2019-05-09 18:54:39 +12:00
2019-10-09 17:16:38 +13:00
( function ( window ) { 'use strict' ; window . Appwrite = function ( ) { let config = { endpoint : 'https://appwrite.io/v1' , project : '' , key : '' , locale : '' , mode : '' , } ; let setEndpoint = function ( endpoint ) { config . endpoint = endpoint ; return this ; } ; let setProject = function ( value )
2019-08-06 16:58:32 +12:00
{ http . addGlobalHeader ( 'X-Appwrite-Project' , value ) ; config . project = value ; return this ; } ; let setKey = function ( value )
{ http . addGlobalHeader ( 'X-Appwrite-Key' , value ) ; config . key = value ; return this ; } ; let setLocale = function ( value )
{ http . addGlobalHeader ( 'X-Appwrite-Locale' , value ) ; config . locale = value ; return this ; } ; let setMode = function ( value )
2019-08-23 09:10:32 +12:00
{ http . addGlobalHeader ( 'X-Appwrite-Mode' , value ) ; config . mode = value ; return this ; } ; let http = function ( document ) { let globalParams = [ ] , globalHeaders = [ ] ; let addParam = function ( url , param , value ) { let a = document . createElement ( 'a' ) , regex = /(?:\?|&|&)+([^=]+)(?:=([^&]*))*/g ; let match , str = [ ] ; a . href = url ; param = encodeURIComponent ( param ) ; while ( match = regex . exec ( a . search ) ) if ( param !== match [ 1 ] ) str . push ( match [ 1 ] + ( match [ 2 ] ? "=" + match [ 2 ] : "" ) ) ; str . push ( param + ( value ? "=" + encodeURIComponent ( value ) : "" ) ) ; a . search = str . join ( "&" ) ; return a . href ; } ; let buildQuery = function ( params ) { let str = [ ] ; for ( let p in params ) { if ( Array . isArray ( params [ p ] ) ) { for ( let index = 0 ; index < params [ p ] . length ; index ++ ) { let param = params [ p ] [ index ] ; str . push ( encodeURIComponent ( p + '[]' ) + "=" + encodeURIComponent ( param ) ) ; } }
else { str . push ( encodeURIComponent ( p ) + "=" + encodeURIComponent ( params [ p ] ) ) ; } }
2020-12-31 01:25:09 +13:00
return str . join ( "&" ) ; } ; let addGlobalHeader = function ( key , value ) { globalHeaders [ key ] = { key : key . toLowerCase ( ) , value : value . toLowerCase ( ) } ; } ; let addGlobalParam = function ( key , value ) { globalParams . push ( { key : key , value : value } ) ; } ; addGlobalHeader ( 'x-sdk-version' , 'appwrite:web:1.0.0' ) ; addGlobalHeader ( 'content-type' , '' ) ; let call = function ( method , path , headers = { } , params = { } , progress = null ) { let i ; path = config . endpoint + path ; if ( - 1 === [ 'GET' , 'POST' , 'PUT' , 'DELETE' , 'TRACE' , 'HEAD' , 'OPTIONS' , 'CONNECT' , 'PATCH' ] . indexOf ( method ) ) { throw new Error ( 'var method must contain a valid HTTP method name' ) ; }
2019-08-06 16:58:32 +12:00
if ( typeof path !== 'string' ) { throw new Error ( 'var path must be of type string' ) ; }
if ( typeof headers !== 'object' ) { throw new Error ( 'var headers must be of type object' ) ; }
for ( i = 0 ; i < globalParams . length ; i ++ ) { path = addParam ( path , globalParams [ i ] . key , globalParams [ i ] . value ) ; }
2020-02-27 22:17:09 +13:00
if ( window . localStorage && window . localStorage . getItem ( 'cookieFallback' ) ) { headers [ 'X-Fallback-Cookies' ] = window . localStorage . getItem ( 'cookieFallback' ) ; }
2019-08-06 16:58:32 +12:00
for ( let key in globalHeaders ) { if ( globalHeaders . hasOwnProperty ( key ) ) { if ( ! headers [ globalHeaders [ key ] . key ] ) { headers [ globalHeaders [ key ] . key ] = globalHeaders [ key ] . value ; } } }
2019-08-23 09:10:32 +12:00
if ( method === 'GET' ) { for ( let param in params ) { if ( param . hasOwnProperty ( key ) ) { path = addParam ( path , key + ( Array . isArray ( param ) ? '[]' : '' ) , params [ key ] ) ; } } }
2019-08-15 10:01:44 +12:00
switch ( headers [ 'content-type' ] ) { case 'application/json' : params = JSON . stringify ( params ) ; break ; case 'multipart/form-data' : let formData = new FormData ( ) ; Object . keys ( params ) . forEach ( function ( key ) { let param = params [ key ] ; formData . append ( key + ( Array . isArray ( param ) ? '[]' : '' ) , param ) ; } ) ; params = formData ; break ; }
return new Promise ( function ( resolve , reject ) { let request = new XMLHttpRequest ( ) , key ; request . withCredentials = true ; request . open ( method , path , true ) ; for ( key in headers ) { if ( headers . hasOwnProperty ( key ) ) { if ( key === 'content-type' && headers [ key ] === 'multipart/form-data' ) { continue ; }
request . setRequestHeader ( key , headers [ key ] ) ; } }
2020-06-17 07:39:14 +12:00
request . onload = function ( ) { let data = request . response ; let contentType = this . getResponseHeader ( 'content-type' ) || '' ; contentType = contentType . substring ( 0 , contentType . indexOf ( ';' ) ) ; switch ( contentType ) { case 'application/json' : data = JSON . parse ( data ) ; break ; }
2020-02-27 22:17:09 +13:00
let cookieFallback = this . getResponseHeader ( 'X-Fallback-Cookies' ) || '' ; if ( window . localStorage && cookieFallback ) { window . console . warn ( 'Appwrite is using localStorage for session management. Increase your security by adding a custom domain as your API endpoint.' ) ; window . localStorage . setItem ( 'cookieFallback' , cookieFallback ) ; }
2020-06-17 07:39:14 +12:00
if ( 4 === request . readyState && 399 >= request . status ) { resolve ( data ) ; } else { reject ( data ) ; } } ; if ( progress ) { request . addEventListener ( 'progress' , progress ) ; request . upload . addEventListener ( 'progress' , progress , false ) ; }
2020-05-11 08:19:20 +12:00
request . onerror = function ( ) { reject ( new Error ( "Network Error" ) ) ; } ; request . send ( params ) ; } ) } ; return { 'get' : function ( path , headers = { } , params = { } ) { return call ( 'GET' , path + ( ( Object . keys ( params ) . length > 0 ) ? '?' + buildQuery ( params ) : '' ) , headers , { } ) ; } , 'post' : function ( path , headers = { } , params = { } , progress = null ) { return call ( 'POST' , path , headers , params , progress ) ; } , 'put' : function ( path , headers = { } , params = { } , progress = null ) { return call ( 'PUT' , path , headers , params , progress ) ; } , 'patch' : function ( path , headers = { } , params = { } , progress = null ) { return call ( 'PATCH' , path , headers , params , progress ) ; } , 'delete' : function ( path , headers = { } , params = { } , progress = null ) { return call ( 'DELETE' , path , headers , params , progress ) ; } , 'addGlobalParam' : addGlobalParam , 'addGlobalHeader' : addGlobalHeader } } ( window . document ) ; let account = { get : function ( ) { let path = '/account' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , create : function ( email , password , name = '' ) { if ( email === undefined ) { throw new Error ( 'Missing required parameter: "email"' ) ; }
2020-01-31 06:12:29 +13:00
if ( password === undefined ) { throw new Error ( 'Missing required parameter: "password"' ) ; }
let path = '/account' ; let payload = { } ; if ( email ) { payload [ 'email' ] = email ; }
if ( password ) { payload [ 'password' ] = password ; }
if ( name ) { payload [ 'name' ] = name ; }
return http . post ( path , { 'content-type' : 'application/json' , } , payload ) ; } , delete : function ( ) { let path = '/account' ; let payload = { } ; return http . delete ( path , { 'content-type' : 'application/json' , } , payload ) ; } , updateEmail : function ( email , password ) { if ( email === undefined ) { throw new Error ( 'Missing required parameter: "email"' ) ; }
2019-08-06 16:58:32 +12:00
if ( password === undefined ) { throw new Error ( 'Missing required parameter: "password"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/account/email' ; let payload = { } ; if ( email ) { payload [ 'email' ] = email ; }
if ( password ) { payload [ 'password' ] = password ; }
2021-03-01 00:00:08 +13:00
return http . patch ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getLogs : function ( ) { let path = '/account/logs' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , updateName : function ( name ) { if ( name === undefined ) { throw new Error ( 'Missing required parameter: "name"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/account/name' ; let payload = { } ; if ( name ) { payload [ 'name' ] = name ; }
2020-01-31 06:12:29 +13:00
return http . patch ( path , { 'content-type' : 'application/json' , } , payload ) ; } , updatePassword : function ( password , oldPassword ) { if ( password === undefined ) { throw new Error ( 'Missing required parameter: "password"' ) ; }
2019-08-06 16:58:32 +12:00
if ( oldPassword === undefined ) { throw new Error ( 'Missing required parameter: "oldPassword"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/account/password' ; let payload = { } ; if ( password ) { payload [ 'password' ] = password ; }
2020-03-26 09:19:19 +13:00
if ( oldPassword ) { payload [ 'oldPassword' ] = oldPassword ; }
2020-01-31 06:12:29 +13:00
return http . patch ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getPrefs : function ( ) { let path = '/account/prefs' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , updatePrefs : function ( prefs ) { if ( prefs === undefined ) { throw new Error ( 'Missing required parameter: "prefs"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/account/prefs' ; let payload = { } ; if ( prefs ) { payload [ 'prefs' ] = prefs ; }
2020-01-31 06:12:29 +13:00
return http . patch ( path , { 'content-type' : 'application/json' , } , payload ) ; } , createRecovery : function ( email , url ) { if ( email === undefined ) { throw new Error ( 'Missing required parameter: "email"' ) ; }
if ( url === undefined ) { throw new Error ( 'Missing required parameter: "url"' ) ; }
let path = '/account/recovery' ; let payload = { } ; if ( email ) { payload [ 'email' ] = email ; }
if ( url ) { payload [ 'url' ] = url ; }
2020-03-29 04:12:34 +13:00
return http . post ( path , { 'content-type' : 'application/json' , } , payload ) ; } , updateRecovery : function ( userId , secret , password , passwordAgain ) { if ( userId === undefined ) { throw new Error ( 'Missing required parameter: "userId"' ) ; }
2020-01-31 06:12:29 +13:00
if ( secret === undefined ) { throw new Error ( 'Missing required parameter: "secret"' ) ; }
2020-03-29 04:12:34 +13:00
if ( password === undefined ) { throw new Error ( 'Missing required parameter: "password"' ) ; }
if ( passwordAgain === undefined ) { throw new Error ( 'Missing required parameter: "passwordAgain"' ) ; }
2020-01-31 06:12:29 +13:00
let path = '/account/recovery' ; let payload = { } ; if ( userId ) { payload [ 'userId' ] = userId ; }
if ( secret ) { payload [ 'secret' ] = secret ; }
2020-03-29 04:12:34 +13:00
if ( password ) { payload [ 'password' ] = password ; }
if ( passwordAgain ) { payload [ 'passwordAgain' ] = passwordAgain ; }
2020-01-31 06:12:29 +13:00
return http . put ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getSessions : function ( ) { let path = '/account/sessions' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , createSession : function ( email , password ) { if ( email === undefined ) { throw new Error ( 'Missing required parameter: "email"' ) ; }
2019-08-06 16:58:32 +12:00
if ( password === undefined ) { throw new Error ( 'Missing required parameter: "password"' ) ; }
2020-01-31 06:12:29 +13:00
let path = '/account/sessions' ; let payload = { } ; if ( email ) { payload [ 'email' ] = email ; }
2019-10-09 17:16:38 +13:00
if ( password ) { payload [ 'password' ] = password ; }
2020-06-17 07:39:14 +12:00
return http . post ( path , { 'content-type' : 'application/json' , } , payload ) ; } , deleteSessions : function ( ) { let path = '/account/sessions' ; let payload = { } ; return http . delete ( path , { 'content-type' : 'application/json' , } , payload ) ; } , createOAuth2Session : function ( provider , success = 'https://appwrite.io/auth/oauth2/success' , failure = 'https://appwrite.io/auth/oauth2/failure' , scopes = [ ] ) { if ( provider === undefined ) { throw new Error ( 'Missing required parameter: "provider"' ) ; }
2020-02-17 00:41:03 +13:00
let path = '/account/sessions/oauth2/{provider}' . replace ( new RegExp ( '{provider}' , 'g' ) , provider ) ; let payload = { } ; if ( success ) { payload [ 'success' ] = success ; }
2019-10-09 17:16:38 +13:00
if ( failure ) { payload [ 'failure' ] = failure ; }
2020-06-17 07:39:14 +12:00
if ( scopes ) { payload [ 'scopes' ] = scopes ; }
payload [ 'project' ] = config . project ; payload [ 'key' ] = config . key ; let query = [ ] ; for ( let p in payload ) { if ( Array . isArray ( payload [ p ] ) ) { for ( let index = 0 ; index < payload [ p ] . length ; index ++ ) { let param = payload [ p ] [ index ] ; query . push ( encodeURIComponent ( p + '[]' ) + "=" + encodeURIComponent ( param ) ) ; } }
else { query . push ( encodeURIComponent ( p ) + "=" + encodeURIComponent ( payload [ p ] ) ) ; } }
query = query . join ( "&" ) ; window . location = config . endpoint + path + ( ( query ) ? '?' + query : '' ) ; } , deleteSession : function ( sessionId ) { if ( sessionId === undefined ) { throw new Error ( 'Missing required parameter: "sessionId"' ) ; }
2020-02-16 07:34:16 +13:00
let path = '/account/sessions/{sessionId}' . replace ( new RegExp ( '{sessionId}' , 'g' ) , sessionId ) ; let payload = { } ; return http . delete ( path , { 'content-type' : 'application/json' , } , payload ) ; } , createVerification : function ( url ) { if ( url === undefined ) { throw new Error ( 'Missing required parameter: "url"' ) ; }
2020-01-31 06:12:29 +13:00
let path = '/account/verification' ; let payload = { } ; if ( url ) { payload [ 'url' ] = url ; }
2020-02-24 07:10:09 +13:00
return http . post ( path , { 'content-type' : 'application/json' , } , payload ) ; } , updateVerification : function ( userId , secret ) { if ( userId === undefined ) { throw new Error ( 'Missing required parameter: "userId"' ) ; }
2020-01-31 06:12:29 +13:00
if ( secret === undefined ) { throw new Error ( 'Missing required parameter: "secret"' ) ; }
let path = '/account/verification' ; let payload = { } ; if ( userId ) { payload [ 'userId' ] = userId ; }
if ( secret ) { payload [ 'secret' ] = secret ; }
return http . put ( path , { 'content-type' : 'application/json' , } , payload ) ; } } ; let avatars = { getBrowser : function ( code , width = 100 , height = 100 , quality = 100 ) { if ( code === undefined ) { throw new Error ( 'Missing required parameter: "code"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/avatars/browsers/{code}' . replace ( new RegExp ( '{code}' , 'g' ) , code ) ; let payload = { } ; if ( width ) { payload [ 'width' ] = width ; }
if ( height ) { payload [ 'height' ] = height ; }
if ( quality ) { payload [ 'quality' ] = quality ; }
2020-06-17 07:39:14 +12:00
payload [ 'project' ] = config . project ; payload [ 'key' ] = config . key ; let query = [ ] ; for ( let p in payload ) { if ( Array . isArray ( payload [ p ] ) ) { for ( let index = 0 ; index < payload [ p ] . length ; index ++ ) { let param = payload [ p ] [ index ] ; query . push ( encodeURIComponent ( p + '[]' ) + "=" + encodeURIComponent ( param ) ) ; } }
else { query . push ( encodeURIComponent ( p ) + "=" + encodeURIComponent ( payload [ p ] ) ) ; } }
query = query . join ( "&" ) ; return config . endpoint + path + ( ( query ) ? '?' + query : '' ) ; } , getCreditCard : function ( code , width = 100 , height = 100 , quality = 100 ) { if ( code === undefined ) { throw new Error ( 'Missing required parameter: "code"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/avatars/credit-cards/{code}' . replace ( new RegExp ( '{code}' , 'g' ) , code ) ; let payload = { } ; if ( width ) { payload [ 'width' ] = width ; }
if ( height ) { payload [ 'height' ] = height ; }
if ( quality ) { payload [ 'quality' ] = quality ; }
2020-06-17 07:39:14 +12:00
payload [ 'project' ] = config . project ; payload [ 'key' ] = config . key ; let query = [ ] ; for ( let p in payload ) { if ( Array . isArray ( payload [ p ] ) ) { for ( let index = 0 ; index < payload [ p ] . length ; index ++ ) { let param = payload [ p ] [ index ] ; query . push ( encodeURIComponent ( p + '[]' ) + "=" + encodeURIComponent ( param ) ) ; } }
else { query . push ( encodeURIComponent ( p ) + "=" + encodeURIComponent ( payload [ p ] ) ) ; } }
query = query . join ( "&" ) ; return config . endpoint + path + ( ( query ) ? '?' + query : '' ) ; } , getFavicon : function ( url ) { if ( url === undefined ) { throw new Error ( 'Missing required parameter: "url"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/avatars/favicon' ; let payload = { } ; if ( url ) { payload [ 'url' ] = url ; }
2020-06-17 07:39:14 +12:00
payload [ 'project' ] = config . project ; payload [ 'key' ] = config . key ; let query = [ ] ; for ( let p in payload ) { if ( Array . isArray ( payload [ p ] ) ) { for ( let index = 0 ; index < payload [ p ] . length ; index ++ ) { let param = payload [ p ] [ index ] ; query . push ( encodeURIComponent ( p + '[]' ) + "=" + encodeURIComponent ( param ) ) ; } }
else { query . push ( encodeURIComponent ( p ) + "=" + encodeURIComponent ( payload [ p ] ) ) ; } }
query = query . join ( "&" ) ; return config . endpoint + path + ( ( query ) ? '?' + query : '' ) ; } , getFlag : function ( code , width = 100 , height = 100 , quality = 100 ) { if ( code === undefined ) { throw new Error ( 'Missing required parameter: "code"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/avatars/flags/{code}' . replace ( new RegExp ( '{code}' , 'g' ) , code ) ; let payload = { } ; if ( width ) { payload [ 'width' ] = width ; }
if ( height ) { payload [ 'height' ] = height ; }
if ( quality ) { payload [ 'quality' ] = quality ; }
2020-06-17 07:39:14 +12:00
payload [ 'project' ] = config . project ; payload [ 'key' ] = config . key ; let query = [ ] ; for ( let p in payload ) { if ( Array . isArray ( payload [ p ] ) ) { for ( let index = 0 ; index < payload [ p ] . length ; index ++ ) { let param = payload [ p ] [ index ] ; query . push ( encodeURIComponent ( p + '[]' ) + "=" + encodeURIComponent ( param ) ) ; } }
else { query . push ( encodeURIComponent ( p ) + "=" + encodeURIComponent ( payload [ p ] ) ) ; } }
query = query . join ( "&" ) ; return config . endpoint + path + ( ( query ) ? '?' + query : '' ) ; } , getImage : function ( url , width = 400 , height = 400 ) { if ( url === undefined ) { throw new Error ( 'Missing required parameter: "url"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/avatars/image' ; let payload = { } ; if ( url ) { payload [ 'url' ] = url ; }
if ( width ) { payload [ 'width' ] = width ; }
if ( height ) { payload [ 'height' ] = height ; }
2020-06-17 07:39:14 +12:00
payload [ 'project' ] = config . project ; payload [ 'key' ] = config . key ; let query = [ ] ; for ( let p in payload ) { if ( Array . isArray ( payload [ p ] ) ) { for ( let index = 0 ; index < payload [ p ] . length ; index ++ ) { let param = payload [ p ] [ index ] ; query . push ( encodeURIComponent ( p + '[]' ) + "=" + encodeURIComponent ( param ) ) ; } }
else { query . push ( encodeURIComponent ( p ) + "=" + encodeURIComponent ( payload [ p ] ) ) ; } }
query = query . join ( "&" ) ; return config . endpoint + path + ( ( query ) ? '?' + query : '' ) ; } , getInitials : function ( name = '' , width = 500 , height = 500 , color = '' , background = '' ) { let path = '/avatars/initials' ; let payload = { } ; if ( name ) { payload [ 'name' ] = name ; }
2020-06-14 06:44:50 +12:00
if ( width ) { payload [ 'width' ] = width ; }
if ( height ) { payload [ 'height' ] = height ; }
if ( color ) { payload [ 'color' ] = color ; }
if ( background ) { payload [ 'background' ] = background ; }
2020-06-17 07:39:14 +12:00
payload [ 'project' ] = config . project ; payload [ 'key' ] = config . key ; let query = [ ] ; for ( let p in payload ) { if ( Array . isArray ( payload [ p ] ) ) { for ( let index = 0 ; index < payload [ p ] . length ; index ++ ) { let param = payload [ p ] [ index ] ; query . push ( encodeURIComponent ( p + '[]' ) + "=" + encodeURIComponent ( param ) ) ; } }
else { query . push ( encodeURIComponent ( p ) + "=" + encodeURIComponent ( payload [ p ] ) ) ; } }
2020-07-15 04:33:13 +12:00
query = query . join ( "&" ) ; return config . endpoint + path + ( ( query ) ? '?' + query : '' ) ; } , getQR : function ( text , size = 400 , margin = 1 , download = false ) { if ( text === undefined ) { throw new Error ( 'Missing required parameter: "text"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/avatars/qr' ; let payload = { } ; if ( text ) { payload [ 'text' ] = text ; }
if ( size ) { payload [ 'size' ] = size ; }
if ( margin ) { payload [ 'margin' ] = margin ; }
if ( download ) { payload [ 'download' ] = download ; }
2020-06-17 07:39:14 +12:00
payload [ 'project' ] = config . project ; payload [ 'key' ] = config . key ; let query = [ ] ; for ( let p in payload ) { if ( Array . isArray ( payload [ p ] ) ) { for ( let index = 0 ; index < payload [ p ] . length ; index ++ ) { let param = payload [ p ] [ index ] ; query . push ( encodeURIComponent ( p + '[]' ) + "=" + encodeURIComponent ( param ) ) ; } }
else { query . push ( encodeURIComponent ( p ) + "=" + encodeURIComponent ( payload [ p ] ) ) ; } }
query = query . join ( "&" ) ; return config . endpoint + path + ( ( query ) ? '?' + query : '' ) ; } } ; let database = { listCollections : function ( search = '' , limit = 25 , offset = 0 , orderType = 'ASC' ) { let path = '/database/collections' ; let payload = { } ; if ( search ) { payload [ 'search' ] = search ; }
2019-10-09 17:16:38 +13:00
if ( limit ) { payload [ 'limit' ] = limit ; }
if ( offset ) { payload [ 'offset' ] = offset ; }
if ( orderType ) { payload [ 'orderType' ] = orderType ; }
2020-01-31 06:12:29 +13:00
return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , createCollection : function ( name , read , write , rules ) { if ( name === undefined ) { throw new Error ( 'Missing required parameter: "name"' ) ; }
if ( read === undefined ) { throw new Error ( 'Missing required parameter: "read"' ) ; }
if ( write === undefined ) { throw new Error ( 'Missing required parameter: "write"' ) ; }
if ( rules === undefined ) { throw new Error ( 'Missing required parameter: "rules"' ) ; }
let path = '/database/collections' ; let payload = { } ; if ( name ) { payload [ 'name' ] = name ; }
2019-10-09 17:16:38 +13:00
if ( read ) { payload [ 'read' ] = read ; }
if ( write ) { payload [ 'write' ] = write ; }
if ( rules ) { payload [ 'rules' ] = rules ; }
2020-01-31 06:12:29 +13:00
return http . post ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getCollection : function ( collectionId ) { if ( collectionId === undefined ) { throw new Error ( 'Missing required parameter: "collectionId"' ) ; }
let path = '/database/collections/{collectionId}' . replace ( new RegExp ( '{collectionId}' , 'g' ) , collectionId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , updateCollection : function ( collectionId , name , read , write , rules = [ ] ) { if ( collectionId === undefined ) { throw new Error ( 'Missing required parameter: "collectionId"' ) ; }
2019-08-06 16:58:32 +12:00
if ( name === undefined ) { throw new Error ( 'Missing required parameter: "name"' ) ; }
2020-01-31 06:12:29 +13:00
if ( read === undefined ) { throw new Error ( 'Missing required parameter: "read"' ) ; }
if ( write === undefined ) { throw new Error ( 'Missing required parameter: "write"' ) ; }
let path = '/database/collections/{collectionId}' . replace ( new RegExp ( '{collectionId}' , 'g' ) , collectionId ) ; let payload = { } ; if ( name ) { payload [ 'name' ] = name ; }
2019-10-09 17:16:38 +13:00
if ( read ) { payload [ 'read' ] = read ; }
if ( write ) { payload [ 'write' ] = write ; }
if ( rules ) { payload [ 'rules' ] = rules ; }
2020-01-31 06:12:29 +13:00
return http . put ( path , { 'content-type' : 'application/json' , } , payload ) ; } , deleteCollection : function ( collectionId ) { if ( collectionId === undefined ) { throw new Error ( 'Missing required parameter: "collectionId"' ) ; }
2020-12-31 01:25:09 +13:00
let path = '/database/collections/{collectionId}' . replace ( new RegExp ( '{collectionId}' , 'g' ) , collectionId ) ; let payload = { } ; return http . delete ( path , { 'content-type' : 'application/json' , } , payload ) ; } , listDocuments : function ( collectionId , filters = [ ] , limit = 25 , offset = 0 , orderField = '' , orderType = 'ASC' , orderCast = 'string' , search = '' ) { if ( collectionId === undefined ) { throw new Error ( 'Missing required parameter: "collectionId"' ) ; }
2020-01-31 06:12:29 +13:00
let path = '/database/collections/{collectionId}/documents' . replace ( new RegExp ( '{collectionId}' , 'g' ) , collectionId ) ; let payload = { } ; if ( filters ) { payload [ 'filters' ] = filters ; }
2019-10-09 17:16:38 +13:00
if ( limit ) { payload [ 'limit' ] = limit ; }
2020-07-15 04:33:13 +12:00
if ( offset ) { payload [ 'offset' ] = offset ; }
2020-03-26 09:19:19 +13:00
if ( orderField ) { payload [ 'orderField' ] = orderField ; }
if ( orderType ) { payload [ 'orderType' ] = orderType ; }
if ( orderCast ) { payload [ 'orderCast' ] = orderCast ; }
2019-10-09 17:16:38 +13:00
if ( search ) { payload [ 'search' ] = search ; }
2020-01-31 06:12:29 +13:00
return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , createDocument : function ( collectionId , data , read , write , parentDocument = '' , parentProperty = '' , parentPropertyType = 'assign' ) { if ( collectionId === undefined ) { throw new Error ( 'Missing required parameter: "collectionId"' ) ; }
2019-08-07 02:28:42 +12:00
if ( data === undefined ) { throw new Error ( 'Missing required parameter: "data"' ) ; }
2020-01-31 06:12:29 +13:00
if ( read === undefined ) { throw new Error ( 'Missing required parameter: "read"' ) ; }
if ( write === undefined ) { throw new Error ( 'Missing required parameter: "write"' ) ; }
let path = '/database/collections/{collectionId}/documents' . replace ( new RegExp ( '{collectionId}' , 'g' ) , collectionId ) ; let payload = { } ; if ( data ) { payload [ 'data' ] = data ; }
2019-10-09 17:16:38 +13:00
if ( read ) { payload [ 'read' ] = read ; }
if ( write ) { payload [ 'write' ] = write ; }
if ( parentDocument ) { payload [ 'parentDocument' ] = parentDocument ; }
if ( parentProperty ) { payload [ 'parentProperty' ] = parentProperty ; }
if ( parentPropertyType ) { payload [ 'parentPropertyType' ] = parentPropertyType ; }
2020-01-31 06:12:29 +13:00
return http . post ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getDocument : function ( collectionId , documentId ) { if ( collectionId === undefined ) { throw new Error ( 'Missing required parameter: "collectionId"' ) ; }
2019-08-06 16:58:32 +12:00
if ( documentId === undefined ) { throw new Error ( 'Missing required parameter: "documentId"' ) ; }
2020-01-31 06:12:29 +13:00
let path = '/database/collections/{collectionId}/documents/{documentId}' . replace ( new RegExp ( '{collectionId}' , 'g' ) , collectionId ) . replace ( new RegExp ( '{documentId}' , 'g' ) , documentId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , updateDocument : function ( collectionId , documentId , data , read , write ) { if ( collectionId === undefined ) { throw new Error ( 'Missing required parameter: "collectionId"' ) ; }
2019-08-06 16:58:32 +12:00
if ( documentId === undefined ) { throw new Error ( 'Missing required parameter: "documentId"' ) ; }
if ( data === undefined ) { throw new Error ( 'Missing required parameter: "data"' ) ; }
2020-01-31 06:12:29 +13:00
if ( read === undefined ) { throw new Error ( 'Missing required parameter: "read"' ) ; }
if ( write === undefined ) { throw new Error ( 'Missing required parameter: "write"' ) ; }
let path = '/database/collections/{collectionId}/documents/{documentId}' . replace ( new RegExp ( '{collectionId}' , 'g' ) , collectionId ) . replace ( new RegExp ( '{documentId}' , 'g' ) , documentId ) ; let payload = { } ; if ( data ) { payload [ 'data' ] = data ; }
2019-10-09 17:16:38 +13:00
if ( read ) { payload [ 'read' ] = read ; }
if ( write ) { payload [ 'write' ] = write ; }
2020-01-31 06:12:29 +13:00
return http . patch ( path , { 'content-type' : 'application/json' , } , payload ) ; } , deleteDocument : function ( collectionId , documentId ) { if ( collectionId === undefined ) { throw new Error ( 'Missing required parameter: "collectionId"' ) ; }
2019-08-06 16:58:32 +12:00
if ( documentId === undefined ) { throw new Error ( 'Missing required parameter: "documentId"' ) ; }
2020-07-15 04:33:13 +12:00
let path = '/database/collections/{collectionId}/documents/{documentId}' . replace ( new RegExp ( '{collectionId}' , 'g' ) , collectionId ) . replace ( new RegExp ( '{documentId}' , 'g' ) , documentId ) ; let payload = { } ; return http . delete ( path , { 'content-type' : 'application/json' , } , payload ) ; } } ; let functions = { list : function ( search = '' , limit = 25 , offset = 0 , orderType = 'ASC' ) { let path = '/functions' ; let payload = { } ; if ( search ) { payload [ 'search' ] = search ; }
2020-07-13 08:58:33 +12:00
if ( limit ) { payload [ 'limit' ] = limit ; }
if ( offset ) { payload [ 'offset' ] = offset ; }
if ( orderType ) { payload [ 'orderType' ] = orderType ; }
2021-02-02 11:00:53 +13:00
return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , create : function ( name , execute , env , vars = { } , events = [ ] , schedule = '' , timeout = 15 ) { if ( name === undefined ) { throw new Error ( 'Missing required parameter: "name"' ) ; }
2020-12-31 01:25:09 +13:00
if ( execute === undefined ) { throw new Error ( 'Missing required parameter: "execute"' ) ; }
2020-07-15 04:33:13 +12:00
if ( env === undefined ) { throw new Error ( 'Missing required parameter: "env"' ) ; }
2020-07-13 08:58:33 +12:00
let path = '/functions' ; let payload = { } ; if ( name ) { payload [ 'name' ] = name ; }
2020-12-31 01:25:09 +13:00
if ( execute ) { payload [ 'execute' ] = execute ; }
2020-07-15 04:33:13 +12:00
if ( env ) { payload [ 'env' ] = env ; }
2020-07-13 08:58:33 +12:00
if ( vars ) { payload [ 'vars' ] = vars ; }
if ( events ) { payload [ 'events' ] = events ; }
if ( schedule ) { payload [ 'schedule' ] = schedule ; }
if ( timeout ) { payload [ 'timeout' ] = timeout ; }
return http . post ( path , { 'content-type' : 'application/json' , } , payload ) ; } , get : function ( functionId ) { if ( functionId === undefined ) { throw new Error ( 'Missing required parameter: "functionId"' ) ; }
2021-02-02 11:00:53 +13:00
let path = '/functions/{functionId}' . replace ( new RegExp ( '{functionId}' , 'g' ) , functionId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , update : function ( functionId , name , execute , vars = { } , events = [ ] , schedule = '' , timeout = 15 ) { if ( functionId === undefined ) { throw new Error ( 'Missing required parameter: "functionId"' ) ; }
2020-07-13 08:58:33 +12:00
if ( name === undefined ) { throw new Error ( 'Missing required parameter: "name"' ) ; }
2020-12-31 01:25:09 +13:00
if ( execute === undefined ) { throw new Error ( 'Missing required parameter: "execute"' ) ; }
2020-07-13 08:58:33 +12:00
let path = '/functions/{functionId}' . replace ( new RegExp ( '{functionId}' , 'g' ) , functionId ) ; let payload = { } ; if ( name ) { payload [ 'name' ] = name ; }
2020-12-31 01:25:09 +13:00
if ( execute ) { payload [ 'execute' ] = execute ; }
2020-07-13 08:58:33 +12:00
if ( vars ) { payload [ 'vars' ] = vars ; }
if ( events ) { payload [ 'events' ] = events ; }
if ( schedule ) { payload [ 'schedule' ] = schedule ; }
if ( timeout ) { payload [ 'timeout' ] = timeout ; }
return http . put ( path , { 'content-type' : 'application/json' , } , payload ) ; } , delete : function ( functionId ) { if ( functionId === undefined ) { throw new Error ( 'Missing required parameter: "functionId"' ) ; }
let path = '/functions/{functionId}' . replace ( new RegExp ( '{functionId}' , 'g' ) , functionId ) ; let payload = { } ; return http . delete ( path , { 'content-type' : 'application/json' , } , payload ) ; } , listExecutions : function ( functionId , search = '' , limit = 25 , offset = 0 , orderType = 'ASC' ) { if ( functionId === undefined ) { throw new Error ( 'Missing required parameter: "functionId"' ) ; }
let path = '/functions/{functionId}/executions' . replace ( new RegExp ( '{functionId}' , 'g' ) , functionId ) ; let payload = { } ; if ( search ) { payload [ 'search' ] = search ; }
if ( limit ) { payload [ 'limit' ] = limit ; }
if ( offset ) { payload [ 'offset' ] = offset ; }
if ( orderType ) { payload [ 'orderType' ] = orderType ; }
2021-03-12 02:53:36 +13:00
return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , createExecution : function ( functionId , data ) { if ( functionId === undefined ) { throw new Error ( 'Missing required parameter: "functionId"' ) ; }
let path = '/functions/{functionId}/executions' . replace ( new RegExp ( '{functionId}' , 'g' ) , functionId ) ; let payload = { } ; if ( data ) { payload [ 'data' ] = data ; }
return http . post ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getExecution : function ( functionId , executionId ) { if ( functionId === undefined ) { throw new Error ( 'Missing required parameter: "functionId"' ) ; }
2020-07-13 08:58:33 +12:00
if ( executionId === undefined ) { throw new Error ( 'Missing required parameter: "executionId"' ) ; }
let path = '/functions/{functionId}/executions/{executionId}' . replace ( new RegExp ( '{functionId}' , 'g' ) , functionId ) . replace ( new RegExp ( '{executionId}' , 'g' ) , executionId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , updateTag : function ( functionId , tag ) { if ( functionId === undefined ) { throw new Error ( 'Missing required parameter: "functionId"' ) ; }
if ( tag === undefined ) { throw new Error ( 'Missing required parameter: "tag"' ) ; }
let path = '/functions/{functionId}/tag' . replace ( new RegExp ( '{functionId}' , 'g' ) , functionId ) ; let payload = { } ; if ( tag ) { payload [ 'tag' ] = tag ; }
return http . patch ( path , { 'content-type' : 'application/json' , } , payload ) ; } , listTags : function ( functionId , search = '' , limit = 25 , offset = 0 , orderType = 'ASC' ) { if ( functionId === undefined ) { throw new Error ( 'Missing required parameter: "functionId"' ) ; }
let path = '/functions/{functionId}/tags' . replace ( new RegExp ( '{functionId}' , 'g' ) , functionId ) ; let payload = { } ; if ( search ) { payload [ 'search' ] = search ; }
if ( limit ) { payload [ 'limit' ] = limit ; }
if ( offset ) { payload [ 'offset' ] = offset ; }
if ( orderType ) { payload [ 'orderType' ] = orderType ; }
2020-07-15 04:33:13 +12:00
return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , createTag : function ( functionId , command , code ) { if ( functionId === undefined ) { throw new Error ( 'Missing required parameter: "functionId"' ) ; }
2020-07-13 08:58:33 +12:00
if ( command === undefined ) { throw new Error ( 'Missing required parameter: "command"' ) ; }
if ( code === undefined ) { throw new Error ( 'Missing required parameter: "code"' ) ; }
2020-07-15 04:33:13 +12:00
let path = '/functions/{functionId}/tags' . replace ( new RegExp ( '{functionId}' , 'g' ) , functionId ) ; let payload = { } ; if ( command ) { payload [ 'command' ] = command ; }
2020-07-13 08:58:33 +12:00
if ( code ) { payload [ 'code' ] = code ; }
2020-07-15 08:33:52 +12:00
return http . post ( path , { 'content-type' : 'multipart/form-data' , } , payload ) ; } , getTag : function ( functionId , tagId ) { if ( functionId === undefined ) { throw new Error ( 'Missing required parameter: "functionId"' ) ; }
2020-07-13 08:58:33 +12:00
if ( tagId === undefined ) { throw new Error ( 'Missing required parameter: "tagId"' ) ; }
let path = '/functions/{functionId}/tags/{tagId}' . replace ( new RegExp ( '{functionId}' , 'g' ) , functionId ) . replace ( new RegExp ( '{tagId}' , 'g' ) , tagId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , deleteTag : function ( functionId , tagId ) { if ( functionId === undefined ) { throw new Error ( 'Missing required parameter: "functionId"' ) ; }
if ( tagId === undefined ) { throw new Error ( 'Missing required parameter: "tagId"' ) ; }
2020-12-31 01:25:09 +13:00
let path = '/functions/{functionId}/tags/{tagId}' . replace ( new RegExp ( '{functionId}' , 'g' ) , functionId ) . replace ( new RegExp ( '{tagId}' , 'g' ) , tagId ) ; let payload = { } ; return http . delete ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getUsage : function ( functionId , range = '30d' ) { if ( functionId === undefined ) { throw new Error ( 'Missing required parameter: "functionId"' ) ; }
2020-07-21 23:53:48 +12:00
let path = '/functions/{functionId}/usage' . replace ( new RegExp ( '{functionId}' , 'g' ) , functionId ) ; let payload = { } ; if ( range ) { payload [ 'range' ] = range ; }
return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } } ; let health = { get : function ( ) { let path = '/health' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getAntiVirus : function ( ) { let path = '/health/anti-virus' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getCache : function ( ) { let path = '/health/cache' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getDB : function ( ) { let path = '/health/db' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getQueueCertificates : function ( ) { let path = '/health/queue/certificates' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getQueueFunctions : function ( ) { let path = '/health/queue/functions' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getQueueLogs : function ( ) { let path = '/health/queue/logs' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getQueueTasks : function ( ) { let path = '/health/queue/tasks' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getQueueUsage : function ( ) { let path = '/health/queue/usage' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getQueueWebhooks : function ( ) { let path = '/health/queue/webhooks' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getStorageLocal : function ( ) { let path = '/health/storage/local' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getTime : function ( ) { let path = '/health/time' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } } ; let locale = { get : function ( ) { let path = '/locale' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getContinents : function ( ) { let path = '/locale/continents' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getCountries : function ( ) { let path = '/locale/countries' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getCountriesEU : function ( ) { let path = '/locale/countries/eu' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getCountriesPhones : function ( ) { let path = '/locale/countries/phones' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getCurrencies : function ( ) { let path = '/locale/currencies' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getLanguages : function ( ) { let path = '/locale/languages' ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } } ; let projects = { list : function ( search = '' , limit = 25 , offset = 0 , orderType = 'ASC' ) { let path = '/projects' ; let payload = { } ; if ( search ) { payload [ 'search' ] = search ; }
2020-07-15 04:33:13 +12:00
if ( limit ) { payload [ 'limit' ] = limit ; }
if ( offset ) { payload [ 'offset' ] = offset ; }
if ( orderType ) { payload [ 'orderType' ] = orderType ; }
return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , create : function ( name , teamId , description = '' , logo = '' , url = '' , legalName = '' , legalCountry = '' , legalState = '' , legalCity = '' , legalAddress = '' , legalTaxId = '' ) { if ( name === undefined ) { throw new Error ( 'Missing required parameter: "name"' ) ; }
2019-08-06 17:25:54 +12:00
if ( teamId === undefined ) { throw new Error ( 'Missing required parameter: "teamId"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/projects' ; let payload = { } ; if ( name ) { payload [ 'name' ] = name ; }
if ( teamId ) { payload [ 'teamId' ] = teamId ; }
if ( description ) { payload [ 'description' ] = description ; }
if ( logo ) { payload [ 'logo' ] = logo ; }
if ( url ) { payload [ 'url' ] = url ; }
if ( legalName ) { payload [ 'legalName' ] = legalName ; }
if ( legalCountry ) { payload [ 'legalCountry' ] = legalCountry ; }
if ( legalState ) { payload [ 'legalState' ] = legalState ; }
if ( legalCity ) { payload [ 'legalCity' ] = legalCity ; }
if ( legalAddress ) { payload [ 'legalAddress' ] = legalAddress ; }
if ( legalTaxId ) { payload [ 'legalTaxId' ] = legalTaxId ; }
2020-01-31 06:12:29 +13:00
return http . post ( path , { 'content-type' : 'application/json' , } , payload ) ; } , get : function ( projectId ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
let path = '/projects/{projectId}' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , update : function ( projectId , name , description = '' , logo = '' , url = '' , legalName = '' , legalCountry = '' , legalState = '' , legalCity = '' , legalAddress = '' , legalTaxId = '' ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2019-08-06 17:25:54 +12:00
if ( name === undefined ) { throw new Error ( 'Missing required parameter: "name"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/projects/{projectId}' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) ; let payload = { } ; if ( name ) { payload [ 'name' ] = name ; }
if ( description ) { payload [ 'description' ] = description ; }
if ( logo ) { payload [ 'logo' ] = logo ; }
if ( url ) { payload [ 'url' ] = url ; }
if ( legalName ) { payload [ 'legalName' ] = legalName ; }
if ( legalCountry ) { payload [ 'legalCountry' ] = legalCountry ; }
if ( legalState ) { payload [ 'legalState' ] = legalState ; }
if ( legalCity ) { payload [ 'legalCity' ] = legalCity ; }
if ( legalAddress ) { payload [ 'legalAddress' ] = legalAddress ; }
if ( legalTaxId ) { payload [ 'legalTaxId' ] = legalTaxId ; }
2020-01-31 13:00:31 +13:00
return http . patch ( path , { 'content-type' : 'application/json' , } , payload ) ; } , delete : function ( projectId , password ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
if ( password === undefined ) { throw new Error ( 'Missing required parameter: "password"' ) ; }
let path = '/projects/{projectId}' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) ; let payload = { } ; if ( password ) { payload [ 'password' ] = password ; }
2021-03-01 00:00:08 +13:00
return http . delete ( path , { 'content-type' : 'application/json' , } , payload ) ; } , updateAuthLimit : function ( projectId , limit ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
if ( limit === undefined ) { throw new Error ( 'Missing required parameter: "limit"' ) ; }
2021-03-01 04:01:16 +13:00
let path = '/projects/{projectId}/auth/limit' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) ; let payload = { } ; if ( typeof limit !== 'undefined' ) { payload [ 'limit' ] = limit ; }
2021-03-01 00:00:08 +13:00
return http . patch ( path , { 'content-type' : 'application/json' , } , payload ) ; } , updateAuthStatus : function ( projectId , method , status ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
if ( method === undefined ) { throw new Error ( 'Missing required parameter: "method"' ) ; }
if ( status === undefined ) { throw new Error ( 'Missing required parameter: "status"' ) ; }
let path = '/projects/{projectId}/auth/{method}' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) . replace ( new RegExp ( '{method}' , 'g' ) , method ) ; let payload = { } ; if ( status ) { payload [ 'status' ] = status ; }
return http . patch ( path , { 'content-type' : 'application/json' , } , payload ) ; } , listDomains : function ( projectId ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2020-02-24 07:10:09 +13:00
let path = '/projects/{projectId}/domains' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , createDomain : function ( projectId , domain ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
if ( domain === undefined ) { throw new Error ( 'Missing required parameter: "domain"' ) ; }
let path = '/projects/{projectId}/domains' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) ; let payload = { } ; if ( domain ) { payload [ 'domain' ] = domain ; }
return http . post ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getDomain : function ( projectId , domainId ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
if ( domainId === undefined ) { throw new Error ( 'Missing required parameter: "domainId"' ) ; }
let path = '/projects/{projectId}/domains/{domainId}' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) . replace ( new RegExp ( '{domainId}' , 'g' ) , domainId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , deleteDomain : function ( projectId , domainId ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
if ( domainId === undefined ) { throw new Error ( 'Missing required parameter: "domainId"' ) ; }
let path = '/projects/{projectId}/domains/{domainId}' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) . replace ( new RegExp ( '{domainId}' , 'g' ) , domainId ) ; let payload = { } ; return http . delete ( path , { 'content-type' : 'application/json' , } , payload ) ; } , updateDomainVerification : function ( projectId , domainId ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
if ( domainId === undefined ) { throw new Error ( 'Missing required parameter: "domainId"' ) ; }
let path = '/projects/{projectId}/domains/{domainId}/verification' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) . replace ( new RegExp ( '{domainId}' , 'g' ) , domainId ) ; let payload = { } ; return http . patch ( path , { 'content-type' : 'application/json' , } , payload ) ; } , listKeys : function ( projectId ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2020-01-31 06:12:29 +13:00
let path = '/projects/{projectId}/keys' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , createKey : function ( projectId , name , scopes ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2019-08-06 17:25:54 +12:00
if ( name === undefined ) { throw new Error ( 'Missing required parameter: "name"' ) ; }
if ( scopes === undefined ) { throw new Error ( 'Missing required parameter: "scopes"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/projects/{projectId}/keys' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) ; let payload = { } ; if ( name ) { payload [ 'name' ] = name ; }
if ( scopes ) { payload [ 'scopes' ] = scopes ; }
2020-01-31 06:12:29 +13:00
return http . post ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getKey : function ( projectId , keyId ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2019-08-06 17:25:54 +12:00
if ( keyId === undefined ) { throw new Error ( 'Missing required parameter: "keyId"' ) ; }
2020-01-31 06:12:29 +13:00
let path = '/projects/{projectId}/keys/{keyId}' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) . replace ( new RegExp ( '{keyId}' , 'g' ) , keyId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , updateKey : function ( projectId , keyId , name , scopes ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2019-08-06 17:25:54 +12:00
if ( keyId === undefined ) { throw new Error ( 'Missing required parameter: "keyId"' ) ; }
if ( name === undefined ) { throw new Error ( 'Missing required parameter: "name"' ) ; }
if ( scopes === undefined ) { throw new Error ( 'Missing required parameter: "scopes"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/projects/{projectId}/keys/{keyId}' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) . replace ( new RegExp ( '{keyId}' , 'g' ) , keyId ) ; let payload = { } ; if ( name ) { payload [ 'name' ] = name ; }
if ( scopes ) { payload [ 'scopes' ] = scopes ; }
2020-01-31 06:12:29 +13:00
return http . put ( path , { 'content-type' : 'application/json' , } , payload ) ; } , deleteKey : function ( projectId , keyId ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2019-08-06 17:25:54 +12:00
if ( keyId === undefined ) { throw new Error ( 'Missing required parameter: "keyId"' ) ; }
2020-02-17 00:41:03 +13:00
let path = '/projects/{projectId}/keys/{keyId}' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) . replace ( new RegExp ( '{keyId}' , 'g' ) , keyId ) ; let payload = { } ; return http . delete ( path , { 'content-type' : 'application/json' , } , payload ) ; } , updateOAuth2 : function ( projectId , provider , appId = '' , secret = '' ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2019-08-06 17:25:54 +12:00
if ( provider === undefined ) { throw new Error ( 'Missing required parameter: "provider"' ) ; }
2020-02-17 00:41:03 +13:00
let path = '/projects/{projectId}/oauth2' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) ; let payload = { } ; if ( provider ) { payload [ 'provider' ] = provider ; }
2019-10-09 17:16:38 +13:00
if ( appId ) { payload [ 'appId' ] = appId ; }
if ( secret ) { payload [ 'secret' ] = secret ; }
2020-01-31 06:12:29 +13:00
return http . patch ( path , { 'content-type' : 'application/json' , } , payload ) ; } , listPlatforms : function ( projectId ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2020-03-17 08:42:07 +13:00
let path = '/projects/{projectId}/platforms' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , createPlatform : function ( projectId , type , name , key = '' , store = '' , hostname = '' ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2019-08-06 17:25:54 +12:00
if ( type === undefined ) { throw new Error ( 'Missing required parameter: "type"' ) ; }
if ( name === undefined ) { throw new Error ( 'Missing required parameter: "name"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/projects/{projectId}/platforms' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) ; let payload = { } ; if ( type ) { payload [ 'type' ] = type ; }
if ( name ) { payload [ 'name' ] = name ; }
if ( key ) { payload [ 'key' ] = key ; }
if ( store ) { payload [ 'store' ] = store ; }
2020-03-17 08:42:07 +13:00
if ( hostname ) { payload [ 'hostname' ] = hostname ; }
2020-01-31 06:12:29 +13:00
return http . post ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getPlatform : function ( projectId , platformId ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2019-08-06 17:25:54 +12:00
if ( platformId === undefined ) { throw new Error ( 'Missing required parameter: "platformId"' ) ; }
2020-03-17 08:42:07 +13:00
let path = '/projects/{projectId}/platforms/{platformId}' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) . replace ( new RegExp ( '{platformId}' , 'g' ) , platformId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , updatePlatform : function ( projectId , platformId , name , key = '' , store = '' , hostname = '' ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2019-08-06 17:25:54 +12:00
if ( platformId === undefined ) { throw new Error ( 'Missing required parameter: "platformId"' ) ; }
if ( name === undefined ) { throw new Error ( 'Missing required parameter: "name"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/projects/{projectId}/platforms/{platformId}' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) . replace ( new RegExp ( '{platformId}' , 'g' ) , platformId ) ; let payload = { } ; if ( name ) { payload [ 'name' ] = name ; }
if ( key ) { payload [ 'key' ] = key ; }
if ( store ) { payload [ 'store' ] = store ; }
2020-03-17 08:42:07 +13:00
if ( hostname ) { payload [ 'hostname' ] = hostname ; }
2020-01-31 06:12:29 +13:00
return http . put ( path , { 'content-type' : 'application/json' , } , payload ) ; } , deletePlatform : function ( projectId , platformId ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2019-08-06 17:25:54 +12:00
if ( platformId === undefined ) { throw new Error ( 'Missing required parameter: "platformId"' ) ; }
2020-01-31 06:12:29 +13:00
let path = '/projects/{projectId}/platforms/{platformId}' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) . replace ( new RegExp ( '{platformId}' , 'g' ) , platformId ) ; let payload = { } ; return http . delete ( path , { 'content-type' : 'application/json' , } , payload ) ; } , listTasks : function ( projectId ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
let path = '/projects/{projectId}/tasks' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , createTask : function ( projectId , name , status , schedule , security , httpMethod , httpUrl , httpHeaders = [ ] , httpUser = '' , httpPass = '' ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2019-08-06 17:25:54 +12:00
if ( name === undefined ) { throw new Error ( 'Missing required parameter: "name"' ) ; }
if ( status === undefined ) { throw new Error ( 'Missing required parameter: "status"' ) ; }
if ( schedule === undefined ) { throw new Error ( 'Missing required parameter: "schedule"' ) ; }
if ( security === undefined ) { throw new Error ( 'Missing required parameter: "security"' ) ; }
if ( httpMethod === undefined ) { throw new Error ( 'Missing required parameter: "httpMethod"' ) ; }
if ( httpUrl === undefined ) { throw new Error ( 'Missing required parameter: "httpUrl"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/projects/{projectId}/tasks' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) ; let payload = { } ; if ( name ) { payload [ 'name' ] = name ; }
if ( status ) { payload [ 'status' ] = status ; }
if ( schedule ) { payload [ 'schedule' ] = schedule ; }
if ( security ) { payload [ 'security' ] = security ; }
if ( httpMethod ) { payload [ 'httpMethod' ] = httpMethod ; }
if ( httpUrl ) { payload [ 'httpUrl' ] = httpUrl ; }
if ( httpHeaders ) { payload [ 'httpHeaders' ] = httpHeaders ; }
if ( httpUser ) { payload [ 'httpUser' ] = httpUser ; }
if ( httpPass ) { payload [ 'httpPass' ] = httpPass ; }
2020-01-31 06:12:29 +13:00
return http . post ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getTask : function ( projectId , taskId ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2019-08-06 17:25:54 +12:00
if ( taskId === undefined ) { throw new Error ( 'Missing required parameter: "taskId"' ) ; }
2020-01-31 06:12:29 +13:00
let path = '/projects/{projectId}/tasks/{taskId}' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) . replace ( new RegExp ( '{taskId}' , 'g' ) , taskId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , updateTask : function ( projectId , taskId , name , status , schedule , security , httpMethod , httpUrl , httpHeaders = [ ] , httpUser = '' , httpPass = '' ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2019-08-06 17:25:54 +12:00
if ( taskId === undefined ) { throw new Error ( 'Missing required parameter: "taskId"' ) ; }
if ( name === undefined ) { throw new Error ( 'Missing required parameter: "name"' ) ; }
if ( status === undefined ) { throw new Error ( 'Missing required parameter: "status"' ) ; }
if ( schedule === undefined ) { throw new Error ( 'Missing required parameter: "schedule"' ) ; }
if ( security === undefined ) { throw new Error ( 'Missing required parameter: "security"' ) ; }
if ( httpMethod === undefined ) { throw new Error ( 'Missing required parameter: "httpMethod"' ) ; }
if ( httpUrl === undefined ) { throw new Error ( 'Missing required parameter: "httpUrl"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/projects/{projectId}/tasks/{taskId}' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) . replace ( new RegExp ( '{taskId}' , 'g' ) , taskId ) ; let payload = { } ; if ( name ) { payload [ 'name' ] = name ; }
if ( status ) { payload [ 'status' ] = status ; }
if ( schedule ) { payload [ 'schedule' ] = schedule ; }
if ( security ) { payload [ 'security' ] = security ; }
if ( httpMethod ) { payload [ 'httpMethod' ] = httpMethod ; }
if ( httpUrl ) { payload [ 'httpUrl' ] = httpUrl ; }
if ( httpHeaders ) { payload [ 'httpHeaders' ] = httpHeaders ; }
if ( httpUser ) { payload [ 'httpUser' ] = httpUser ; }
if ( httpPass ) { payload [ 'httpPass' ] = httpPass ; }
2020-01-31 06:12:29 +13:00
return http . put ( path , { 'content-type' : 'application/json' , } , payload ) ; } , deleteTask : function ( projectId , taskId ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2019-08-06 17:25:54 +12:00
if ( taskId === undefined ) { throw new Error ( 'Missing required parameter: "taskId"' ) ; }
2020-12-31 01:25:09 +13:00
let path = '/projects/{projectId}/tasks/{taskId}' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) . replace ( new RegExp ( '{taskId}' , 'g' ) , taskId ) ; let payload = { } ; return http . delete ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getUsage : function ( projectId , range = '30d' ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2020-04-24 23:24:04 +12:00
let path = '/projects/{projectId}/usage' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) ; let payload = { } ; if ( range ) { payload [ 'range' ] = range ; }
return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , listWebhooks : function ( projectId ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2020-01-31 06:12:29 +13:00
let path = '/projects/{projectId}/webhooks' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , createWebhook : function ( projectId , name , events , url , security , httpUser = '' , httpPass = '' ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2019-08-06 17:25:54 +12:00
if ( name === undefined ) { throw new Error ( 'Missing required parameter: "name"' ) ; }
if ( events === undefined ) { throw new Error ( 'Missing required parameter: "events"' ) ; }
if ( url === undefined ) { throw new Error ( 'Missing required parameter: "url"' ) ; }
if ( security === undefined ) { throw new Error ( 'Missing required parameter: "security"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/projects/{projectId}/webhooks' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) ; let payload = { } ; if ( name ) { payload [ 'name' ] = name ; }
if ( events ) { payload [ 'events' ] = events ; }
if ( url ) { payload [ 'url' ] = url ; }
if ( security ) { payload [ 'security' ] = security ; }
if ( httpUser ) { payload [ 'httpUser' ] = httpUser ; }
if ( httpPass ) { payload [ 'httpPass' ] = httpPass ; }
2020-01-31 06:12:29 +13:00
return http . post ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getWebhook : function ( projectId , webhookId ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2019-08-06 17:25:54 +12:00
if ( webhookId === undefined ) { throw new Error ( 'Missing required parameter: "webhookId"' ) ; }
2020-01-31 06:12:29 +13:00
let path = '/projects/{projectId}/webhooks/{webhookId}' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) . replace ( new RegExp ( '{webhookId}' , 'g' ) , webhookId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , updateWebhook : function ( projectId , webhookId , name , events , url , security , httpUser = '' , httpPass = '' ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2019-08-06 17:25:54 +12:00
if ( webhookId === undefined ) { throw new Error ( 'Missing required parameter: "webhookId"' ) ; }
if ( name === undefined ) { throw new Error ( 'Missing required parameter: "name"' ) ; }
if ( events === undefined ) { throw new Error ( 'Missing required parameter: "events"' ) ; }
if ( url === undefined ) { throw new Error ( 'Missing required parameter: "url"' ) ; }
if ( security === undefined ) { throw new Error ( 'Missing required parameter: "security"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/projects/{projectId}/webhooks/{webhookId}' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) . replace ( new RegExp ( '{webhookId}' , 'g' ) , webhookId ) ; let payload = { } ; if ( name ) { payload [ 'name' ] = name ; }
if ( events ) { payload [ 'events' ] = events ; }
if ( url ) { payload [ 'url' ] = url ; }
if ( security ) { payload [ 'security' ] = security ; }
if ( httpUser ) { payload [ 'httpUser' ] = httpUser ; }
if ( httpPass ) { payload [ 'httpPass' ] = httpPass ; }
2020-01-31 06:12:29 +13:00
return http . put ( path , { 'content-type' : 'application/json' , } , payload ) ; } , deleteWebhook : function ( projectId , webhookId ) { if ( projectId === undefined ) { throw new Error ( 'Missing required parameter: "projectId"' ) ; }
2019-08-06 17:25:54 +12:00
if ( webhookId === undefined ) { throw new Error ( 'Missing required parameter: "webhookId"' ) ; }
2020-01-31 09:58:49 +13:00
let path = '/projects/{projectId}/webhooks/{webhookId}' . replace ( new RegExp ( '{projectId}' , 'g' ) , projectId ) . replace ( new RegExp ( '{webhookId}' , 'g' ) , webhookId ) ; let payload = { } ; return http . delete ( path , { 'content-type' : 'application/json' , } , payload ) ; } } ; let storage = { listFiles : function ( search = '' , limit = 25 , offset = 0 , orderType = 'ASC' ) { let path = '/storage/files' ; let payload = { } ; if ( search ) { payload [ 'search' ] = search ; }
2019-10-09 17:16:38 +13:00
if ( limit ) { payload [ 'limit' ] = limit ; }
if ( offset ) { payload [ 'offset' ] = offset ; }
if ( orderType ) { payload [ 'orderType' ] = orderType ; }
2020-01-31 09:58:49 +13:00
return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , createFile : function ( file , read , write ) { if ( file === undefined ) { throw new Error ( 'Missing required parameter: "file"' ) ; }
2020-01-31 06:12:29 +13:00
if ( read === undefined ) { throw new Error ( 'Missing required parameter: "read"' ) ; }
if ( write === undefined ) { throw new Error ( 'Missing required parameter: "write"' ) ; }
let path = '/storage/files' ; let payload = { } ; if ( file ) { payload [ 'file' ] = file ; }
2019-10-09 17:16:38 +13:00
if ( read ) { payload [ 'read' ] = read ; }
if ( write ) { payload [ 'write' ] = write ; }
2020-01-31 09:58:49 +13:00
return http . post ( path , { 'content-type' : 'multipart/form-data' , } , payload ) ; } , getFile : function ( fileId ) { if ( fileId === undefined ) { throw new Error ( 'Missing required parameter: "fileId"' ) ; }
let path = '/storage/files/{fileId}' . replace ( new RegExp ( '{fileId}' , 'g' ) , fileId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , updateFile : function ( fileId , read , write ) { if ( fileId === undefined ) { throw new Error ( 'Missing required parameter: "fileId"' ) ; }
2020-01-31 06:12:29 +13:00
if ( read === undefined ) { throw new Error ( 'Missing required parameter: "read"' ) ; }
if ( write === undefined ) { throw new Error ( 'Missing required parameter: "write"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/storage/files/{fileId}' . replace ( new RegExp ( '{fileId}' , 'g' ) , fileId ) ; let payload = { } ; if ( read ) { payload [ 'read' ] = read ; }
if ( write ) { payload [ 'write' ] = write ; }
2020-01-31 09:58:49 +13:00
return http . put ( path , { 'content-type' : 'application/json' , } , payload ) ; } , deleteFile : function ( fileId ) { if ( fileId === undefined ) { throw new Error ( 'Missing required parameter: "fileId"' ) ; }
let path = '/storage/files/{fileId}' . replace ( new RegExp ( '{fileId}' , 'g' ) , fileId ) ; let payload = { } ; return http . delete ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getFileDownload : function ( fileId ) { if ( fileId === undefined ) { throw new Error ( 'Missing required parameter: "fileId"' ) ; }
2020-06-17 07:39:14 +12:00
let path = '/storage/files/{fileId}/download' . replace ( new RegExp ( '{fileId}' , 'g' ) , fileId ) ; let payload = { } ; payload [ 'project' ] = config . project ; payload [ 'key' ] = config . key ; let query = [ ] ; for ( let p in payload ) { if ( Array . isArray ( payload [ p ] ) ) { for ( let index = 0 ; index < payload [ p ] . length ; index ++ ) { let param = payload [ p ] [ index ] ; query . push ( encodeURIComponent ( p + '[]' ) + "=" + encodeURIComponent ( param ) ) ; } }
else { query . push ( encodeURIComponent ( p ) + "=" + encodeURIComponent ( payload [ p ] ) ) ; } }
query = query . join ( "&" ) ; return config . endpoint + path + ( ( query ) ? '?' + query : '' ) ; } , getFilePreview : function ( fileId , width = 0 , height = 0 , quality = 100 , background = '' , output = '' ) { if ( fileId === undefined ) { throw new Error ( 'Missing required parameter: "fileId"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/storage/files/{fileId}/preview' . replace ( new RegExp ( '{fileId}' , 'g' ) , fileId ) ; let payload = { } ; if ( width ) { payload [ 'width' ] = width ; }
if ( height ) { payload [ 'height' ] = height ; }
if ( quality ) { payload [ 'quality' ] = quality ; }
if ( background ) { payload [ 'background' ] = background ; }
if ( output ) { payload [ 'output' ] = output ; }
2020-06-17 07:39:14 +12:00
payload [ 'project' ] = config . project ; payload [ 'key' ] = config . key ; let query = [ ] ; for ( let p in payload ) { if ( Array . isArray ( payload [ p ] ) ) { for ( let index = 0 ; index < payload [ p ] . length ; index ++ ) { let param = payload [ p ] [ index ] ; query . push ( encodeURIComponent ( p + '[]' ) + "=" + encodeURIComponent ( param ) ) ; } }
else { query . push ( encodeURIComponent ( p ) + "=" + encodeURIComponent ( payload [ p ] ) ) ; } }
2020-12-31 01:25:09 +13:00
query = query . join ( "&" ) ; return config . endpoint + path + ( ( query ) ? '?' + query : '' ) ; } , getFileView : function ( fileId ) { if ( fileId === undefined ) { throw new Error ( 'Missing required parameter: "fileId"' ) ; }
let path = '/storage/files/{fileId}/view' . replace ( new RegExp ( '{fileId}' , 'g' ) , fileId ) ; let payload = { } ; payload [ 'project' ] = config . project ; payload [ 'key' ] = config . key ; let query = [ ] ; for ( let p in payload ) { if ( Array . isArray ( payload [ p ] ) ) { for ( let index = 0 ; index < payload [ p ] . length ; index ++ ) { let param = payload [ p ] [ index ] ; query . push ( encodeURIComponent ( p + '[]' ) + "=" + encodeURIComponent ( param ) ) ; } }
2020-06-17 07:39:14 +12:00
else { query . push ( encodeURIComponent ( p ) + "=" + encodeURIComponent ( payload [ p ] ) ) ; } }
query = query . join ( "&" ) ; return config . endpoint + path + ( ( query ) ? '?' + query : '' ) ; } } ; let teams = { list : function ( search = '' , limit = 25 , offset = 0 , orderType = 'ASC' ) { let path = '/teams' ; let payload = { } ; if ( search ) { payload [ 'search' ] = search ; }
2019-10-09 17:16:38 +13:00
if ( limit ) { payload [ 'limit' ] = limit ; }
if ( offset ) { payload [ 'offset' ] = offset ; }
if ( orderType ) { payload [ 'orderType' ] = orderType ; }
2020-01-31 06:12:29 +13:00
return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , create : function ( name , roles = [ "owner" ] ) { if ( name === undefined ) { throw new Error ( 'Missing required parameter: "name"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/teams' ; let payload = { } ; if ( name ) { payload [ 'name' ] = name ; }
if ( roles ) { payload [ 'roles' ] = roles ; }
2020-01-31 06:12:29 +13:00
return http . post ( path , { 'content-type' : 'application/json' , } , payload ) ; } , get : function ( teamId ) { if ( teamId === undefined ) { throw new Error ( 'Missing required parameter: "teamId"' ) ; }
let path = '/teams/{teamId}' . replace ( new RegExp ( '{teamId}' , 'g' ) , teamId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , update : function ( teamId , name ) { if ( teamId === undefined ) { throw new Error ( 'Missing required parameter: "teamId"' ) ; }
2019-08-06 16:58:32 +12:00
if ( name === undefined ) { throw new Error ( 'Missing required parameter: "name"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/teams/{teamId}' . replace ( new RegExp ( '{teamId}' , 'g' ) , teamId ) ; let payload = { } ; if ( name ) { payload [ 'name' ] = name ; }
2020-01-31 06:12:29 +13:00
return http . put ( path , { 'content-type' : 'application/json' , } , payload ) ; } , delete : function ( teamId ) { if ( teamId === undefined ) { throw new Error ( 'Missing required parameter: "teamId"' ) ; }
2020-06-08 16:38:39 +12:00
let path = '/teams/{teamId}' . replace ( new RegExp ( '{teamId}' , 'g' ) , teamId ) ; let payload = { } ; return http . delete ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getMemberships : function ( teamId , search = '' , limit = 25 , offset = 0 , orderType = 'ASC' ) { if ( teamId === undefined ) { throw new Error ( 'Missing required parameter: "teamId"' ) ; }
let path = '/teams/{teamId}/memberships' . replace ( new RegExp ( '{teamId}' , 'g' ) , teamId ) ; let payload = { } ; if ( search ) { payload [ 'search' ] = search ; }
if ( limit ) { payload [ 'limit' ] = limit ; }
if ( offset ) { payload [ 'offset' ] = offset ; }
if ( orderType ) { payload [ 'orderType' ] = orderType ; }
return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , createMembership : function ( teamId , email , roles , url , name = '' ) { if ( teamId === undefined ) { throw new Error ( 'Missing required parameter: "teamId"' ) ; }
2019-08-06 16:58:32 +12:00
if ( email === undefined ) { throw new Error ( 'Missing required parameter: "email"' ) ; }
if ( roles === undefined ) { throw new Error ( 'Missing required parameter: "roles"' ) ; }
2020-01-31 06:12:29 +13:00
if ( url === undefined ) { throw new Error ( 'Missing required parameter: "url"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/teams/{teamId}/memberships' . replace ( new RegExp ( '{teamId}' , 'g' ) , teamId ) ; let payload = { } ; if ( email ) { payload [ 'email' ] = email ; }
if ( name ) { payload [ 'name' ] = name ; }
if ( roles ) { payload [ 'roles' ] = roles ; }
2020-01-31 06:12:29 +13:00
if ( url ) { payload [ 'url' ] = url ; }
return http . post ( path , { 'content-type' : 'application/json' , } , payload ) ; } , deleteMembership : function ( teamId , inviteId ) { if ( teamId === undefined ) { throw new Error ( 'Missing required parameter: "teamId"' ) ; }
2019-08-06 16:58:32 +12:00
if ( inviteId === undefined ) { throw new Error ( 'Missing required parameter: "inviteId"' ) ; }
2020-01-31 06:12:29 +13:00
let path = '/teams/{teamId}/memberships/{inviteId}' . replace ( new RegExp ( '{teamId}' , 'g' ) , teamId ) . replace ( new RegExp ( '{inviteId}' , 'g' ) , inviteId ) ; let payload = { } ; return http . delete ( path , { 'content-type' : 'application/json' , } , payload ) ; } , updateMembershipStatus : function ( teamId , inviteId , userId , secret ) { if ( teamId === undefined ) { throw new Error ( 'Missing required parameter: "teamId"' ) ; }
2019-08-06 16:58:32 +12:00
if ( inviteId === undefined ) { throw new Error ( 'Missing required parameter: "inviteId"' ) ; }
if ( userId === undefined ) { throw new Error ( 'Missing required parameter: "userId"' ) ; }
if ( secret === undefined ) { throw new Error ( 'Missing required parameter: "secret"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/teams/{teamId}/memberships/{inviteId}/status' . replace ( new RegExp ( '{teamId}' , 'g' ) , teamId ) . replace ( new RegExp ( '{inviteId}' , 'g' ) , inviteId ) ; let payload = { } ; if ( userId ) { payload [ 'userId' ] = userId ; }
if ( secret ) { payload [ 'secret' ] = secret ; }
2020-01-31 13:00:31 +13:00
return http . patch ( path , { 'content-type' : 'application/json' , } , payload ) ; } } ; let users = { list : function ( search = '' , limit = 25 , offset = 0 , orderType = 'ASC' ) { let path = '/users' ; let payload = { } ; if ( search ) { payload [ 'search' ] = search ; }
2019-10-09 17:16:38 +13:00
if ( limit ) { payload [ 'limit' ] = limit ; }
if ( offset ) { payload [ 'offset' ] = offset ; }
if ( orderType ) { payload [ 'orderType' ] = orderType ; }
2020-01-31 06:12:29 +13:00
return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , create : function ( email , password , name = '' ) { if ( email === undefined ) { throw new Error ( 'Missing required parameter: "email"' ) ; }
2019-08-06 16:58:32 +12:00
if ( password === undefined ) { throw new Error ( 'Missing required parameter: "password"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/users' ; let payload = { } ; if ( email ) { payload [ 'email' ] = email ; }
if ( password ) { payload [ 'password' ] = password ; }
if ( name ) { payload [ 'name' ] = name ; }
2020-01-31 06:12:29 +13:00
return http . post ( path , { 'content-type' : 'application/json' , } , payload ) ; } , get : function ( userId ) { if ( userId === undefined ) { throw new Error ( 'Missing required parameter: "userId"' ) ; }
2020-09-20 18:12:33 +12:00
let path = '/users/{userId}' . replace ( new RegExp ( '{userId}' , 'g' ) , userId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , deleteUser : function ( userId ) { if ( userId === undefined ) { throw new Error ( 'Missing required parameter: "userId"' ) ; }
let path = '/users/{userId}' . replace ( new RegExp ( '{userId}' , 'g' ) , userId ) ; let payload = { } ; return http . delete ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getLogs : function ( userId ) { if ( userId === undefined ) { throw new Error ( 'Missing required parameter: "userId"' ) ; }
2020-01-31 06:12:29 +13:00
let path = '/users/{userId}/logs' . replace ( new RegExp ( '{userId}' , 'g' ) , userId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getPrefs : function ( userId ) { if ( userId === undefined ) { throw new Error ( 'Missing required parameter: "userId"' ) ; }
let path = '/users/{userId}/prefs' . replace ( new RegExp ( '{userId}' , 'g' ) , userId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , updatePrefs : function ( userId , prefs ) { if ( userId === undefined ) { throw new Error ( 'Missing required parameter: "userId"' ) ; }
2019-10-09 17:16:38 +13:00
if ( prefs === undefined ) { throw new Error ( 'Missing required parameter: "prefs"' ) ; }
let path = '/users/{userId}/prefs' . replace ( new RegExp ( '{userId}' , 'g' ) , userId ) ; let payload = { } ; if ( prefs ) { payload [ 'prefs' ] = prefs ; }
2020-01-31 06:12:29 +13:00
return http . patch ( path , { 'content-type' : 'application/json' , } , payload ) ; } , getSessions : function ( userId ) { if ( userId === undefined ) { throw new Error ( 'Missing required parameter: "userId"' ) ; }
let path = '/users/{userId}/sessions' . replace ( new RegExp ( '{userId}' , 'g' ) , userId ) ; let payload = { } ; return http . get ( path , { 'content-type' : 'application/json' , } , payload ) ; } , deleteSessions : function ( userId ) { if ( userId === undefined ) { throw new Error ( 'Missing required parameter: "userId"' ) ; }
let path = '/users/{userId}/sessions' . replace ( new RegExp ( '{userId}' , 'g' ) , userId ) ; let payload = { } ; return http . delete ( path , { 'content-type' : 'application/json' , } , payload ) ; } , deleteSession : function ( userId , sessionId ) { if ( userId === undefined ) { throw new Error ( 'Missing required parameter: "userId"' ) ; }
2019-08-06 16:58:32 +12:00
if ( sessionId === undefined ) { throw new Error ( 'Missing required parameter: "sessionId"' ) ; }
2020-05-01 18:28:39 +12:00
let path = '/users/{userId}/sessions/{sessionId}' . replace ( new RegExp ( '{userId}' , 'g' ) , userId ) . replace ( new RegExp ( '{sessionId}' , 'g' ) , sessionId ) ; let payload = { } ; return http . delete ( path , { 'content-type' : 'application/json' , } , payload ) ; } , updateStatus : function ( userId , status ) { if ( userId === undefined ) { throw new Error ( 'Missing required parameter: "userId"' ) ; }
2019-08-06 16:58:32 +12:00
if ( status === undefined ) { throw new Error ( 'Missing required parameter: "status"' ) ; }
2019-10-09 17:16:38 +13:00
let path = '/users/{userId}/status' . replace ( new RegExp ( '{userId}' , 'g' ) , userId ) ; let payload = { } ; if ( status ) { payload [ 'status' ] = status ; }
2020-07-24 09:00:10 +12:00
return http . patch ( path , { 'content-type' : 'application/json' , } , payload ) ; } } ; return { setEndpoint : setEndpoint , setProject : setProject , setKey : setKey , setLocale : setLocale , setMode : setMode , account : account , avatars : avatars , database : database , functions : functions , health : health , locale : locale , projects : projects , storage : storage , teams : teams , users : users } ; } ; if ( typeof module !== "undefined" ) { module . exports = window . Appwrite ; } } ) ( ( typeof window !== "undefined" ) ? window : { } ) ; ( function ( global , factory ) { typeof exports === 'object' && typeof module !== 'undefined' ? module . exports = factory ( function ( ) { try { return require ( 'moment' ) ; } catch ( e ) { } } ( ) ) : typeof define === 'function' && define . amd ? define ( [ 'require' ] , function ( require ) { return factory ( function ( ) { try { return require ( 'moment' ) ; } catch ( e ) { } } ( ) ) ; } ) : ( global = global || self , global . Chart = factory ( global . moment ) ) ; } ( this , ( function ( moment ) { 'use strict' ; moment = moment && moment . hasOwnProperty ( 'default' ) ? moment [ 'default' ] : moment ; function createCommonjsModule ( fn , module ) { return module = { exports : { } } , fn ( module , module . exports ) , module . exports ; }
function getCjsExportFromNamespace ( n ) { return n && n [ 'default' ] || n ; }
var colorName = { "aliceblue" : [ 240 , 248 , 255 ] , "antiquewhite" : [ 250 , 235 , 215 ] , "aqua" : [ 0 , 255 , 255 ] , "aquamarine" : [ 127 , 255 , 212 ] , "azure" : [ 240 , 255 , 255 ] , "beige" : [ 245 , 245 , 220 ] , "bisque" : [ 255 , 228 , 196 ] , "black" : [ 0 , 0 , 0 ] , "blanchedalmond" : [ 255 , 235 , 205 ] , "blue" : [ 0 , 0 , 255 ] , "blueviolet" : [ 138 , 43 , 226 ] , "brown" : [ 165 , 42 , 42 ] , "burlywood" : [ 222 , 184 , 135 ] , "cadetblue" : [ 95 , 158 , 160 ] , "chartreuse" : [ 127 , 255 , 0 ] , "chocolate" : [ 210 , 105 , 30 ] , "coral" : [ 255 , 127 , 80 ] , "cornflowerblue" : [ 100 , 149 , 237 ] , "cornsilk" : [ 255 , 248 , 220 ] , "crimson" : [ 220 , 20 , 60 ] , "cyan" : [ 0 , 255 , 255 ] , "darkblue" : [ 0 , 0 , 139 ] , "darkcyan" : [ 0 , 139 , 139 ] , "darkgoldenrod" : [ 184 , 134 , 11 ] , "darkgray" : [ 169 , 169 , 169 ] , "darkgreen" : [ 0 , 100 , 0 ] , "darkgrey" : [ 169 , 169 , 169 ] , "darkkhaki" : [ 189 , 183 , 107 ] , "darkmagenta" : [ 139 , 0 , 139 ] , "darkolivegreen" : [ 85 , 107 , 47 ] , "darkorange" : [ 255 , 140 , 0 ] , "darkorchid" : [ 153 , 50 , 204 ] , "darkred" : [ 139 , 0 , 0 ] , "darksalmon" : [ 233 , 150 , 122 ] , "darkseagreen" : [ 143 , 188 , 143 ] , "darkslateblue" : [ 72 , 61 , 139 ] , "darkslategray" : [ 47 , 79 , 79 ] , "darkslategrey" : [ 47 , 79 , 79 ] , "darkturquoise" : [ 0 , 206 , 209 ] , "darkviolet" : [ 148 , 0 , 211 ] , "deeppink" : [ 255 , 20 , 147 ] , "deepskyblue" : [ 0 , 191 , 255 ] , "dimgray" : [ 105 , 105 , 105 ] , "dimgrey" : [ 105 , 105 , 105 ] , "dodgerblue" : [ 30 , 144 , 255 ] , "firebrick" : [ 178 , 34 , 34 ] , "floralwhite" : [ 255 , 250 , 240 ] , "forestgreen" : [ 34 , 139 , 34 ] , "fuchsia" : [ 255 , 0 , 255 ] , "gainsboro" : [ 220 , 220 , 220 ] , "ghostwhite" : [ 248 , 248 , 255 ] , "gold" : [ 255 , 215 , 0 ] , "goldenrod" : [ 218 , 165 , 32 ] , "gray" : [ 128 , 128 , 128 ] , "green" : [ 0 , 128 , 0 ] , "greenyellow" : [ 173 , 255 , 47 ] , "grey" : [ 128 , 128 , 128 ] , "honeydew" : [ 240 , 255 , 240 ] , "hotpink" : [ 255 , 105 , 180 ] , "indianred" : [ 205 , 92 , 92 ] , "indigo" : [ 75 , 0 , 130 ] , "ivory" : [ 255 , 255 , 240 ] , "khaki" : [ 240 , 230 , 140 ] , "lavender" : [ 230 , 230 , 250 ] , "lavenderblush" : [ 255 , 240 , 245 ] , "lawngreen" : [ 124 , 252 , 0 ] , "lemonchiffon" : [ 255 , 250 , 205 ] , "lightblue" : [ 173 , 216 , 230 ] , "lightcoral" : [ 240 , 128 , 128 ] , "lightcyan" : [ 224 , 255 , 255 ] , "lightgoldenrodyellow" : [ 250 , 250 , 210 ] , "lightgray" : [ 211 , 211 , 211 ] , "lightgreen" : [ 144 , 238 , 144 ] , "lightgrey" : [ 211 , 211 , 211 ] , "lightpink" : [ 255 , 182 , 193 ] , "lightsalmon" : [ 255 , 160 , 122 ] , "lightseagreen" : [ 32 , 178 , 170 ] , "lightskyblue" : [ 135 , 206 , 250 ] , "lightslategray" : [ 119 , 136 , 153 ] , "lightslategrey" : [ 119 , 136 , 153 ] , "lightsteelblue" : [ 176 , 196 , 222 ] , "lightyellow" : [ 255 , 255 , 224 ] , "lime" : [ 0 , 255 , 0 ] , "limegreen" : [ 50 , 205 , 50 ] , "linen" : [ 250 , 240 , 230 ] , "magenta" : [ 255 , 0 , 255 ] , "maroon" : [ 128 , 0 , 0 ] , "mediumaquamarine" : [ 102 , 205 , 170 ] , "mediumblue" : [ 0 , 0 , 205 ] , "mediumorchid" : [ 186 , 85 , 211 ] , "mediumpurple" : [ 147 , 112 , 219 ] , "mediumseagreen" : [ 60 , 179 , 113 ] , "mediumslateblue" : [ 123 , 104 , 238 ] , "mediumspringgreen" : [ 0 , 250 , 154 ] , "mediumturquoise" : [ 72 , 209 , 204 ] , "mediumvioletred" : [ 199 , 21 , 133 ] , "midnightblue" : [ 25 , 25 , 112 ] , "mintcream" : [ 245 , 255 , 250 ] , "mistyrose" : [ 255 , 228 , 225 ] , "moccasin" : [ 255 , 228 , 181 ] , "navajowhite" : [ 255 , 222 , 173 ] , "navy" : [ 0 , 0 , 128 ] , "oldlace" : [ 253 , 245 , 230 ] , "olive" : [ 128 , 128 , 0 ] , "olivedrab" : [ 107 , 142 , 35 ] , "orange" : [ 255 , 165 , 0 ] , "orangered" : [ 255 , 69 , 0 ] , "orchid" : [ 218 , 112 , 214 ] , "palegoldenrod" : [ 238 , 232 , 170 ] , "palegreen" : [ 152 , 251 , 152 ] , "paleturquoise" : [ 175 , 238 , 238 ] , "palevioletred" : [ 219 , 112 , 147 ] , "papayawhip" : [ 255 , 239 , 213 ] , "peachpuff" : [ 255 , 218 , 185 ] , "peru" : [ 205 , 133 , 63 ] , "pink" : [ 255 , 192 , 203 ] , "plum" : [ 221 , 160 , 221 ] , "powderblue" : [ 176 , 224 , 230 ] , "purple" : [ 128 , 0 , 128 ] , "rebeccapurple" : [ 102 , 51 , 153 ] , "red" : [ 255 , 0 , 0 ] , "rosybrown" : [ 188 , 143 , 143 ] , "royalblue" : [ 65 , 105 , 225 ] , "saddlebrown" : [ 139 , 69 , 19 ] , "salmon" : [ 250 , 128 , 114 ] , "sandybrown" : [ 244 , 164 , 96 ] , "seagreen" : [ 46 , 139 , 87 ] , "seashell" : [ 255 , 245 , 238 ] , "sienna" : [ 160 , 82 , 45 ] , "silver" : [ 192 , 192 , 192 ] , "skyblue" : [ 135 , 206 , 235 ] , "slateblue" : [ 106 , 90 , 205 ] , "slategray" : [ 112 , 128 , 144 ] , "slategrey" : [ 112 , 128 , 144 ] , "snow" : [ 255 , 250 , 250 ] , "springgreen" : [ 0 , 255 , 127 ] , "steelblue" : [ 70 , 130 , 180 ] , "tan" : [ 210 , 180 , 140 ] , "teal" : [ 0 , 128 , 128 ] , "thistle" : [ 216 , 191 , 216 ] , "tomato" : [ 255 , 99 , 71 ] , "turquoise" : [ 64 , 224 , 208 ] , "violet" : [ 238 , 130 , 238 ] , "wheat" : [ 245 , 222 , 179 ] , "white" : [ 255 , 255 , 255 ] , "whitesmoke" : [ 245 , 245 , 245 ] , "yellow" : [ 255 , 255 , 0 ] , "yellowgreen" : [ 154 , 205 , 50 ] } ; var conversions = createCommonjsModule ( function ( module ) { var reverseKeywords = { } ; for ( var key in colorName ) { if ( colorName . hasOwnProperty ( key ) ) { reverseKeywords [ colorName [ key ] ] = key ; } }
var convert = module . exports = { rgb : { channels : 3 , labels : 'rgb' } , hsl : { channels : 3 , labels : 'hsl' } , hsv : { channels : 3 , labels : 'hsv' } , hwb : { channels : 3 , labels : 'hwb' } , cmyk : { channels : 4 , labels : 'cmyk' } , xyz : { channels : 3 , labels : 'xyz' } , lab : { channels : 3 , labels : 'lab' } , lch : { channels : 3 , labels : 'lch' } , hex : { channels : 1 , labels : [ 'hex' ] } , keyword : { channels : 1 , labels : [ 'keyword' ] } , ansi16 : { channels : 1 , labels : [ 'ansi16' ] } , ansi256 : { channels : 1 , labels : [ 'ansi256' ] } , hcg : { channels : 3 , labels : [ 'h' , 'c' , 'g' ] } , apple : { channels : 3 , labels : [ 'r16' , 'g16' , 'b16' ] } , gray : { channels : 1 , labels : [ 'gray' ] } } ; for ( var model in convert ) { if ( convert . hasOwnProperty ( model ) ) { if ( ! ( 'channels' in convert [ model ] ) ) { throw new Error ( 'missing channels property: ' + model ) ; }
if ( ! ( 'labels' in convert [ model ] ) ) { throw new Error ( 'missing channel labels property: ' + model ) ; }
if ( convert [ model ] . labels . length !== convert [ model ] . channels ) { throw new Error ( 'channel and label counts mismatch: ' + model ) ; }
var channels = convert [ model ] . channels ; var labels = convert [ model ] . labels ; delete convert [ model ] . channels ; delete convert [ model ] . labels ; Object . defineProperty ( convert [ model ] , 'channels' , { value : channels } ) ; Object . defineProperty ( convert [ model ] , 'labels' , { value : labels } ) ; } }
convert . rgb . hsl = function ( rgb ) { var r = rgb [ 0 ] / 255 ; var g = rgb [ 1 ] / 255 ; var b = rgb [ 2 ] / 255 ; var min = Math . min ( r , g , b ) ; var max = Math . max ( r , g , b ) ; var delta = max - min ; var h ; var s ; var l ; if ( max === min ) { h = 0 ; } else if ( r === max ) { h = ( g - b ) / delta ; } else if ( g === max ) { h = 2 + ( b - r ) / delta ; } else if ( b === max ) { h = 4 + ( r - g ) / delta ; }
h = Math . min ( h * 60 , 360 ) ; if ( h < 0 ) { h += 360 ; }
l = ( min + max ) / 2 ; if ( max === min ) { s = 0 ; } else if ( l <= 0.5 ) { s = delta / ( max + min ) ; } else { s = delta / ( 2 - max - min ) ; }
return [ h , s * 100 , l * 100 ] ; } ; convert . rgb . hsv = function ( rgb ) { var rdif ; var gdif ; var bdif ; var h ; var s ; var r = rgb [ 0 ] / 255 ; var g = rgb [ 1 ] / 255 ; var b = rgb [ 2 ] / 255 ; var v = Math . max ( r , g , b ) ; var diff = v - Math . min ( r , g , b ) ; var diffc = function ( c ) { return ( v - c ) / 6 / diff + 1 / 2 ; } ; if ( diff === 0 ) { h = s = 0 ; } else { s = diff / v ; rdif = diffc ( r ) ; gdif = diffc ( g ) ; bdif = diffc ( b ) ; if ( r === v ) { h = bdif - gdif ; } else if ( g === v ) { h = ( 1 / 3 ) + rdif - bdif ; } else if ( b === v ) { h = ( 2 / 3 ) + gdif - rdif ; }
if ( h < 0 ) { h += 1 ; } else if ( h > 1 ) { h -= 1 ; } }
return [ h * 360 , s * 100 , v * 100 ] ; } ; convert . rgb . hwb = function ( rgb ) { var r = rgb [ 0 ] ; var g = rgb [ 1 ] ; var b = rgb [ 2 ] ; var h = convert . rgb . hsl ( rgb ) [ 0 ] ; var w = 1 / 255 * Math . min ( r , Math . min ( g , b ) ) ; b = 1 - 1 / 255 * Math . max ( r , Math . max ( g , b ) ) ; return [ h , w * 100 , b * 100 ] ; } ; convert . rgb . cmyk = function ( rgb ) { var r = rgb [ 0 ] / 255 ; var g = rgb [ 1 ] / 255 ; var b = rgb [ 2 ] / 255 ; var c ; var m ; var y ; var k ; k = Math . min ( 1 - r , 1 - g , 1 - b ) ; c = ( 1 - r - k ) / ( 1 - k ) || 0 ; m = ( 1 - g - k ) / ( 1 - k ) || 0 ; y = ( 1 - b - k ) / ( 1 - k ) || 0 ; return [ c * 100 , m * 100 , y * 100 , k * 100 ] ; } ; function comparativeDistance ( x , y ) { return ( Math . pow ( x [ 0 ] - y [ 0 ] , 2 ) +
Math . pow ( x [ 1 ] - y [ 1 ] , 2 ) +
Math . pow ( x [ 2 ] - y [ 2 ] , 2 ) ) ; }
convert . rgb . keyword = function ( rgb ) { var reversed = reverseKeywords [ rgb ] ; if ( reversed ) { return reversed ; }
var currentClosestDistance = Infinity ; var currentClosestKeyword ; for ( var keyword in colorName ) { if ( colorName . hasOwnProperty ( keyword ) ) { var value = colorName [ keyword ] ; var distance = comparativeDistance ( rgb , value ) ; if ( distance < currentClosestDistance ) { currentClosestDistance = distance ; currentClosestKeyword = keyword ; } } }
return currentClosestKeyword ; } ; convert . keyword . rgb = function ( keyword ) { return colorName [ keyword ] ; } ; convert . rgb . xyz = function ( rgb ) { var r = rgb [ 0 ] / 255 ; var g = rgb [ 1 ] / 255 ; var b = rgb [ 2 ] / 255 ; r = r > 0.04045 ? Math . pow ( ( ( r + 0.055 ) / 1.055 ) , 2.4 ) : ( r / 12.92 ) ; g = g > 0.04045 ? Math . pow ( ( ( g + 0.055 ) / 1.055 ) , 2.4 ) : ( g / 12.92 ) ; b = b > 0.04045 ? Math . pow ( ( ( b + 0.055 ) / 1.055 ) , 2.4 ) : ( b / 12.92 ) ; var x = ( r * 0.4124 ) + ( g * 0.3576 ) + ( b * 0.1805 ) ; var y = ( r * 0.2126 ) + ( g * 0.7152 ) + ( b * 0.0722 ) ; var z = ( r * 0.0193 ) + ( g * 0.1192 ) + ( b * 0.9505 ) ; return [ x * 100 , y * 100 , z * 100 ] ; } ; convert . rgb . lab = function ( rgb ) { var xyz = convert . rgb . xyz ( rgb ) ; var x = xyz [ 0 ] ; var y = xyz [ 1 ] ; var z = xyz [ 2 ] ; var l ; var a ; var b ; x /= 95.047 ; y /= 100 ; z /= 108.883 ; x = x > 0.008856 ? Math . pow ( x , 1 / 3 ) : ( 7.787 * x ) + ( 16 / 116 ) ; y = y > 0.008856 ? Math . pow ( y , 1 / 3 ) : ( 7.787 * y ) + ( 16 / 116 ) ; z = z > 0.008856 ? Math . pow ( z , 1 / 3 ) : ( 7.787 * z ) + ( 16 / 116 ) ; l = ( 116 * y ) - 16 ; a = 500 * ( x - y ) ; b = 200 * ( y - z ) ; return [ l , a , b ] ; } ; convert . hsl . rgb = function ( hsl ) { var h = hsl [ 0 ] / 360 ; var s = hsl [ 1 ] / 100 ; var l = hsl [ 2 ] / 100 ; var t1 ; var t2 ; var t3 ; var rgb ; var val ; if ( s === 0 ) { val = l * 255 ; return [ val , val , val ] ; }
if ( l < 0.5 ) { t2 = l * ( 1 + s ) ; } else { t2 = l + s - l * s ; }
t1 = 2 * l - t2 ; rgb = [ 0 , 0 , 0 ] ; for ( var i = 0 ; i < 3 ; i ++ ) { t3 = h + 1 / 3 * - ( i - 1 ) ; if ( t3 < 0 ) { t3 ++ ; }
if ( t3 > 1 ) { t3 -- ; }
if ( 6 * t3 < 1 ) { val = t1 + ( t2 - t1 ) * 6 * t3 ; } else if ( 2 * t3 < 1 ) { val = t2 ; } else if ( 3 * t3 < 2 ) { val = t1 + ( t2 - t1 ) * ( 2 / 3 - t3 ) * 6 ; } else { val = t1 ; }
rgb [ i ] = val * 255 ; }
return rgb ; } ; convert . hsl . hsv = function ( hsl ) { var h = hsl [ 0 ] ; var s = hsl [ 1 ] / 100 ; var l = hsl [ 2 ] / 100 ; var smin = s ; var lmin = Math . max ( l , 0.01 ) ; var sv ; var v ; l *= 2 ; s *= ( l <= 1 ) ? l : 2 - l ; smin *= lmin <= 1 ? lmin : 2 - lmin ; v = ( l + s ) / 2 ; sv = l === 0 ? ( 2 * smin ) / ( lmin + smin ) : ( 2 * s ) / ( l + s ) ; return [ h , sv * 100 , v * 100 ] ; } ; convert . hsv . rgb = function ( hsv ) { var h = hsv [ 0 ] / 60 ; var s = hsv [ 1 ] / 100 ; var v = hsv [ 2 ] / 100 ; var hi = Math . floor ( h ) % 6 ; var f = h - Math . floor ( h ) ; var p = 255 * v * ( 1 - s ) ; var q = 255 * v * ( 1 - ( s * f ) ) ; var t = 255 * v * ( 1 - ( s * ( 1 - f ) ) ) ; v *= 255 ; switch ( hi ) { case 0 : return [ v , t , p ] ; case 1 : return [ q , v , p ] ; case 2 : return [ p , v , t ] ; case 3 : return [ p , q , v ] ; case 4 : return [ t , p , v ] ; case 5 : return [ v , p , q ] ; } } ; convert . hsv . hsl = function ( hsv ) { var h = hsv [ 0 ] ; var s = hsv [ 1 ] / 100 ; var v = hsv [ 2 ] / 100 ; var vmin = Math . max ( v , 0.01 ) ; var lmin ; var sl ; var l ; l = ( 2 - s ) * v ; lmin = ( 2 - s ) * vmin ; sl = s * vmin ; sl /= ( lmin <= 1 ) ? lmin : 2 - lmin ; sl = sl || 0 ; l /= 2 ; return [ h , sl * 100 , l * 100 ] ; } ; convert . hwb . rgb = function ( hwb ) { var h = hwb [ 0 ] / 360 ; var wh = hwb [ 1 ] / 100 ; var bl = hwb [ 2 ] / 100 ; var ratio = wh + bl ; var i ; var v ; var f ; var n ; if ( ratio > 1 ) { wh /= ratio ; bl /= ratio ; }
i = Math . floor ( 6 * h ) ; v = 1 - bl ; f = 6 * h - i ; if ( ( i & 0x01 ) !== 0 ) { f = 1 - f ; }
n = wh + f * ( v - wh ) ; var r ; var g ; var b ; switch ( i ) { default : case 6 : case 0 : r = v ; g = n ; b = wh ; break ; case 1 : r = n ; g = v ; b = wh ; break ; case 2 : r = wh ; g = v ; b = n ; break ; case 3 : r = wh ; g = n ; b = v ; break ; case 4 : r = n ; g = wh ; b = v ; break ; case 5 : r = v ; g = wh ; b = n ; break ; }
return [ r * 255 , g * 255 , b * 255 ] ; } ; convert . cmyk . rgb = function ( cmyk ) { var c = cmyk [ 0 ] / 100 ; var m = cmyk [ 1 ] / 100 ; var y = cmyk [ 2 ] / 100 ; var k = cmyk [ 3 ] / 100 ; var r ; var g ; var b ; r = 1 - Math . min ( 1 , c * ( 1 - k ) + k ) ; g = 1 - Math . min ( 1 , m * ( 1 - k ) + k ) ; b = 1 - Math . min ( 1 , y * ( 1 - k ) + k ) ; return [ r * 255 , g * 255 , b * 255 ] ; } ; convert . xyz . rgb = function ( xyz ) { var x = xyz [ 0 ] / 100 ; var y = xyz [ 1 ] / 100 ; var z = xyz [ 2 ] / 100 ; var r ; var g ; var b ; r = ( x * 3.2406 ) + ( y * - 1.5372 ) + ( z * - 0.4986 ) ; g = ( x * - 0.9689 ) + ( y * 1.8758 ) + ( z * 0.0415 ) ; b = ( x * 0.0557 ) + ( y * - 0.2040 ) + ( z * 1.0570 ) ; r = r > 0.0031308 ? ( ( 1.055 * Math . pow ( r , 1.0 / 2.4 ) ) - 0.055 ) : r * 12.92 ; g = g > 0.0031308 ? ( ( 1.055 * Math . pow ( g , 1.0 / 2.4 ) ) - 0.055 ) : g * 12.92 ; b = b > 0.0031308 ? ( ( 1.055 * Math . pow ( b , 1.0 / 2.4 ) ) - 0.055 ) : b * 12.92 ; r = Math . min ( Math . max ( 0 , r ) , 1 ) ; g = Math . min ( Math . max ( 0 , g ) , 1 ) ; b = Math . min ( Math . max ( 0 , b ) , 1 ) ; return [ r * 255 , g * 255 , b * 255 ] ; } ; convert . xyz . lab = function ( xyz ) { var x = xyz [ 0 ] ; var y = xyz [ 1 ] ; var z = xyz [ 2 ] ; var l ; var a ; var b ; x /= 95.047 ; y /= 100 ; z /= 108.883 ; x = x > 0.008856 ? Math . pow ( x , 1 / 3 ) : ( 7.787 * x ) + ( 16 / 116 ) ; y = y > 0.008856 ? Math . pow ( y , 1 / 3 ) : ( 7.787 * y ) + ( 16 / 116 ) ; z = z > 0.008856 ? Math . pow ( z , 1 / 3 ) : ( 7.787 * z ) + ( 16 / 116 ) ; l = ( 116 * y ) - 16 ; a = 500 * ( x - y ) ; b = 200 * ( y - z ) ; return [ l , a , b ] ; } ; convert . lab . xyz = function ( lab ) { var l = lab [ 0 ] ; var a = lab [ 1 ] ; var b = lab [ 2 ] ; var x ; var y ; var z ; y = ( l + 16 ) / 116 ; x = a / 500 + y ; z = y - b / 200 ; var y2 = Math . pow ( y , 3 ) ; var x2 = Math . pow ( x , 3 ) ; var z2 = Math . pow ( z , 3 ) ; y = y2 > 0.008856 ? y2 : ( y - 16 / 116 ) / 7.787 ; x = x2 > 0.008856 ? x2 : ( x - 16 / 116 ) / 7.787 ; z = z2 > 0.008856 ? z2 : ( z - 16 / 116 ) / 7.787 ; x *= 95.047 ; y *= 100 ; z *= 108.883 ; return [ x , y , z ] ; } ; convert . lab . lch = function ( lab ) { var l = lab [ 0 ] ; var a = lab [ 1 ] ; var b = lab [ 2 ] ; var hr ; var h ; var c ; hr = Math . atan2 ( b , a ) ; h = hr * 360 / 2 / Math . PI ; if ( h < 0 ) { h += 360 ; }
c = Math . sqrt ( a * a + b * b ) ; return [ l , c , h ] ; } ; convert . lch . lab = function ( lch ) { var l = lch [ 0 ] ; var c = lch [ 1 ] ; var h = lch [ 2 ] ; var a ; var b ; var hr ; hr = h / 360 * 2 * Math . PI ; a = c * Math . cos ( hr ) ; b = c * Math . sin ( hr ) ; return [ l , a , b ] ; } ; convert . rgb . ansi16 = function ( args ) { var r = args [ 0 ] ; var g = args [ 1 ] ; var b = args [ 2 ] ; var value = 1 in arguments ? arguments [ 1 ] : convert . rgb . hsv ( args ) [ 2 ] ; value = Math . round ( value / 50 ) ; if ( value === 0 ) { return 30 ; }
var ansi = 30
+ ( ( Math . round ( b / 255 ) << 2 ) | ( Math . round ( g / 255 ) << 1 ) | Math . round ( r / 255 ) ) ; if ( value === 2 ) { ansi += 60 ; }
return ansi ; } ; convert . hsv . ansi16 = function ( args ) { return convert . rgb . ansi16 ( convert . hsv . rgb ( args ) , args [ 2 ] ) ; } ; convert . rgb . ansi256 = function ( args ) { var r = args [ 0 ] ; var g = args [ 1 ] ; var b = args [ 2 ] ; if ( r === g && g === b ) { if ( r < 8 ) { return 16 ; }
if ( r > 248 ) { return 231 ; }
return Math . round ( ( ( r - 8 ) / 247 ) * 24 ) + 232 ; }
var ansi = 16
+ ( 36 * Math . round ( r / 255 * 5 ) )
+ ( 6 * Math . round ( g / 255 * 5 ) )
+ Math . round ( b / 255 * 5 ) ; return ansi ; } ; convert . ansi16 . rgb = function ( args ) { var color = args % 10 ; if ( color === 0 || color === 7 ) { if ( args > 50 ) { color += 3.5 ; }
color = color / 10.5 * 255 ; return [ color , color , color ] ; }
var mult = ( ~ ~ ( args > 50 ) + 1 ) * 0.5 ; var r = ( ( color & 1 ) * mult ) * 255 ; var g = ( ( ( color >> 1 ) & 1 ) * mult ) * 255 ; var b = ( ( ( color >> 2 ) & 1 ) * mult ) * 255 ; return [ r , g , b ] ; } ; convert . ansi256 . rgb = function ( args ) { if ( args >= 232 ) { var c = ( args - 232 ) * 10 + 8 ; return [ c , c , c ] ; }
args -= 16 ; var rem ; var r = Math . floor ( args / 36 ) / 5 * 255 ; var g = Math . floor ( ( rem = args % 36 ) / 6 ) / 5 * 255 ; var b = ( rem % 6 ) / 5 * 255 ; return [ r , g , b ] ; } ; convert . rgb . hex = function ( args ) { var integer = ( ( Math . round ( args [ 0 ] ) & 0xFF ) << 16 )
+ ( ( Math . round ( args [ 1 ] ) & 0xFF ) << 8 )
+ ( Math . round ( args [ 2 ] ) & 0xFF ) ; var string = integer . toString ( 16 ) . toUpperCase ( ) ; return '000000' . substring ( string . length ) + string ; } ; convert . hex . rgb = function ( args ) { var match = args . toString ( 16 ) . match ( /[a-f0-9]{6}|[a-f0-9]{3}/i ) ; if ( ! match ) { return [ 0 , 0 , 0 ] ; }
var colorString = match [ 0 ] ; if ( match [ 0 ] . length === 3 ) { colorString = colorString . split ( '' ) . map ( function ( char ) { return char + char ; } ) . join ( '' ) ; }
var integer = parseInt ( colorString , 16 ) ; var r = ( integer >> 16 ) & 0xFF ; var g = ( integer >> 8 ) & 0xFF ; var b = integer & 0xFF ; return [ r , g , b ] ; } ; convert . rgb . hcg = function ( rgb ) { var r = rgb [ 0 ] / 255 ; var g = rgb [ 1 ] / 255 ; var b = rgb [ 2 ] / 255 ; var max = Math . max ( Math . max ( r , g ) , b ) ; var min = Math . min ( Math . min ( r , g ) , b ) ; var chroma = ( max - min ) ; var grayscale ; var hue ; if ( chroma < 1 ) { grayscale = min / ( 1 - chroma ) ; } else { grayscale = 0 ; }
if ( chroma <= 0 ) { hue = 0 ; } else
if ( max === r ) { hue = ( ( g - b ) / chroma ) % 6 ; } else
if ( max === g ) { hue = 2 + ( b - r ) / chroma ; } else { hue = 4 + ( r - g ) / chroma + 4 ; }
hue /= 6 ; hue %= 1 ; return [ hue * 360 , chroma * 100 , grayscale * 100 ] ; } ; convert . hsl . hcg = function ( hsl ) { var s = hsl [ 1 ] / 100 ; var l = hsl [ 2 ] / 100 ; var c = 1 ; var f = 0 ; if ( l < 0.5 ) { c = 2.0 * s * l ; } else { c = 2.0 * s * ( 1.0 - l ) ; }
if ( c < 1.0 ) { f = ( l - 0.5 * c ) / ( 1.0 - c ) ; }
return [ hsl [ 0 ] , c * 100 , f * 100 ] ; } ; convert . hsv . hcg = function ( hsv ) { var s = hsv [ 1 ] / 100 ; var v = hsv [ 2 ] / 100 ; var c = s * v ; var f = 0 ; if ( c < 1.0 ) { f = ( v - c ) / ( 1 - c ) ; }
return [ hsv [ 0 ] , c * 100 , f * 100 ] ; } ; convert . hcg . rgb = function ( hcg ) { var h = hcg [ 0 ] / 360 ; var c = hcg [ 1 ] / 100 ; var g = hcg [ 2 ] / 100 ; if ( c === 0.0 ) { return [ g * 255 , g * 255 , g * 255 ] ; }
var pure = [ 0 , 0 , 0 ] ; var hi = ( h % 1 ) * 6 ; var v = hi % 1 ; var w = 1 - v ; var mg = 0 ; switch ( Math . floor ( hi ) ) { case 0 : pure [ 0 ] = 1 ; pure [ 1 ] = v ; pure [ 2 ] = 0 ; break ; case 1 : pure [ 0 ] = w ; pure [ 1 ] = 1 ; pure [ 2 ] = 0 ; break ; case 2 : pure [ 0 ] = 0 ; pure [ 1 ] = 1 ; pure [ 2 ] = v ; break ; case 3 : pure [ 0 ] = 0 ; pure [ 1 ] = w ; pure [ 2 ] = 1 ; break ; case 4 : pure [ 0 ] = v ; pure [ 1 ] = 0 ; pure [ 2 ] = 1 ; break ; default : pure [ 0 ] = 1 ; pure [ 1 ] = 0 ; pure [ 2 ] = w ; }
mg = ( 1.0 - c ) * g ; return [ ( c * pure [ 0 ] + mg ) * 255 , ( c * pure [ 1 ] + mg ) * 255 , ( c * pure [ 2 ] + mg ) * 255 ] ; } ; convert . hcg . hsv = function ( hcg ) { var c = hcg [ 1 ] / 100 ; var g = hcg [ 2 ] / 100 ; var v = c + g * ( 1.0 - c ) ; var f = 0 ; if ( v > 0.0 ) { f = c / v ; }
return [ hcg [ 0 ] , f * 100 , v * 100 ] ; } ; convert . hcg . hsl = function ( hcg ) { var c = hcg [ 1 ] / 100 ; var g = hcg [ 2 ] / 100 ; var l = g * ( 1.0 - c ) + 0.5 * c ; var s = 0 ; if ( l > 0.0 && l < 0.5 ) { s = c / ( 2 * l ) ; } else
if ( l >= 0.5 && l < 1.0 ) { s = c / ( 2 * ( 1 - l ) ) ; }
return [ hcg [ 0 ] , s * 100 , l * 100 ] ; } ; convert . hcg . hwb = function ( hcg ) { var c = hcg [ 1 ] / 100 ; var g = hcg [ 2 ] / 100 ; var v = c + g * ( 1.0 - c ) ; return [ hcg [ 0 ] , ( v - c ) * 100 , ( 1 - v ) * 100 ] ; } ; convert . hwb . hcg = function ( hwb ) { var w = hwb [ 1 ] / 100 ; var b = hwb [ 2 ] / 100 ; var v = 1 - b ; var c = v - w ; var g = 0 ; if ( c < 1 ) { g = ( v - c ) / ( 1 - c ) ; }
return [ hwb [ 0 ] , c * 100 , g * 100 ] ; } ; convert . apple . rgb = function ( apple ) { return [ ( apple [ 0 ] / 65535 ) * 255 , ( apple [ 1 ] / 65535 ) * 255 , ( apple [ 2 ] / 65535 ) * 255 ] ; } ; convert . rgb . apple = function ( rgb ) { return [ ( rgb [ 0 ] / 255 ) * 65535 , ( rgb [ 1 ] / 255 ) * 65535 , ( rgb [ 2 ] / 255 ) * 65535 ] ; } ; convert . gray . rgb = function ( args ) { return [ args [ 0 ] / 100 * 255 , args [ 0 ] / 100 * 255 , args [ 0 ] / 100 * 255 ] ; } ; convert . gray . hsl = convert . gray . hsv = function ( args ) { return [ 0 , 0 , args [ 0 ] ] ; } ; convert . gray . hwb = function ( gray ) { return [ 0 , 100 , gray [ 0 ] ] ; } ; convert . gray . cmyk = function ( gray ) { return [ 0 , 0 , 0 , gray [ 0 ] ] ; } ; convert . gray . lab = function ( gray ) { return [ gray [ 0 ] , 0 , 0 ] ; } ; convert . gray . hex = function ( gray ) { var val = Math . round ( gray [ 0 ] / 100 * 255 ) & 0xFF ; var integer = ( val << 16 ) + ( val << 8 ) + val ; var string = integer . toString ( 16 ) . toUpperCase ( ) ; return '000000' . substring ( string . length ) + string ; } ; convert . rgb . gray = function ( rgb ) { var val = ( rgb [ 0 ] + rgb [ 1 ] + rgb [ 2 ] ) / 3 ; return [ val / 255 * 100 ] ; } ; } ) ; var conversions _1 = conversions . rgb ; var conversions _2 = conversions . hsl ; var conversions _3 = conversions . hsv ; var conversions _4 = conversions . hwb ; var conversions _5 = conversions . cmyk ; var conversions _6 = conversions . xyz ; var conversions _7 = conversions . lab ; var conversions _8 = conversions . lch ; var conversions _9 = conversions . hex ; var conversions _10 = conversions . keyword ; var conversions _11 = conversions . ansi16 ; var conversions _12 = conversions . ansi256 ; var conversions _13 = conversions . hcg ; var conversions _14 = conversions . apple ; var conversions _15 = conversions . gray ; function buildGraph ( ) { var graph = { } ; var models = Object . keys ( conversions ) ; for ( var len = models . length , i = 0 ; i < len ; i ++ ) { graph [ models [ i ] ] = { distance : - 1 , parent : null } ; }
return graph ; }
function deriveBFS ( fromModel ) { var graph = buildGraph ( ) ; var queue = [ fromModel ] ; graph [ fromModel ] . distance = 0 ; while ( queue . length ) { var current = queue . pop ( ) ; var adjacents = Object . keys ( conversions [ current ] ) ; for ( var len = adjacents . length , i = 0 ; i < len ; i ++ ) { var adjacent = adjacents [ i ] ; var node = graph [ adjacent ] ; if ( node . distance === - 1 ) { node . distance = graph [ current ] . distance + 1 ; node . parent = current ; queue . unshift ( adjacent ) ; } } }
return graph ; }
function link ( from , to ) { return function ( args ) { return to ( from ( args ) ) ; } ; }
function wrapConversion ( toModel , graph ) { var path = [ graph [ toModel ] . parent , toModel ] ; var fn = conversions [ graph [ toModel ] . parent ] [ toModel ] ; var cur = graph [ toModel ] . parent ; while ( graph [ cur ] . parent ) { path . unshift ( graph [ cur ] . parent ) ; fn = link ( conversions [ graph [ cur ] . parent ] [ cur ] , fn ) ; cur = graph [ cur ] . parent ; }
fn . conversion = path ; return fn ; }
var route = function ( fromModel ) { var graph = deriveBFS ( fromModel ) ; var conversion = { } ; var models = Object . keys ( graph ) ; for ( var len = models . length , i = 0 ; i < len ; i ++ ) { var toModel = models [ i ] ; var node = graph [ toModel ] ; if ( node . parent === null ) { continue ; }
conversion [ toModel ] = wrapConversion ( toModel , graph ) ; }
return conversion ; } ; var convert = { } ; var models = Object . keys ( conversions ) ; function wrapRaw ( fn ) { var wrappedFn = function ( args ) { if ( args === undefined || args === null ) { return args ; }
if ( arguments . length > 1 ) { args = Array . prototype . slice . call ( arguments ) ; }
return fn ( args ) ; } ; if ( 'conversion' in fn ) { wrappedFn . conversion = fn . conversion ; }
return wrappedFn ; }
function wrapRounded ( fn ) { var wrappedFn = function ( args ) { if ( args === undefined || args === null ) { return args ; }
if ( arguments . length > 1 ) { args = Array . prototype . slice . call ( arguments ) ; }
var result = fn ( args ) ; if ( typeof result === 'object' ) { for ( var len = result . length , i = 0 ; i < len ; i ++ ) { result [ i ] = Math . round ( result [ i ] ) ; } }
return result ; } ; if ( 'conversion' in fn ) { wrappedFn . conversion = fn . conversion ; }
return wrappedFn ; }
models . forEach ( function ( fromModel ) { convert [ fromModel ] = { } ; Object . defineProperty ( convert [ fromModel ] , 'channels' , { value : conversions [ fromModel ] . channels } ) ; Object . defineProperty ( convert [ fromModel ] , 'labels' , { value : conversions [ fromModel ] . labels } ) ; var routes = route ( fromModel ) ; var routeModels = Object . keys ( routes ) ; routeModels . forEach ( function ( toModel ) { var fn = routes [ toModel ] ; convert [ fromModel ] [ toModel ] = wrapRounded ( fn ) ; convert [ fromModel ] [ toModel ] . raw = wrapRaw ( fn ) ; } ) ; } ) ; var colorConvert = convert ; var colorName$1 = { "aliceblue" : [ 240 , 248 , 255 ] , "antiquewhite" : [ 250 , 235 , 215 ] , "aqua" : [ 0 , 255 , 255 ] , "aquamarine" : [ 127 , 255 , 212 ] , "azure" : [ 240 , 255 , 255 ] , "beige" : [ 245 , 245 , 220 ] , "bisque" : [ 255 , 228 , 196 ] , "black" : [ 0 , 0 , 0 ] , "blanchedalmond" : [ 255 , 235 , 205 ] , "blue" : [ 0 , 0 , 255 ] , "blueviolet" : [ 138 , 43 , 226 ] , "brown" : [ 165 , 42 , 42 ] , "burlywood" : [ 222 , 184 , 135 ] , "cadetblue" : [ 95 , 158 , 160 ] , "chartreuse" : [ 127 , 255 , 0 ] , "chocolate" : [ 210 , 105 , 30 ] , "coral" : [ 255 , 127 , 80 ] , "cornflowerblue" : [ 100 , 149 , 237 ] , "cornsilk" : [ 255 , 248 , 220 ] , "crimson" : [ 220 , 20 , 60 ] , "cyan" : [ 0 , 255 , 255 ] , "darkblue" : [ 0 , 0 , 139 ] , "darkcyan" : [ 0 , 139 , 139 ] , "darkgoldenrod" : [ 184 , 134 , 11 ] , "darkgray" : [ 169 , 169 , 169 ] , "darkgreen" : [ 0 , 100 , 0 ] , "darkgrey" : [ 169 , 169 , 169 ] , "darkkhaki" : [ 189 , 183 , 107 ] , "darkmagenta" : [ 139 , 0 , 139 ] , "darkolivegreen" : [ 85 , 107 , 47 ] , "darkorange" : [ 255 , 140 , 0 ] , "darkorchid" : [ 153 , 50 , 204 ] , "darkred" : [ 139 , 0 , 0 ] , "darksalmon" : [ 233 , 150 , 122 ] , "darkseagreen" : [ 143 , 188 , 143 ] , "darkslateblue" : [ 72 , 61 , 139 ] , "darkslategray" : [ 47 , 79 , 79 ] , "darkslategrey" : [ 47 , 79 , 79 ] , "darkturquoise" : [ 0 , 206 , 209 ] , "darkviolet" : [ 148 , 0 , 211 ] , "deeppink" : [ 255 , 20 , 147 ] , "deepskyblue" : [ 0 , 191 , 255 ] , "dimgray" : [ 105 , 105 , 105 ] , "dimgrey" : [ 105 , 105 , 105 ] , "dodgerblue" : [ 30 , 144 , 255 ] , "firebrick" : [ 178 , 34 , 34 ] , "floralwhite" : [ 255 , 250 , 240 ] , "forestgreen" : [ 34 , 139 , 34 ] , "fuchsia" : [ 255 , 0 , 255 ] , "gainsboro" : [ 220 , 220 , 220 ] , "ghostwhite" : [ 248 , 248 , 255 ] , "gold" : [ 255 , 215 , 0 ] , "goldenrod" : [ 218 , 165 , 32 ] , "gray" : [ 128 , 128 , 128 ] , "green" : [ 0 , 128 , 0 ] , "greenyellow" : [ 173 , 255 , 47 ] , "grey" : [ 128 , 128 , 128 ] , "honeydew" : [ 240 , 255 , 240 ] , "hotpink" : [ 255 , 105 , 180 ] , "indianred" : [ 205 , 92 , 92 ] , "indigo" : [ 75 , 0 , 130 ] , "ivory" : [ 255 , 255 , 240 ] , "khaki" : [ 240 , 230 , 140 ] , "lavender" : [ 230 , 230 , 250 ] , "lavenderblush" : [ 255 , 240 , 245 ] , "lawngreen" : [ 124 , 252 , 0 ] , "lemonchiffon" : [ 255 , 250 , 205 ] , "lightblue" : [ 173 , 216 , 230 ] , "lightcoral" : [ 240 , 128 , 128 ] , "lightcyan" : [ 224 , 255 , 255 ] , "lightgoldenrodyellow" : [ 250 , 250 , 210 ] , "lightgray" : [ 211 , 211 , 211 ] , "lightgreen" : [ 144 , 238 , 144 ] , "lightgrey" : [ 211 , 211 , 211 ] , "lightpink" : [ 255 , 182 , 193 ] , "lightsalmon" : [ 255 , 160 , 122 ] , "lightseagreen" : [ 32 , 178 , 170 ] , "lightskyblue" : [ 135 , 206 , 250 ] , "lightslategray" : [ 119 , 136 , 153 ] , "lightslategrey" : [ 119 , 136 , 153 ] , "lightsteelblue" : [ 176 , 196 , 222 ] , "lightyellow" : [ 255 , 255 , 224 ] , "lime" : [ 0 , 255 , 0 ] , "limegreen" : [ 50 , 205 , 50 ] , "linen" : [ 250 , 240 , 230 ] , "magenta" : [ 255 , 0 , 255 ] , "maroon" : [ 128 , 0 , 0 ] , "mediumaquamarine" : [ 102 , 205 , 170 ] , "mediumblue" : [ 0 , 0 , 205 ] , "mediumorchid" : [ 186 , 85 , 211 ] , "mediumpurple" : [ 147 , 112 , 219 ] , "mediumseagreen" : [ 60 , 179 , 113 ] , "mediumslateblue" : [ 123 , 104 , 238 ] , "mediumspringgreen" : [ 0 , 250 , 154 ] , "mediumturquoise" : [ 72 , 209 , 204 ] , "mediumvioletred" : [ 199 , 21 , 133 ] , "midnightblue" : [ 25 , 25 , 112 ] , "mintcream" : [ 245 , 255 , 250 ] , "mistyrose" : [ 255 , 228 , 225 ] , "moccasin" : [ 255 , 228 , 181 ] , "navajowhite" : [ 255 , 222 , 173 ] , "navy" : [ 0 , 0 , 128 ] , "oldlace" : [ 253 , 245 , 230 ] , "olive" : [ 128 , 128 , 0 ] , "olivedrab" : [ 107 , 142 , 35 ] , "orange" : [ 255 , 165 , 0 ] , "orangered" : [ 255 , 69 , 0 ] , "orchid" : [ 218 , 112 , 214 ] , "palegoldenrod" : [ 238 , 232 , 170 ] , "palegreen" : [ 152 , 251 , 152 ] , "paleturquoise" : [ 175 , 238 , 238 ] , "palevioletred" : [ 219 , 112 , 147 ] , "papayawhip" : [ 255 , 239 , 213 ] , "peachpuff" : [ 255 , 218 , 185 ] , "peru" : [ 205 , 133 , 63 ] , "pink" : [ 255 , 192 , 203 ] , "plum" : [ 221 , 160 , 221 ] , "powderblue" : [ 176 , 224 , 230 ] , "purple" : [ 128 , 0 , 128 ] , "rebeccapurple" : [ 102 , 51 , 153 ] , "red" : [ 255 , 0 , 0 ] , "rosybrown" : [ 188 , 143 , 143 ] , "royalblue" : [ 65 , 105 , 225 ] , "saddlebrown" : [ 139 , 69 , 19 ] , "salmon" : [ 250 , 128 , 114 ] , "sandybrown" : [ 244 , 164 , 96 ] , "seagreen" : [ 46 , 139 , 87 ] , "seashell" : [ 255 , 245 , 238 ] , "sienna" : [ 160 , 82 , 45 ] , "silver" : [ 192 , 192 , 192 ] , "skyblue" : [ 135 , 206 , 235 ] , "slateblue" : [ 106 , 90 , 205 ] , "slategray" : [ 112 , 128 , 144 ] , "slategrey" : [ 112 , 128 , 144 ] , "snow" : [ 255 , 250 , 250 ] , "springgreen" : [ 0 , 255 , 127 ] , "steelblue" : [ 70 , 130 , 180 ] , "tan" : [ 210 , 180 , 140 ] , "teal" : [ 0 , 128 , 128 ] , "thistle" : [ 216 , 191 , 216 ] , "tomato" : [ 255 , 99 , 71 ] , "turquoise" : [ 64 , 224 , 208 ] , "violet" : [ 238 , 130 , 238 ] , "wheat" : [ 245 , 222 , 179 ] , " w
var abbr = /^#([a-fA-F0-9]{3,4})$/i , hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i , rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i , per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i , keyword = /(\w+)/ ; var rgb = [ 0 , 0 , 0 ] , a = 1 , match = string . match ( abbr ) , hexAlpha = "" ; if ( match ) { match = match [ 1 ] ; hexAlpha = match [ 3 ] ; for ( var i = 0 ; i < rgb . length ; i ++ ) { rgb [ i ] = parseInt ( match [ i ] + match [ i ] , 16 ) ; }
if ( hexAlpha ) { a = Math . round ( ( parseInt ( hexAlpha + hexAlpha , 16 ) / 255 ) * 100 ) / 100 ; } }
else if ( match = string . match ( hex ) ) { hexAlpha = match [ 2 ] ; match = match [ 1 ] ; for ( var i = 0 ; i < rgb . length ; i ++ ) { rgb [ i ] = parseInt ( match . slice ( i * 2 , i * 2 + 2 ) , 16 ) ; }
if ( hexAlpha ) { a = Math . round ( ( parseInt ( hexAlpha , 16 ) / 255 ) * 100 ) / 100 ; } }
2019-05-09 18:54:39 +12:00
else if ( match = string . match ( rgba ) ) { for ( var i = 0 ; i < rgb . length ; i ++ ) { rgb [ i ] = parseInt ( match [ i + 1 ] ) ; }
a = parseFloat ( match [ 4 ] ) ; }
else if ( match = string . match ( per ) ) { for ( var i = 0 ; i < rgb . length ; i ++ ) { rgb [ i ] = Math . round ( parseFloat ( match [ i + 1 ] ) * 2.55 ) ; }
a = parseFloat ( match [ 4 ] ) ; }
else if ( match = string . match ( keyword ) ) { if ( match [ 1 ] == "transparent" ) { return [ 0 , 0 , 0 , 0 ] ; }
2020-07-24 09:00:10 +12:00
rgb = colorName$1 [ match [ 1 ] ] ; if ( ! rgb ) { return ; } }
2019-05-09 18:54:39 +12:00
for ( var i = 0 ; i < rgb . length ; i ++ ) { rgb [ i ] = scale ( rgb [ i ] , 0 , 255 ) ; }
if ( ! a && a != 0 ) { a = 1 ; }
else { a = scale ( a , 0 , 1 ) ; }
rgb [ 3 ] = a ; return rgb ; }
function getHsla ( string ) { if ( ! string ) { return ; }
var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/ ; var match = string . match ( hsl ) ; if ( match ) { var alpha = parseFloat ( match [ 4 ] ) ; var h = scale ( parseInt ( match [ 1 ] ) , 0 , 360 ) , s = scale ( parseFloat ( match [ 2 ] ) , 0 , 100 ) , l = scale ( parseFloat ( match [ 3 ] ) , 0 , 100 ) , a = scale ( isNaN ( alpha ) ? 1 : alpha , 0 , 1 ) ; return [ h , s , l , a ] ; } }
function getHwb ( string ) { if ( ! string ) { return ; }
var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/ ; var match = string . match ( hwb ) ; if ( match ) { var alpha = parseFloat ( match [ 4 ] ) ; var h = scale ( parseInt ( match [ 1 ] ) , 0 , 360 ) , w = scale ( parseFloat ( match [ 2 ] ) , 0 , 100 ) , b = scale ( parseFloat ( match [ 3 ] ) , 0 , 100 ) , a = scale ( isNaN ( alpha ) ? 1 : alpha , 0 , 1 ) ; return [ h , w , b , a ] ; } }
function getRgb ( string ) { var rgba = getRgba ( string ) ; return rgba && rgba . slice ( 0 , 3 ) ; }
function getHsl ( string ) { var hsla = getHsla ( string ) ; return hsla && hsla . slice ( 0 , 3 ) ; }
function getAlpha ( string ) { var vals = getRgba ( string ) ; if ( vals ) { return vals [ 3 ] ; }
else if ( vals = getHsla ( string ) ) { return vals [ 3 ] ; }
else if ( vals = getHwb ( string ) ) { return vals [ 3 ] ; } }
2020-07-24 09:00:10 +12:00
function hexString ( rgba , a ) { var a = ( a !== undefined && rgba . length === 3 ) ? a : rgba [ 3 ] ; return "#" + hexDouble ( rgba [ 0 ] )
+ hexDouble ( rgba [ 1 ] )
+ hexDouble ( rgba [ 2 ] )
+ ( ( a >= 0 && a < 1 ) ? hexDouble ( Math . round ( a * 255 ) ) : "" ) ; }
2019-05-09 18:54:39 +12:00
function rgbString ( rgba , alpha ) { if ( alpha < 1 || ( rgba [ 3 ] && rgba [ 3 ] < 1 ) ) { return rgbaString ( rgba , alpha ) ; }
return "rgb(" + rgba [ 0 ] + ", " + rgba [ 1 ] + ", " + rgba [ 2 ] + ")" ; }
function rgbaString ( rgba , alpha ) { if ( alpha === undefined ) { alpha = ( rgba [ 3 ] !== undefined ? rgba [ 3 ] : 1 ) ; }
return "rgba(" + rgba [ 0 ] + ", " + rgba [ 1 ] + ", " + rgba [ 2 ]
+ ", " + alpha + ")" ; }
function percentString ( rgba , alpha ) { if ( alpha < 1 || ( rgba [ 3 ] && rgba [ 3 ] < 1 ) ) { return percentaString ( rgba , alpha ) ; }
var r = Math . round ( rgba [ 0 ] / 255 * 100 ) , g = Math . round ( rgba [ 1 ] / 255 * 100 ) , b = Math . round ( rgba [ 2 ] / 255 * 100 ) ; return "rgb(" + r + "%, " + g + "%, " + b + "%)" ; }
function percentaString ( rgba , alpha ) { var r = Math . round ( rgba [ 0 ] / 255 * 100 ) , g = Math . round ( rgba [ 1 ] / 255 * 100 ) , b = Math . round ( rgba [ 2 ] / 255 * 100 ) ; return "rgba(" + r + "%, " + g + "%, " + b + "%, " + ( alpha || rgba [ 3 ] || 1 ) + ")" ; }
function hslString ( hsla , alpha ) { if ( alpha < 1 || ( hsla [ 3 ] && hsla [ 3 ] < 1 ) ) { return hslaString ( hsla , alpha ) ; }
return "hsl(" + hsla [ 0 ] + ", " + hsla [ 1 ] + "%, " + hsla [ 2 ] + "%)" ; }
function hslaString ( hsla , alpha ) { if ( alpha === undefined ) { alpha = ( hsla [ 3 ] !== undefined ? hsla [ 3 ] : 1 ) ; }
return "hsla(" + hsla [ 0 ] + ", " + hsla [ 1 ] + "%, " + hsla [ 2 ] + "%, "
+ alpha + ")" ; }
function hwbString ( hwb , alpha ) { if ( alpha === undefined ) { alpha = ( hwb [ 3 ] !== undefined ? hwb [ 3 ] : 1 ) ; }
return "hwb(" + hwb [ 0 ] + ", " + hwb [ 1 ] + "%, " + hwb [ 2 ] + "%"
+ ( alpha !== undefined && alpha !== 1 ? ", " + alpha : "" ) + ")" ; }
function keyword ( rgb ) { return reverseNames [ rgb . slice ( 0 , 3 ) ] ; }
function scale ( num , min , max ) { return Math . min ( Math . max ( min , num ) , max ) ; }
function hexDouble ( num ) { var str = num . toString ( 16 ) . toUpperCase ( ) ; return ( str . length < 2 ) ? "0" + str : str ; }
2020-07-24 09:00:10 +12:00
var reverseNames = { } ; for ( var name in colorName$1 ) { reverseNames [ colorName$1 [ name ] ] = name ; }
var Color = function ( obj ) { if ( obj instanceof Color ) { return obj ; }
2019-05-09 18:54:39 +12:00
if ( ! ( this instanceof Color ) ) { return new Color ( obj ) ; }
2020-07-24 09:00:10 +12:00
this . valid = false ; this . values = { rgb : [ 0 , 0 , 0 ] , hsl : [ 0 , 0 , 0 ] , hsv : [ 0 , 0 , 0 ] , hwb : [ 0 , 0 , 0 ] , cmyk : [ 0 , 0 , 0 , 0 ] , alpha : 1 } ; var vals ; if ( typeof obj === 'string' ) { vals = colorString . getRgba ( obj ) ; if ( vals ) { this . setValues ( 'rgb' , vals ) ; } else if ( vals = colorString . getHsla ( obj ) ) { this . setValues ( 'hsl' , vals ) ; } else if ( vals = colorString . getHwb ( obj ) ) { this . setValues ( 'hwb' , vals ) ; } } else if ( typeof obj === 'object' ) { vals = obj ; if ( vals . r !== undefined || vals . red !== undefined ) { this . setValues ( 'rgb' , vals ) ; } else if ( vals . l !== undefined || vals . lightness !== undefined ) { this . setValues ( 'hsl' , vals ) ; } else if ( vals . v !== undefined || vals . value !== undefined ) { this . setValues ( 'hsv' , vals ) ; } else if ( vals . w !== undefined || vals . whiteness !== undefined ) { this . setValues ( 'hwb' , vals ) ; } else if ( vals . c !== undefined || vals . cyan !== undefined ) { this . setValues ( 'cmyk' , vals ) ; } } } ; Color . prototype = { isValid : function ( ) { return this . valid ; } , rgb : function ( ) { return this . setSpace ( 'rgb' , arguments ) ; } , hsl : function ( ) { return this . setSpace ( 'hsl' , arguments ) ; } , hsv : function ( ) { return this . setSpace ( 'hsv' , arguments ) ; } , hwb : function ( ) { return this . setSpace ( 'hwb' , arguments ) ; } , cmyk : function ( ) { return this . setSpace ( 'cmyk' , arguments ) ; } , rgbArray : function ( ) { return this . values . rgb ; } , hslArray : function ( ) { return this . values . hsl ; } , hsvArray : function ( ) { return this . values . hsv ; } , hwbArray : function ( ) { var values = this . values ; if ( values . alpha !== 1 ) { return values . hwb . concat ( [ values . alpha ] ) ; }
2019-05-09 18:54:39 +12:00
return values . hwb ; } , cmykArray : function ( ) { return this . values . cmyk ; } , rgbaArray : function ( ) { var values = this . values ; return values . rgb . concat ( [ values . alpha ] ) ; } , hslaArray : function ( ) { var values = this . values ; return values . hsl . concat ( [ values . alpha ] ) ; } , alpha : function ( val ) { if ( val === undefined ) { return this . values . alpha ; }
this . setValues ( 'alpha' , val ) ; return this ; } , red : function ( val ) { return this . setChannel ( 'rgb' , 0 , val ) ; } , green : function ( val ) { return this . setChannel ( 'rgb' , 1 , val ) ; } , blue : function ( val ) { return this . setChannel ( 'rgb' , 2 , val ) ; } , hue : function ( val ) { if ( val ) { val %= 360 ; val = val < 0 ? 360 + val : val ; }
2020-07-24 09:00:10 +12:00
return this . setChannel ( 'hsl' , 0 , val ) ; } , saturation : function ( val ) { return this . setChannel ( 'hsl' , 1 , val ) ; } , lightness : function ( val ) { return this . setChannel ( 'hsl' , 2 , val ) ; } , saturationv : function ( val ) { return this . setChannel ( 'hsv' , 1 , val ) ; } , whiteness : function ( val ) { return this . setChannel ( 'hwb' , 1 , val ) ; } , blackness : function ( val ) { return this . setChannel ( 'hwb' , 2 , val ) ; } , value : function ( val ) { return this . setChannel ( 'hsv' , 2 , val ) ; } , cyan : function ( val ) { return this . setChannel ( 'cmyk' , 0 , val ) ; } , magenta : function ( val ) { return this . setChannel ( 'cmyk' , 1 , val ) ; } , yellow : function ( val ) { return this . setChannel ( 'cmyk' , 2 , val ) ; } , black : function ( val ) { return this . setChannel ( 'cmyk' , 3 , val ) ; } , hexString : function ( ) { return colorString . hexString ( this . values . rgb ) ; } , rgbString : function ( ) { return colorString . rgbString ( this . values . rgb , this . values . alpha ) ; } , rgbaString : function ( ) { return colorString . rgbaString ( this . values . rgb , this . values . alpha ) ; } , percentString : function ( ) { return colorString . percentString ( this . values . rgb , this . values . alpha ) ; } , hslString : function ( ) { return colorString . hslString ( this . values . hsl , this . values . alpha ) ; } , hslaString : function ( ) { return colorString . hslaString ( this . values . hsl , this . values . alpha ) ; } , hwbString : function ( ) { return colorString . hwbString ( this . values . hwb , this . values . alpha ) ; } , keyword : function ( ) { return colorString . keyword ( this . values . rgb , this . values . alpha ) ; } , rgbNumber : function ( ) { var rgb = this . values . rgb ; return ( rgb [ 0 ] << 16 ) | ( rgb [ 1 ] << 8 ) | rgb [ 2 ] ; } , luminosity : function ( ) { var rgb = this . values . rgb ; var lum = [ ] ; for ( var i = 0 ; i < rgb . length ; i ++ ) { var chan = rgb [ i ] / 255 ; lum [ i ] = ( chan <= 0.03928 ) ? chan / 12.92 : Math . pow ( ( ( chan + 0.055 ) / 1.055 ) , 2.4 ) ; }
2019-05-09 18:54:39 +12:00
return 0.2126 * lum [ 0 ] + 0.7152 * lum [ 1 ] + 0.0722 * lum [ 2 ] ; } , contrast : function ( color2 ) { var lum1 = this . luminosity ( ) ; var lum2 = color2 . luminosity ( ) ; if ( lum1 > lum2 ) { return ( lum1 + 0.05 ) / ( lum2 + 0.05 ) ; }
return ( lum2 + 0.05 ) / ( lum1 + 0.05 ) ; } , level : function ( color2 ) { var contrastRatio = this . contrast ( color2 ) ; if ( contrastRatio >= 7.1 ) { return 'AAA' ; }
return ( contrastRatio >= 4.5 ) ? 'AA' : '' ; } , dark : function ( ) { var rgb = this . values . rgb ; var yiq = ( rgb [ 0 ] * 299 + rgb [ 1 ] * 587 + rgb [ 2 ] * 114 ) / 1000 ; return yiq < 128 ; } , light : function ( ) { return ! this . dark ( ) ; } , negate : function ( ) { var rgb = [ ] ; for ( var i = 0 ; i < 3 ; i ++ ) { rgb [ i ] = 255 - this . values . rgb [ i ] ; }
this . setValues ( 'rgb' , rgb ) ; return this ; } , lighten : function ( ratio ) { var hsl = this . values . hsl ; hsl [ 2 ] += hsl [ 2 ] * ratio ; this . setValues ( 'hsl' , hsl ) ; return this ; } , darken : function ( ratio ) { var hsl = this . values . hsl ; hsl [ 2 ] -= hsl [ 2 ] * ratio ; this . setValues ( 'hsl' , hsl ) ; return this ; } , saturate : function ( ratio ) { var hsl = this . values . hsl ; hsl [ 1 ] += hsl [ 1 ] * ratio ; this . setValues ( 'hsl' , hsl ) ; return this ; } , desaturate : function ( ratio ) { var hsl = this . values . hsl ; hsl [ 1 ] -= hsl [ 1 ] * ratio ; this . setValues ( 'hsl' , hsl ) ; return this ; } , whiten : function ( ratio ) { var hwb = this . values . hwb ; hwb [ 1 ] += hwb [ 1 ] * ratio ; this . setValues ( 'hwb' , hwb ) ; return this ; } , blacken : function ( ratio ) { var hwb = this . values . hwb ; hwb [ 2 ] += hwb [ 2 ] * ratio ; this . setValues ( 'hwb' , hwb ) ; return this ; } , greyscale : function ( ) { var rgb = this . values . rgb ; var val = rgb [ 0 ] * 0.3 + rgb [ 1 ] * 0.59 + rgb [ 2 ] * 0.11 ; this . setValues ( 'rgb' , [ val , val , val ] ) ; return this ; } , clearer : function ( ratio ) { var alpha = this . values . alpha ; this . setValues ( 'alpha' , alpha - ( alpha * ratio ) ) ; return this ; } , opaquer : function ( ratio ) { var alpha = this . values . alpha ; this . setValues ( 'alpha' , alpha + ( alpha * ratio ) ) ; return this ; } , rotate : function ( degrees ) { var hsl = this . values . hsl ; var hue = ( hsl [ 0 ] + degrees ) % 360 ; hsl [ 0 ] = hue < 0 ? 360 + hue : hue ; this . setValues ( 'hsl' , hsl ) ; return this ; } , mix : function ( mixinColor , weight ) { var color1 = this ; var color2 = mixinColor ; var p = weight === undefined ? 0.5 : weight ; var w = 2 * p - 1 ; var a = color1 . alpha ( ) - color2 . alpha ( ) ; var w1 = ( ( ( w * a === - 1 ) ? w : ( w + a ) / ( 1 + w * a ) ) + 1 ) / 2.0 ; var w2 = 1 - w1 ; return this . rgb ( w1 * color1 . red ( ) + w2 * color2 . red ( ) , w1 * color1 . green ( ) + w2 * color2 . green ( ) , w1 * color1 . blue ( ) + w2 * color2 . blue ( ) ) . alpha ( color1 . alpha ( ) * p + color2 . alpha ( ) * ( 1 - p ) ) ; } , toJSON : function ( ) { return this . rgb ( ) ; } , clone : function ( ) { var result = new Color ( ) ; var source = this . values ; var target = result . values ; var value , type ; for ( var prop in source ) { if ( source . hasOwnProperty ( prop ) ) { value = source [ prop ] ; type = ( { } ) . toString . call ( value ) ; if ( type === '[object Array]' ) { target [ prop ] = value . slice ( 0 ) ; } else if ( type === '[object Number]' ) { target [ prop ] = value ; } else { console . error ( 'unexpected color value:' , value ) ; } } }
return result ; } } ; Color . prototype . spaces = { rgb : [ 'red' , 'green' , 'blue' ] , hsl : [ 'hue' , 'saturation' , 'lightness' ] , hsv : [ 'hue' , 'saturation' , 'value' ] , hwb : [ 'hue' , 'whiteness' , 'blackness' ] , cmyk : [ 'cyan' , 'magenta' , 'yellow' , 'black' ] } ; Color . prototype . maxes = { rgb : [ 255 , 255 , 255 ] , hsl : [ 360 , 100 , 100 ] , hsv : [ 360 , 100 , 100 ] , hwb : [ 360 , 100 , 100 ] , cmyk : [ 100 , 100 , 100 , 100 ] } ; Color . prototype . getValues = function ( space ) { var values = this . values ; var vals = { } ; for ( var i = 0 ; i < space . length ; i ++ ) { vals [ space . charAt ( i ) ] = values [ space ] [ i ] ; }
if ( values . alpha !== 1 ) { vals . a = values . alpha ; }
return vals ; } ; Color . prototype . setValues = function ( space , vals ) { var values = this . values ; var spaces = this . spaces ; var maxes = this . maxes ; var alpha = 1 ; var i ; this . valid = true ; if ( space === 'alpha' ) { alpha = vals ; } else if ( vals . length ) { values [ space ] = vals . slice ( 0 , space . length ) ; alpha = vals [ space . length ] ; } else if ( vals [ space . charAt ( 0 ) ] !== undefined ) { for ( i = 0 ; i < space . length ; i ++ ) { values [ space ] [ i ] = vals [ space . charAt ( i ) ] ; }
alpha = vals . a ; } else if ( vals [ spaces [ space ] [ 0 ] ] !== undefined ) { var chans = spaces [ space ] ; for ( i = 0 ; i < space . length ; i ++ ) { values [ space ] [ i ] = vals [ chans [ i ] ] ; }
alpha = vals . alpha ; }
values . alpha = Math . max ( 0 , Math . min ( 1 , ( alpha === undefined ? values . alpha : alpha ) ) ) ; if ( space === 'alpha' ) { return false ; }
var capped ; for ( i = 0 ; i < space . length ; i ++ ) { capped = Math . max ( 0 , Math . min ( maxes [ space ] [ i ] , values [ space ] [ i ] ) ) ; values [ space ] [ i ] = Math . round ( capped ) ; }
2020-07-24 09:00:10 +12:00
for ( var sname in spaces ) { if ( sname !== space ) { values [ sname ] = colorConvert [ space ] [ sname ] ( values [ space ] ) ; } }
2019-05-09 18:54:39 +12:00
return true ; } ; Color . prototype . setSpace = function ( space , args ) { var vals = args [ 0 ] ; if ( vals === undefined ) { return this . getValues ( space ) ; }
if ( typeof vals === 'number' ) { vals = Array . prototype . slice . call ( args ) ; }
this . setValues ( space , vals ) ; return this ; } ; Color . prototype . setChannel = function ( space , index , val ) { var svalues = this . values [ space ] ; if ( val === undefined ) { return svalues [ index ] ; } else if ( val === svalues [ index ] ) { return this ; }
svalues [ index ] = val ; this . setValues ( space , svalues ) ; return this ; } ; if ( typeof window !== 'undefined' ) { window . Color = Color ; }
2020-07-24 09:00:10 +12:00
var chartjsColor = Color ; var helpers = { noop : function ( ) { } , uid : ( function ( ) { var id = 0 ; return function ( ) { return id ++ ; } ; } ( ) ) , isNullOrUndef : function ( value ) { return value === null || typeof value === 'undefined' ; } , isArray : function ( value ) { if ( Array . isArray && Array . isArray ( value ) ) { return true ; }
var type = Object . prototype . toString . call ( value ) ; if ( type . substr ( 0 , 7 ) === '[object' && type . substr ( - 6 ) === 'Array]' ) { return true ; }
return false ; } , isObject : function ( value ) { return value !== null && Object . prototype . toString . call ( value ) === '[object Object]' ; } , isFinite : function ( value ) { return ( typeof value === 'number' || value instanceof Number ) && isFinite ( value ) ; } , valueOrDefault : function ( value , defaultValue ) { return typeof value === 'undefined' ? defaultValue : value ; } , valueAtIndexOrDefault : function ( value , index , defaultValue ) { return helpers . valueOrDefault ( helpers . isArray ( value ) ? value [ index ] : value , defaultValue ) ; } , callback : function ( fn , args , thisArg ) { if ( fn && typeof fn . call === 'function' ) { return fn . apply ( thisArg , args ) ; } } , each : function ( loopable , fn , thisArg , reverse ) { var i , len , keys ; if ( helpers . isArray ( loopable ) ) { len = loopable . length ; if ( reverse ) { for ( i = len - 1 ; i >= 0 ; i -- ) { fn . call ( thisArg , loopable [ i ] , i ) ; } } else { for ( i = 0 ; i < len ; i ++ ) { fn . call ( thisArg , loopable [ i ] , i ) ; } } } else if ( helpers . isObject ( loopable ) ) { keys = Object . keys ( loopable ) ; len = keys . length ; for ( i = 0 ; i < len ; i ++ ) { fn . call ( thisArg , loopable [ keys [ i ] ] , keys [ i ] ) ; } } } , arrayEquals : function ( a0 , a1 ) { var i , ilen , v0 , v1 ; if ( ! a0 || ! a1 || a0 . length !== a1 . length ) { return false ; }
2019-05-09 18:54:39 +12:00
for ( i = 0 , ilen = a0 . length ; i < ilen ; ++ i ) { v0 = a0 [ i ] ; v1 = a1 [ i ] ; if ( v0 instanceof Array && v1 instanceof Array ) { if ( ! helpers . arrayEquals ( v0 , v1 ) ) { return false ; } } else if ( v0 !== v1 ) { return false ; } }
return true ; } , clone : function ( source ) { if ( helpers . isArray ( source ) ) { return source . map ( helpers . clone ) ; }
if ( helpers . isObject ( source ) ) { var target = { } ; var keys = Object . keys ( source ) ; var klen = keys . length ; var k = 0 ; for ( ; k < klen ; ++ k ) { target [ keys [ k ] ] = helpers . clone ( source [ keys [ k ] ] ) ; }
return target ; }
return source ; } , _merger : function ( key , target , source , options ) { var tval = target [ key ] ; var sval = source [ key ] ; if ( helpers . isObject ( tval ) && helpers . isObject ( sval ) ) { helpers . merge ( tval , sval , options ) ; } else { target [ key ] = helpers . clone ( sval ) ; } } , _mergerIf : function ( key , target , source ) { var tval = target [ key ] ; var sval = source [ key ] ; if ( helpers . isObject ( tval ) && helpers . isObject ( sval ) ) { helpers . mergeIf ( tval , sval ) ; } else if ( ! target . hasOwnProperty ( key ) ) { target [ key ] = helpers . clone ( sval ) ; } } , merge : function ( target , source , options ) { var sources = helpers . isArray ( source ) ? source : [ source ] ; var ilen = sources . length ; var merge , i , keys , klen , k ; if ( ! helpers . isObject ( target ) ) { return target ; }
options = options || { } ; merge = options . merger || helpers . _merger ; for ( i = 0 ; i < ilen ; ++ i ) { source = sources [ i ] ; if ( ! helpers . isObject ( source ) ) { continue ; }
keys = Object . keys ( source ) ; for ( k = 0 , klen = keys . length ; k < klen ; ++ k ) { merge ( keys [ k ] , target , source , options ) ; } }
2020-07-24 09:00:10 +12:00
return target ; } , mergeIf : function ( target , source ) { return helpers . merge ( target , source , { merger : helpers . _mergerIf } ) ; } , extend : Object . assign || function ( target ) { return helpers . merge ( target , [ ] . slice . call ( arguments , 1 ) , { merger : function ( key , dst , src ) { dst [ key ] = src [ key ] ; } } ) ; } , inherits : function ( extensions ) { var me = this ; var ChartElement = ( extensions && extensions . hasOwnProperty ( 'constructor' ) ) ? extensions . constructor : function ( ) { return me . apply ( this , arguments ) ; } ; var Surrogate = function ( ) { this . constructor = ChartElement ; } ; Surrogate . prototype = me . prototype ; ChartElement . prototype = new Surrogate ( ) ; ChartElement . extend = helpers . inherits ; if ( extensions ) { helpers . extend ( ChartElement . prototype , extensions ) ; }
ChartElement . _ _super _ _ = me . prototype ; return ChartElement ; } , _deprecated : function ( scope , value , previous , current ) { if ( value !== undefined ) { console . warn ( scope + ': "' + previous + '" is deprecated. Please use "' + current + '" instead' ) ; } } } ; var helpers _core = helpers ; helpers . callCallback = helpers . callback ; helpers . indexOf = function ( array , item , fromIndex ) { return Array . prototype . indexOf . call ( array , item , fromIndex ) ; } ; helpers . getValueOrDefault = helpers . valueOrDefault ; helpers . getValueAtIndexOrDefault = helpers . valueAtIndexOrDefault ; var effects = { linear : function ( t ) { return t ; } , easeInQuad : function ( t ) { return t * t ; } , easeOutQuad : function ( t ) { return - t * ( t - 2 ) ; } , easeInOutQuad : function ( t ) { if ( ( t /= 0.5 ) < 1 ) { return 0.5 * t * t ; }
2019-05-09 18:54:39 +12:00
return - 0.5 * ( ( -- t ) * ( t - 2 ) - 1 ) ; } , easeInCubic : function ( t ) { return t * t * t ; } , easeOutCubic : function ( t ) { return ( t = t - 1 ) * t * t + 1 ; } , easeInOutCubic : function ( t ) { if ( ( t /= 0.5 ) < 1 ) { return 0.5 * t * t * t ; }
return 0.5 * ( ( t -= 2 ) * t * t + 2 ) ; } , easeInQuart : function ( t ) { return t * t * t * t ; } , easeOutQuart : function ( t ) { return - ( ( t = t - 1 ) * t * t * t - 1 ) ; } , easeInOutQuart : function ( t ) { if ( ( t /= 0.5 ) < 1 ) { return 0.5 * t * t * t * t ; }
return - 0.5 * ( ( t -= 2 ) * t * t * t - 2 ) ; } , easeInQuint : function ( t ) { return t * t * t * t * t ; } , easeOutQuint : function ( t ) { return ( t = t - 1 ) * t * t * t * t + 1 ; } , easeInOutQuint : function ( t ) { if ( ( t /= 0.5 ) < 1 ) { return 0.5 * t * t * t * t * t ; }
return 0.5 * ( ( t -= 2 ) * t * t * t * t + 2 ) ; } , easeInSine : function ( t ) { return - Math . cos ( t * ( Math . PI / 2 ) ) + 1 ; } , easeOutSine : function ( t ) { return Math . sin ( t * ( Math . PI / 2 ) ) ; } , easeInOutSine : function ( t ) { return - 0.5 * ( Math . cos ( Math . PI * t ) - 1 ) ; } , easeInExpo : function ( t ) { return ( t === 0 ) ? 0 : Math . pow ( 2 , 10 * ( t - 1 ) ) ; } , easeOutExpo : function ( t ) { return ( t === 1 ) ? 1 : - Math . pow ( 2 , - 10 * t ) + 1 ; } , easeInOutExpo : function ( t ) { if ( t === 0 ) { return 0 ; }
if ( t === 1 ) { return 1 ; }
if ( ( t /= 0.5 ) < 1 ) { return 0.5 * Math . pow ( 2 , 10 * ( t - 1 ) ) ; }
return 0.5 * ( - Math . pow ( 2 , - 10 * -- t ) + 2 ) ; } , easeInCirc : function ( t ) { if ( t >= 1 ) { return t ; }
return - ( Math . sqrt ( 1 - t * t ) - 1 ) ; } , easeOutCirc : function ( t ) { return Math . sqrt ( 1 - ( t = t - 1 ) * t ) ; } , easeInOutCirc : function ( t ) { if ( ( t /= 0.5 ) < 1 ) { return - 0.5 * ( Math . sqrt ( 1 - t * t ) - 1 ) ; }
return 0.5 * ( Math . sqrt ( 1 - ( t -= 2 ) * t ) + 1 ) ; } , easeInElastic : function ( t ) { var s = 1.70158 ; var p = 0 ; var a = 1 ; if ( t === 0 ) { return 0 ; }
if ( t === 1 ) { return 1 ; }
if ( ! p ) { p = 0.3 ; }
if ( a < 1 ) { a = 1 ; s = p / 4 ; } else { s = p / ( 2 * Math . PI ) * Math . asin ( 1 / a ) ; }
return - ( a * Math . pow ( 2 , 10 * ( t -= 1 ) ) * Math . sin ( ( t - s ) * ( 2 * Math . PI ) / p ) ) ; } , easeOutElastic : function ( t ) { var s = 1.70158 ; var p = 0 ; var a = 1 ; if ( t === 0 ) { return 0 ; }
if ( t === 1 ) { return 1 ; }
if ( ! p ) { p = 0.3 ; }
if ( a < 1 ) { a = 1 ; s = p / 4 ; } else { s = p / ( 2 * Math . PI ) * Math . asin ( 1 / a ) ; }
return a * Math . pow ( 2 , - 10 * t ) * Math . sin ( ( t - s ) * ( 2 * Math . PI ) / p ) + 1 ; } , easeInOutElastic : function ( t ) { var s = 1.70158 ; var p = 0 ; var a = 1 ; if ( t === 0 ) { return 0 ; }
if ( ( t /= 0.5 ) === 2 ) { return 1 ; }
if ( ! p ) { p = 0.45 ; }
if ( a < 1 ) { a = 1 ; s = p / 4 ; } else { s = p / ( 2 * Math . PI ) * Math . asin ( 1 / a ) ; }
if ( t < 1 ) { return - 0.5 * ( a * Math . pow ( 2 , 10 * ( t -= 1 ) ) * Math . sin ( ( t - s ) * ( 2 * Math . PI ) / p ) ) ; }
return a * Math . pow ( 2 , - 10 * ( t -= 1 ) ) * Math . sin ( ( t - s ) * ( 2 * Math . PI ) / p ) * 0.5 + 1 ; } , easeInBack : function ( t ) { var s = 1.70158 ; return t * t * ( ( s + 1 ) * t - s ) ; } , easeOutBack : function ( t ) { var s = 1.70158 ; return ( t = t - 1 ) * t * ( ( s + 1 ) * t + s ) + 1 ; } , easeInOutBack : function ( t ) { var s = 1.70158 ; if ( ( t /= 0.5 ) < 1 ) { return 0.5 * ( t * t * ( ( ( s *= ( 1.525 ) ) + 1 ) * t - s ) ) ; }
return 0.5 * ( ( t -= 2 ) * t * ( ( ( s *= ( 1.525 ) ) + 1 ) * t + s ) + 2 ) ; } , easeInBounce : function ( t ) { return 1 - effects . easeOutBounce ( 1 - t ) ; } , easeOutBounce : function ( t ) { if ( t < ( 1 / 2.75 ) ) { return 7.5625 * t * t ; }
if ( t < ( 2 / 2.75 ) ) { return 7.5625 * ( t -= ( 1.5 / 2.75 ) ) * t + 0.75 ; }
if ( t < ( 2.5 / 2.75 ) ) { return 7.5625 * ( t -= ( 2.25 / 2.75 ) ) * t + 0.9375 ; }
return 7.5625 * ( t -= ( 2.625 / 2.75 ) ) * t + 0.984375 ; } , easeInOutBounce : function ( t ) { if ( t < 0.5 ) { return effects . easeInBounce ( t * 2 ) * 0.5 ; }
2020-07-24 09:00:10 +12:00
return effects . easeOutBounce ( t * 2 - 1 ) * 0.5 + 0.5 ; } } ; var helpers _easing = { effects : effects } ; helpers _core . easingEffects = effects ; var PI = Math . PI ; var RAD _PER _DEG = PI / 180 ; var DOUBLE _PI = PI * 2 ; var HALF _PI = PI / 2 ; var QUARTER _PI = PI / 4 ; var TWO _THIRDS _PI = PI * 2 / 3 ; var exports$1 = { clear : function ( chart ) { chart . ctx . clearRect ( 0 , 0 , chart . width , chart . height ) ; } , roundedRect : function ( ctx , x , y , width , height , radius ) { if ( radius ) { var r = Math . min ( radius , height / 2 , width / 2 ) ; var left = x + r ; var top = y + r ; var right = x + width - r ; var bottom = y + height - r ; ctx . moveTo ( x , top ) ; if ( left < right && top < bottom ) { ctx . arc ( left , top , r , - PI , - HALF _PI ) ; ctx . arc ( right , top , r , - HALF _PI , 0 ) ; ctx . arc ( right , bottom , r , 0 , HALF _PI ) ; ctx . arc ( left , bottom , r , HALF _PI , PI ) ; } else if ( left < right ) { ctx . moveTo ( left , y ) ; ctx . arc ( right , top , r , - HALF _PI , HALF _PI ) ; ctx . arc ( left , top , r , HALF _PI , PI + HALF _PI ) ; } else if ( top < bottom ) { ctx . arc ( left , top , r , - PI , 0 ) ; ctx . arc ( left , bottom , r , 0 , PI ) ; } else { ctx . arc ( left , top , r , - PI , PI ) ; }
ctx . closePath ( ) ; ctx . moveTo ( x , y ) ; } else { ctx . rect ( x , y , width , height ) ; } } , drawPoint : function ( ctx , style , radius , x , y , rotation ) { var type , xOffset , yOffset , size , cornerRadius ; var rad = ( rotation || 0 ) * RAD _PER _DEG ; if ( style && typeof style === 'object' ) { type = style . toString ( ) ; if ( type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]' ) { ctx . save ( ) ; ctx . translate ( x , y ) ; ctx . rotate ( rad ) ; ctx . drawImage ( style , - style . width / 2 , - style . height / 2 , style . width , style . height ) ; ctx . restore ( ) ; return ; } }
if ( isNaN ( radius ) || radius <= 0 ) { return ; }
ctx . beginPath ( ) ; switch ( style ) { default : ctx . arc ( x , y , radius , 0 , DOUBLE _PI ) ; ctx . closePath ( ) ; break ; case 'triangle' : ctx . moveTo ( x + Math . sin ( rad ) * radius , y - Math . cos ( rad ) * radius ) ; rad += TWO _THIRDS _PI ; ctx . lineTo ( x + Math . sin ( rad ) * radius , y - Math . cos ( rad ) * radius ) ; rad += TWO _THIRDS _PI ; ctx . lineTo ( x + Math . sin ( rad ) * radius , y - Math . cos ( rad ) * radius ) ; ctx . closePath ( ) ; break ; case 'rectRounded' : cornerRadius = radius * 0.516 ; size = radius - cornerRadius ; xOffset = Math . cos ( rad + QUARTER _PI ) * size ; yOffset = Math . sin ( rad + QUARTER _PI ) * size ; ctx . arc ( x - xOffset , y - yOffset , cornerRadius , rad - PI , rad - HALF _PI ) ; ctx . arc ( x + yOffset , y - xOffset , cornerRadius , rad - HALF _PI , rad ) ; ctx . arc ( x + xOffset , y + yOffset , cornerRadius , rad , rad + HALF _PI ) ; ctx . arc ( x - yOffset , y + xOffset , cornerRadius , rad + HALF _PI , rad + PI ) ; ctx . closePath ( ) ; break ; case 'rect' : if ( ! rotation ) { size = Math . SQRT1 _2 * radius ; ctx . rect ( x - size , y - size , 2 * size , 2 * size ) ; break ; }
rad += QUARTER _PI ; case 'rectRot' : xOffset = Math . cos ( rad ) * radius ; yOffset = Math . sin ( rad ) * radius ; ctx . moveTo ( x - xOffset , y - yOffset ) ; ctx . lineTo ( x + yOffset , y - xOffset ) ; ctx . lineTo ( x + xOffset , y + yOffset ) ; ctx . lineTo ( x - yOffset , y + xOffset ) ; ctx . closePath ( ) ; break ; case 'crossRot' : rad += QUARTER _PI ; case 'cross' : xOffset = Math . cos ( rad ) * radius ; yOffset = Math . sin ( rad ) * radius ; ctx . moveTo ( x - xOffset , y - yOffset ) ; ctx . lineTo ( x + xOffset , y + yOffset ) ; ctx . moveTo ( x + yOffset , y - xOffset ) ; ctx . lineTo ( x - yOffset , y + xOffset ) ; break ; case 'star' : xOffset = Math . cos ( rad ) * radius ; yOffset = Math . sin ( rad ) * radius ; ctx . moveTo ( x - xOffset , y - yOffset ) ; ctx . lineTo ( x + xOffset , y + yOffset ) ; ctx . moveTo ( x + yOffset , y - xOffset ) ; ctx . lineTo ( x - yOffset , y + xOffset ) ; rad += QUARTER _PI ; xOffset = Math . cos ( rad ) * radius ; yOffset = Math . sin ( rad ) * radius ; ctx . moveTo ( x - xOffset , y - yOffset ) ; ctx . lineTo ( x + xOffset , y + yOffset ) ; ctx . moveTo ( x + yOffset , y - xOffset ) ; ctx . lineTo ( x - yOffset , y + xOffset ) ; break ; case 'line' : xOffset = Math . cos ( rad ) * radius ; yOffset = Math . sin ( rad ) * radius ; ctx . moveTo ( x - xOffset , y - yOffset ) ; ctx . lineTo ( x + xOffset , y + yOffset ) ; break ; case 'dash' : ctx . moveTo ( x , y ) ; ctx . lineTo ( x + Math . cos ( rad ) * radius , y + Math . sin ( rad ) * radius ) ; break ; }
ctx . fill ( ) ; ctx . stroke ( ) ; } , _isPointInArea : function ( point , area ) { var epsilon = 1e-6 ; return point . x > area . left - epsilon && point . x < area . right + epsilon && point . y > area . top - epsilon && point . y < area . bottom + epsilon ; } , clipArea : function ( ctx , area ) { ctx . save ( ) ; ctx . beginPath ( ) ; ctx . rect ( area . left , area . top , area . right - area . left , area . bottom - area . top ) ; ctx . clip ( ) ; } , unclipArea : function ( ctx ) { ctx . restore ( ) ; } , lineTo : function ( ctx , previous , target , flip ) { var stepped = target . steppedLine ; if ( stepped ) { if ( stepped === 'middle' ) { var midpoint = ( previous . x + target . x ) / 2.0 ; ctx . lineTo ( midpoint , flip ? target . y : previous . y ) ; ctx . lineTo ( midpoint , flip ? previous . y : target . y ) ; } else if ( ( stepped === 'after' && ! flip ) || ( stepped !== 'after' && flip ) ) { ctx . lineTo ( previous . x , target . y ) ; } else { ctx . lineTo ( target . x , previous . y ) ; }
ctx . lineTo ( target . x , target . y ) ; return ; }
if ( ! target . tension ) { ctx . lineTo ( target . x , target . y ) ; return ; }
ctx . bezierCurveTo ( flip ? previous . controlPointPreviousX : previous . controlPointNextX , flip ? previous . controlPointPreviousY : previous . controlPointNextY , flip ? target . controlPointNextX : target . controlPointPreviousX , flip ? target . controlPointNextY : target . controlPointPreviousY , target . x , target . y ) ; } } ; var helpers _canvas = exports$1 ; helpers _core . clear = exports$1 . clear ; helpers _core . drawRoundedRectangle = function ( ctx ) { ctx . beginPath ( ) ; exports$1 . roundedRect . apply ( exports$1 , arguments ) ; } ; var defaults = { _set : function ( scope , values ) { return helpers _core . merge ( this [ scope ] || ( this [ scope ] = { } ) , values ) ; } } ; defaults . _set ( 'global' , { defaultColor : 'rgba(0,0,0,0.1)' , defaultFontColor : '#666' , defaultFontFamily : "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif" , defaultFontSize : 12 , defaultFontStyle : 'normal' , defaultLineHeight : 1.2 , showLines : true } ) ; var core _defaults = defaults ; var valueOrDefault = helpers _core . valueOrDefault ; function toFontString ( font ) { if ( ! font || helpers _core . isNullOrUndef ( font . size ) || helpers _core . isNullOrUndef ( font . family ) ) { return null ; }
return ( font . style ? font . style + ' ' : '' )
+ ( font . weight ? font . weight + ' ' : '' )
+ font . size + 'px '
+ font . family ; }
var helpers _options = { toLineHeight : function ( value , size ) { var matches = ( '' + value ) . match ( /^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/ ) ; if ( ! matches || matches [ 1 ] === 'normal' ) { return size * 1.2 ; }
value = + matches [ 2 ] ; switch ( matches [ 3 ] ) { case 'px' : return value ; case '%' : value /= 100 ; break ; }
return size * value ; } , toPadding : function ( value ) { var t , r , b , l ; if ( helpers _core . isObject ( value ) ) { t = + value . top || 0 ; r = + value . right || 0 ; b = + value . bottom || 0 ; l = + value . left || 0 ; } else { t = r = b = l = + value || 0 ; }
return { top : t , right : r , bottom : b , left : l , height : t + b , width : l + r } ; } , _parseFont : function ( options ) { var globalDefaults = core _defaults . global ; var size = valueOrDefault ( options . fontSize , globalDefaults . defaultFontSize ) ; var font = { family : valueOrDefault ( options . fontFamily , globalDefaults . defaultFontFamily ) , lineHeight : helpers _core . options . toLineHeight ( valueOrDefault ( options . lineHeight , globalDefaults . defaultLineHeight ) , size ) , size : size , style : valueOrDefault ( options . fontStyle , globalDefaults . defaultFontStyle ) , weight : null , string : '' } ; font . string = toFontString ( font ) ; return font ; } , resolve : function ( inputs , context , index , info ) { var cacheable = true ; var i , ilen , value ; for ( i = 0 , ilen = inputs . length ; i < ilen ; ++ i ) { value = inputs [ i ] ; if ( value === undefined ) { continue ; }
if ( context !== undefined && typeof value === 'function' ) { value = value ( context ) ; cacheable = false ; }
if ( index !== undefined && helpers _core . isArray ( value ) ) { value = value [ index ] ; cacheable = false ; }
if ( value !== undefined ) { if ( info && ! cacheable ) { info . cacheable = false ; }
return value ; } } } } ; var exports$2 = { _factorize : function ( value ) { var result = [ ] ; var sqrt = Math . sqrt ( value ) ; var i ; for ( i = 1 ; i < sqrt ; i ++ ) { if ( value % i === 0 ) { result . push ( i ) ; result . push ( value / i ) ; } }
if ( sqrt === ( sqrt | 0 ) ) { result . push ( sqrt ) ; }
result . sort ( function ( a , b ) { return a - b ; } ) . pop ( ) ; return result ; } , log10 : Math . log10 || function ( x ) { var exponent = Math . log ( x ) * Math . LOG10E ; var powerOf10 = Math . round ( exponent ) ; var isPowerOf10 = x === Math . pow ( 10 , powerOf10 ) ; return isPowerOf10 ? powerOf10 : exponent ; } } ; var helpers _math = exports$2 ; helpers _core . log10 = exports$2 . log10 ; var getRtlAdapter = function ( rectX , width ) { return { x : function ( x ) { return rectX + rectX + width - x ; } , setWidth : function ( w ) { width = w ; } , textAlign : function ( align ) { if ( align === 'center' ) { return align ; }
return align === 'right' ? 'left' : 'right' ; } , xPlus : function ( x , value ) { return x - value ; } , leftForLtr : function ( x , itemWidth ) { return x - itemWidth ; } , } ; } ; var getLtrAdapter = function ( ) { return { x : function ( x ) { return x ; } , setWidth : function ( w ) { } , textAlign : function ( align ) { return align ; } , xPlus : function ( x , value ) { return x + value ; } , leftForLtr : function ( x , _itemWidth ) { return x ; } , } ; } ; var getAdapter = function ( rtl , rectX , width ) { return rtl ? getRtlAdapter ( rectX , width ) : getLtrAdapter ( ) ; } ; var overrideTextDirection = function ( ctx , direction ) { var style , original ; if ( direction === 'ltr' || direction === 'rtl' ) { style = ctx . canvas . style ; original = [ style . getPropertyValue ( 'direction' ) , style . getPropertyPriority ( 'direction' ) , ] ; style . setProperty ( 'direction' , direction , 'important' ) ; ctx . prevTextDirection = original ; } } ; var restoreTextDirection = function ( ctx ) { var original = ctx . prevTextDirection ; if ( original !== undefined ) { delete ctx . prevTextDirection ; ctx . canvas . style . setProperty ( 'direction' , original [ 0 ] , original [ 1 ] ) ; } } ; var helpers _rtl = { getRtlAdapter : getAdapter , overrideTextDirection : overrideTextDirection , restoreTextDirection : restoreTextDirection , } ; var helpers$1 = helpers _core ; var easing = helpers _easing ; var canvas = helpers _canvas ; var options = helpers _options ; var math = helpers _math ; var rtl = helpers _rtl ; helpers$1 . easing = easing ; helpers$1 . canvas = canvas ; helpers$1 . options = options ; helpers$1 . math = math ; helpers$1 . rtl = rtl ; function interpolate ( start , view , model , ease ) { var keys = Object . keys ( model ) ; var i , ilen , key , actual , origin , target , type , c0 , c1 ; for ( i = 0 , ilen = keys . length ; i < ilen ; ++ i ) { key = keys [ i ] ; target = model [ key ] ; if ( ! view . hasOwnProperty ( key ) ) { view [ key ] = target ; }
actual = view [ key ] ; if ( actual === target || key [ 0 ] === '_' ) { continue ; }
if ( ! start . hasOwnProperty ( key ) ) { start [ key ] = actual ; }
origin = start [ key ] ; type = typeof target ; if ( type === typeof origin ) { if ( type === 'string' ) { c0 = chartjsColor ( origin ) ; if ( c0 . valid ) { c1 = chartjsColor ( target ) ; if ( c1 . valid ) { view [ key ] = c1 . mix ( c0 , ease ) . rgbString ( ) ; continue ; } } } else if ( helpers$1 . isFinite ( origin ) && helpers$1 . isFinite ( target ) ) { view [ key ] = origin + ( target - origin ) * ease ; continue ; } }
view [ key ] = target ; } }
var Element = function ( configuration ) { helpers$1 . extend ( this , configuration ) ; this . initialize . apply ( this , arguments ) ; } ; helpers$1 . extend ( Element . prototype , { _type : undefined , initialize : function ( ) { this . hidden = false ; } , pivot : function ( ) { var me = this ; if ( ! me . _view ) { me . _view = helpers$1 . extend ( { } , me . _model ) ; }
me . _start = { } ; return me ; } , transition : function ( ease ) { var me = this ; var model = me . _model ; var start = me . _start ; var view = me . _view ; if ( ! model || ease === 1 ) { me . _view = helpers$1 . extend ( { } , model ) ; me . _start = null ; return me ; }
if ( ! view ) { view = me . _view = { } ; }
if ( ! start ) { start = me . _start = { } ; }
interpolate ( start , view , model , ease ) ; return me ; } , tooltipPosition : function ( ) { return { x : this . _model . x , y : this . _model . y } ; } , hasValue : function ( ) { return helpers$1 . isNumber ( this . _model . x ) && helpers$1 . isNumber ( this . _model . y ) ; } } ) ; Element . extend = helpers$1 . inherits ; var core _element = Element ; var exports$3 = core _element . extend ( { chart : null , currentStep : 0 , numSteps : 60 , easing : '' , render : null , onAnimationProgress : null , onAnimationComplete : null , } ) ; var core _animation = exports$3 ; Object . defineProperty ( exports$3 . prototype , 'animationObject' , { get : function ( ) { return this ; } } ) ; Object . defineProperty ( exports$3 . prototype , 'chartInstance' , { get : function ( ) { return this . chart ; } , set : function ( value ) { this . chart = value ; } } ) ; core _defaults . _set ( 'global' , { animation : { duration : 1000 , easing : 'easeOutQuart' , onProgress : helpers$1 . noop , onComplete : helpers$1 . noop } } ) ; var core _animations = { animations : [ ] , request : null , addAnimation : function ( chart , animation , duration , lazy ) { var animations = this . animations ; var i , ilen ; animation . chart = chart ; animation . startTime = Date . now ( ) ; animation . duration = duration ; if ( ! lazy ) { chart . animating = true ; }
for ( i = 0 , ilen = animations . length ; i < ilen ; ++ i ) { if ( animations [ i ] . chart === chart ) { animations [ i ] = animation ; return ; } }
animations . push ( animation ) ; if ( animations . length === 1 ) { this . requestAnimationFrame ( ) ; } } , cancelAnimation : function ( chart ) { var index = helpers$1 . findIndex ( this . animations , function ( animation ) { return animation . chart === chart ; } ) ; if ( index !== - 1 ) { this . animations . splice ( index , 1 ) ; chart . animating = false ; } } , requestAnimationFrame : function ( ) { var me = this ; if ( me . request === null ) { me . request = helpers$1 . requestAnimFrame . call ( window , function ( ) { me . request = null ; me . startDigest ( ) ; } ) ; } } , startDigest : function ( ) { var me = this ; me . advance ( ) ; if ( me . animations . length > 0 ) { me . requestAnimationFrame ( ) ; } } , advance : function ( ) { var animations = this . animations ; var animation , chart , numSteps , nextStep ; var i = 0 ; while ( i < animations . length ) { animation = animations [ i ] ; chart = animation . chart ; numSteps = animation . numSteps ; nextStep = Math . floor ( ( Date . now ( ) - animation . startTime ) / animation . duration * numSteps ) + 1 ; animation . currentStep = Math . min ( nextStep , numSteps ) ; helpers$1 . callback ( animation . render , [ chart , animation ] , chart ) ; helpers$1 . callback ( animation . onAnimationProgress , [ animation ] , chart ) ; if ( animation . currentStep >= numSteps ) { helpers$1 . callback ( animation . onAnimationComplete , [ animation ] , chart ) ; chart . animating = false ; animations . splice ( i , 1 ) ; } else { ++ i ; } } } } ; var resolve = helpers$1 . options . resolve ; var arrayEvents = [ 'push' , 'pop' , 'shift' , 'splice' , 'unshift' ] ; function listenArrayEvents ( array , listener ) { if ( array . _chartjs ) { array . _chartjs . listeners . push ( listener ) ; return ; }
Object . defineProperty ( array , '_chartjs' , { configurable : true , enumerable : false , value : { listeners : [ listener ] } } ) ; arrayEvents . forEach ( function ( key ) { var method = 'onData' + key . charAt ( 0 ) . toUpperCase ( ) + key . slice ( 1 ) ; var base = array [ key ] ; Object . defineProperty ( array , key , { configurable : true , enumerable : false , value : function ( ) { var args = Array . prototype . slice . call ( arguments ) ; var res = base . apply ( this , args ) ; helpers$1 . each ( array . _chartjs . listeners , function ( object ) { if ( typeof object [ method ] === 'function' ) { object [ method ] . apply ( object , args ) ; } } ) ; return res ; } } ) ; } ) ; }
function unlistenArrayEvents ( array , listener ) { var stub = array . _chartjs ; if ( ! stub ) { return ; }
var listeners = stub . listeners ; var index = listeners . indexOf ( listener ) ; if ( index !== - 1 ) { listeners . splice ( index , 1 ) ; }
if ( listeners . length > 0 ) { return ; }
arrayEvents . forEach ( function ( key ) { delete array [ key ] ; } ) ; delete array . _chartjs ; }
var DatasetController = function ( chart , datasetIndex ) { this . initialize ( chart , datasetIndex ) ; } ; helpers$1 . extend ( DatasetController . prototype , { datasetElementType : null , dataElementType : null , _datasetElementOptions : [ 'backgroundColor' , 'borderCapStyle' , 'borderColor' , 'borderDash' , 'borderDashOffset' , 'borderJoinStyle' , 'borderWidth' ] , _dataElementOptions : [ 'backgroundColor' , 'borderColor' , 'borderWidth' , 'pointStyle' ] , initialize : function ( chart , datasetIndex ) { var me = this ; me . chart = chart ; me . index = datasetIndex ; me . linkScales ( ) ; me . addElements ( ) ; me . _type = me . getMeta ( ) . type ; } , updateIndex : function ( datasetIndex ) { this . index = datasetIndex ; } , linkScales : function ( ) { var me = this ; var meta = me . getMeta ( ) ; var chart = me . chart ; var scales = chart . scales ; var dataset = me . getDataset ( ) ; var scalesOpts = chart . options . scales ; if ( meta . xAxisID === null || ! ( meta . xAxisID in scales ) || dataset . xAxisID ) { meta . xAxisID = dataset . xAxisID || scalesOpts . xAxes [ 0 ] . id ; }
if ( meta . yAxisID === null || ! ( meta . yAxisID in scales ) || dataset . yAxisID ) { meta . yAxisID = dataset . yAxisID || scalesOpts . yAxes [ 0 ] . id ; } } , getDataset : function ( ) { return this . chart . data . datasets [ this . index ] ; } , getMeta : function ( ) { return this . chart . getDatasetMeta ( this . index ) ; } , getScaleForId : function ( scaleID ) { return this . chart . scales [ scaleID ] ; } , _getValueScaleId : function ( ) { return this . getMeta ( ) . yAxisID ; } , _getIndexScaleId : function ( ) { return this . getMeta ( ) . xAxisID ; } , _getValueScale : function ( ) { return this . getScaleForId ( this . _getValueScaleId ( ) ) ; } , _getIndexScale : function ( ) { return this . getScaleForId ( this . _getIndexScaleId ( ) ) ; } , reset : function ( ) { this . _update ( true ) ; } , destroy : function ( ) { if ( this . _data ) { unlistenArrayEvents ( this . _data , this ) ; } } , createMetaDataset : function ( ) { var me = this ; var type = me . datasetElementType ; return type && new type ( { _chart : me . chart , _datasetIndex : me . index } ) ; } , createMetaData : function ( index ) { var me = this ; var type = me . dataElementType ; return type && new type ( { _chart : me . chart , _datasetIndex : me . index , _index : index } ) ; } , addElements : function ( ) { var me = this ; var meta = me . getMeta ( ) ; var data = me . getDataset ( ) . data || [ ] ; var metaData = meta . data ; var i , ilen ; for ( i = 0 , ilen = data . length ; i < ilen ; ++ i ) { metaData [ i ] = metaData [ i ] || me . createMetaData ( i ) ; }
meta . dataset = meta . dataset || me . createMetaDataset ( ) ; } , addElementAndReset : function ( index ) { var element = this . createMetaData ( index ) ; this . getMeta ( ) . data . splice ( index , 0 , element ) ; this . updateElement ( element , index , true ) ; } , buildOrUpdateElements : function ( ) { var me = this ; var dataset = me . getDataset ( ) ; var data = dataset . data || ( dataset . data = [ ] ) ; if ( me . _data !== data ) { if ( me . _data ) { unlistenArrayEvents ( me . _data , me ) ; }
if ( data && Object . isExtensible ( data ) ) { listenArrayEvents ( data , me ) ; }
me . _data = data ; }
me . resyncElements ( ) ; } , _configure : function ( ) { var me = this ; me . _config = helpers$1 . merge ( { } , [ me . chart . options . datasets [ me . _type ] , me . getDataset ( ) , ] , { merger : function ( key , target , source ) { if ( key !== '_meta' && key !== 'data' ) { helpers$1 . _merger ( key , target , source ) ; } } } ) ; } , _update : function ( reset ) { var me = this ; me . _configure ( ) ; me . _cachedDataOpts = null ; me . update ( reset ) ; } , update : helpers$1 . noop , transition : function ( easingValue ) { var meta = this . getMeta ( ) ; var elements = meta . data || [ ] ; var ilen = elements . length ; var i = 0 ; for ( ; i < ilen ; ++ i ) { elements [ i ] . transition ( easingValue ) ; }
if ( meta . dataset ) { meta . dataset . transition ( easingValue ) ; } } , draw : function ( ) { var meta = this . getMeta ( ) ; var elements = meta . data || [ ] ; var ilen = elements . length ; var i = 0 ; if ( meta . dataset ) { meta . dataset . draw ( ) ; }
for ( ; i < ilen ; ++ i ) { elements [ i ] . draw ( ) ; } } , getStyle : function ( index ) { var me = this ; var meta = me . getMeta ( ) ; var dataset = meta . dataset ; var style ; me . _configure ( ) ; if ( dataset && index === undefined ) { style = me . _resolveDatasetElementOptions ( dataset || { } ) ; } else { index = index || 0 ; style = me . _resolveDataElementOptions ( meta . data [ index ] || { } , index ) ; }
if ( style . fill === false || style . fill === null ) { style . backgroundColor = style . borderColor ; }
return style ; } , _resolveDatasetElementOptions : function ( element , hover ) { var me = this ; var chart = me . chart ; var datasetOpts = me . _config ; var custom = element . custom || { } ; var options = chart . options . elements [ me . datasetElementType . prototype . _type ] || { } ; var elementOptions = me . _datasetElementOptions ; var values = { } ; var i , ilen , key , readKey ; var context = { chart : chart , dataset : me . getDataset ( ) , datasetIndex : me . index , hover : hover } ; for ( i = 0 , ilen = elementOptions . length ; i < ilen ; ++ i ) { key = elementOptions [ i ] ; readKey = hover ? 'hover' + key . charAt ( 0 ) . toUpperCase ( ) + key . slice ( 1 ) : key ; values [ key ] = resolve ( [ custom [ readKey ] , datasetOpts [ readKey ] , options [ readKey ] ] , context ) ; }
return values ; } , _resolveDataElementOptions : function ( element , index ) { var me = this ; var custom = element && element . custom ; var cached = me . _cachedDataOpts ; if ( cached && ! custom ) { return cached ; }
var chart = me . chart ; var datasetOpts = me . _config ; var options = chart . options . elements [ me . dataElementType . prototype . _type ] || { } ; var elementOptions = me . _dataElementOptions ; var values = { } ; var context = { chart : chart , dataIndex : index , dataset : me . getDataset ( ) , datasetIndex : me . index } ; var info = { cacheable : ! custom } ; var keys , i , ilen , key ; custom = custom || { } ; if ( helpers$1 . isArray ( elementOptions ) ) { for ( i = 0 , ilen = elementOptions . length ; i < ilen ; ++ i ) { key = elementOptions [ i ] ; values [ key ] = resolve ( [ custom [ key ] , datasetOpts [ key ] , options [ key ] ] , context , index , info ) ; } } else { keys = Object . keys ( elementOptions ) ; for ( i = 0 , ilen = keys . length ; i < ilen ; ++ i ) { key = keys [ i ] ; values [ key ] = resolve ( [ custom [ key ] , datasetOpts [ elementOptions [ key ] ] , datasetOpts [ key ] , options [ key ] ] , context , index , info ) ; } }
if ( info . cacheable ) { me . _cachedDataOpts = Object . freeze ( values ) ; }
return values ; } , removeHoverStyle : function ( element ) { helpers$1 . merge ( element . _model , element . $previousStyle || { } ) ; delete element . $previousStyle ; } , setHoverStyle : function ( element ) { var dataset = this . chart . data . datasets [ element . _datasetIndex ] ; var index = element . _index ; var custom = element . custom || { } ; var model = element . _model ; var getHoverColor = helpers$1 . getHoverColor ; element . $previousStyle = { backgroundColor : model . backgroundColor , borderColor : model . borderColor , borderWidth : model . borderWidth } ; model . backgroundColor = resolve ( [ custom . hoverBackgroundColor , dataset . hoverBackgroundColor , getHoverColor ( model . backgroundColor ) ] , undefined , index ) ; model . borderColor = resolve ( [ custom . hoverBorderColor , dataset . hoverBorderColor , getHoverColor ( model . borderColor ) ] , undefined , index ) ; model . borderWidth = resolve ( [ custom . hoverBorderWidth , dataset . hoverBorderWidth , model . borderWidth ] , undefined , index ) ; } , _removeDatasetHoverStyle : function ( ) { var element = this . getMeta ( ) . dataset ; if ( element ) { this . removeHoverStyle ( element ) ; } } , _setDatasetHoverStyle : function ( ) { var element = this . getMeta ( ) . dataset ; var prev = { } ; var i , ilen , key , keys , hoverOptions , model ; if ( ! element ) { return ; }
model = element . _model ; hoverOptions = this . _resolveDatasetElementOptions ( element , true ) ; keys = Object . keys ( hoverOptions ) ; for ( i = 0 , ilen = keys . length ; i < ilen ; ++ i ) { key = keys [ i ] ; prev [ key ] = model [ key ] ; model [ key ] = hoverOptions [ key ] ; }
element . $previousStyle = prev ; } , resyncElements : function ( ) { var me = this ; var meta = me . getMeta ( ) ; var data = me . getDataset ( ) . data ; var numMeta = meta . data . length ; var numData = data . length ; if ( numData < numMeta ) { meta . data . splice ( numData , numMeta - numData ) ; } else if ( numData > numMeta ) { me . insertElements ( numMeta , numData - numMeta ) ; } } , insertElements : function ( start , count ) { for ( var i = 0 ; i < count ; ++ i ) { this . addElementAndReset ( start + i ) ; } } , onDataPush : function ( ) { var count = arguments . length ; this . insertElements ( this . getDataset ( ) . data . length - count , count ) ; } , onDataPop : function ( ) { this . getMeta ( ) . data . pop ( ) ; } , onDataShift : function ( ) { this . getMeta ( ) . data . shift ( ) ; } , onDataSplice : function ( start , count ) { this . getMeta ( ) . data . splice ( start , count ) ; this . insertElements ( start , arguments . length - 2 ) ; } , onDataUnshift : function ( ) { this . insertElements ( 0 , arguments . length ) ; } } ) ; DatasetController . extend = helpers$1 . inherits ; var core _datasetController = DatasetController ; var TAU = Math . PI * 2 ; core _defaults . _set ( 'global' , { elements : { arc : { backgroundColor : core _defaults . global . defaultColor , borderColor : '#fff' , borderWidth : 2 , borderAlign : 'center' } } } ) ; function clipArc ( ctx , arc ) { var startAngle = arc . startAngle ; var endAngle = arc . endAngle ; var pixelMargin = arc . pixelMargin ; var angleMargin = pixelMargin / arc . outerRadius ; var x = arc . x ; var y = arc . y ; ctx . beginPath ( ) ; ctx . arc ( x , y , arc . outerRadius , startAngle - angleMargin , endAngle + angleMargin ) ; if ( arc . innerRadius > pixelMargin ) { angleMargin = pixelMargin / arc . innerRadius ; ctx . arc ( x , y , arc . innerRadius - pixelMargin , endAngle + angleMargin , startAngle - angleMargin , true ) ; } else { ctx . arc ( x , y , pixelMargin , endAngle + Math . PI / 2 , startAngle - Math . PI / 2 ) ; }
ctx . closePath ( ) ; ctx . clip ( ) ; }
function drawFullCircleBorders ( ctx , vm , arc , inner ) { var endAngle = arc . endAngle ; var i ; if ( inner ) { arc . endAngle = arc . startAngle + TAU ; clipArc ( ctx , arc ) ; arc . endAngle = endAngle ; if ( arc . endAngle === arc . startAngle && arc . fullCircles ) { arc . endAngle += TAU ; arc . fullCircles -- ; } }
ctx . beginPath ( ) ; ctx . arc ( arc . x , arc . y , arc . innerRadius , arc . startAngle + TAU , arc . startAngle , true ) ; for ( i = 0 ; i < arc . fullCircles ; ++ i ) { ctx . stroke ( ) ; }
ctx . beginPath ( ) ; ctx . arc ( arc . x , arc . y , vm . outerRadius , arc . startAngle , arc . startAngle + TAU ) ; for ( i = 0 ; i < arc . fullCircles ; ++ i ) { ctx . stroke ( ) ; } }
function drawBorder ( ctx , vm , arc ) { var inner = vm . borderAlign === 'inner' ; if ( inner ) { ctx . lineWidth = vm . borderWidth * 2 ; ctx . lineJoin = 'round' ; } else { ctx . lineWidth = vm . borderWidth ; ctx . lineJoin = 'bevel' ; }
if ( arc . fullCircles ) { drawFullCircleBorders ( ctx , vm , arc , inner ) ; }
if ( inner ) { clipArc ( ctx , arc ) ; }
ctx . beginPath ( ) ; ctx . arc ( arc . x , arc . y , vm . outerRadius , arc . startAngle , arc . endAngle ) ; ctx . arc ( arc . x , arc . y , arc . innerRadius , arc . endAngle , arc . startAngle , true ) ; ctx . closePath ( ) ; ctx . stroke ( ) ; }
var element _arc = core _element . extend ( { _type : 'arc' , inLabelRange : function ( mouseX ) { var vm = this . _view ; if ( vm ) { return ( Math . pow ( mouseX - vm . x , 2 ) < Math . pow ( vm . radius + vm . hoverRadius , 2 ) ) ; }
return false ; } , inRange : function ( chartX , chartY ) { var vm = this . _view ; if ( vm ) { var pointRelativePosition = helpers$1 . getAngleFromPoint ( vm , { x : chartX , y : chartY } ) ; var angle = pointRelativePosition . angle ; var distance = pointRelativePosition . distance ; var startAngle = vm . startAngle ; var endAngle = vm . endAngle ; while ( endAngle < startAngle ) { endAngle += TAU ; }
while ( angle > endAngle ) { angle -= TAU ; }
while ( angle < startAngle ) { angle += TAU ; }
var betweenAngles = ( angle >= startAngle && angle <= endAngle ) ; var withinRadius = ( distance >= vm . innerRadius && distance <= vm . outerRadius ) ; return ( betweenAngles && withinRadius ) ; }
return false ; } , getCenterPoint : function ( ) { var vm = this . _view ; var halfAngle = ( vm . startAngle + vm . endAngle ) / 2 ; var halfRadius = ( vm . innerRadius + vm . outerRadius ) / 2 ; return { x : vm . x + Math . cos ( halfAngle ) * halfRadius , y : vm . y + Math . sin ( halfAngle ) * halfRadius } ; } , getArea : function ( ) { var vm = this . _view ; return Math . PI * ( ( vm . endAngle - vm . startAngle ) / ( 2 * Math . PI ) ) * ( Math . pow ( vm . outerRadius , 2 ) - Math . pow ( vm . innerRadius , 2 ) ) ; } , tooltipPosition : function ( ) { var vm = this . _view ; var centreAngle = vm . startAngle + ( ( vm . endAngle - vm . startAngle ) / 2 ) ; var rangeFromCentre = ( vm . outerRadius - vm . innerRadius ) / 2 + vm . innerRadius ; return { x : vm . x + ( Math . cos ( centreAngle ) * rangeFromCentre ) , y : vm . y + ( Math . sin ( centreAngle ) * rangeFromCentre ) } ; } , draw : function ( ) { var ctx = this . _chart . ctx ; var vm = this . _view ; var pixelMargin = ( vm . borderAlign === 'inner' ) ? 0.33 : 0 ; var arc = { x : vm . x , y : vm . y , innerRadius : vm . innerRadius , outerRadius : Math . max ( vm . outerRadius - pixelMargin , 0 ) , pixelMargin : pixelMargin , startAngle : vm . startAngle , endAngle : vm . endAngle , fullCircles : Math . floor ( vm . circumference / TAU ) } ; var i ; ctx . save ( ) ; ctx . fillStyle = vm . backgroundColor ; ctx . strokeStyle = vm . borderColor ; if ( arc . fullCircles ) { arc . endAngle = arc . startAngle + TAU ; ctx . beginPath ( ) ; ctx . arc ( arc . x , arc . y , arc . outerRadius , arc . startAngle , arc . endAngle ) ; ctx . arc ( arc . x , arc . y , arc . innerRadius , arc . endAngle , arc . startAngle , true ) ; ctx . closePath ( ) ; for ( i = 0 ; i < arc . fullCircles ; ++ i ) { ctx . fill ( ) ; }
arc . endAngle = arc . startAngle + vm . circumference % TAU ; }
ctx . beginPath ( ) ; ctx . arc ( arc . x , arc . y , arc . outerRadius , arc . startAngle , arc . endAngle ) ; ctx . arc ( arc . x , arc . y , arc . innerRadius , arc . endAngle , arc . startAngle , true ) ; ctx . closePath ( ) ; ctx . fill ( ) ; if ( vm . borderWidth ) { drawBorder ( ctx , vm , arc ) ; }
ctx . restore ( ) ; } } ) ; var valueOrDefault$1 = helpers$1 . valueOrDefault ; var defaultColor = core _defaults . global . defaultColor ; core _defaults . _set ( 'global' , { elements : { line : { tension : 0.4 , backgroundColor : defaultColor , borderWidth : 3 , borderColor : defaultColor , borderCapStyle : 'butt' , borderDash : [ ] , borderDashOffset : 0.0 , borderJoinStyle : 'miter' , capBezierPoints : true , fill : true , } } } ) ; var element _line = core _element . extend ( { _type : 'line' , draw : function ( ) { var me = this ; var vm = me . _view ; var ctx = me . _chart . ctx ; var spanGaps = vm . spanGaps ; var points = me . _children . slice ( ) ; var globalDefaults = core _defaults . global ; var globalOptionLineElements = globalDefaults . elements . line ; var lastDrawnIndex = - 1 ; var closePath = me . _loop ; var index , previous , currentVM ; if ( ! points . length ) { return ; }
if ( me . _loop ) { for ( index = 0 ; index < points . length ; ++ index ) { previous = helpers$1 . previousItem ( points , index ) ; if ( ! points [ index ] . _view . skip && previous . _view . skip ) { points = points . slice ( index ) . concat ( points . slice ( 0 , index ) ) ; closePath = spanGaps ; break ; } }
if ( closePath ) { points . push ( points [ 0 ] ) ; } }
ctx . save ( ) ; ctx . lineCap = vm . borderCapStyle || globalOptionLineElements . borderCapStyle ; if ( ctx . setLineDash ) { ctx . setLineDash ( vm . borderDash || globalOptionLineElements . borderDash ) ; }
ctx . lineDashOffset = valueOrDefault$1 ( vm . borderDashOffset , globalOptionLineElements . borderDashOffset ) ; ctx . lineJoin = vm . borderJoinStyle || globalOptionLineElements . borderJoinStyle ; ctx . lineWidth = valueOrDefault$1 ( vm . borderWidth , globalOptionLineElements . borderWidth ) ; ctx . strokeStyle = vm . borderColor || globalDefaults . defaultColor ; ctx . beginPath ( ) ; currentVM = points [ 0 ] . _view ; if ( ! currentVM . skip ) { ctx . moveTo ( currentVM . x , currentVM . y ) ; lastDrawnIndex = 0 ; }
for ( index = 1 ; index < points . length ; ++ index ) { currentVM = points [ index ] . _view ; previous = lastDrawnIndex === - 1 ? helpers$1 . previousItem ( points , index ) : points [ lastDrawnIndex ] ; if ( ! currentVM . skip ) { if ( ( lastDrawnIndex !== ( index - 1 ) && ! spanGaps ) || lastDrawnIndex === - 1 ) { ctx . moveTo ( currentVM . x , currentVM . y ) ; } else { helpers$1 . canvas . lineTo ( ctx , previous . _view , currentVM ) ; }
lastDrawnIndex = index ; } }
if ( closePath ) { ctx . closePath ( ) ; }
ctx . stroke ( ) ; ctx . restore ( ) ; } } ) ; var valueOrDefault$2 = helpers$1 . valueOrDefault ; var defaultColor$1 = core _defaults . global . defaultColor ; core _defaults . _set ( 'global' , { elements : { point : { radius : 3 , pointStyle : 'circle' , backgroundColor : defaultColor$1 , borderColor : defaultColor$1 , borderWidth : 1 , hitRadius : 1 , hoverRadius : 4 , hoverBorderWidth : 1 } } } ) ; function xRange ( mouseX ) { var vm = this . _view ; return vm ? ( Math . abs ( mouseX - vm . x ) < vm . radius + vm . hitRadius ) : false ; }
function yRange ( mouseY ) { var vm = this . _view ; return vm ? ( Math . abs ( mouseY - vm . y ) < vm . radius + vm . hitRadius ) : false ; }
var element _point = core _element . extend ( { _type : 'point' , inRange : function ( mouseX , mouseY ) { var vm = this . _view ; return vm ? ( ( Math . pow ( mouseX - vm . x , 2 ) + Math . pow ( mouseY - vm . y , 2 ) ) < Math . pow ( vm . hitRadius + vm . radius , 2 ) ) : false ; } , inLabelRange : xRange , inXRange : xRange , inYRange : yRange , getCenterPoint : function ( ) { var vm = this . _view ; return { x : vm . x , y : vm . y } ; } , getArea : function ( ) { return Math . PI * Math . pow ( this . _view . radius , 2 ) ; } , tooltipPosition : function ( ) { var vm = this . _view ; return { x : vm . x , y : vm . y , padding : vm . radius + vm . borderWidth } ; } , draw : function ( chartArea ) { var vm = this . _view ; var ctx = this . _chart . ctx ; var pointStyle = vm . pointStyle ; var rotation = vm . rotation ; var radius = vm . radius ; var x = vm . x ; var y = vm . y ; var globalDefaults = core _defaults . global ; var defaultColor = globalDefaults . defaultColor ; if ( vm . skip ) { return ; }
if ( chartArea === undefined || helpers$1 . canvas . _isPointInArea ( vm , chartArea ) ) { ctx . strokeStyle = vm . borderColor || defaultColor ; ctx . lineWidth = valueOrDefault$2 ( vm . borderWidth , globalDefaults . elements . point . borderWidth ) ; ctx . fillStyle = vm . backgroundColor || defaultColor ; helpers$1 . canvas . drawPoint ( ctx , pointStyle , radius , x , y , rotation ) ; } } } ) ; var defaultColor$2 = core _defaults . global . defaultColor ; core _defaults . _set ( 'global' , { elements : { rectangle : { backgroundColor : defaultColor$2 , borderColor : defaultColor$2 , borderSkipped : 'bottom' , borderWidth : 0 } } } ) ; function isVertical ( vm ) { return vm && vm . width !== undefined ; }
function getBarBounds ( vm ) { var x1 , x2 , y1 , y2 , half ; if ( isVertical ( vm ) ) { half = vm . width / 2 ; x1 = vm . x - half ; x2 = vm . x + half ; y1 = Math . min ( vm . y , vm . base ) ; y2 = Math . max ( vm . y , vm . base ) ; } else { half = vm . height / 2 ; x1 = Math . min ( vm . x , vm . base ) ; x2 = Math . max ( vm . x , vm . base ) ; y1 = vm . y - half ; y2 = vm . y + half ; }
return { left : x1 , top : y1 , right : x2 , bottom : y2 } ; }
function swap ( orig , v1 , v2 ) { return orig === v1 ? v2 : orig === v2 ? v1 : orig ; }
function parseBorderSkipped ( vm ) { var edge = vm . borderSkipped ; var res = { } ; if ( ! edge ) { return res ; }
if ( vm . horizontal ) { if ( vm . base > vm . x ) { edge = swap ( edge , 'left' , 'right' ) ; } } else if ( vm . base < vm . y ) { edge = swap ( edge , 'bottom' , 'top' ) ; }
res [ edge ] = true ; return res ; }
function parseBorderWidth ( vm , maxW , maxH ) { var value = vm . borderWidth ; var skip = parseBorderSkipped ( vm ) ; var t , r , b , l ; if ( helpers$1 . isObject ( value ) ) { t = + value . top || 0 ; r = + value . right || 0 ; b = + value . bottom || 0 ; l = + value . left || 0 ; } else { t = r = b = l = + value || 0 ; }
return { t : skip . top || ( t < 0 ) ? 0 : t > maxH ? maxH : t , r : skip . right || ( r < 0 ) ? 0 : r > maxW ? maxW : r , b : skip . bottom || ( b < 0 ) ? 0 : b > maxH ? maxH : b , l : skip . left || ( l < 0 ) ? 0 : l > maxW ? maxW : l } ; }
function boundingRects ( vm ) { var bounds = getBarBounds ( vm ) ; var width = bounds . right - bounds . left ; var height = bounds . bottom - bounds . top ; var border = parseBorderWidth ( vm , width / 2 , height / 2 ) ; return { outer : { x : bounds . left , y : bounds . top , w : width , h : height } , inner : { x : bounds . left + border . l , y : bounds . top + border . t , w : width - border . l - border . r , h : height - border . t - border . b } } ; }
function inRange ( vm , x , y ) { var skipX = x === null ; var skipY = y === null ; var bounds = ! vm || ( skipX && skipY ) ? false : getBarBounds ( vm ) ; return bounds && ( skipX || x >= bounds . left && x <= bounds . right ) && ( skipY || y >= bounds . top && y <= bounds . bottom ) ; }
var element _rectangle = core _element . extend ( { _type : 'rectangle' , draw : function ( ) { var ctx = this . _chart . ctx ; var vm = this . _view ; var rects = boundingRects ( vm ) ; var outer = rects . outer ; var inner = rects . inner ; ctx . fillStyle = vm . backgroundColor ; ctx . fillRect ( outer . x , outer . y , outer . w , outer . h ) ; if ( outer . w === inner . w && outer . h === inner . h ) { return ; }
ctx . save ( ) ; ctx . beginPath ( ) ; ctx . rect ( outer . x , outer . y , outer . w , outer . h ) ; ctx . clip ( ) ; ctx . fillStyle = vm . borderColor ; ctx . rect ( inner . x , inner . y , inner . w , inner . h ) ; ctx . fill ( 'evenodd' ) ; ctx . restore ( ) ; } , height : function ( ) { var vm = this . _view ; return vm . base - vm . y ; } , inRange : function ( mouseX , mouseY ) { return inRange ( this . _view , mouseX , mouseY ) ; } , inLabelRange : function ( mouseX , mouseY ) { var vm = this . _view ; return isVertical ( vm ) ? inRange ( vm , mouseX , null ) : inRange ( vm , null , mouseY ) ; } , inXRange : function ( mouseX ) { return inRange ( this . _view , mouseX , null ) ; } , inYRange : function ( mouseY ) { return inRange ( this . _view , null , mouseY ) ; } , getCenterPoint : function ( ) { var vm = this . _view ; var x , y ; if ( isVertical ( vm ) ) { x = vm . x ; y = ( vm . y + vm . base ) / 2 ; } else { x = ( vm . x + vm . base ) / 2 ; y = vm . y ; }
return { x : x , y : y } ; } , getArea : function ( ) { var vm = this . _view ; return isVertical ( vm ) ? vm . width * Math . abs ( vm . y - vm . base ) : vm . height * Math . abs ( vm . x - vm . base ) ; } , tooltipPosition : function ( ) { var vm = this . _view ; return { x : vm . x , y : vm . y } ; } } ) ; var elements = { } ; var Arc = element _arc ; var Line = element _line ; var Point = element _point ; var Rectangle = element _rectangle ; elements . Arc = Arc ; elements . Line = Line ; elements . Point = Point ; elements . Rectangle = Rectangle ; var deprecated = helpers$1 . _deprecated ; var valueOrDefault$3 = helpers$1 . valueOrDefault ; core _defaults . _set ( 'bar' , { hover : { mode : 'label' } , scales : { xAxes : [ { type : 'category' , offset : true , gridLines : { offsetGridLines : true } } ] , yAxes : [ { type : 'linear' } ] } } ) ; core _defaults . _set ( 'global' , { datasets : { bar : { categoryPercentage : 0.8 , barPercentage : 0.9 } } } ) ; function computeMinSampleSize ( scale , pixels ) { var min = scale . _length ; var prev , curr , i , ilen ; for ( i = 1 , ilen = pixels . length ; i < ilen ; ++ i ) { min = Math . min ( min , Math . abs ( pixels [ i ] - pixels [ i - 1 ] ) ) ; }
for ( i = 0 , ilen = scale . getTicks ( ) . length ; i < ilen ; ++ i ) { curr = scale . getPixelForTick ( i ) ; min = i > 0 ? Math . min ( min , Math . abs ( curr - prev ) ) : min ; prev = curr ; }
return min ; }
function computeFitCategoryTraits ( index , ruler , options ) { var thickness = options . barThickness ; var count = ruler . stackCount ; var curr = ruler . pixels [ index ] ; var min = helpers$1 . isNullOrUndef ( thickness ) ? computeMinSampleSize ( ruler . scale , ruler . pixels ) : - 1 ; var size , ratio ; if ( helpers$1 . isNullOrUndef ( thickness ) ) { size = min * options . categoryPercentage ; ratio = options . barPercentage ; } else { size = thickness * count ; ratio = 1 ; }
return { chunk : size / count , ratio : ratio , start : curr - ( size / 2 ) } ; }
function computeFlexCategoryTraits ( index , ruler , options ) { var pixels = ruler . pixels ; var curr = pixels [ index ] ; var prev = index > 0 ? pixels [ index - 1 ] : null ; var next = index < pixels . length - 1 ? pixels [ index + 1 ] : null ; var percent = options . categoryPercentage ; var start , size ; if ( prev === null ) { prev = curr - ( next === null ? ruler . end - ruler . start : next - curr ) ; }
if ( next === null ) { next = curr + curr - prev ; }
start = curr - ( curr - Math . min ( prev , next ) ) / 2 * percent ; size = Math . abs ( next - prev ) / 2 * percent ; return { chunk : size / ruler . stackCount , ratio : options . barPercentage , start : start } ; }
var controller _bar = core _datasetController . extend ( { dataElementType : elements . Rectangle , _dataElementOptions : [ 'backgroundColor' , 'borderColor' , 'borderSkipped' , 'borderWidth' , 'barPercentage' , 'barThickness' , 'categoryPercentage' , 'maxBarThickness' , 'minBarLength' ] , initialize : function ( ) { var me = this ; var meta , scaleOpts ; core _datasetController . prototype . initialize . apply ( me , arguments ) ; meta = me . getMeta ( ) ; meta . stack = me . getDataset ( ) . stack ; meta . bar = true ; scaleOpts = me . _getIndexScale ( ) . options ; deprecated ( 'bar chart' , scaleOpts . barPercentage , 'scales.[x/y]Axes.barPercentage' , 'dataset.barPercentage' ) ; deprecated ( 'bar chart' , scaleOpts . barThickness , 'scales.[x/y]Axes.barThickness' , 'dataset.barThickness' ) ; deprecated ( 'bar chart' , scaleOpts . categoryPercentage , 'scales.[x/y]Axes.categoryPercentage' , 'dataset.categoryPercentage' ) ; deprecated ( 'bar chart' , me . _getValueScale ( ) . options . minBarLength , 'scales.[x/y]Axes.minBarLength' , 'dataset.minBarLength' ) ; deprecated ( 'bar chart' , scaleOpts . maxBarThickness , 'scales.[x/y]Axes.maxBarThickness' , 'dataset.maxBarThickness' ) ; } , update : function ( reset ) { var me = this ; var rects = me . getMeta ( ) . data ; var i , ilen ; me . _ruler = me . getRuler ( ) ; for ( i = 0 , ilen = rects . length ; i < ilen ; ++ i ) { me . updateElement ( rects [ i ] , i , reset ) ; } } , updateElement : function ( rectangle , index , reset ) { var me = this ; var meta = me . getMeta ( ) ; var dataset = me . getDataset ( ) ; var options = me . _resolveDataElementOptions ( rectangle , index ) ; rectangle . _xScale = me . getScaleForId ( meta . xAxisID ) ; rectangle . _yScale = me . getScaleForId ( meta . yAxisID ) ; rectangle . _datasetIndex = me . index ; rectangle . _index = index ; rectangle . _model = { backgroundColor : options . backgroundColor , borderColor : options . borderColor , borderSkipped : options . borderSkipped , borderWidth : options . borderWidth , datasetLabel : dataset . label , label : me . chart . data . labels [ index ] } ; if ( helpers$1 . isArray ( dataset . data [ index ] ) ) { rectangle . _model . borderSkipped = null ; }
me . _updateElementGeometry ( rectangle , index , reset , options ) ; rectangle . pivot ( ) ; } , _updateElementGeometry : function ( rectangle , index , reset , options ) { var me = this ; var model = rectangle . _model ; var vscale = me . _getValueScale ( ) ; var base = vscale . getBasePixel ( ) ; var horizontal = vscale . isHorizontal ( ) ; var ruler = me . _ruler || me . getRuler ( ) ; var vpixels = me . calculateBarValuePixels ( me . index , index , options ) ; var ipixels = me . calculateBarIndexPixels ( me . index , index , ruler , options ) ; model . horizontal = horizontal ; model . base = reset ? base : vpixels . base ; model . x = horizontal ? reset ? base : vpixels . head : ipixels . center ; model . y = horizontal ? ipixels . center : reset ? base : vpixels . head ; model . height = horizontal ? ipixels . size : undefined ; model . width = horizontal ? undefined : ipixels . size ; } , _getStacks : function ( last ) { var me = this ; var scale = me . _getIndexScale ( ) ; var metasets = scale . _getMatchingVisibleMetas ( me . _type ) ; var stacked = scale . options . stacked ; var ilen = metasets . length ; var stacks = [ ] ; var i , meta ; for ( i = 0 ; i < ilen ; ++ i ) { meta = metasets [ i ] ; if ( stacked === false || stacks . indexOf ( meta . stack ) === - 1 || ( stacked === undefined && meta . stack === undefined ) ) { stacks . push ( meta . stack ) ; }
if ( meta . index === last ) { break ; } }
return stacks ; } , getStackCount : function ( ) { return this . _getStacks ( ) . length ; } , getStackIndex : function ( datasetIndex , name ) { var stacks = this . _getStacks ( datasetIndex ) ; var index = ( name !== undefined ) ? stacks . indexOf ( name ) : - 1 ; return ( index === - 1 ) ? stacks . length - 1 : index ; } , getRuler : function ( ) { var me = this ; var scale = me . _getIndexScale ( ) ; var pixels = [ ] ; var i , ilen ; for ( i = 0 , ilen = me . getMeta ( ) . data . length ; i < ilen ; ++ i ) { pixels . push ( scale . getPixelForValue ( null , i , me . index ) ) ; }
return { pixels : pixels , start : scale . _startPixel , end : scale . _endPixel , stackCount : me . getStackCount ( ) , scale : scale } ; } , calculateBarValuePixels : function ( datasetIndex , index , options ) { var me = this ; var chart = me . chart ; var scale = me . _getValueScale ( ) ; var isHorizontal = scale . isHorizontal ( ) ; var datasets = chart . data . datasets ; var metasets = scale . _getMatchingVisibleMetas ( me . _type ) ; var value = scale . _parseValue ( datasets [ datasetIndex ] . data [ index ] ) ; var minBarLength = options . minBarLength ; var stacked = scale . options . stacked ; var stack = me . getMeta ( ) . stack ; var start = value . start === undefined ? 0 : value . max >= 0 && value . min >= 0 ? value . min : value . max ; var length = value . start === undefined ? value . end : value . max >= 0 && value . min >= 0 ? value . max - value . min : value . min - value . max ; var ilen = metasets . length ; var i , imeta , ivalue , base , head , size , stackLength ; if ( stacked || ( stacked === undefined && stack !== undefined ) ) { for ( i = 0 ; i < ilen ; ++ i ) { imeta = metasets [ i ] ; if ( imeta . index === datasetIndex ) { break ; }
if ( imeta . stack === stack ) { stackLength = scale . _parseValue ( datasets [ imeta . index ] . data [ index ] ) ; ivalue = stackLength . start === undefined ? stackLength . end : stackLength . min >= 0 && stackLength . max >= 0 ? stackLength . max : stackLength . min ; if ( ( value . min < 0 && ivalue < 0 ) || ( value . max >= 0 && ivalue > 0 ) ) { start += ivalue ; } } } }
base = scale . getPixelForValue ( start ) ; head = scale . getPixelForValue ( start + length ) ; size = head - base ; if ( minBarLength !== undefined && Math . abs ( size ) < minBarLength ) { size = minBarLength ; if ( length >= 0 && ! isHorizontal || length < 0 && isHorizontal ) { head = base - minBarLength ; } else { head = base + minBarLength ; } }
return { size : size , base : base , head : head , center : head + size / 2 } ; } , calculateBarIndexPixels : function ( datasetIndex , index , ruler , options ) { var me = this ; var range = options . barThickness === 'flex' ? computeFlexCategoryTraits ( index , ruler , options ) : computeFitCategoryTraits ( index , ruler , options ) ; var stackIndex = me . getStackIndex ( datasetIndex , me . getMeta ( ) . stack ) ; var center = range . start + ( range . chunk * stackIndex ) + ( range . chunk / 2 ) ; var size = Math . min ( valueOrDefault$3 ( options . maxBarThickness , Infinity ) , range . chunk * range . ratio ) ; return { base : center - size / 2 , head : center + size / 2 , center : center , size : size } ; } , draw : function ( ) { var me = this ; var chart = me . chart ; var scale = me . _getValueScale ( ) ; var rects = me . getMeta ( ) . data ; var dataset = me . getDataset ( ) ; var ilen = rects . length ; var i = 0 ; helpers$1 . canvas . clipArea ( chart . ctx , chart . chartArea ) ; for ( ; i < ilen ; ++ i ) { var val = scale . _parseValue ( dataset . data [ i ] ) ; if ( ! isNaN ( val . min ) && ! isNaN ( val . max ) ) { rects [ i ] . draw ( ) ; } }
helpers$1 . canvas . unclipArea ( chart . ctx ) ; } , _resolveDataElementOptions : function ( ) { var me = this ; var values = helpers$1 . extend ( { } , core _datasetController . prototype . _resolveDataElementOptions . apply ( me , arguments ) ) ; var indexOpts = me . _getIndexScale ( ) . options ; var valueOpts = me . _getValueScale ( ) . options ; values . barPercentage = valueOrDefault$3 ( indexOpts . barPercentage , values . barPercentage ) ; values . barThickness = valueOrDefault$3 ( indexOpts . barThickness , values . barThickness ) ; values . categoryPercentage = valueOrDefault$3 ( indexOpts . categoryPercentage , values . categoryPercentage ) ; values . maxBarThickness = valueOrDefault$3 ( indexOpts . maxBarThickness , values . maxBarThickness ) ; values . minBarLength = valueOrDefault$3 ( valueOpts . minBarLength , values . minBarLength ) ; return values ; } } ) ; var valueOrDefault$4 = helpers$1 . valueOrDefault ; var resolve$1 = helpers$1 . options . resolve ; core _defaults . _set ( 'bubble' , { hover : { mode : 'single' } , scales : { xAxes : [ { type : 'linear' , position : 'bottom' , id : 'x-axis-0' } ] , yAxes : [ { type : 'linear' , position : 'left' , id : 'y-axis-0' } ] } , tooltips : { callbacks : { title : function ( ) { return '' ; } , label : function ( item , data ) { var datasetLabel = data . datasets [ item . datasetIndex ] . label || '' ; var dataPoint = data . datasets [ item . datasetIndex ] . data [ item . index ] ; return datasetLabel + ': (' + item . xLabel + ', ' + item . yLabel + ', ' + dataPoint . r + ')' ; } } } } ) ; var controller _bubble = core _datasetController . extend ( { dataElementType : elements . Point , _dataElementOptions : [ 'backgroundColor' , 'borderColor' , 'borderWidth' , 'hoverBackgroundColor' , 'hoverBorderColor' , 'hoverBorderWidth' , 'hoverRadius' , 'hitRadius' , 'pointStyle' , 'rotation' ] , update : function ( reset ) { var me = this ; var meta = me . getMeta ( ) ; var points = meta . data ; helpers$1 . each ( points , function ( point , index ) { me . updateElement ( point , index , reset ) ; } ) ; } , updateElement : function ( point , index , reset ) { var me = this ; var meta = me . getMeta ( ) ; var custom = point . custom || { } ; var xScale = me . getScaleForId ( meta . xAxisID ) ; var yScale = me . getScaleForId ( meta . yAxisID ) ; var options = me . _resolveDataElementOptions ( point , index ) ; var data = me . getDataset ( ) . data [ index ] ; var dsIndex = me . index ; var x = reset ? xScale . getPixelForDecimal ( 0.5 ) : xScale . getPixelForValue ( typeof data === 'object' ? data : NaN , index , dsIndex ) ; var y = reset ? yScale . getBasePixel ( ) : yScale . getPixelForValue ( data , index , dsIndex ) ; point . _xScale = xScale ; point . _yScale = yScale ; point . _options = options ; point . _datasetIndex = dsIndex ; point . _index = index ; point . _model = { backgroundColor : options . backgroundColor , borderColor : options . borderColor , borderWidth : options . borderWidth , hitRadius : options . hitRadius , pointStyle : options . pointStyle , rotation : options . rotation , radius : reset ? 0 : options . radius , skip : custom . skip || isNaN ( x ) || isNaN ( y ) , x : x , y : y , } ; point . pivot ( ) ; } , setHoverStyle : function ( point ) { var model = point . _model ; var options = point . _options ; var getHoverColor = helpers$1 . getHoverColor ; point . $previousStyle = { backgroundColor : model . backgroundColor , borderColor : model . borderColor , borderWidth : model . borderWidth , radius : model . radius } ; model . backgroundColor = valueOrDefault$4 ( options . hoverBackgroundColor , getHoverColor ( options . backgroundColor ) ) ; model . borderColor = valueOrDefault$4 ( options . hoverBorderColor , getHoverColor ( options . borderColor ) ) ; model . borderWidth = valueOrDefault$4 ( options . hoverBorderWidth , options . borderWidth ) ; model . radius = options . radius + options . hoverRadius ; } , _resolveDataElementOptions : function ( point , index ) { var me = this ; var chart = me . chart ; var dataset = me . getDataset ( ) ; var custom = point . custom || { } ; var data = dataset . data [ index ] || { } ; var values = core _datasetController . prototype . _resolveDataElementOptions . apply ( me , arguments ) ; var context = { chart : chart , dataIndex : index , dataset : dataset , datasetIndex : me . index } ; if ( me . _cachedDataOpts === values ) { values = helpers$1 . extend ( { } , values ) ; }
values . radius = resolve$1 ( [ custom . radius , data . r , me . _config . radius , chart . options . elements . point . radius ] , context , index ) ; return values ; } } ) ; var valueOrDefault$5 = helpers$1 . valueOrDefault ; var PI$1 = Math . PI ; var DOUBLE _PI$1 = PI$1 * 2 ; var HALF _PI$1 = PI$1 / 2 ; core _defaults . _set ( 'doughnut' , { animation : { animateRotate : true , animateScale : false } , hover : { mode : 'single' } , legendCallback : function ( chart ) { var list = document . createElement ( 'ul' ) ; var data = chart . data ; var datasets = data . datasets ; var labels = data . labels ; var i , ilen , listItem , listItemSpan ; list . setAttribute ( 'class' , chart . id + '-legend' ) ; if ( datasets . length ) { for ( i = 0 , ilen = datasets [ 0 ] . data . length ; i < ilen ; ++ i ) { listItem = list . appendChild ( document . createElement ( 'li' ) ) ; listItemSpan = listItem . appendChild ( document . createElement ( 'span' ) ) ; listItemSpan . style . backgroundColor = datasets [ 0 ] . backgroundColor [ i ] ; if ( labels [ i ] ) { listItem . appendChild ( document . createTextNode ( labels [ i ] ) ) ; } } }
return list . outerHTML ; } , legend : { labels : { generateLabels : function ( chart ) { var data = chart . data ; if ( data . labels . length && data . datasets . length ) { return data . labels . map ( function ( label , i ) { var meta = chart . getDatasetMeta ( 0 ) ; var style = meta . controller . getStyle ( i ) ; return { text : label , fillStyle : style . backgroundColor , strokeStyle : style . borderColor , lineWidth : style . borderWidth , hidden : isNaN ( data . datasets [ 0 ] . data [ i ] ) || meta . data [ i ] . hidden , index : i } ; } ) ; }
return [ ] ; } } , onClick : function ( e , legendItem ) { var index = legendItem . index ; var chart = this . chart ; var i , ilen , meta ; for ( i = 0 , ilen = ( chart . data . datasets || [ ] ) . length ; i < ilen ; ++ i ) { meta = chart . getDatasetMeta ( i ) ; if ( meta . data [ index ] ) { meta . data [ index ] . hidden = ! meta . data [ index ] . hidden ; } }
chart . update ( ) ; } } , cutoutPercentage : 50 , rotation : - HALF _PI$1 , circumference : DOUBLE _PI$1 , tooltips : { callbacks : { title : function ( ) { return '' ; } , label : function ( tooltipItem , data ) { var dataLabel = data . labels [ tooltipItem . index ] ; var value = ': ' + data . datasets [ tooltipItem . datasetIndex ] . data [ tooltipItem . index ] ; if ( helpers$1 . isArray ( dataLabel ) ) { dataLabel = dataLabel . slice ( ) ; dataLabel [ 0 ] += value ; } else { dataLabel += value ; }
return dataLabel ; } } } } ) ; var controller _doughnut = core _datasetController . extend ( { dataElementType : elements . Arc , linkScales : helpers$1 . noop , _dataElementOptions : [ 'backgroundColor' , 'borderColor' , 'borderWidth' , 'borderAlign' , 'hoverBackgroundColor' , 'hoverBorderColor' , 'hoverBorderWidth' , ] , getRingIndex : function ( datasetIndex ) { var ringIndex = 0 ; for ( var j = 0 ; j < datasetIndex ; ++ j ) { if ( this . chart . isDatasetVisible ( j ) ) { ++ ringIndex ; } }
return ringIndex ; } , update : function ( reset ) { var me = this ; var chart = me . chart ; var chartArea = chart . chartArea ; var opts = chart . options ; var ratioX = 1 ; var ratioY = 1 ; var offsetX = 0 ; var offsetY = 0 ; var meta = me . getMeta ( ) ; var arcs = meta . data ; var cutout = opts . cutoutPercentage / 100 || 0 ; var circumference = opts . circumference ; var chartWeight = me . _getRingWeight ( me . index ) ; var maxWidth , maxHeight , i , ilen ; if ( circumference < DOUBLE _PI$1 ) { var startAngle = opts . rotation % DOUBLE _PI$1 ; startAngle += startAngle >= PI$1 ? - DOUBLE _PI$1 : startAngle < - PI$1 ? DOUBLE _PI$1 : 0 ; var endAngle = startAngle + circumference ; var startX = Math . cos ( startAngle ) ; var startY = Math . sin ( startAngle ) ; var endX = Math . cos ( endAngle ) ; var endY = Math . sin ( endAngle ) ; var contains0 = ( startAngle <= 0 && endAngle >= 0 ) || endAngle >= DOUBLE _PI$1 ; var contains90 = ( startAngle <= HALF _PI$1 && endAngle >= HALF _PI$1 ) || endAngle >= DOUBLE _PI$1 + HALF _PI$1 ; var contains180 = startAngle === - PI$1 || endAngle >= PI$1 ; var contains270 = ( startAngle <= - HALF _PI$1 && endAngle >= - HALF _PI$1 ) || endAngle >= PI$1 + HALF _PI$1 ; var minX = contains180 ? - 1 : Math . min ( startX , startX * cutout , endX , endX * cutout ) ; var minY = contains270 ? - 1 : Math . min ( startY , startY * cutout , endY , endY * cutout ) ; var maxX = contains0 ? 1 : Math . max ( startX , startX * cutout , endX , endX * cutout ) ; var maxY = contains90 ? 1 : Math . max ( startY , startY * cutout , endY , endY * cutout ) ; ratioX = ( maxX - minX ) / 2 ; ratioY = ( maxY - minY ) / 2 ; offsetX = - ( maxX + minX ) / 2 ; offsetY = - ( maxY + minY ) / 2 ; }
for ( i = 0 , ilen = arcs . length ; i < ilen ; ++ i ) { arcs [ i ] . _options = me . _resolveDataElementOptions ( arcs [ i ] , i ) ; }
chart . borderWidth = me . getMaxBorderWidth ( ) ; maxWidth = ( chartArea . right - chartArea . left - chart . borderWidth ) / ratioX ; maxHeight = ( chartArea . bottom - chartArea . top - chart . borderWidth ) / ratioY ; chart . outerRadius = Math . max ( Math . min ( maxWidth , maxHeight ) / 2 , 0 ) ; chart . innerRadius = Math . max ( chart . outerRadius * cutout , 0 ) ; chart . radiusLength = ( chart . outerRadius - chart . innerRadius ) / ( me . _getVisibleDatasetWeightTotal ( ) || 1 ) ; chart . offsetX = offsetX * chart . outerRadius ; chart . offsetY = offsetY * chart . outerRadius ; meta . total = me . calculateTotal ( ) ; me . outerRadius = chart . outerRadius - chart . radiusLength * me . _getRingWeightOffset ( me . index ) ; me . innerRadius = Math . max ( me . outerRadius - chart . radiusLength * chartWeight , 0 ) ; for ( i = 0 , ilen = arcs . length ; i < ilen ; ++ i ) { me . updateElement ( arcs [ i ] , i , reset ) ; } } , updateElement : function ( arc , index , reset ) { var me = this ; var chart = me . chart ; var chartArea = chart . chartArea ; var opts = chart . options ; var animationOpts = opts . animation ; var centerX = ( chartArea . left + chartArea . right ) / 2 ; var centerY = ( chartArea . top + chartArea . bottom ) / 2 ; var startAngle = opts . rotation ; var endAngle = opts . rotation ; var dataset = me . getDataset ( ) ; var circumference = reset && animationOpts . animateRotate ? 0 : arc . hidden ? 0 : me . calculateCircumference ( dataset . data [ index ] ) * ( opts . circumference / DOUBLE _PI$1 ) ; var innerRadius = reset && animationOpts . animateScale ? 0 : me . innerRadius ; var outerRadius = reset && animationOpts . animateScale ? 0 : me . outerRadius ; var options = arc . _options || { } ; helpers$1 . extend ( arc , { _datasetIndex : me . index , _index : index , _model : { backgroundColor : options . backgroundColor , borderColor : options . borderColor , borderWidth : options . borderWidth , borderAlign : options . borderAlign , x : centerX + chart . offsetX , y : centerY + chart . offsetY , startAngle : startAngle , endAngle : endAngle , circumference : circumference , outerRadius : outerRadius , innerRadius : innerRadius , label : helpers$1 . valueAtIndexOrDefault ( dataset . label , index , chart . data . labels [ index ] ) } } ) ; var model = arc . _model ; if ( ! reset || ! animationOpts . animateRotate ) { if ( index === 0 ) { model . startAngle = opts . rotation ; } else { model . startAngle = me . getMeta ( ) . data [ index - 1 ] . _model . endAngle ; }
model . endAngle = model . startAngle + model . circumference ; }
arc . pivot ( ) ; } , calculateTotal : function ( ) { var dataset = this . getDataset ( ) ; var meta = this . getMeta ( ) ; var total = 0 ; var value ; helpers$1 . each ( meta . data , function ( element , index ) { value = dataset . data [ index ] ; if ( ! isNaN ( value ) && ! element . hidden ) { total += Math . abs ( value ) ; } } ) ; return total ; } , calculateCircumference : function ( value ) { var total = this . getMeta ( ) . total ; if ( total > 0 && ! isNaN ( value ) ) { return DOUBLE _PI$1 * ( Math . abs ( value ) / total ) ; }
return 0 ; } , getMaxBorderWidth : function ( arcs ) { var me = this ; var max = 0 ; var chart = me . chart ; var i , ilen , meta , arc , controller , options , borderWidth , hoverWidth ; if ( ! arcs ) { for ( i = 0 , ilen = chart . data . datasets . length ; i < ilen ; ++ i ) { if ( chart . isDatasetVisible ( i ) ) { meta = chart . getDatasetMeta ( i ) ; arcs = meta . data ; if ( i !== me . index ) { controller = meta . controller ; }
break ; } } }
if ( ! arcs ) { return 0 ; }
for ( i = 0 , ilen = arcs . length ; i < ilen ; ++ i ) { arc = arcs [ i ] ; if ( controller ) { controller . _configure ( ) ; options = controller . _resolveDataElementOptions ( arc , i ) ; } else { options = arc . _options ; }
if ( options . borderAlign !== 'inner' ) { borderWidth = options . borderWidth ; hoverWidth = options . hoverBorderWidth ; max = borderWidth > max ? borderWidth : max ; max = hoverWidth > max ? hoverWidth : max ; } }
return max ; } , setHoverStyle : function ( arc ) { var model = arc . _model ; var options = arc . _options ; var getHoverColor = helpers$1 . getHoverColor ; arc . $previousStyle = { backgroundColor : model . backgroundColor , borderColor : model . borderColor , borderWidth : model . borderWidth , } ; model . backgroundColor = valueOrDefault$5 ( options . hoverBackgroundColor , getHoverColor ( options . backgroundColor ) ) ; model . borderColor = valueOrDefault$5 ( options . hoverBorderColor , getHoverColor ( options . borderColor ) ) ; model . borderWidth = valueOrDefault$5 ( options . hoverBorderWidth , options . borderWidth ) ; } , _getRingWeightOffset : function ( datasetIndex ) { var ringWeightOffset = 0 ; for ( var i = 0 ; i < datasetIndex ; ++ i ) { if ( this . chart . isDatasetVisible ( i ) ) { ringWeightOffset += this . _getRingWeight ( i ) ; } }
return ringWeightOffset ; } , _getRingWeight : function ( dataSetIndex ) { return Math . max ( valueOrDefault$5 ( this . chart . data . datasets [ dataSetIndex ] . weight , 1 ) , 0 ) ; } , _getVisibleDatasetWeightTotal : function ( ) { return this . _getRingWeightOffset ( this . chart . data . datasets . length ) ; } } ) ; core _defaults . _set ( 'horizontalBar' , { hover : { mode : 'index' , axis : 'y' } , scales : { xAxes : [ { type : 'linear' , position : 'bottom' } ] , yAxes : [ { type : 'category' , position : 'left' , offset : true , gridLines : { offsetGridLines : true } } ] } , elements : { rectangle : { borderSkipped : 'left' } } , tooltips : { mode : 'index' , axis : 'y' } } ) ; core _defaults . _set ( 'global' , { datasets : { horizontalBar : { categoryPercentage : 0.8 , barPercentage : 0.9 } } } ) ; var controller _horizontalBar = controller _bar . extend ( { _getValueScaleId : function ( ) { return this . getMeta ( ) . xAxisID ; } , _getIndexScaleId : function ( ) { return this . getMeta ( ) . yAxisID ; } } ) ; var valueOrDefault$6 = helpers$1 . valueOrDefault ; var resolve$2 = helpers$1 . options . resolve ; var isPointInArea = helpers$1 . canvas . _isPointInArea ; core _defaults . _set ( 'line' , { showLines : true , spanGaps : false , hover : { mode : 'label' } , scales : { xAxes : [ { type : 'category' , id : 'x-axis-0' } ] , yAxes : [ { type : 'linear' , id : 'y-axis-0' } ] } } ) ; function scaleClip ( scale , halfBorderWidth ) { var tickOpts = scale && scale . options . ticks || { } ; var reverse = tickOpts . reverse ; var min = tickOpts . min === undefined ? halfBorderWidth : 0 ; var max = tickOpts . max === undefined ? halfBorderWidth : 0 ; return { start : reverse ? max : min , end : reverse ? min : max } ; }
function defaultClip ( xScale , yScale , borderWidth ) { var halfBorderWidth = borderWidth / 2 ; var x = scaleClip ( xScale , halfBorderWidth ) ; var y = scaleClip ( yScale , halfBorderWidth ) ; return { top : y . end , right : x . end , bottom : y . start , left : x . start } ; }
function toClip ( value ) { var t , r , b , l ; if ( helpers$1 . isObject ( value ) ) { t = value . top ; r = value . right ; b = value . bottom ; l = value . left ; } else { t = r = b = l = value ; }
return { top : t , right : r , bottom : b , left : l } ; }
var controller _line = core _datasetController . extend ( { datasetElementType : elements . Line , dataElementType : elements . Point , _datasetElementOptions : [ 'backgroundColor' , 'borderCapStyle' , 'borderColor' , 'borderDash' , 'borderDashOffset' , 'borderJoinStyle' , 'borderWidth' , 'cubicInterpolationMode' , 'fill' ] , _dataElementOptions : { backgroundColor : 'pointBackgroundColor' , borderColor : 'pointBorderColor' , borderWidth : 'pointBorderWidth' , hitRadius : 'pointHitRadius' , hoverBackgroundColor : 'pointHoverBackgroundColor' , hoverBorderColor : 'pointHoverBorderColor' , hoverBorderWidth : 'pointHoverBorderWidth' , hoverRadius : 'pointHoverRadius' , pointStyle : 'pointStyle' , radius : 'pointRadius' , rotation : 'pointRotation' } , update : function ( reset ) { var me = this ; var meta = me . getMeta ( ) ; var line = meta . dataset ; var points = meta . data || [ ] ; var options = me . chart . options ; var config = me . _config ; var showLine = me . _showLine = valueOrDefault$6 ( config . showLine , options . showLines ) ; var i , ilen ; me . _xScale = me . getScaleForId ( meta . xAxisID ) ; me . _yScale = me . getScaleForId ( meta . yAxisID ) ; if ( showLine ) { if ( config . tension !== undefined && config . lineTension === undefined ) { config . lineTension = config . tension ; }
line . _scale = me . _yScale ; line . _datasetIndex = me . index ; line . _children = points ; line . _model = me . _resolveDatasetElementOptions ( line ) ; line . pivot ( ) ; }
for ( i = 0 , ilen = points . length ; i < ilen ; ++ i ) { me . updateElement ( points [ i ] , i , reset ) ; }
if ( showLine && line . _model . tension !== 0 ) { me . updateBezierControlPoints ( ) ; }
for ( i = 0 , ilen = points . length ; i < ilen ; ++ i ) { points [ i ] . pivot ( ) ; } } , updateElement : function ( point , index , reset ) { var me = this ; var meta = me . getMeta ( ) ; var custom = point . custom || { } ; var dataset = me . getDataset ( ) ; var datasetIndex = me . index ; var value = dataset . data [ index ] ; var xScale = me . _xScale ; var yScale = me . _yScale ; var lineModel = meta . dataset . _model ; var x , y ; var options = me . _resolveDataElementOptions ( point , index ) ; x = xScale . getPixelForValue ( typeof value === 'object' ? value : NaN , index , datasetIndex ) ; y = reset ? yScale . getBasePixel ( ) : me . calculatePointY ( value , index , datasetIndex ) ; point . _xScale = xScale ; point . _yScale = yScale ; point . _options = options ; point . _datasetIndex = datasetIndex ; point . _index = index ; point . _model = { x : x , y : y , skip : custom . skip || isNaN ( x ) || isNaN ( y ) , radius : options . radius , pointStyle : options . pointStyle , rotation : options . rotation , backgroundColor : options . backgroundColor , borderColor : options . borderColor , borderWidth : options . borderWidth , tension : valueOrDefault$6 ( custom . tension , lineModel ? lineModel . tension : 0 ) , steppedLine : lineModel ? lineModel . steppedLine : false , hitRadius : options . hitRadius } ; } , _resolveDatasetElementOptions : function ( element ) { var me = this ; var config = me . _config ; var custom = element . custom || { } ; var options = me . chart . options ; var lineOptions = options . elements . line ; var values = core _datasetController . prototype . _resolveDatasetElementOptions . apply ( me , arguments ) ; values . spanGaps = valueOrDefault$6 ( config . spanGaps , options . spanGaps ) ; values . tension = valueOrDefault$6 ( config . lineTension , lineOptions . tension ) ; values . steppedLine = resolve$2 ( [ custom . steppedLine , config . steppedLine , lineOptions . stepped ] ) ; values . clip = toClip ( valueOrDefault$6 ( config . clip , defaultClip ( me . _xScale , me . _yScale , values . borderWidth ) ) ) ; return values ; } , calculatePointY : function ( value , index , datasetIndex ) { var me = this ; var chart = me . chart ; var yScale = me . _yScale ; var sumPos = 0 ; var sumNeg = 0 ; var i , ds , dsMeta , stackedRightValue , rightValue , metasets , ilen ; if ( yScale . options . stacked ) { rightValue = + yScale . getRightValue ( value ) ; metasets = chart . _getSortedVisibleDatasetMetas ( ) ; ilen = metasets . length ; for ( i = 0 ; i < ilen ; ++ i ) { dsMeta = metasets [ i ] ; if ( dsMeta . index === datasetIndex ) { break ; }
ds = chart . data . datasets [ dsMeta . index ] ; if ( dsMeta . type === 'line' && dsMeta . yAxisID === yScale . id ) { stackedRightValue = + yScale . getRightValue ( ds . data [ index ] ) ; if ( stackedRightValue < 0 ) { sumNeg += stackedRightValue || 0 ; } else { sumPos += stackedRightValue || 0 ; } } }
if ( rightValue < 0 ) { return yScale . getPixelForValue ( sumNeg + rightValue ) ; }
return yScale . getPixelForValue ( sumPos + rightValue ) ; }
return yScale . getPixelForValue ( value ) ; } , updateBezierControlPoints : function ( ) { var me = this ; var chart = me . chart ; var meta = me . getMeta ( ) ; var lineModel = meta . dataset . _model ; var area = chart . chartArea ; var points = meta . data || [ ] ; var i , ilen , model , controlPoints ; if ( lineModel . spanGaps ) { points = points . filter ( function ( pt ) { return ! pt . _model . skip ; } ) ; }
function capControlPoint ( pt , min , max ) { return Math . max ( Math . min ( pt , max ) , min ) ; }
if ( lineModel . cubicInterpolationMode === 'monotone' ) { helpers$1 . splineCurveMonotone ( points ) ; } else { for ( i = 0 , ilen = points . length ; i < ilen ; ++ i ) { model = points [ i ] . _model ; controlPoints = helpers$1 . splineCurve ( helpers$1 . previousItem ( points , i ) . _model , model , helpers$1 . nextItem ( points , i ) . _model , lineModel . tension ) ; model . controlPointPreviousX = controlPoints . previous . x ; model . controlPointPreviousY = controlPoints . previous . y ; model . controlPointNextX = controlPoints . next . x ; model . controlPointNextY = controlPoints . next . y ; } }
if ( chart . options . elements . line . capBezierPoints ) { for ( i = 0 , ilen = points . length ; i < ilen ; ++ i ) { model = points [ i ] . _model ; if ( isPointInArea ( model , area ) ) { if ( i > 0 && isPointInArea ( points [ i - 1 ] . _model , area ) ) { model . controlPointPreviousX = capControlPoint ( model . controlPointPreviousX , area . left , area . right ) ; model . controlPointPreviousY = capControlPoint ( model . controlPointPreviousY , area . top , area . bottom ) ; }
if ( i < points . length - 1 && isPointInArea ( points [ i + 1 ] . _model , area ) ) { model . controlPointNextX = capControlPoint ( model . controlPointNextX , area . left , area . right ) ; model . controlPointNextY = capControlPoint ( model . controlPointNextY , area . top , area . bottom ) ; } } } } } , draw : function ( ) { var me = this ; var chart = me . chart ; var meta = me . getMeta ( ) ; var points = meta . data || [ ] ; var area = chart . chartArea ; var canvas = chart . canvas ; var i = 0 ; var ilen = points . length ; var clip ; if ( me . _showLine ) { clip = meta . dataset . _model . clip ; helpers$1 . canvas . clipArea ( chart . ctx , { left : clip . left === false ? 0 : area . left - clip . left , right : clip . right === false ? canvas . width : area . right + clip . right , top : clip . top === false ? 0 : area . top - clip . top , bottom : clip . bottom === false ? canvas . height : area . bottom + clip . bottom } ) ; meta . dataset . draw ( ) ; helpers$1 . canvas . unclipArea ( chart . ctx ) ; }
for ( ; i < ilen ; ++ i ) { points [ i ] . draw ( area ) ; } } , setHoverStyle : function ( point ) { var model = point . _model ; var options = point . _options ; var getHoverColor = helpers$1 . getHoverColor ; point . $previousStyle = { backgroundColor : model . backgroundColor , borderColor : model . borderColor , borderWidth : model . borderWidth , radius : model . radius } ; model . backgroundColor = valueOrDefault$6 ( options . hoverBackgroundColor , getHoverColor ( options . backgroundColor ) ) ; model . borderColor = valueOrDefault$6 ( options . hoverBorderColor , getHoverColor ( options . borderColor ) ) ; model . borderWidth = valueOrDefault$6 ( options . hoverBorderWidth , options . borderWidth ) ; model . radius = valueOrDefault$6 ( options . hoverRadius , options . radius ) ; } , } ) ; var resolve$3 = helpers$1 . options . resolve ; core _defaults . _set ( 'polarArea' , { scale : { type : 'radialLinear' , angleLines : { display : false } , gridLines : { circular : true } , pointLabels : { display : false } , ticks : { beginAtZero : true } } , animation : { animateRotate : true , animateScale : true } , startAngle : - 0.5 * Math . PI , legendCallback : function ( chart ) { var list = document . createElement ( 'ul' ) ; var data = chart . data ; var datasets = data . datasets ; var labels = data . labels ; var i , ilen , listItem , listItemSpan ; list . setAttribute ( 'class' , chart . id + '-legend' ) ; if ( datasets . length ) { for ( i = 0 , ilen = datasets [ 0 ] . data . length ; i < ilen ; ++ i ) { listItem = list . appendChild ( document . createElement ( 'li' ) ) ; listItemSpan = listItem . appendChild ( document . createElement ( 'span' ) ) ; listItemSpan . style . backgroundColor = datasets [ 0 ] . backgroundColor [ i ] ; if ( labels [ i ] ) { listItem . appendChild ( document . createTextNode ( labels [ i ] ) ) ; } } }
return list . outerHTML ; } , legend : { labels : { generateLabels : function ( chart ) { var data = chart . data ; if ( data . labels . length && data . datasets . length ) { return data . labels . map ( function ( label , i ) { var meta = chart . getDatasetMeta ( 0 ) ; var style = meta . controller . getStyle ( i ) ; return { text : label , fillStyle : style . backgroundColor , strokeStyle : style . borderColor , lineWidth : style . borderWidth , hidden : isNaN ( data . datasets [ 0 ] . data [ i ] ) || meta . data [ i ] . hidden , index : i } ; } ) ; }
return [ ] ; } } , onClick : function ( e , legendItem ) { var index = legendItem . index ; var chart = this . chart ; var i , ilen , meta ; for ( i = 0 , ilen = ( chart . data . datasets || [ ] ) . length ; i < ilen ; ++ i ) { meta = chart . getDatasetMeta ( i ) ; meta . data [ index ] . hidden = ! meta . data [ index ] . hidden ; }
chart . update ( ) ; } } , tooltips : { callbacks : { title : function ( ) { return '' ; } , label : function ( item , data ) { return data . labels [ item . index ] + ': ' + item . yLabel ; } } } } ) ; var controller _polarArea = core _datasetController . extend ( { dataElementType : elements . Arc , linkScales : helpers$1 . noop , _dataElementOptions : [ 'backgroundColor' , 'borderColor' , 'borderWidth' , 'borderAlign' , 'hoverBackgroundColor' , 'hoverBorderColor' , 'hoverBorderWidth' , ] , _getIndexScaleId : function ( ) { return this . chart . scale . id ; } , _getValueScaleId : function ( ) { return this . chart . scale . id ; } , update : function ( reset ) { var me = this ; var dataset = me . getDataset ( ) ; var meta = me . getMeta ( ) ; var start = me . chart . options . startAngle || 0 ; var starts = me . _starts = [ ] ; var angles = me . _angles = [ ] ; var arcs = meta . data ; var i , ilen , angle ; me . _updateRadius ( ) ; meta . count = me . countVisibleElements ( ) ; for ( i = 0 , ilen = dataset . data . length ; i < ilen ; i ++ ) { starts [ i ] = start ; angle = me . _computeAngle ( i ) ; angles [ i ] = angle ; start += angle ; }
for ( i = 0 , ilen = arcs . length ; i < ilen ; ++ i ) { arcs [ i ] . _options = me . _resolveDataElementOptions ( arcs [ i ] , i ) ; me . updateElement ( arcs [ i ] , i , reset ) ; } } , _updateRadius : function ( ) { var me = this ; var chart = me . chart ; var chartArea = chart . chartArea ; var opts = chart . options ; var minSize = Math . min ( chartArea . right - chartArea . left , chartArea . bottom - chartArea . top ) ; chart . outerRadius = Math . max ( minSize / 2 , 0 ) ; chart . innerRadius = Math . max ( opts . cutoutPercentage ? ( chart . outerRadius / 100 ) * ( opts . cutoutPercentage ) : 1 , 0 ) ; chart . radiusLength = ( chart . outerRadius - chart . innerRadius ) / chart . getVisibleDatasetCount ( ) ; me . outerRadius = chart . outerRadius - ( chart . radiusLength * me . index ) ; me . innerRadius = me . outerRadius - chart . radiusLength ; } , updateElement : function ( arc , index , reset ) { var me = this ; var chart = me . chart ; var dataset = me . getDataset ( ) ; var opts = chart . options ; var animationOpts = opts . animation ; var scale = chart . scale ; var labels = chart . data . labels ; var centerX = scale . xCenter ; var centerY = scale . yCenter ; var datasetStartAngle = opts . startAngle ; var distance = arc . hidden ? 0 : scale . getDistanceFromCenterForValue ( dataset . data [ index ] ) ; var startAngle = me . _starts [ index ] ; var endAngle = startAngle + ( arc . hidden ? 0 : me . _angles [ index ] ) ; var resetRadius = animationOpts . animateScale ? 0 : scale . getDistanceFromCenterForValue ( dataset . data [ index ] ) ; var options = arc . _options || { } ; helpers$1 . extend ( arc , { _datasetIndex : me . index , _index : index , _scale : scale , _model : { backgroundColor : options . backgroundColor , borderColor : options . borderColor , borderWidth : options . borderWidth , borderAlign : options . borderAlign , x : centerX , y : centerY , innerRadius : 0 , outerRadius : reset ? resetRadius : distance , startAngle : reset && animationOpts . animateRotate ? datasetStartAngle : startAngle , endAngle : reset && animationOpts . animateRotate ? datasetStartAngle : endAngle , label : helpers$1 . valueAtIndexOrDefault ( labels , index , labels [ index ] ) } } ) ; arc . pivot ( ) ; } , countVisibleElements : function ( ) { var dataset = this . getDataset ( ) ; var meta = this . getMeta ( ) ; var count = 0 ; helpers$1 . each ( meta . data , function ( element , index ) { if ( ! isNaN ( dataset . data [ index ] ) && ! element . hidden ) { count ++ ; } } ) ; return count ; } , setHoverStyle : function ( arc ) { var model = arc . _model ; var options = arc . _options ; var getHoverColor = helpers$1 . getHoverColor ; var valueOrDefault = helpers$1 . valueOrDefault ; arc . $previousStyle = { backgroundColor : model . backgroundColor , borderColor : model . borderColor , borderWidth : model . borderWidth , } ; model . backgroundColor = valueOrDefault ( options . hoverBackgroundColor , getHoverColor ( options . backgroundColor ) ) ; model . borderColor = valueOrDefault ( options . hoverBorderColor , getHoverColor ( options . borderColor ) ) ; model . borderWidth = valueOrDefault ( options . hoverBorderWidth , options . borderWidth ) ; } , _computeAngle : function ( index ) { var me = this ; var count = this . getMeta ( ) . count ; var dataset = me . getDataset ( ) ; var meta = me . getMeta ( ) ; if ( isNaN ( dataset . data [ index ] ) || meta . data [ index ] . hidden ) { return 0 ; }
var context = { chart : me . chart , dataIndex : index , dataset : dataset , datasetIndex : me . index } ; return resolve$3 ( [ me . chart . options . elements . arc . angle , ( 2 * Math . PI ) / count ] , context , index ) ; } } ) ; core _defaults . _set ( 'pie' , helpers$1 . clone ( core _defaults . doughnut ) ) ; core _defaults . _set ( 'pie' , { cutoutPercentage : 0 } ) ; var controller _pie = controller _doughnut ; var valueOrDefault$7 = helpers$1 . valueOrDefault ; core _defaults . _set ( 'radar' , { spanGaps : false , scale : { type : 'radialLinear' } , elements : { line : { fill : 'start' , tension : 0 } } } ) ; var controller _radar = core _datasetController . extend ( { datasetElementType : elements . Line , dataElementType : elements . Point , linkScales : helpers$1 . noop , _datasetElementOptions : [ 'backgroundColor' , 'borderWidth' , 'borderColor' , 'borderCapStyle' , 'borderDash' , 'borderDashOffset' , 'borderJoinStyle' , 'fill' ] , _dataElementOptions : { backgroundColor : 'pointBackgroundColor' , borderColor : 'pointBorderColor' , borderWidth : 'pointBorderWidth' , hitRadius : 'pointHitRadius' , hoverBackgroundColor : 'pointHoverBackgroundColor' , hoverBorderColor : 'pointHoverBorderColor' , hoverBorderWidth : 'pointHoverBorderWidth' , hoverRadius : 'pointHoverRadius' , pointStyle : 'pointStyle' , radius : 'pointRadius' , rotation : 'pointRotation' } , _getIndexScaleId : function ( ) { return this . chart . scale . id ; } , _getValueScaleId : function ( ) { return this . chart . scale . id ; } , update : function ( reset ) { var me = this ; var meta = me . getMeta ( ) ; var line = meta . dataset ; var points = meta . data || [ ] ; var scale = me . chart . scale ; var config = me . _config ; var i , ilen ; if ( config . tension !== undefined && config . lineTension === undefined ) { config . lineTension = config . tension ; }
line . _scale = scale ; line . _datasetIndex = me . index ; line . _children = points ; line . _loop = true ; line . _model = me . _resolveDatasetElementOptions ( line ) ; line . pivot ( ) ; for ( i = 0 , ilen = points . length ; i < ilen ; ++ i ) { me . updateElement ( points [ i ] , i , reset ) ; }
me . updateBezierControlPoints ( ) ; for ( i = 0 , ilen = points . length ; i < ilen ; ++ i ) { points [ i ] . pivot ( ) ; } } , updateElement : function ( point , index , reset ) { var me = this ; var custom = point . custom || { } ; var dataset = me . getDataset ( ) ; var scale = me . chart . scale ; var pointPosition = scale . getPointPositionForValue ( index , dataset . data [ index ] ) ; var options = me . _resolveDataElementOptions ( point , index ) ; var lineModel = me . getMeta ( ) . dataset . _model ; var x = reset ? scale . xCenter : pointPosition . x ; var y = reset ? scale . yCenter : pointPosition . y ; point . _scale = scale ; point . _options = options ; point . _datasetIndex = me . index ; point . _index = index ; point . _model = { x : x , y : y , skip : custom . skip || isNaN ( x ) || isNaN ( y ) , radius : options . radius , pointStyle : options . pointStyle , rotation : options . rotation , backgroundColor : options . backgroundColor , borderColor : options . borderColor , borderWidth : options . borderWidth , tension : valueOrDefault$7 ( custom . tension , lineModel ? lineModel . tension : 0 ) , hitRadius : options . hitRadius } ; } , _resolveDatasetElementOptions : function ( ) { var me = this ; var config = me . _config ; var options = me . chart . options ; var values = core _datasetController . prototype . _resolveDatasetElementOptions . apply ( me , arguments ) ; values . spanGaps = valueOrDefault$7 ( config . spanGaps , options . spanGaps ) ; values . tension = valueOrDefault$7 ( config . lineTension , options . elements . line . tension ) ; return values ; } , updateBezierControlPoints : function ( ) { var me = this ; var meta = me . getMeta ( ) ; var area = me . chart . chartArea ; var points = meta . data || [ ] ; var i , ilen , model , controlPoints ; if ( meta . dataset . _model . spanGaps ) { points = points . filter ( function ( pt ) { return ! pt . _model . skip ; } ) ; }
function capControlPoint ( pt , min , max ) { return Math . max ( Math . min ( pt , max ) , min ) ; }
for ( i = 0 , ilen = points . length ; i < ilen ; ++ i ) { model = points [ i ] . _model ; controlPoints = helpers$1 . splineCurve ( helpers$1 . previousItem ( points , i , true ) . _model , model , helpers$1 . nextItem ( points , i , true ) . _model , model . tension ) ; model . controlPointPreviousX = capControlPoint ( controlPoints . previous . x , area . left , area . right ) ; model . controlPointPreviousY = capControlPoint ( controlPoints . previous . y , area . top , area . bottom ) ; model . controlPointNextX = capControlPoint ( controlPoints . next . x , area . left , area . right ) ; model . controlPointNextY = capControlPoint ( controlPoints . next . y , area . top , area . bottom ) ; } } , setHoverStyle : function ( point ) { var model = point . _model ; var options = point . _options ; var getHoverColor = helpers$1 . getHoverColor ; point . $previousStyle = { backgroundColor : model . backgroundColor , borderColor : model . borderColor , borderWidth : model . borderWidth , radius : model . radius } ; model . backgroundColor = valueOrDefault$7 ( options . hoverBackgroundColor , getHoverColor ( options . backgroundColor ) ) ; model . borderColor = valueOrDefault$7 ( options . hoverBorderColor , getHoverColor ( options . borderColor ) ) ; model . borderWidth = valueOrDefault$7 ( options . hoverBorderWidth , options . borderWidth ) ; model . radius = valueOrDefault$7 ( options . hoverRadius , options . radius ) ; } } ) ; core _defaults . _set ( 'scatter' , { hover : { mode : 'single' } , scales : { xAxes : [ { id : 'x-axis-1' , type : 'linear' , position : 'bottom' } ] , yAxes : [ { id : 'y-axis-1' , type : 'linear' , position : 'left' } ] } , tooltips : { callbacks : { title : function ( ) { return '' ; } , label : function ( item ) { return '(' + item . xLabel + ', ' + item . yLabel + ')' ; } } } } ) ; core _defaults . _set ( 'global' , { datasets : { scatter : { showLine : false } } } ) ; var controller _scatter = controller _line ; var controllers = { bar : controller _bar , bubble : controller _bubble , doughnut : controller _doughnut , horizontalBar : controller _horizontalBar , line : controller _line , polarArea : controller _polarArea , pie : controller _pie , radar : controller _radar , scatter : controller _scatter } ; function getRelativePosition ( e , chart ) { if ( e . native ) { return { x : e . x , y : e . y } ; }
return helpers$1 . getRelativePosition ( e , chart ) ; }
function parseVisibleItems ( chart , handler ) { var metasets = chart . _getSortedVisibleDatasetMetas ( ) ; var metadata , i , j , ilen , jlen , element ; for ( i = 0 , ilen = metasets . length ; i < ilen ; ++ i ) { metadata = metasets [ i ] . data ; for ( j = 0 , jlen = metadata . length ; j < jlen ; ++ j ) { element = metadata [ j ] ; if ( ! element . _view . skip ) { handler ( element ) ; } } } }
function getIntersectItems ( chart , position ) { var elements = [ ] ; parseVisibleItems ( chart , function ( element ) { if ( element . inRange ( position . x , position . y ) ) { elements . push ( element ) ; } } ) ; return elements ; }
function getNearestItems ( chart , position , intersect , distanceMetric ) { var minDistance = Number . POSITIVE _INFINITY ; var nearestItems = [ ] ; parseVisibleItems ( chart , function ( element ) { if ( intersect && ! element . inRange ( position . x , position . y ) ) { return ; }
var center = element . getCenterPoint ( ) ; var distance = distanceMetric ( position , center ) ; if ( distance < minDistance ) { nearestItems = [ element ] ; minDistance = distance ; } else if ( distance === minDistance ) { nearestItems . push ( element ) ; } } ) ; return nearestItems ; }
function getDistanceMetricForAxis ( axis ) { var useX = axis . indexOf ( 'x' ) !== - 1 ; var useY = axis . indexOf ( 'y' ) !== - 1 ; return function ( pt1 , pt2 ) { var deltaX = useX ? Math . abs ( pt1 . x - pt2 . x ) : 0 ; var deltaY = useY ? Math . abs ( pt1 . y - pt2 . y ) : 0 ; return Math . sqrt ( Math . pow ( deltaX , 2 ) + Math . pow ( deltaY , 2 ) ) ; } ; }
function indexMode ( chart , e , options ) { var position = getRelativePosition ( e , chart ) ; options . axis = options . axis || 'x' ; var distanceMetric = getDistanceMetricForAxis ( options . axis ) ; var items = options . intersect ? getIntersectItems ( chart , position ) : getNearestItems ( chart , position , false , distanceMetric ) ; var elements = [ ] ; if ( ! items . length ) { return [ ] ; }
chart . _getSortedVisibleDatasetMetas ( ) . forEach ( function ( meta ) { var element = meta . data [ items [ 0 ] . _index ] ; if ( element && ! element . _view . skip ) { elements . push ( element ) ; } } ) ; return elements ; }
var core _interaction = { modes : { single : function ( chart , e ) { var position = getRelativePosition ( e , chart ) ; var elements = [ ] ; parseVisibleItems ( chart , function ( element ) { if ( element . inRange ( position . x , position . y ) ) { elements . push ( element ) ; return elements ; } } ) ; return elements . slice ( 0 , 1 ) ; } , label : indexMode , index : indexMode , dataset : function ( chart , e , options ) { var position = getRelativePosition ( e , chart ) ; options . axis = options . axis || 'xy' ; var distanceMetric = getDistanceMetricForAxis ( options . axis ) ; var items = options . intersect ? getIntersectItems ( chart , position ) : getNearestItems ( chart , position , false , distanceMetric ) ; if ( items . length > 0 ) { items = chart . getDatasetMeta ( items [ 0 ] . _datasetIndex ) . data ; }
return items ; } , 'x-axis' : function ( chart , e ) { return indexMode ( chart , e , { intersect : false } ) ; } , point : function ( chart , e ) { var position = getRelativePosition ( e , chart ) ; return getIntersectItems ( chart , position ) ; } , nearest : function ( chart , e , options ) { var position = getRelativePosition ( e , chart ) ; options . axis = options . axis || 'xy' ; var distanceMetric = getDistanceMetricForAxis ( options . axis ) ; return getNearestItems ( chart , position , options . intersect , distanceMetric ) ; } , x : function ( chart , e , options ) { var position = getRelativePosition ( e , chart ) ; var items = [ ] ; var intersectsItem = false ; parseVisibleItems ( chart , function ( element ) { if ( element . inXRange ( position . x ) ) { items . push ( element ) ; }
if ( element . inRange ( position . x , position . y ) ) { intersectsItem = true ; } } ) ; if ( options . intersect && ! intersectsItem ) { items = [ ] ; }
return items ; } , y : function ( chart , e , options ) { var position = getRelativePosition ( e , chart ) ; var items = [ ] ; var intersectsItem = false ; parseVisibleItems ( chart , function ( element ) { if ( element . inYRange ( position . y ) ) { items . push ( element ) ; }
if ( element . inRange ( position . x , position . y ) ) { intersectsItem = true ; } } ) ; if ( options . intersect && ! intersectsItem ) { items = [ ] ; }
return items ; } } } ; var extend = helpers$1 . extend ; function filterByPosition ( array , position ) { return helpers$1 . where ( array , function ( v ) { return v . pos === position ; } ) ; }
function sortByWeight ( array , reverse ) { return array . sort ( function ( a , b ) { var v0 = reverse ? b : a ; var v1 = reverse ? a : b ; return v0 . weight === v1 . weight ? v0 . index - v1 . index : v0 . weight - v1 . weight ; } ) ; }
function wrapBoxes ( boxes ) { var layoutBoxes = [ ] ; var i , ilen , box ; for ( i = 0 , ilen = ( boxes || [ ] ) . length ; i < ilen ; ++ i ) { box = boxes [ i ] ; layoutBoxes . push ( { index : i , box : box , pos : box . position , horizontal : box . isHorizontal ( ) , weight : box . weight } ) ; }
return layoutBoxes ; }
function setLayoutDims ( layouts , params ) { var i , ilen , layout ; for ( i = 0 , ilen = layouts . length ; i < ilen ; ++ i ) { layout = layouts [ i ] ; layout . width = layout . horizontal ? layout . box . fullWidth && params . availableWidth : params . vBoxMaxWidth ; layout . height = layout . horizontal && params . hBoxMaxHeight ; } }
function buildLayoutBoxes ( boxes ) { var layoutBoxes = wrapBoxes ( boxes ) ; var left = sortByWeight ( filterByPosition ( layoutBoxes , 'left' ) , true ) ; var right = sortByWeight ( filterByPosition ( layoutBoxes , 'right' ) ) ; var top = sortByWeight ( filterByPosition ( layoutBoxes , 'top' ) , true ) ; var bottom = sortByWeight ( filterByPosition ( layoutBoxes , 'bottom' ) ) ; return { leftAndTop : left . concat ( top ) , rightAndBottom : right . concat ( bottom ) , chartArea : filterByPosition ( layoutBoxes , 'chartArea' ) , vertical : left . concat ( right ) , horizontal : top . concat ( bottom ) } ; }
function getCombinedMax ( maxPadding , chartArea , a , b ) { return Math . max ( maxPadding [ a ] , chartArea [ a ] ) + Math . max ( maxPadding [ b ] , chartArea [ b ] ) ; }
function updateDims ( chartArea , params , layout ) { var box = layout . box ; var maxPadding = chartArea . maxPadding ; var newWidth , newHeight ; if ( layout . size ) { chartArea [ layout . pos ] -= layout . size ; }
layout . size = layout . horizontal ? box . height : box . width ; chartArea [ layout . pos ] += layout . size ; if ( box . getPadding ) { var boxPadding = box . getPadding ( ) ; maxPadding . top = Math . max ( maxPadding . top , boxPadding . top ) ; maxPadding . left = Math . max ( maxPadding . left , boxPadding . left ) ; maxPadding . bottom = Math . max ( maxPadding . bottom , boxPadding . bottom ) ; maxPadding . right = Math . max ( maxPadding . right , boxPadding . right ) ; }
newWidth = params . outerWidth - getCombinedMax ( maxPadding , chartArea , 'left' , 'right' ) ; newHeight = params . outerHeight - getCombinedMax ( maxPadding , chartArea , 'top' , 'bottom' ) ; if ( newWidth !== chartArea . w || newHeight !== chartArea . h ) { chartArea . w = newWidth ; chartArea . h = newHeight ; return layout . horizontal ? newWidth !== chartArea . w : newHeight !== chartArea . h ; } }
function handleMaxPadding ( chartArea ) { var maxPadding = chartArea . maxPadding ; function updatePos ( pos ) { var change = Math . max ( maxPadding [ pos ] - chartArea [ pos ] , 0 ) ; chartArea [ pos ] += change ; return change ; }
chartArea . y += updatePos ( 'top' ) ; chartArea . x += updatePos ( 'left' ) ; updatePos ( 'right' ) ; updatePos ( 'bottom' ) ; }
function getMargins ( horizontal , chartArea ) { var maxPadding = chartArea . maxPadding ; function marginForPositions ( positions ) { var margin = { left : 0 , top : 0 , right : 0 , bottom : 0 } ; positions . forEach ( function ( pos ) { margin [ pos ] = Math . max ( chartArea [ pos ] , maxPadding [ pos ] ) ; } ) ; return margin ; }
return horizontal ? marginForPositions ( [ 'left' , 'right' ] ) : marginForPositions ( [ 'top' , 'bottom' ] ) ; }
function fitBoxes ( boxes , chartArea , params ) { var refitBoxes = [ ] ; var i , ilen , layout , box , refit , changed ; for ( i = 0 , ilen = boxes . length ; i < ilen ; ++ i ) { layout = boxes [ i ] ; box = layout . box ; box . update ( layout . width || chartArea . w , layout . height || chartArea . h , getMargins ( layout . horizontal , chartArea ) ) ; if ( updateDims ( chartArea , params , layout ) ) { changed = true ; if ( refitBoxes . length ) { refit = true ; } }
if ( ! box . fullWidth ) { refitBoxes . push ( layout ) ; } }
return refit ? fitBoxes ( refitBoxes , chartArea , params ) || changed : changed ; }
function placeBoxes ( boxes , chartArea , params ) { var userPadding = params . padding ; var x = chartArea . x ; var y = chartArea . y ; var i , ilen , layout , box ; for ( i = 0 , ilen = boxes . length ; i < ilen ; ++ i ) { layout = boxes [ i ] ; box = layout . box ; if ( layout . horizontal ) { box . left = box . fullWidth ? userPadding . left : chartArea . left ; box . right = box . fullWidth ? params . outerWidth - userPadding . right : chartArea . left + chartArea . w ; box . top = y ; box . bottom = y + box . height ; box . width = box . right - box . left ; y = box . bottom ; } else { box . left = x ; box . right = x + box . width ; box . top = chartArea . top ; box . bottom = chartArea . top + chartArea . h ; box . height = box . bottom - box . top ; x = box . right ; } }
chartArea . x = x ; chartArea . y = y ; }
core _defaults . _set ( 'global' , { layout : { padding : { top : 0 , right : 0 , bottom : 0 , left : 0 } } } ) ; var core _layouts = { defaults : { } , addBox : function ( chart , item ) { if ( ! chart . boxes ) { chart . boxes = [ ] ; }
item . fullWidth = item . fullWidth || false ; item . position = item . position || 'top' ; item . weight = item . weight || 0 ; item . _layers = item . _layers || function ( ) { return [ { z : 0 , draw : function ( ) { item . draw . apply ( item , arguments ) ; } } ] ; } ; chart . boxes . push ( item ) ; } , removeBox : function ( chart , layoutItem ) { var index = chart . boxes ? chart . boxes . indexOf ( layoutItem ) : - 1 ; if ( index !== - 1 ) { chart . boxes . splice ( index , 1 ) ; } } , configure : function ( chart , item , options ) { var props = [ 'fullWidth' , 'position' , 'weight' ] ; var ilen = props . length ; var i = 0 ; var prop ; for ( ; i < ilen ; ++ i ) { prop = props [ i ] ; if ( options . hasOwnProperty ( prop ) ) { item [ prop ] = options [ prop ] ; } } } , update : function ( chart , width , height ) { if ( ! chart ) { return ; }
var layoutOptions = chart . options . layout || { } ; var padding = helpers$1 . options . toPadding ( layoutOptions . padding ) ; var availableWidth = width - padding . width ; var availableHeight = height - padding . height ; var boxes = buildLayoutBoxes ( chart . boxes ) ; var verticalBoxes = boxes . vertical ; var horizontalBoxes = boxes . horizontal ; var params = Object . freeze ( { outerWidth : width , outerHeight : height , padding : padding , availableWidth : availableWidth , vBoxMaxWidth : availableWidth / 2 / verticalBoxes . length , hBoxMaxHeight : availableHeight / 2 } ) ; var chartArea = extend ( { maxPadding : extend ( { } , padding ) , w : availableWidth , h : availableHeight , x : padding . left , y : padding . top } , padding ) ; setLayoutDims ( verticalBoxes . concat ( horizontalBoxes ) , params ) ; fitBoxes ( verticalBoxes , chartArea , params ) ; if ( fitBoxes ( horizontalBoxes , chartArea , params ) ) { fitBoxes ( verticalBoxes , chartArea , params ) ; }
handleMaxPadding ( chartArea ) ; placeBoxes ( boxes . leftAndTop , chartArea , params ) ; chartArea . x += chartArea . w ; chartArea . y += chartArea . h ; placeBoxes ( boxes . rightAndBottom , chartArea , params ) ; chart . chartArea = { left : chartArea . left , top : chartArea . top , right : chartArea . left + chartArea . w , bottom : chartArea . top + chartArea . h } ; helpers$1 . each ( boxes . chartArea , function ( layout ) { var box = layout . box ; extend ( box , chart . chartArea ) ; box . update ( chartArea . w , chartArea . h ) ; } ) ; } } ; var platform _basic = { acquireContext : function ( item ) { if ( item && item . canvas ) { item = item . canvas ; }
return item && item . getContext ( '2d' ) || null ; } } ; var platform _dom = "/*\n * DOM element rendering detection\n * https://davidwalsh.name/detect-node-insertion\n */\n@keyframes chartjs-render-animation {\n\tfrom { opacity: 0.99; }\n\tto { opacity: 1; }\n}\n\n.chartjs-render-monitor {\n\tanimation: chartjs-render-animation 0.001s;\n}\n\n/*\n * DOM element resizing detection\n * https://github.com/marcj/css-element-queries\n */\n.chartjs-size-monitor,\n.chartjs-size-monitor-expand,\n.chartjs-size-monitor-shrink {\n\tposition: absolute;\n\tdirection: ltr;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow: hidden;\n\tpointer-events: none;\n\tvisibility: hidden;\n\tz-index: -1;\n}\n\n.chartjs-size-monitor-expand > div {\n\tposition: absolute;\n\twidth: 1000000px;\n\theight: 1000000px;\n\tleft: 0;\n\ttop: 0;\n}\n\n.chartjs-size-monitor-shrink > div {\n\tposition: absolute;\n\twidth: 200%;\n\theight: 200%;\n\tleft: 0;\n\ttop: 0;\n}\n" ; var platform _dom$1 = Object . freeze ( { _ _proto _ _ : null , 'default' : platform _dom } ) ; var stylesheet = getCjsExportFromNamespace ( platform _dom$1 ) ; var EXPANDO _KEY = '$chartjs' ; var CSS _PREFIX = 'chartjs-' ; var CSS _SIZE _MONITOR = CSS _PREFIX + 'size-monitor' ; var CSS _RENDER _MONITOR = CSS _PREFIX + 'render-monitor' ; var CSS _RENDER _ANIMATION = CSS _PREFIX + 'render-animation' ; var ANIMATION _START _EVENTS = [ 'animationstart' , 'webkitAnimationStart' ] ; var EVENT _TYPES = { touchstart : 'mousedown' , touchmove : 'mousemove' , touchend : 'mouseup' , pointerenter : 'mouseenter' , pointerdown : 'mousedown' , pointermove : 'mousemove' , pointerup : 'mouseup' , pointerleave : 'mouseout' , pointerout : 'mouseout' } ; function readUsedSize ( element , property ) { var value = helpers$1 . getStyle ( element , property ) ; var matches = value && value . match ( /^(\d+)(\.\d+)?px$/ ) ; return matches ? Number ( matches [ 1 ] ) : undefined ; }
2019-05-09 18:54:39 +12:00
function initCanvas ( canvas , config ) { var style = canvas . style ; var renderHeight = canvas . getAttribute ( 'height' ) ; var renderWidth = canvas . getAttribute ( 'width' ) ; canvas [ EXPANDO _KEY ] = { initial : { height : renderHeight , width : renderWidth , style : { display : style . display , height : style . height , width : style . width } } } ; style . display = style . display || 'block' ; if ( renderWidth === null || renderWidth === '' ) { var displayWidth = readUsedSize ( canvas , 'width' ) ; if ( displayWidth !== undefined ) { canvas . width = displayWidth ; } }
if ( renderHeight === null || renderHeight === '' ) { if ( canvas . style . height === '' ) { canvas . height = canvas . width / ( config . options . aspectRatio || 2 ) ; } else { var displayHeight = readUsedSize ( canvas , 'height' ) ; if ( displayWidth !== undefined ) { canvas . height = displayHeight ; } } }
return canvas ; }
var supportsEventListenerOptions = ( function ( ) { var supports = false ; try { var options = Object . defineProperty ( { } , 'passive' , { get : function ( ) { supports = true ; } } ) ; window . addEventListener ( 'e' , null , options ) ; } catch ( e ) { }
2020-07-24 09:00:10 +12:00
return supports ; } ( ) ) ; var eventListenerOptions = supportsEventListenerOptions ? { passive : true } : false ; function addListener ( node , type , listener ) { node . addEventListener ( type , listener , eventListenerOptions ) ; }
function removeListener ( node , type , listener ) { node . removeEventListener ( type , listener , eventListenerOptions ) ; }
2019-05-09 18:54:39 +12:00
function createEvent ( type , chart , x , y , nativeEvent ) { return { type : type , chart : chart , native : nativeEvent || null , x : x !== undefined ? x : null , y : y !== undefined ? y : null , } ; }
2020-07-24 09:00:10 +12:00
function fromNativeEvent ( event , chart ) { var type = EVENT _TYPES [ event . type ] || event . type ; var pos = helpers$1 . getRelativePosition ( event , chart ) ; return createEvent ( type , chart , pos . x , pos . y , event ) ; }
function throttled ( fn , thisArg ) { var ticking = false ; var args = [ ] ; return function ( ) { args = Array . prototype . slice . call ( arguments ) ; thisArg = thisArg || this ; if ( ! ticking ) { ticking = true ; helpers$1 . requestAnimFrame . call ( window , function ( ) { ticking = false ; fn . apply ( thisArg , args ) ; } ) ; } } ; }
function createDiv ( cls ) { var el = document . createElement ( 'div' ) ; el . className = cls || '' ; return el ; }
function createResizer ( handler ) { var maxSize = 1000000 ; var resizer = createDiv ( CSS _SIZE _MONITOR ) ; var expand = createDiv ( CSS _SIZE _MONITOR + '-expand' ) ; var shrink = createDiv ( CSS _SIZE _MONITOR + '-shrink' ) ; expand . appendChild ( createDiv ( ) ) ; shrink . appendChild ( createDiv ( ) ) ; resizer . appendChild ( expand ) ; resizer . appendChild ( shrink ) ; resizer . _reset = function ( ) { expand . scrollLeft = maxSize ; expand . scrollTop = maxSize ; shrink . scrollLeft = maxSize ; shrink . scrollTop = maxSize ; } ; var onScroll = function ( ) { resizer . _reset ( ) ; handler ( ) ; } ; addListener ( expand , 'scroll' , onScroll . bind ( expand , 'expand' ) ) ; addListener ( shrink , 'scroll' , onScroll . bind ( shrink , 'shrink' ) ) ; return resizer ; }
function watchForRender ( node , handler ) { var expando = node [ EXPANDO _KEY ] || ( node [ EXPANDO _KEY ] = { } ) ; var proxy = expando . renderProxy = function ( e ) { if ( e . animationName === CSS _RENDER _ANIMATION ) { handler ( ) ; } } ; helpers$1 . each ( ANIMATION _START _EVENTS , function ( type ) { addListener ( node , type , proxy ) ; } ) ; expando . reflow = ! ! node . offsetParent ; node . classList . add ( CSS _RENDER _MONITOR ) ; }
function unwatchForRender ( node ) { var expando = node [ EXPANDO _KEY ] || { } ; var proxy = expando . renderProxy ; if ( proxy ) { helpers$1 . each ( ANIMATION _START _EVENTS , function ( type ) { removeListener ( node , type , proxy ) ; } ) ; delete expando . renderProxy ; }
2019-05-09 18:54:39 +12:00
node . classList . remove ( CSS _RENDER _MONITOR ) ; }
2020-07-24 09:00:10 +12:00
function addResizeListener ( node , listener , chart ) { var expando = node [ EXPANDO _KEY ] || ( node [ EXPANDO _KEY ] = { } ) ; var resizer = expando . resizer = createResizer ( throttled ( function ( ) { if ( expando . resizer ) { var container = chart . options . maintainAspectRatio && node . parentNode ; var w = container ? container . clientWidth : 0 ; listener ( createEvent ( 'resize' , chart ) ) ; if ( container && container . clientWidth < w && chart . canvas ) { listener ( createEvent ( 'resize' , chart ) ) ; } } } ) ) ; watchForRender ( node , function ( ) { if ( expando . resizer ) { var container = node . parentNode ; if ( container && container !== resizer . parentNode ) { container . insertBefore ( resizer , container . firstChild ) ; }
2019-05-09 18:54:39 +12:00
resizer . _reset ( ) ; } } ) ; }
function removeResizeListener ( node ) { var expando = node [ EXPANDO _KEY ] || { } ; var resizer = expando . resizer ; delete expando . resizer ; unwatchForRender ( node ) ; if ( resizer && resizer . parentNode ) { resizer . parentNode . removeChild ( resizer ) ; } }
2020-07-24 09:00:10 +12:00
function injectCSS ( rootNode , css ) { var expando = rootNode [ EXPANDO _KEY ] || ( rootNode [ EXPANDO _KEY ] = { } ) ; if ( ! expando . containsStyles ) { expando . containsStyles = true ; css = '/* Chart.js */\n' + css ; var style = document . createElement ( 'style' ) ; style . setAttribute ( 'type' , 'text/css' ) ; style . appendChild ( document . createTextNode ( css ) ) ; rootNode . appendChild ( style ) ; } }
var platform _dom$2 = { disableCSSInjection : false , _enabled : typeof window !== 'undefined' && typeof document !== 'undefined' , _ensureLoaded : function ( canvas ) { if ( ! this . disableCSSInjection ) { var root = canvas . getRootNode ? canvas . getRootNode ( ) : document ; var targetNode = root . host ? root : document . head ; injectCSS ( targetNode , stylesheet ) ; } } , acquireContext : function ( item , config ) { if ( typeof item === 'string' ) { item = document . getElementById ( item ) ; } else if ( item . length ) { item = item [ 0 ] ; }
2019-05-09 18:54:39 +12:00
if ( item && item . canvas ) { item = item . canvas ; }
2020-07-24 09:00:10 +12:00
var context = item && item . getContext && item . getContext ( '2d' ) ; if ( context && context . canvas === item ) { this . _ensureLoaded ( item ) ; initCanvas ( item , config ) ; return context ; }
2019-05-09 18:54:39 +12:00
return null ; } , releaseContext : function ( context ) { var canvas = context . canvas ; if ( ! canvas [ EXPANDO _KEY ] ) { return ; }
2020-07-24 09:00:10 +12:00
var initial = canvas [ EXPANDO _KEY ] . initial ; [ 'height' , 'width' ] . forEach ( function ( prop ) { var value = initial [ prop ] ; if ( helpers$1 . isNullOrUndef ( value ) ) { canvas . removeAttribute ( prop ) ; } else { canvas . setAttribute ( prop , value ) ; } } ) ; helpers$1 . each ( initial . style || { } , function ( value , key ) { canvas . style [ key ] = value ; } ) ; canvas . width = canvas . width ; delete canvas [ EXPANDO _KEY ] ; } , addEventListener : function ( chart , type , listener ) { var canvas = chart . canvas ; if ( type === 'resize' ) { addResizeListener ( canvas , listener , chart ) ; return ; }
var expando = listener [ EXPANDO _KEY ] || ( listener [ EXPANDO _KEY ] = { } ) ; var proxies = expando . proxies || ( expando . proxies = { } ) ; var proxy = proxies [ chart . id + '_' + type ] = function ( event ) { listener ( fromNativeEvent ( event , chart ) ) ; } ; addListener ( canvas , type , proxy ) ; } , removeEventListener : function ( chart , type , listener ) { var canvas = chart . canvas ; if ( type === 'resize' ) { removeResizeListener ( canvas ) ; return ; }
2019-05-09 18:54:39 +12:00
var expando = listener [ EXPANDO _KEY ] || { } ; var proxies = expando . proxies || { } ; var proxy = proxies [ chart . id + '_' + type ] ; if ( ! proxy ) { return ; }
2020-07-24 09:00:10 +12:00
removeListener ( canvas , type , proxy ) ; } } ; helpers$1 . addEvent = addListener ; helpers$1 . removeEvent = removeListener ; var implementation = platform _dom$2 . _enabled ? platform _dom$2 : platform _basic ; var platform = helpers$1 . extend ( { initialize : function ( ) { } , acquireContext : function ( ) { } , releaseContext : function ( ) { } , addEventListener : function ( ) { } , removeEventListener : function ( ) { } } , implementation ) ; core _defaults . _set ( 'global' , { plugins : { } } ) ; var core _plugins = { _plugins : [ ] , _cacheId : 0 , register : function ( plugins ) { var p = this . _plugins ; ( [ ] ) . concat ( plugins ) . forEach ( function ( plugin ) { if ( p . indexOf ( plugin ) === - 1 ) { p . push ( plugin ) ; } } ) ; this . _cacheId ++ ; } , unregister : function ( plugins ) { var p = this . _plugins ; ( [ ] ) . concat ( plugins ) . forEach ( function ( plugin ) { var idx = p . indexOf ( plugin ) ; if ( idx !== - 1 ) { p . splice ( idx , 1 ) ; } } ) ; this . _cacheId ++ ; } , clear : function ( ) { this . _plugins = [ ] ; this . _cacheId ++ ; } , count : function ( ) { return this . _plugins . length ; } , getAll : function ( ) { return this . _plugins ; } , notify : function ( chart , hook , args ) { var descriptors = this . descriptors ( chart ) ; var ilen = descriptors . length ; var i , descriptor , plugin , params , method ; for ( i = 0 ; i < ilen ; ++ i ) { descriptor = descriptors [ i ] ; plugin = descriptor . plugin ; method = plugin [ hook ] ; if ( typeof method === 'function' ) { params = [ chart ] . concat ( args || [ ] ) ; params . push ( descriptor . options ) ; if ( method . apply ( plugin , params ) === false ) { return false ; } } }
return true ; } , descriptors : function ( chart ) { var cache = chart . $plugins || ( chart . $plugins = { } ) ; if ( cache . id === this . _cacheId ) { return cache . descriptors ; }
var plugins = [ ] ; var descriptors = [ ] ; var config = ( chart && chart . config ) || { } ; var options = ( config . options && config . options . plugins ) || { } ; this . _plugins . concat ( config . plugins || [ ] ) . forEach ( function ( plugin ) { var idx = plugins . indexOf ( plugin ) ; if ( idx !== - 1 ) { return ; }
var id = plugin . id ; var opts = options [ id ] ; if ( opts === false ) { return ; }
if ( opts === true ) { opts = helpers$1 . clone ( core _defaults . global . plugins [ id ] ) ; }
plugins . push ( plugin ) ; descriptors . push ( { plugin : plugin , options : opts || { } } ) ; } ) ; cache . descriptors = descriptors ; cache . id = this . _cacheId ; return descriptors ; } , _invalidate : function ( chart ) { delete chart . $plugins ; } } ; var core _scaleService = { constructors : { } , defaults : { } , registerScaleType : function ( type , scaleConstructor , scaleDefaults ) { this . constructors [ type ] = scaleConstructor ; this . defaults [ type ] = helpers$1 . clone ( scaleDefaults ) ; } , getScaleConstructor : function ( type ) { return this . constructors . hasOwnProperty ( type ) ? this . constructors [ type ] : undefined ; } , getScaleDefaults : function ( type ) { return this . defaults . hasOwnProperty ( type ) ? helpers$1 . merge ( { } , [ core _defaults . scale , this . defaults [ type ] ] ) : { } ; } , updateScaleDefaults : function ( type , additions ) { var me = this ; if ( me . defaults . hasOwnProperty ( type ) ) { me . defaults [ type ] = helpers$1 . extend ( me . defaults [ type ] , additions ) ; } } , addScalesToLayout : function ( chart ) { helpers$1 . each ( chart . scales , function ( scale ) { scale . fullWidth = scale . options . fullWidth ; scale . position = scale . options . position ; scale . weight = scale . options . weight ; core _layouts . addBox ( chart , scale ) ; } ) ; } } ; var valueOrDefault$8 = helpers$1 . valueOrDefault ; var getRtlHelper = helpers$1 . rtl . getRtlAdapter ; core _defaults . _set ( 'global' , { tooltips : { enabled : true , custom : null , mode : 'nearest' , position : 'average' , intersect : true , backgroundColor : 'rgba(0,0,0,0.8)' , titleFontStyle : 'bold' , titleSpacing : 2 , titleMarginBottom : 6 , titleFontColor : '#fff' , titleAlign : 'left' , bodySpacing : 2 , bodyFontColor : '#fff' , bodyAlign : 'left' , footerFontStyle : 'bold' , footerSpacing : 2 , footerMarginTop : 6 , footerFontColor : '#fff' , footerAlign : 'left' , yPadding : 6 , xPadding : 6 , caretPadding : 2 , caretSize : 5 , cornerRadius : 6 , multiKeyBackground : '#fff' , displayColors : true , borderColor : 'rgba(0,0,0,0)' , borderWidth : 0 , callbacks : { beforeTitle : helpers$1 . noop , title : function ( tooltipItems , data ) { var title = '' ; var labels = data . labels ; var labelCount = labels ? labels . length : 0 ; if ( tooltipItems . length > 0 ) { var item = tooltipItems [ 0 ] ; if ( item . label ) { title = item . label ; } else if ( item . xLabel ) { title = item . xLabel ; } else if ( labelCount > 0 && item . index < labelCount ) { title = labels [ item . index ] ; } }
return title ; } , afterTitle : helpers$1 . noop , beforeBody : helpers$1 . noop , beforeLabel : helpers$1 . noop , label : function ( tooltipItem , data ) { var label = data . datasets [ tooltipItem . datasetIndex ] . label || '' ; if ( label ) { label += ': ' ; }
if ( ! helpers$1 . isNullOrUndef ( tooltipItem . value ) ) { label += tooltipItem . value ; } else { label += tooltipItem . yLabel ; }
return label ; } , labelColor : function ( tooltipItem , chart ) { var meta = chart . getDatasetMeta ( tooltipItem . datasetIndex ) ; var activeElement = meta . data [ tooltipItem . index ] ; var view = activeElement . _view ; return { borderColor : view . borderColor , backgroundColor : view . backgroundColor } ; } , labelTextColor : function ( ) { return this . _options . bodyFontColor ; } , afterLabel : helpers$1 . noop , afterBody : helpers$1 . noop , beforeFooter : helpers$1 . noop , footer : helpers$1 . noop , afterFooter : helpers$1 . noop } } } ) ; var positioners = { average : function ( elements ) { if ( ! elements . length ) { return false ; }
var i , len ; var x = 0 ; var y = 0 ; var count = 0 ; for ( i = 0 , len = elements . length ; i < len ; ++ i ) { var el = elements [ i ] ; if ( el && el . hasValue ( ) ) { var pos = el . tooltipPosition ( ) ; x += pos . x ; y += pos . y ; ++ count ; } }
return { x : x / count , y : y / count } ; } , nearest : function ( elements , eventPosition ) { var x = eventPosition . x ; var y = eventPosition . y ; var minDistance = Number . POSITIVE _INFINITY ; var i , len , nearestElement ; for ( i = 0 , len = elements . length ; i < len ; ++ i ) { var el = elements [ i ] ; if ( el && el . hasValue ( ) ) { var center = el . getCenterPoint ( ) ; var d = helpers$1 . distanceBetweenPoints ( eventPosition , center ) ; if ( d < minDistance ) { minDistance = d ; nearestElement = el ; } } }
if ( nearestElement ) { var tp = nearestElement . tooltipPosition ( ) ; x = tp . x ; y = tp . y ; }
return { x : x , y : y } ; } } ; function pushOrConcat ( base , toPush ) { if ( toPush ) { if ( helpers$1 . isArray ( toPush ) ) { Array . prototype . push . apply ( base , toPush ) ; } else { base . push ( toPush ) ; } }
return base ; }
function splitNewlines ( str ) { if ( ( typeof str === 'string' || str instanceof String ) && str . indexOf ( '\n' ) > - 1 ) { return str . split ( '\n' ) ; }
return str ; }
function createTooltipItem ( element ) { var xScale = element . _xScale ; var yScale = element . _yScale || element . _scale ; var index = element . _index ; var datasetIndex = element . _datasetIndex ; var controller = element . _chart . getDatasetMeta ( datasetIndex ) . controller ; var indexScale = controller . _getIndexScale ( ) ; var valueScale = controller . _getValueScale ( ) ; return { xLabel : xScale ? xScale . getLabelForIndex ( index , datasetIndex ) : '' , yLabel : yScale ? yScale . getLabelForIndex ( index , datasetIndex ) : '' , label : indexScale ? '' + indexScale . getLabelForIndex ( index , datasetIndex ) : '' , value : valueScale ? '' + valueScale . getLabelForIndex ( index , datasetIndex ) : '' , index : index , datasetIndex : datasetIndex , x : element . _model . x , y : element . _model . y } ; }
function getBaseModel ( tooltipOpts ) { var globalDefaults = core _defaults . global ; return { xPadding : tooltipOpts . xPadding , yPadding : tooltipOpts . yPadding , xAlign : tooltipOpts . xAlign , yAlign : tooltipOpts . yAlign , rtl : tooltipOpts . rtl , textDirection : tooltipOpts . textDirection , bodyFontColor : tooltipOpts . bodyFontColor , _bodyFontFamily : valueOrDefault$8 ( tooltipOpts . bodyFontFamily , globalDefaults . defaultFontFamily ) , _bodyFontStyle : valueOrDefault$8 ( tooltipOpts . bodyFontStyle , globalDefaults . defaultFontStyle ) , _bodyAlign : tooltipOpts . bodyAlign , bodyFontSize : valueOrDefault$8 ( tooltipOpts . bodyFontSize , globalDefaults . defaultFontSize ) , bodySpacing : tooltipOpts . bodySpacing , titleFontColor : tooltipOpts . titleFontColor , _titleFontFamily : valueOrDefault$8 ( tooltipOpts . titleFontFamily , globalDefaults . defaultFontFamily ) , _titleFontStyle : valueOrDefault$8 ( tooltipOpts . titleFontStyle , globalDefaults . defaultFontStyle ) , titleFontSize : valueOrDefault$8 ( tooltipOpts . titleFontSize , globalDefaults . defaultFontSize ) , _titleAlign : tooltipOpts . titleAlign , titleSpacing : tooltipOpts . titleSpacing , titleMarginBottom : tooltipOpts . titleMarginBottom , footerFontColor : tooltipOpts . footerFontColor , _footerFontFamily : valueOrDefault$8 ( tooltipOpts . footerFontFamily , globalDefaults . defaultFontFamily ) , _footerFontStyle : valueOrDefault$8 ( tooltipOpts . footerFontStyle , globalDefaults . defaultFontStyle ) , footerFontSize : valueOrDefault$8 ( tooltipOpts . footerFontSize , globalDefaults . defaultFontSize ) , _footerAlign : tooltipOpts . footerAlign , footerSpacing : tooltipOpts . footerSpacing , footerMarginTop : tooltipOpts . footerMarginTop , caretSize : tooltipOpts . caretSize , cornerRadius : tooltipOpts . cornerRadius , backgroundColor : tooltipOpts . backgroundColor , opacity : 0 , legendColorBackground : tooltipOpts . multiKeyBackground , displayColors : tooltipOpts . displayColors , borderColor : tooltipOpts . borderColor , borderWidth : tooltipOpts . borderWidth } ; }
function getTooltipSize ( tooltip , model ) { var ctx = tooltip . _chart . ctx ; var height = model . yPadding * 2 ; var width = 0 ; var body = model . body ; var combinedBodyLength = body . reduce ( function ( count , bodyItem ) { return count + bodyItem . before . length + bodyItem . lines . length + bodyItem . after . length ; } , 0 ) ; combinedBodyLength += model . beforeBody . length + model . afterBody . length ; var titleLineCount = model . title . length ; var footerLineCount = model . footer . length ; var titleFontSize = model . titleFontSize ; var bodyFontSize = model . bodyFontSize ; var footerFontSize = model . footerFontSize ; height += titleLineCount * titleFontSize ; height += titleLineCount ? ( titleLineCount - 1 ) * model . titleSpacing : 0 ; height += titleLineCount ? model . titleMarginBottom : 0 ; height += combinedBodyLength * bodyFontSize ; height += combinedBodyLength ? ( combinedBodyLength - 1 ) * model . bodySpacing : 0 ; height += footerLineCount ? model . footerMarginTop : 0 ; height += footerLineCount * ( footerFontSize ) ; height += footerLineCount ? ( footerLineCount - 1 ) * model . footerSpacing : 0 ; var widthPadding = 0 ; var maxLineWidth = function ( line ) { width = Math . max ( width , ctx . measureText ( line ) . width + widthPadding ) ; } ; ctx . font = helpers$1 . fontString ( titleFontSize , model . _titleFontStyle , model . _titleFontFamily ) ; helpers$1 . each ( model . title , maxLineWidth ) ; ctx . font = helpers$1 . fontString ( bodyFontSize , model . _bodyFontStyle , model . _bodyFontFamily ) ; helpers$1 . each ( model . beforeBody . concat ( model . afterBody ) , maxLineWidth ) ; widthPadding = model . displayColors ? ( bodyFontSize + 2 ) : 0 ; helpers$1 . each ( body , function ( bodyItem ) { helpers$1 . each ( bodyItem . before , maxLineWidth ) ; helpers$1 . each ( bodyItem . lines , maxLineWidth ) ; helpers$1 . each ( bodyItem . after , maxLineWidth ) ; } ) ; widthPadding = 0 ; ctx . font = helpers$1 . fontString ( footerFontSize , model . _footerFontStyle , model . _footerFontFamily ) ; helpers$1 . each ( model . footer , maxLineWidth ) ; width += 2 * model . xPadding ; return { width : width , height : height } ; }
function determineAlignment ( tooltip , size ) { var model = tooltip . _model ; var chart = tooltip . _chart ; var chartArea = tooltip . _chart . chartArea ; var xAlign = 'center' ; var yAlign = 'center' ; if ( model . y < size . height ) { yAlign = 'top' ; } else if ( model . y > ( chart . height - size . height ) ) { yAlign = 'bottom' ; }
var lf , rf ; var olf , orf ; var yf ; var midX = ( chartArea . left + chartArea . right ) / 2 ; var midY = ( chartArea . top + chartArea . bottom ) / 2 ; if ( yAlign === 'center' ) { lf = function ( x ) { return x <= midX ; } ; rf = function ( x ) { return x > midX ; } ; } else { lf = function ( x ) { return x <= ( size . width / 2 ) ; } ; rf = function ( x ) { return x >= ( chart . width - ( size . width / 2 ) ) ; } ; }
olf = function ( x ) { return x + size . width + model . caretSize + model . caretPadding > chart . width ; } ; orf = function ( x ) { return x - size . width - model . caretSize - model . caretPadding < 0 ; } ; yf = function ( y ) { return y <= midY ? 'top' : 'bottom' ; } ; if ( lf ( model . x ) ) { xAlign = 'left' ; if ( olf ( model . x ) ) { xAlign = 'center' ; yAlign = yf ( model . y ) ; } } else if ( rf ( model . x ) ) { xAlign = 'right' ; if ( orf ( model . x ) ) { xAlign = 'center' ; yAlign = yf ( model . y ) ; } }
var opts = tooltip . _options ; return { xAlign : opts . xAlign ? opts . xAlign : xAlign , yAlign : opts . yAlign ? opts . yAlign : yAlign } ; }
function getBackgroundPoint ( vm , size , alignment , chart ) { var x = vm . x ; var y = vm . y ; var caretSize = vm . caretSize ; var caretPadding = vm . caretPadding ; var cornerRadius = vm . cornerRadius ; var xAlign = alignment . xAlign ; var yAlign = alignment . yAlign ; var paddingAndSize = caretSize + caretPadding ; var radiusAndPadding = cornerRadius + caretPadding ; if ( xAlign === 'right' ) { x -= size . width ; } else if ( xAlign === 'center' ) { x -= ( size . width / 2 ) ; if ( x + size . width > chart . width ) { x = chart . width - size . width ; }
if ( x < 0 ) { x = 0 ; } }
if ( yAlign === 'top' ) { y += paddingAndSize ; } else if ( yAlign === 'bottom' ) { y -= size . height + paddingAndSize ; } else { y -= ( size . height / 2 ) ; }
if ( yAlign === 'center' ) { if ( xAlign === 'left' ) { x += paddingAndSize ; } else if ( xAlign === 'right' ) { x -= paddingAndSize ; } } else if ( xAlign === 'left' ) { x -= radiusAndPadding ; } else if ( xAlign === 'right' ) { x += radiusAndPadding ; }
return { x : x , y : y } ; }
function getAlignedX ( vm , align ) { return align === 'center' ? vm . x + vm . width / 2 : align === 'right' ? vm . x + vm . width - vm . xPadding : vm . x + vm . xPadding ; }
function getBeforeAfterBodyLines ( callback ) { return pushOrConcat ( [ ] , splitNewlines ( callback ) ) ; }
var exports$4 = core _element . extend ( { initialize : function ( ) { this . _model = getBaseModel ( this . _options ) ; this . _lastActive = [ ] ; } , getTitle : function ( ) { var me = this ; var opts = me . _options ; var callbacks = opts . callbacks ; var beforeTitle = callbacks . beforeTitle . apply ( me , arguments ) ; var title = callbacks . title . apply ( me , arguments ) ; var afterTitle = callbacks . afterTitle . apply ( me , arguments ) ; var lines = [ ] ; lines = pushOrConcat ( lines , splitNewlines ( beforeTitle ) ) ; lines = pushOrConcat ( lines , splitNewlines ( title ) ) ; lines = pushOrConcat ( lines , splitNewlines ( afterTitle ) ) ; return lines ; } , getBeforeBody : function ( ) { return getBeforeAfterBodyLines ( this . _options . callbacks . beforeBody . apply ( this , arguments ) ) ; } , getBody : function ( tooltipItems , data ) { var me = this ; var callbacks = me . _options . callbacks ; var bodyItems = [ ] ; helpers$1 . each ( tooltipItems , function ( tooltipItem ) { var bodyItem = { before : [ ] , lines : [ ] , after : [ ] } ; pushOrConcat ( bodyItem . before , splitNewlines ( callbacks . beforeLabel . call ( me , tooltipItem , data ) ) ) ; pushOrConcat ( bodyItem . lines , callbacks . label . call ( me , tooltipItem , data ) ) ; pushOrConcat ( bodyItem . after , splitNewlines ( callbacks . afterLabel . call ( me , tooltipItem , data ) ) ) ; bodyItems . push ( bodyItem ) ; } ) ; return bodyItems ; } , getAfterBody : function ( ) { return getBeforeAfterBodyLines ( this . _options . callbacks . afterBody . apply ( this , arguments ) ) ; } , getFooter : function ( ) { var me = this ; var callbacks = me . _options . callbacks ; var beforeFooter = callbacks . beforeFooter . apply ( me , arguments ) ; var footer = callbacks . footer . apply ( me , arguments ) ; var afterFooter = callbacks . afterFooter . apply ( me , arguments ) ; var lines = [ ] ; lines = pushOrConcat ( lines , splitNewlines ( beforeFooter ) ) ; lines = pushOrConcat ( lines , splitNewlines ( footer ) ) ; lines = pushOrConcat ( lines , splitNewlines ( afterFooter ) ) ; return lines ; } , update : function ( changed ) { var me = this ; var opts = me . _options ; var existingModel = me . _model ; var model = me . _model = getBaseModel ( opts ) ; var active = me . _active ; var data = me . _data ; var alignment = { xAlign : existingModel . xAlign , yAlign : existingModel . yAlign } ; var backgroundPoint = { x : existingModel . x , y : existingModel . y } ; var tooltipSize = { width : existingModel . width , height : existingModel . height } ; var tooltipPosition = { x : existingModel . caretX , y : existingModel . caretY } ; var i , len ; if ( active . length ) { model . opacity = 1 ; var labelColors = [ ] ; var labelTextColors = [ ] ; tooltipPosition = positioners [ opts . position ] . call ( me , active , me . _eventPosition ) ; var tooltipItems = [ ] ; for ( i = 0 , len = active . length ; i < len ; ++ i ) { tooltipItems . push ( createTooltipItem ( active [ i ] ) ) ; }
if ( opts . filter ) { tooltipItems = tooltipItems . filter ( function ( a ) { return opts . filter ( a , data ) ; } ) ; }
if ( opts . itemSort ) { tooltipItems = tooltipItems . sort ( function ( a , b ) { return opts . itemSort ( a , b , data ) ; } ) ; }
helpers$1 . each ( tooltipItems , function ( tooltipItem ) { labelColors . push ( opts . callbacks . labelColor . call ( me , tooltipItem , me . _chart ) ) ; labelTextColors . push ( opts . callbacks . labelTextColor . call ( me , tooltipItem , me . _chart ) ) ; } ) ; model . title = me . getTitle ( tooltipItems , data ) ; model . beforeBody = me . getBeforeBody ( tooltipItems , data ) ; model . body = me . getBody ( tooltipItems , data ) ; model . afterBody = me . getAfterBody ( tooltipItems , data ) ; model . footer = me . getFooter ( tooltipItems , data ) ; model . x = tooltipPosition . x ; model . y = tooltipPosition . y ; model . caretPadding = opts . caretPadding ; model . labelColors = labelColors ; model . labelTextColors = labelTextColors ; model . dataPoints = tooltipItems ; tooltipSize = getTooltipSize ( this , model ) ; alignment = determineAlignment ( this , tooltipSize ) ; backgroundPoint = getBackgroundPoint ( model , tooltipSize , alignment , me . _chart ) ; } else { model . opacity = 0 ; }
model . xAlign = alignment . xAlign ; model . yAlign = alignment . yAlign ; model . x = backgroundPoint . x ; model . y = backgroundPoint . y ; model . width = tooltipSize . width ; model . height = tooltipSize . height ; model . caretX = tooltipPosition . x ; model . caretY = tooltipPosition . y ; me . _model = model ; if ( changed && opts . custom ) { opts . custom . call ( me , model ) ; }
return me ; } , drawCaret : function ( tooltipPoint , size ) { var ctx = this . _chart . ctx ; var vm = this . _view ; var caretPosition = this . getCaretPosition ( tooltipPoint , size , vm ) ; ctx . lineTo ( caretPosition . x1 , caretPosition . y1 ) ; ctx . lineTo ( caretPosition . x2 , caretPosition . y2 ) ; ctx . lineTo ( caretPosition . x3 , caretPosition . y3 ) ; } , getCaretPosition : function ( tooltipPoint , size , vm ) { var x1 , x2 , x3 , y1 , y2 , y3 ; var caretSize = vm . caretSize ; var cornerRadius = vm . cornerRadius ; var xAlign = vm . xAlign ; var yAlign = vm . yAlign ; var ptX = tooltipPoint . x ; var ptY = tooltipPoint . y ; var width = size . width ; var height = size . height ; if ( yAlign === 'center' ) { y2 = ptY + ( height / 2 ) ; if ( xAlign === 'left' ) { x1 = ptX ; x2 = x1 - caretSize ; x3 = x1 ; y1 = y2 + caretSize ; y3 = y2 - caretSize ; } else { x1 = ptX + width ; x2 = x1 + caretSize ; x3 = x1 ; y1 = y2 - caretSize ; y3 = y2 + caretSize ; } } else { if ( xAlign === 'left' ) { x2 = ptX + cornerRadius + ( caretSize ) ; x1 = x2 - caretSize ; x3 = x2 + caretSize ; } else if ( xAlign === 'right' ) { x2 = ptX + width - cornerRadius - caretSize ; x1 = x2 - caretSize ; x3 = x2 + caretSize ; } else { x2 = vm . caretX ; x1 = x2 - caretSize ; x3 = x2 + caretSize ; }
if ( yAlign === 'top' ) { y1 = ptY ; y2 = y1 - caretSize ; y3 = y1 ; } else { y1 = ptY + height ; y2 = y1 + caretSize ; y3 = y1 ; var tmp = x3 ; x3 = x1 ; x1 = tmp ; } }
return { x1 : x1 , x2 : x2 , x3 : x3 , y1 : y1 , y2 : y2 , y3 : y3 } ; } , drawTitle : function ( pt , vm , ctx ) { var title = vm . title ; var length = title . length ; var titleFontSize , titleSpacing , i ; if ( length ) { var rtlHelper = getRtlHelper ( vm . rtl , vm . x , vm . width ) ; pt . x = getAlignedX ( vm , vm . _titleAlign ) ; ctx . textAlign = rtlHelper . textAlign ( vm . _titleAlign ) ; ctx . textBaseline = 'middle' ; titleFontSize = vm . titleFontSize ; titleSpacing = vm . titleSpacing ; ctx . fillStyle = vm . titleFontColor ; ctx . font = helpers$1 . fontString ( titleFontSize , vm . _titleFontStyle , vm . _titleFontFamily ) ; for ( i = 0 ; i < length ; ++ i ) { ctx . fillText ( title [ i ] , rtlHelper . x ( pt . x ) , pt . y + titleFontSize / 2 ) ; pt . y += titleFontSize + titleSpacing ; if ( i + 1 === length ) { pt . y += vm . titleMarginBottom - titleSpacing ; } } } } , drawBody : function ( pt , vm , ctx ) { var bodyFontSize = vm . bodyFontSize ; var bodySpacing = vm . bodySpacing ; var bodyAlign = vm . _bodyAlign ; var body = vm . body ; var drawColorBoxes = vm . displayColors ; var xLinePadding = 0 ; var colorX = drawColorBoxes ? getAlignedX ( vm , 'left' ) : 0 ; var rtlHelper = getRtlHelper ( vm . rtl , vm . x , vm . width ) ; var fillLineOfText = function ( line ) { ctx . fillText ( line , rtlHelper . x ( pt . x + xLinePadding ) , pt . y + bodyFontSize / 2 ) ; pt . y += bodyFontSize + bodySpacing ; } ; var bodyItem , textColor , labelColors , lines , i , j , ilen , jlen ; var bodyAlignForCalculation = rtlHelper . textAlign ( bodyAlign ) ; ctx . textAlign = bodyAlign ; ctx . textBaseline = 'middle' ; ctx . font = helpers$1 . fontString ( bodyFontSize , vm . _bodyFontStyle , vm . _bodyFontFamily ) ; pt . x = getAlignedX ( vm , bodyAlignForCalculation ) ; ctx . fillStyle = vm . bodyFontColor ; helpers$1 . each ( vm . beforeBody , fillLineOfText ) ; xLinePadding = drawColorBoxes && bodyAlignForCalculation !== 'right' ? bodyAlign === 'center' ? ( bodyFontSize / 2 + 1 ) : ( bodyFontSize + 2 ) : 0 ; for ( i = 0 , ilen = body . length ; i < ilen ; ++ i ) { bodyItem = body [ i ] ; textColor = vm . labelTextColors [ i ] ; labelColors = vm . labelColors [ i ] ; ctx . fillStyle = textColor ; helpers$1 . each ( bodyItem . before , fillLineOfText ) ; lines = bodyItem . lines ; for ( j = 0 , jlen = lines . length ; j < jlen ; ++ j ) { if ( drawColorBoxes ) { var rtlColorX = rtlHelper . x ( colorX ) ; ctx . fillStyle = vm . legendColorBackground ; ctx . fillRect ( rtlHelper . leftForLtr ( rtlColorX , bodyFontSize ) , pt . y , bodyFontSize , bodyFontSize ) ; ctx . lineWidth = 1 ; ctx . strokeStyle = labelColors . borderColor ; ctx . strokeRect ( rtlHelper . leftForLtr ( rtlColorX , bodyFontSize ) , pt . y , bodyFontSize , bodyFontSize ) ; ctx . fillStyle = labelColors . backgroundColor ; ctx . fillRect ( rtlHelper . leftForLtr ( rtlHelper . xPlus ( rtlColorX , 1 ) , bodyFontSize - 2 ) , pt . y + 1 , bodyFontSize - 2 , bodyFontSize - 2 ) ; ctx . fillStyle = textColor ; }
fillLineOfText ( lines [ j ] ) ; }
helpers$1 . each ( bodyItem . after , fillLineOfText ) ; }
xLinePadding = 0 ; helpers$1 . each ( vm . afterBody , fillLineOfText ) ; pt . y -= bodySpacing ; } , drawFooter : function ( pt , vm , ctx ) { var footer = vm . footer ; var length = footer . length ; var footerFontSize , i ; if ( length ) { var rtlHelper = getRtlHelper ( vm . rtl , vm . x , vm . width ) ; pt . x = getAlignedX ( vm , vm . _footerAlign ) ; pt . y += vm . footerMarginTop ; ctx . textAlign = rtlHelper . textAlign ( vm . _footerAlign ) ; ctx . textBaseline = 'middle' ; footerFontSize = vm . footerFontSize ; ctx . fillStyle = vm . footerFontColor ; ctx . font = helpers$1 . fontString ( footerFontSize , vm . _footerFontStyle , vm . _footerFontFamily ) ; for ( i = 0 ; i < length ; ++ i ) { ctx . fillText ( footer [ i ] , rtlHelper . x ( pt . x ) , pt . y + footerFontSize / 2 ) ; pt . y += footerFontSize + vm . footerSpacing ; } } } , drawBackground : function ( pt , vm , ctx , tooltipSize ) { ctx . fillStyle = vm . backgroundColor ; ctx . strokeStyle = vm . borderColor ; ctx . lineWidth = vm . borderWidth ; var xAlign = vm . xAlign ; var yAlign = vm . yAlign ; var x = pt . x ; var y = pt . y ; var width = tooltipSize . width ; var height = tooltipSize . height ; var radius = vm . cornerRadius ; ctx . beginPath ( ) ; ctx . moveTo ( x + radius , y ) ; if ( yAlign === 'top' ) { this . drawCaret ( pt , tooltipSize ) ; }
ctx . lineTo ( x + width - radius , y ) ; ctx . quadraticCurveTo ( x + width , y , x + width , y + radius ) ; if ( yAlign === 'center' && xAlign === 'right' ) { this . drawCaret ( pt , tooltipSize ) ; }
ctx . lineTo ( x + width , y + height - radius ) ; ctx . quadraticCurveTo ( x + width , y + height , x + width - radius , y + height ) ; if ( yAlign === 'bottom' ) { this . drawCaret ( pt , tooltipSize ) ; }
ctx . lineTo ( x + radius , y + height ) ; ctx . quadraticCurveTo ( x , y + height , x , y + height - radius ) ; if ( yAlign === 'center' && xAlign === 'left' ) { this . drawCaret ( pt , tooltipSize ) ; }
ctx . lineTo ( x , y + radius ) ; ctx . quadraticCurveTo ( x , y , x + radius , y ) ; ctx . closePath ( ) ; ctx . fill ( ) ; if ( vm . borderWidth > 0 ) { ctx . stroke ( ) ; } } , draw : function ( ) { var ctx = this . _chart . ctx ; var vm = this . _view ; if ( vm . opacity === 0 ) { return ; }
var tooltipSize = { width : vm . width , height : vm . height } ; var pt = { x : vm . x , y : vm . y } ; var opacity = Math . abs ( vm . opacity < 1e-3 ) ? 0 : vm . opacity ; var hasTooltipContent = vm . title . length || vm . beforeBody . length || vm . body . length || vm . afterBody . length || vm . footer . length ; if ( this . _options . enabled && hasTooltipContent ) { ctx . save ( ) ; ctx . globalAlpha = opacity ; this . drawBackground ( pt , vm , ctx , tooltipSize ) ; pt . y += vm . yPadding ; helpers$1 . rtl . overrideTextDirection ( ctx , vm . textDirection ) ; this . drawTitle ( pt , vm , ctx ) ; this . drawBody ( pt , vm , ctx ) ; this . drawFooter ( pt , vm , ctx ) ; helpers$1 . rtl . restoreTextDirection ( ctx , vm . textDirection ) ; ctx . restore ( ) ; } } , handleEvent : function ( e ) { var me = this ; var options = me . _options ; var changed = false ; me . _lastActive = me . _lastActive || [ ] ; if ( e . type === 'mouseout' ) { me . _active = [ ] ; } else { me . _active = me . _chart . getElementsAtEventForMode ( e , options . mode , options ) ; if ( options . reverse ) { me . _active . reverse ( ) ; } }
changed = ! helpers$1 . arrayEquals ( me . _active , me . _lastActive ) ; if ( changed ) { me . _lastActive = me . _active ; if ( options . enabled || options . custom ) { me . _eventPosition = { x : e . x , y : e . y } ; me . update ( true ) ; me . pivot ( ) ; } }
return changed ; } } ) ; var positioners _1 = positioners ; var core _tooltip = exports$4 ; core _tooltip . positioners = positioners _1 ; var valueOrDefault$9 = helpers$1 . valueOrDefault ; core _defaults . _set ( 'global' , { elements : { } , events : [ 'mousemove' , 'mouseout' , 'click' , 'touchstart' , 'touchmove' ] , hover : { onHover : null , mode : 'nearest' , intersect : true , animationDuration : 400 } , onClick : null , maintainAspectRatio : true , responsive : true , responsiveAnimationDuration : 0 } ) ; function mergeScaleConfig ( ) { return helpers$1 . merge ( { } , [ ] . slice . call ( arguments ) , { merger : function ( key , target , source , options ) { if ( key === 'xAxes' || key === 'yAxes' ) { var slen = source [ key ] . length ; var i , type , scale ; if ( ! target [ key ] ) { target [ key ] = [ ] ; }
for ( i = 0 ; i < slen ; ++ i ) { scale = source [ key ] [ i ] ; type = valueOrDefault$9 ( scale . type , key === 'xAxes' ? 'category' : 'linear' ) ; if ( i >= target [ key ] . length ) { target [ key ] . push ( { } ) ; }
if ( ! target [ key ] [ i ] . type || ( scale . type && scale . type !== target [ key ] [ i ] . type ) ) { helpers$1 . merge ( target [ key ] [ i ] , [ core _scaleService . getScaleDefaults ( type ) , scale ] ) ; } else { helpers$1 . merge ( target [ key ] [ i ] , scale ) ; } } } else { helpers$1 . _merger ( key , target , source , options ) ; } } } ) ; }
function mergeConfig ( ) { return helpers$1 . merge ( { } , [ ] . slice . call ( arguments ) , { merger : function ( key , target , source , options ) { var tval = target [ key ] || { } ; var sval = source [ key ] ; if ( key === 'scales' ) { target [ key ] = mergeScaleConfig ( tval , sval ) ; } else if ( key === 'scale' ) { target [ key ] = helpers$1 . merge ( tval , [ core _scaleService . getScaleDefaults ( sval . type ) , sval ] ) ; } else { helpers$1 . _merger ( key , target , source , options ) ; } } } ) ; }
function initConfig ( config ) { config = config || { } ; var data = config . data = config . data || { } ; data . datasets = data . datasets || [ ] ; data . labels = data . labels || [ ] ; config . options = mergeConfig ( core _defaults . global , core _defaults [ config . type ] , config . options || { } ) ; return config ; }
function updateConfig ( chart ) { var newOptions = chart . options ; helpers$1 . each ( chart . scales , function ( scale ) { core _layouts . removeBox ( chart , scale ) ; } ) ; newOptions = mergeConfig ( core _defaults . global , core _defaults [ chart . config . type ] , newOptions ) ; chart . options = chart . config . options = newOptions ; chart . ensureScalesHaveIDs ( ) ; chart . buildOrUpdateScales ( ) ; chart . tooltip . _options = newOptions . tooltips ; chart . tooltip . initialize ( ) ; }
function nextAvailableScaleId ( axesOpts , prefix , index ) { var id ; var hasId = function ( obj ) { return obj . id === id ; } ; do { id = prefix + index ++ ; } while ( helpers$1 . findIndex ( axesOpts , hasId ) >= 0 ) ; return id ; }
function positionIsHorizontal ( position ) { return position === 'top' || position === 'bottom' ; }
function compare2Level ( l1 , l2 ) { return function ( a , b ) { return a [ l1 ] === b [ l1 ] ? a [ l2 ] - b [ l2 ] : a [ l1 ] - b [ l1 ] ; } ; }
var Chart = function ( item , config ) { this . construct ( item , config ) ; return this ; } ; helpers$1 . extend ( Chart . prototype , { construct : function ( item , config ) { var me = this ; config = initConfig ( config ) ; var context = platform . acquireContext ( item , config ) ; var canvas = context && context . canvas ; var height = canvas && canvas . height ; var width = canvas && canvas . width ; me . id = helpers$1 . uid ( ) ; me . ctx = context ; me . canvas = canvas ; me . config = config ; me . width = width ; me . height = height ; me . aspectRatio = height ? width / height : null ; me . options = config . options ; me . _bufferedRender = false ; me . _layers = [ ] ; me . chart = me ; me . controller = me ; Chart . instances [ me . id ] = me ; Object . defineProperty ( me , 'data' , { get : function ( ) { return me . config . data ; } , set : function ( value ) { me . config . data = value ; } } ) ; if ( ! context || ! canvas ) { console . error ( "Failed to create chart: can't acquire context from the given item" ) ; return ; }
me . initialize ( ) ; me . update ( ) ; } , initialize : function ( ) { var me = this ; core _plugins . notify ( me , 'beforeInit' ) ; helpers$1 . retinaScale ( me , me . options . devicePixelRatio ) ; me . bindEvents ( ) ; if ( me . options . responsive ) { me . resize ( true ) ; }
me . initToolTip ( ) ; core _plugins . notify ( me , 'afterInit' ) ; return me ; } , clear : function ( ) { helpers$1 . canvas . clear ( this ) ; return this ; } , stop : function ( ) { core _animations . cancelAnimation ( this ) ; return this ; } , resize : function ( silent ) { var me = this ; var options = me . options ; var canvas = me . canvas ; var aspectRatio = ( options . maintainAspectRatio && me . aspectRatio ) || null ; var newWidth = Math . max ( 0 , Math . floor ( helpers$1 . getMaximumWidth ( canvas ) ) ) ; var newHeight = Math . max ( 0 , Math . floor ( aspectRatio ? newWidth / aspectRatio : helpers$1 . getMaximumHeight ( canvas ) ) ) ; if ( me . width === newWidth && me . height === newHeight ) { return ; }
canvas . width = me . width = newWidth ; canvas . height = me . height = newHeight ; canvas . style . width = newWidth + 'px' ; canvas . style . height = newHeight + 'px' ; helpers$1 . retinaScale ( me , options . devicePixelRatio ) ; if ( ! silent ) { var newSize = { width : newWidth , height : newHeight } ; core _plugins . notify ( me , 'resize' , [ newSize ] ) ; if ( options . onResize ) { options . onResize ( me , newSize ) ; }
me . stop ( ) ; me . update ( { duration : options . responsiveAnimationDuration } ) ; } } , ensureScalesHaveIDs : function ( ) { var options = this . options ; var scalesOptions = options . scales || { } ; var scaleOptions = options . scale ; helpers$1 . each ( scalesOptions . xAxes , function ( xAxisOptions , index ) { if ( ! xAxisOptions . id ) { xAxisOptions . id = nextAvailableScaleId ( scalesOptions . xAxes , 'x-axis-' , index ) ; } } ) ; helpers$1 . each ( scalesOptions . yAxes , function ( yAxisOptions , index ) { if ( ! yAxisOptions . id ) { yAxisOptions . id = nextAvailableScaleId ( scalesOptions . yAxes , 'y-axis-' , index ) ; } } ) ; if ( scaleOptions ) { scaleOptions . id = scaleOptions . id || 'scale' ; } } , buildOrUpdateScales : function ( ) { var me = this ; var options = me . options ; var scales = me . scales || { } ; var items = [ ] ; var updated = Object . keys ( scales ) . reduce ( function ( obj , id ) { obj [ id ] = false ; return obj ; } , { } ) ; if ( options . scales ) { items = items . concat ( ( options . scales . xAxes || [ ] ) . map ( function ( xAxisOptions ) { return { options : xAxisOptions , dtype : 'category' , dposition : 'bottom' } ; } ) , ( options . scales . yAxes || [ ] ) . map ( function ( yAxisOptions ) { return { options : yAxisOptions , dtype : 'linear' , dposition : 'left' } ; } ) ) ; }
if ( options . scale ) { items . push ( { options : options . scale , dtype : 'radialLinear' , isDefault : true , dposition : 'chartArea' } ) ; }
helpers$1 . each ( items , function ( item ) { var scaleOptions = item . options ; var id = scaleOptions . id ; var scaleType = valueOrDefault$9 ( scaleOptions . type , item . dtype ) ; if ( positionIsHorizontal ( scaleOptions . position ) !== positionIsHorizontal ( item . dposition ) ) { scaleOptions . position = item . dposition ; }
updated [ id ] = true ; var scale = null ; if ( id in scales && scales [ id ] . type === scaleType ) { scale = scales [ id ] ; scale . options = scaleOptions ; scale . ctx = me . ctx ; scale . chart = me ; } else { var scaleClass = core _scaleService . getScaleConstructor ( scaleType ) ; if ( ! scaleClass ) { return ; }
scale = new scaleClass ( { id : id , type : scaleType , options : scaleOptions , ctx : me . ctx , chart : me } ) ; scales [ scale . id ] = scale ; }
scale . mergeTicksOptions ( ) ; if ( item . isDefault ) { me . scale = scale ; } } ) ; helpers$1 . each ( updated , function ( hasUpdated , id ) { if ( ! hasUpdated ) { delete scales [ id ] ; } } ) ; me . scales = scales ; core _scaleService . addScalesToLayout ( this ) ; } , buildOrUpdateControllers : function ( ) { var me = this ; var newControllers = [ ] ; var datasets = me . data . datasets ; var i , ilen ; for ( i = 0 , ilen = datasets . length ; i < ilen ; i ++ ) { var dataset = datasets [ i ] ; var meta = me . getDatasetMeta ( i ) ; var type = dataset . type || me . config . type ; if ( meta . type && meta . type !== type ) { me . destroyDatasetMeta ( i ) ; meta = me . getDatasetMeta ( i ) ; }
meta . type = type ; meta . order = dataset . order || 0 ; meta . index = i ; if ( meta . controller ) { meta . controller . updateIndex ( i ) ; meta . controller . linkScales ( ) ; } else { var ControllerClass = controllers [ meta . type ] ; if ( ControllerClass === undefined ) { throw new Error ( '"' + meta . type + '" is not a chart type.' ) ; }
meta . controller = new ControllerClass ( me , i ) ; newControllers . push ( meta . controller ) ; } }
return newControllers ; } , resetElements : function ( ) { var me = this ; helpers$1 . each ( me . data . datasets , function ( dataset , datasetIndex ) { me . getDatasetMeta ( datasetIndex ) . controller . reset ( ) ; } , me ) ; } , reset : function ( ) { this . resetElements ( ) ; this . tooltip . initialize ( ) ; } , update : function ( config ) { var me = this ; var i , ilen ; if ( ! config || typeof config !== 'object' ) { config = { duration : config , lazy : arguments [ 1 ] } ; }
updateConfig ( me ) ; core _plugins . _invalidate ( me ) ; if ( core _plugins . notify ( me , 'beforeUpdate' ) === false ) { return ; }
me . tooltip . _data = me . data ; var newControllers = me . buildOrUpdateControllers ( ) ; for ( i = 0 , ilen = me . data . datasets . length ; i < ilen ; i ++ ) { me . getDatasetMeta ( i ) . controller . buildOrUpdateElements ( ) ; }
me . updateLayout ( ) ; if ( me . options . animation && me . options . animation . duration ) { helpers$1 . each ( newControllers , function ( controller ) { controller . reset ( ) ; } ) ; }
me . updateDatasets ( ) ; me . tooltip . initialize ( ) ; me . lastActive = [ ] ; core _plugins . notify ( me , 'afterUpdate' ) ; me . _layers . sort ( compare2Level ( 'z' , '_idx' ) ) ; if ( me . _bufferedRender ) { me . _bufferedRequest = { duration : config . duration , easing : config . easing , lazy : config . lazy } ; } else { me . render ( config ) ; } } , updateLayout : function ( ) { var me = this ; if ( core _plugins . notify ( me , 'beforeLayout' ) === false ) { return ; }
core _layouts . update ( this , this . width , this . height ) ; me . _layers = [ ] ; helpers$1 . each ( me . boxes , function ( box ) { if ( box . _configure ) { box . _configure ( ) ; }
me . _layers . push . apply ( me . _layers , box . _layers ( ) ) ; } , me ) ; me . _layers . forEach ( function ( item , index ) { item . _idx = index ; } ) ; core _plugins . notify ( me , 'afterScaleUpdate' ) ; core _plugins . notify ( me , 'afterLayout' ) ; } , updateDatasets : function ( ) { var me = this ; if ( core _plugins . notify ( me , 'beforeDatasetsUpdate' ) === false ) { return ; }
for ( var i = 0 , ilen = me . data . datasets . length ; i < ilen ; ++ i ) { me . updateDataset ( i ) ; }
core _plugins . notify ( me , 'afterDatasetsUpdate' ) ; } , updateDataset : function ( index ) { var me = this ; var meta = me . getDatasetMeta ( index ) ; var args = { meta : meta , index : index } ; if ( core _plugins . notify ( me , 'beforeDatasetUpdate' , [ args ] ) === false ) { return ; }
meta . controller . _update ( ) ; core _plugins . notify ( me , 'afterDatasetUpdate' , [ args ] ) ; } , render : function ( config ) { var me = this ; if ( ! config || typeof config !== 'object' ) { config = { duration : config , lazy : arguments [ 1 ] } ; }
var animationOptions = me . options . animation ; var duration = valueOrDefault$9 ( config . duration , animationOptions && animationOptions . duration ) ; var lazy = config . lazy ; if ( core _plugins . notify ( me , 'beforeRender' ) === false ) { return ; }
var onComplete = function ( animation ) { core _plugins . notify ( me , 'afterRender' ) ; helpers$1 . callback ( animationOptions && animationOptions . onComplete , [ animation ] , me ) ; } ; if ( animationOptions && duration ) { var animation = new core _animation ( { numSteps : duration / 16.66 , easing : config . easing || animationOptions . easing , render : function ( chart , animationObject ) { var easingFunction = helpers$1 . easing . effects [ animationObject . easing ] ; var currentStep = animationObject . currentStep ; var stepDecimal = currentStep / animationObject . numSteps ; chart . draw ( easingFunction ( stepDecimal ) , stepDecimal , currentStep ) ; } , onAnimationProgress : animationOptions . onProgress , onAnimationComplete : onComplete } ) ; core _animations . addAnimation ( me , animation , duration , lazy ) ; } else { me . draw ( ) ; onComplete ( new core _animation ( { numSteps : 0 , chart : me } ) ) ; }
return me ; } , draw : function ( easingValue ) { var me = this ; var i , layers ; me . clear ( ) ; if ( helpers$1 . isNullOrUndef ( easingValue ) ) { easingValue = 1 ; }
me . transition ( easingValue ) ; if ( me . width <= 0 || me . height <= 0 ) { return ; }
if ( core _plugins . notify ( me , 'beforeDraw' , [ easingValue ] ) === false ) { return ; }
layers = me . _layers ; for ( i = 0 ; i < layers . length && layers [ i ] . z <= 0 ; ++ i ) { layers [ i ] . draw ( me . chartArea ) ; }
me . drawDatasets ( easingValue ) ; for ( ; i < layers . length ; ++ i ) { layers [ i ] . draw ( me . chartArea ) ; }
me . _drawTooltip ( easingValue ) ; core _plugins . notify ( me , 'afterDraw' , [ easingValue ] ) ; } , transition : function ( easingValue ) { var me = this ; for ( var i = 0 , ilen = ( me . data . datasets || [ ] ) . length ; i < ilen ; ++ i ) { if ( me . isDatasetVisible ( i ) ) { me . getDatasetMeta ( i ) . controller . transition ( easingValue ) ; } }
me . tooltip . transition ( easingValue ) ; } , _getSortedDatasetMetas : function ( filterVisible ) { var me = this ; var datasets = me . data . datasets || [ ] ; var result = [ ] ; var i , ilen ; for ( i = 0 , ilen = datasets . length ; i < ilen ; ++ i ) { if ( ! filterVisible || me . isDatasetVisible ( i ) ) { result . push ( me . getDatasetMeta ( i ) ) ; } }
result . sort ( compare2Level ( 'order' , 'index' ) ) ; return result ; } , _getSortedVisibleDatasetMetas : function ( ) { return this . _getSortedDatasetMetas ( true ) ; } , drawDatasets : function ( easingValue ) { var me = this ; var metasets , i ; if ( core _plugins . notify ( me , 'beforeDatasetsDraw' , [ easingValue ] ) === false ) { return ; }
metasets = me . _getSortedVisibleDatasetMetas ( ) ; for ( i = metasets . length - 1 ; i >= 0 ; -- i ) { me . drawDataset ( metasets [ i ] , easingValue ) ; }
core _plugins . notify ( me , 'afterDatasetsDraw' , [ easingValue ] ) ; } , drawDataset : function ( meta , easingValue ) { var me = this ; var args = { meta : meta , index : meta . index , easingValue : easingValue } ; if ( core _plugins . notify ( me , 'beforeDatasetDraw' , [ args ] ) === false ) { return ; }
meta . controller . draw ( easingValue ) ; core _plugins . notify ( me , 'afterDatasetDraw' , [ args ] ) ; } , _drawTooltip : function ( easingValue ) { var me = this ; var tooltip = me . tooltip ; var args = { tooltip : tooltip , easingValue : easingValue } ; if ( core _plugins . notify ( me , 'beforeTooltipDraw' , [ args ] ) === false ) { return ; }
tooltip . draw ( ) ; core _plugins . notify ( me , 'afterTooltipDraw' , [ args ] ) ; } , getElementAtEvent : function ( e ) { return core _interaction . modes . single ( this , e ) ; } , getElementsAtEvent : function ( e ) { return core _interaction . modes . label ( this , e , { intersect : true } ) ; } , getElementsAtXAxis : function ( e ) { return core _interaction . modes [ 'x-axis' ] ( this , e , { intersect : true } ) ; } , getElementsAtEventForMode : function ( e , mode , options ) { var method = core _interaction . modes [ mode ] ; if ( typeof method === 'function' ) { return method ( this , e , options ) ; }
return [ ] ; } , getDatasetAtEvent : function ( e ) { return core _interaction . modes . dataset ( this , e , { intersect : true } ) ; } , getDatasetMeta : function ( datasetIndex ) { var me = this ; var dataset = me . data . datasets [ datasetIndex ] ; if ( ! dataset . _meta ) { dataset . _meta = { } ; }
var meta = dataset . _meta [ me . id ] ; if ( ! meta ) { meta = dataset . _meta [ me . id ] = { type : null , data : [ ] , dataset : null , controller : null , hidden : null , xAxisID : null , yAxisID : null , order : dataset . order || 0 , index : datasetIndex } ; }
return meta ; } , getVisibleDatasetCount : function ( ) { var count = 0 ; for ( var i = 0 , ilen = this . data . datasets . length ; i < ilen ; ++ i ) { if ( this . isDatasetVisible ( i ) ) { count ++ ; } }
return count ; } , isDatasetVisible : function ( datasetIndex ) { var meta = this . getDatasetMeta ( datasetIndex ) ; return typeof meta . hidden === 'boolean' ? ! meta . hidden : ! this . data . datasets [ datasetIndex ] . hidden ; } , generateLegend : function ( ) { return this . options . legendCallback ( this ) ; } , destroyDatasetMeta : function ( datasetIndex ) { var id = this . id ; var dataset = this . data . datasets [ datasetIndex ] ; var meta = dataset . _meta && dataset . _meta [ id ] ; if ( meta ) { meta . controller . destroy ( ) ; delete dataset . _meta [ id ] ; } } , destroy : function ( ) { var me = this ; var canvas = me . canvas ; var i , ilen ; me . stop ( ) ; for ( i = 0 , ilen = me . data . datasets . length ; i < ilen ; ++ i ) { me . destroyDatasetMeta ( i ) ; }
if ( canvas ) { me . unbindEvents ( ) ; helpers$1 . canvas . clear ( me ) ; platform . releaseContext ( me . ctx ) ; me . canvas = null ; me . ctx = null ; }
core _plugins . notify ( me , 'destroy' ) ; delete Chart . instances [ me . id ] ; } , toBase64Image : function ( ) { return this . canvas . toDataURL . apply ( this . canvas , arguments ) ; } , initToolTip : function ( ) { var me = this ; me . tooltip = new core _tooltip ( { _chart : me , _chartInstance : me , _data : me . data , _options : me . options . tooltips } , me ) ; } , bindEvents : function ( ) { var me = this ; var listeners = me . _listeners = { } ; var listener = function ( ) { me . eventHandler . apply ( me , arguments ) ; } ; helpers$1 . each ( me . options . events , function ( type ) { platform . addEventListener ( me , type , listener ) ; listeners [ type ] = listener ; } ) ; if ( me . options . responsive ) { listener = function ( ) { me . resize ( ) ; } ; platform . addEventListener ( me , 'resize' , listener ) ; listeners . resize = listener ; } } , unbindEvents : function ( ) { var me = this ; var listeners = me . _listeners ; if ( ! listeners ) { return ; }
delete me . _listeners ; helpers$1 . each ( listeners , function ( listener , type ) { platform . removeEventListener ( me , type , listener ) ; } ) ; } , updateHoverStyle : function ( elements , mode , enabled ) { var prefix = enabled ? 'set' : 'remove' ; var element , i , ilen ; for ( i = 0 , ilen = elements . length ; i < ilen ; ++ i ) { element = elements [ i ] ; if ( element ) { this . getDatasetMeta ( element . _datasetIndex ) . controller [ prefix + 'HoverStyle' ] ( element ) ; } }
if ( mode === 'dataset' ) { this . getDatasetMeta ( elements [ 0 ] . _datasetIndex ) . controller [ '_' + prefix + 'DatasetHoverStyle' ] ( ) ; } } , eventHandler : function ( e ) { var me = this ; var tooltip = me . tooltip ; if ( core _plugins . notify ( me , 'beforeEvent' , [ e ] ) === false ) { return ; }
me . _bufferedRender = true ; me . _bufferedRequest = null ; var changed = me . handleEvent ( e ) ; if ( tooltip ) { changed = tooltip . _start ? tooltip . handleEvent ( e ) : changed | tooltip . handleEvent ( e ) ; }
core _plugins . notify ( me , 'afterEvent' , [ e ] ) ; var bufferedRequest = me . _bufferedRequest ; if ( bufferedRequest ) { me . render ( bufferedRequest ) ; } else if ( changed && ! me . animating ) { me . stop ( ) ; me . render ( { duration : me . options . hover . animationDuration , lazy : true } ) ; }
me . _bufferedRender = false ; me . _bufferedRequest = null ; return me ; } , handleEvent : function ( e ) { var me = this ; var options = me . options || { } ; var hoverOptions = options . hover ; var changed = false ; me . lastActive = me . lastActive || [ ] ; if ( e . type === 'mouseout' ) { me . active = [ ] ; } else { me . active = me . getElementsAtEventForMode ( e , hoverOptions . mode , hoverOptions ) ; }
helpers$1 . callback ( options . onHover || options . hover . onHover , [ e . native , me . active ] , me ) ; if ( e . type === 'mouseup' || e . type === 'click' ) { if ( options . onClick ) { options . onClick . call ( me , e . native , me . active ) ; } }
if ( me . lastActive . length ) { me . updateHoverStyle ( me . lastActive , hoverOptions . mode , false ) ; }
if ( me . active . length && hoverOptions . mode ) { me . updateHoverStyle ( me . active , hoverOptions . mode , true ) ; }
changed = ! helpers$1 . arrayEquals ( me . active , me . lastActive ) ; me . lastActive = me . active ; return changed ; } } ) ; Chart . instances = { } ; var core _controller = Chart ; Chart . Controller = Chart ; Chart . types = { } ; helpers$1 . configMerge = mergeConfig ; helpers$1 . scaleMerge = mergeScaleConfig ; var core _helpers = function ( ) { helpers$1 . where = function ( collection , filterCallback ) { if ( helpers$1 . isArray ( collection ) && Array . prototype . filter ) { return collection . filter ( filterCallback ) ; }
var filtered = [ ] ; helpers$1 . each ( collection , function ( item ) { if ( filterCallback ( item ) ) { filtered . push ( item ) ; } } ) ; return filtered ; } ; helpers$1 . findIndex = Array . prototype . findIndex ? function ( array , callback , scope ) { return array . findIndex ( callback , scope ) ; } : function ( array , callback , scope ) { scope = scope === undefined ? array : scope ; for ( var i = 0 , ilen = array . length ; i < ilen ; ++ i ) { if ( callback . call ( scope , array [ i ] , i , array ) ) { return i ; } }
return - 1 ; } ; helpers$1 . findNextWhere = function ( arrayToSearch , filterCallback , startIndex ) { if ( helpers$1 . isNullOrUndef ( startIndex ) ) { startIndex = - 1 ; }
for ( var i = startIndex + 1 ; i < arrayToSearch . length ; i ++ ) { var currentItem = arrayToSearch [ i ] ; if ( filterCallback ( currentItem ) ) { return currentItem ; } } } ; helpers$1 . findPreviousWhere = function ( arrayToSearch , filterCallback , startIndex ) { if ( helpers$1 . isNullOrUndef ( startIndex ) ) { startIndex = arrayToSearch . length ; }
for ( var i = startIndex - 1 ; i >= 0 ; i -- ) { var currentItem = arrayToSearch [ i ] ; if ( filterCallback ( currentItem ) ) { return currentItem ; } } } ; helpers$1 . isNumber = function ( n ) { return ! isNaN ( parseFloat ( n ) ) && isFinite ( n ) ; } ; helpers$1 . almostEquals = function ( x , y , epsilon ) { return Math . abs ( x - y ) < epsilon ; } ; helpers$1 . almostWhole = function ( x , epsilon ) { var rounded = Math . round ( x ) ; return ( ( rounded - epsilon ) <= x ) && ( ( rounded + epsilon ) >= x ) ; } ; helpers$1 . max = function ( array ) { return array . reduce ( function ( max , value ) { if ( ! isNaN ( value ) ) { return Math . max ( max , value ) ; }
return max ; } , Number . NEGATIVE _INFINITY ) ; } ; helpers$1 . min = function ( array ) { return array . reduce ( function ( min , value ) { if ( ! isNaN ( value ) ) { return Math . min ( min , value ) ; }
return min ; } , Number . POSITIVE _INFINITY ) ; } ; helpers$1 . sign = Math . sign ? function ( x ) { return Math . sign ( x ) ; } : function ( x ) { x = + x ; if ( x === 0 || isNaN ( x ) ) { return x ; }
return x > 0 ? 1 : - 1 ; } ; helpers$1 . toRadians = function ( degrees ) { return degrees * ( Math . PI / 180 ) ; } ; helpers$1 . toDegrees = function ( radians ) { return radians * ( 180 / Math . PI ) ; } ; helpers$1 . _decimalPlaces = function ( x ) { if ( ! helpers$1 . isFinite ( x ) ) { return ; }
var e = 1 ; var p = 0 ; while ( Math . round ( x * e ) / e !== x ) { e *= 10 ; p ++ ; }
return p ; } ; helpers$1 . getAngleFromPoint = function ( centrePoint , anglePoint ) { var distanceFromXCenter = anglePoint . x - centrePoint . x ; var distanceFromYCenter = anglePoint . y - centrePoint . y ; var radialDistanceFromCenter = Math . sqrt ( distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter ) ; var angle = Math . atan2 ( distanceFromYCenter , distanceFromXCenter ) ; if ( angle < ( - 0.5 * Math . PI ) ) { angle += 2.0 * Math . PI ; }
return { angle : angle , distance : radialDistanceFromCenter } ; } ; helpers$1 . distanceBetweenPoints = function ( pt1 , pt2 ) { return Math . sqrt ( Math . pow ( pt2 . x - pt1 . x , 2 ) + Math . pow ( pt2 . y - pt1 . y , 2 ) ) ; } ; helpers$1 . aliasPixel = function ( pixelWidth ) { return ( pixelWidth % 2 === 0 ) ? 0 : 0.5 ; } ; helpers$1 . _alignPixel = function ( chart , pixel , width ) { var devicePixelRatio = chart . currentDevicePixelRatio ; var halfWidth = width / 2 ; return Math . round ( ( pixel - halfWidth ) * devicePixelRatio ) / devicePixelRatio + halfWidth ; } ; helpers$1 . splineCurve = function ( firstPoint , middlePoint , afterPoint , t ) { var previous = firstPoint . skip ? middlePoint : firstPoint ; var current = middlePoint ; var next = afterPoint . skip ? middlePoint : afterPoint ; var d01 = Math . sqrt ( Math . pow ( current . x - previous . x , 2 ) + Math . pow ( current . y - previous . y , 2 ) ) ; var d12 = Math . sqrt ( Math . pow ( next . x - current . x , 2 ) + Math . pow ( next . y - current . y , 2 ) ) ; var s01 = d01 / ( d01 + d12 ) ; var s12 = d12 / ( d01 + d12 ) ; s01 = isNaN ( s01 ) ? 0 : s01 ; s12 = isNaN ( s12 ) ? 0 : s12 ; var fa = t * s01 ; var fb = t * s12 ; return { previous : { x : current . x - fa * ( next . x - previous . x ) , y : current . y - fa * ( next . y - previous . y ) } , next : { x : current . x + fb * ( next . x - previous . x ) , y : current . y + fb * ( next . y - previous . y ) } } ; } ; helpers$1 . EPSILON = Number . EPSILON || 1e-14 ; helpers$1 . splineCurveMonotone = function ( points ) { var pointsWithTangents = ( points || [ ] ) . map ( function ( point ) { return { model : point . _model , deltaK : 0 , mK : 0 } ; } ) ; var pointsLen = pointsWithTangents . length ; var i , pointBefore , pointCurrent , pointAfter ; for ( i = 0 ; i < pointsLen ; ++ i ) { pointCurrent = pointsWithTangents [ i ] ; if ( pointCurrent . model . skip ) { continue ; }
pointBefore = i > 0 ? pointsWithTangents [ i - 1 ] : null ; pointAfter = i < pointsLen - 1 ? pointsWithTangents [ i + 1 ] : null ; if ( pointAfter && ! pointAfter . model . skip ) { var slopeDeltaX = ( pointAfter . model . x - pointCurrent . model . x ) ; pointCurrent . deltaK = slopeDeltaX !== 0 ? ( pointAfter . model . y - pointCurrent . model . y ) / slopeDeltaX : 0 ; }
if ( ! pointBefore || pointBefore . model . skip ) { pointCurrent . mK = pointCurrent . deltaK ; } else if ( ! pointAfter || pointAfter . model . skip ) { pointCurrent . mK = pointBefore . deltaK ; } else if ( this . sign ( pointBefore . deltaK ) !== this . sign ( pointCurrent . deltaK ) ) { pointCurrent . mK = 0 ; } else { pointCurrent . mK = ( pointBefore . deltaK + pointCurrent . deltaK ) / 2 ; } }
var alphaK , betaK , tauK , squaredMagnitude ; for ( i = 0 ; i < pointsLen - 1 ; ++ i ) { pointCurrent = pointsWithTangents [ i ] ; pointAfter = pointsWithTangents [ i + 1 ] ; if ( pointCurrent . model . skip || pointAfter . model . skip ) { continue ; }
if ( helpers$1 . almostEquals ( pointCurrent . deltaK , 0 , this . EPSILON ) ) { pointCurrent . mK = pointAfter . mK = 0 ; continue ; }
alphaK = pointCurrent . mK / pointCurrent . deltaK ; betaK = pointAfter . mK / pointCurrent . deltaK ; squaredMagnitude = Math . pow ( alphaK , 2 ) + Math . pow ( betaK , 2 ) ; if ( squaredMagnitude <= 9 ) { continue ; }
tauK = 3 / Math . sqrt ( squaredMagnitude ) ; pointCurrent . mK = alphaK * tauK * pointCurrent . deltaK ; pointAfter . mK = betaK * tauK * pointCurrent . deltaK ; }
var deltaX ; for ( i = 0 ; i < pointsLen ; ++ i ) { pointCurrent = pointsWithTangents [ i ] ; if ( pointCurrent . model . skip ) { continue ; }
pointBefore = i > 0 ? pointsWithTangents [ i - 1 ] : null ; pointAfter = i < pointsLen - 1 ? pointsWithTangents [ i + 1 ] : null ; if ( pointBefore && ! pointBefore . model . skip ) { deltaX = ( pointCurrent . model . x - pointBefore . model . x ) / 3 ; pointCurrent . model . controlPointPreviousX = pointCurrent . model . x - deltaX ; pointCurrent . model . controlPointPreviousY = pointCurrent . model . y - deltaX * pointCurrent . mK ; }
if ( pointAfter && ! pointAfter . model . skip ) { deltaX = ( pointAfter . model . x - pointCurrent . model . x ) / 3 ; pointCurrent . model . controlPointNextX = pointCurrent . model . x + deltaX ; pointCurrent . model . controlPointNextY = pointCurrent . model . y + deltaX * pointCurrent . mK ; } } } ; helpers$1 . nextItem = function ( collection , index , loop ) { if ( loop ) { return index >= collection . length - 1 ? collection [ 0 ] : collection [ index + 1 ] ; }
return index >= collection . length - 1 ? collection [ collection . length - 1 ] : collection [ index + 1 ] ; } ; helpers$1 . previousItem = function ( collection , index , loop ) { if ( loop ) { return index <= 0 ? collection [ collection . length - 1 ] : collection [ index - 1 ] ; }
return index <= 0 ? collection [ 0 ] : collection [ index - 1 ] ; } ; helpers$1 . niceNum = function ( range , round ) { var exponent = Math . floor ( helpers$1 . log10 ( range ) ) ; var fraction = range / Math . pow ( 10 , exponent ) ; var niceFraction ; if ( round ) { if ( fraction < 1.5 ) { niceFraction = 1 ; } else if ( fraction < 3 ) { niceFraction = 2 ; } else if ( fraction < 7 ) { niceFraction = 5 ; } else { niceFraction = 10 ; } } else if ( fraction <= 1.0 ) { niceFraction = 1 ; } else if ( fraction <= 2 ) { niceFraction = 2 ; } else if ( fraction <= 5 ) { niceFraction = 5 ; } else { niceFraction = 10 ; }
return niceFraction * Math . pow ( 10 , exponent ) ; } ; helpers$1 . requestAnimFrame = ( function ( ) { if ( typeof window === 'undefined' ) { return function ( callback ) { callback ( ) ; } ; }
return window . requestAnimationFrame || window . webkitRequestAnimationFrame || window . mozRequestAnimationFrame || window . oRequestAnimationFrame || window . msRequestAnimationFrame || function ( callback ) { return window . setTimeout ( callback , 1000 / 60 ) ; } ; } ( ) ) ; helpers$1 . getRelativePosition = function ( evt , chart ) { var mouseX , mouseY ; var e = evt . originalEvent || evt ; var canvas = evt . target || evt . srcElement ; var boundingRect = canvas . getBoundingClientRect ( ) ; var touches = e . touches ; if ( touches && touches . length > 0 ) { mouseX = touches [ 0 ] . clientX ; mouseY = touches [ 0 ] . clientY ; } else { mouseX = e . clientX ; mouseY = e . clientY ; }
var paddingLeft = parseFloat ( helpers$1 . getStyle ( canvas , 'padding-left' ) ) ; var paddingTop = parseFloat ( helpers$1 . getStyle ( canvas , 'padding-top' ) ) ; var paddingRight = parseFloat ( helpers$1 . getStyle ( canvas , 'padding-right' ) ) ; var paddingBottom = parseFloat ( helpers$1 . getStyle ( canvas , 'padding-bottom' ) ) ; var width = boundingRect . right - boundingRect . left - paddingLeft - paddingRight ; var height = boundingRect . bottom - boundingRect . top - paddingTop - paddingBottom ; mouseX = Math . round ( ( mouseX - boundingRect . left - paddingLeft ) / ( width ) * canvas . width / chart . currentDevicePixelRatio ) ; mouseY = Math . round ( ( mouseY - boundingRect . top - paddingTop ) / ( height ) * canvas . height / chart . currentDevicePixelRatio ) ; return { x : mouseX , y : mouseY } ; } ; function parseMaxStyle ( styleValue , node , parentProperty ) { var valueInPixels ; if ( typeof styleValue === 'string' ) { valueInPixels = parseInt ( styleValue , 10 ) ; if ( styleValue . indexOf ( '%' ) !== - 1 ) { valueInPixels = valueInPixels / 100 * node . parentNode [ parentProperty ] ; } } else { valueInPixels = styleValue ; }
return valueInPixels ; }
function isConstrainedValue ( value ) { return value !== undefined && value !== null && value !== 'none' ; }
function getConstraintDimension ( domNode , maxStyle , percentageProperty ) { var view = document . defaultView ; var parentNode = helpers$1 . _getParentNode ( domNode ) ; var constrainedNode = view . getComputedStyle ( domNode ) [ maxStyle ] ; var constrainedContainer = view . getComputedStyle ( parentNode ) [ maxStyle ] ; var hasCNode = isConstrainedValue ( constrainedNode ) ; var hasCContainer = isConstrainedValue ( constrainedContainer ) ; var infinity = Number . POSITIVE _INFINITY ; if ( hasCNode || hasCContainer ) { return Math . min ( hasCNode ? parseMaxStyle ( constrainedNode , domNode , percentageProperty ) : infinity , hasCContainer ? parseMaxStyle ( constrainedContainer , parentNode , percentageProperty ) : infinity ) ; }
return 'none' ; }
helpers$1 . getConstraintWidth = function ( domNode ) { return getConstraintDimension ( domNode , 'max-width' , 'clientWidth' ) ; } ; helpers$1 . getConstraintHeight = function ( domNode ) { return getConstraintDimension ( domNode , 'max-height' , 'clientHeight' ) ; } ; helpers$1 . _calculatePadding = function ( container , padding , parentDimension ) { padding = helpers$1 . getStyle ( container , padding ) ; return padding . indexOf ( '%' ) > - 1 ? parentDimension * parseInt ( padding , 10 ) / 100 : parseInt ( padding , 10 ) ; } ; helpers$1 . _getParentNode = function ( domNode ) { var parent = domNode . parentNode ; if ( parent && parent . toString ( ) === '[object ShadowRoot]' ) { parent = parent . host ; }
return parent ; } ; helpers$1 . getMaximumWidth = function ( domNode ) { var container = helpers$1 . _getParentNode ( domNode ) ; if ( ! container ) { return domNode . clientWidth ; }
var clientWidth = container . clientWidth ; var paddingLeft = helpers$1 . _calculatePadding ( container , 'padding-left' , clientWidth ) ; var paddingRight = helpers$1 . _calculatePadding ( container , 'padding-right' , clientWidth ) ; var w = clientWidth - paddingLeft - paddingRight ; var cw = helpers$1 . getConstraintWidth ( domNode ) ; return isNaN ( cw ) ? w : Math . min ( w , cw ) ; } ; helpers$1 . getMaximumHeight = function ( domNode ) { var container = helpers$1 . _getParentNode ( domNode ) ; if ( ! container ) { return domNode . clientHeight ; }
var clientHeight = container . clientHeight ; var paddingTop = helpers$1 . _calculatePadding ( container , 'padding-top' , clientHeight ) ; var paddingBottom = helpers$1 . _calculatePadding ( container , 'padding-bottom' , clientHeight ) ; var h = clientHeight - paddingTop - paddingBottom ; var ch = helpers$1 . getConstraintHeight ( domNode ) ; return isNaN ( ch ) ? h : Math . min ( h , ch ) ; } ; helpers$1 . getStyle = function ( el , property ) { return el . currentStyle ? el . currentStyle [ property ] : document . defaultView . getComputedStyle ( el , null ) . getPropertyValue ( property ) ; } ; helpers$1 . retinaScale = function ( chart , forceRatio ) { var pixelRatio = chart . currentDevicePixelRatio = forceRatio || ( typeof window !== 'undefined' && window . devicePixelRatio ) || 1 ; if ( pixelRatio === 1 ) { return ; }
var canvas = chart . canvas ; var height = chart . height ; var width = chart . width ; canvas . height = height * pixelRatio ; canvas . width = width * pixelRatio ; chart . ctx . scale ( pixelRatio , pixelRatio ) ; if ( ! canvas . style . height && ! canvas . style . width ) { canvas . style . height = height + 'px' ; canvas . style . width = width + 'px' ; } } ; helpers$1 . fontString = function ( pixelSize , fontStyle , fontFamily ) { return fontStyle + ' ' + pixelSize + 'px ' + fontFamily ; } ; helpers$1 . longestText = function ( ctx , font , arrayOfThings , cache ) { cache = cache || { } ; var data = cache . data = cache . data || { } ; var gc = cache . garbageCollect = cache . garbageCollect || [ ] ; if ( cache . font !== font ) { data = cache . data = { } ; gc = cache . garbageCollect = [ ] ; cache . font = font ; }
ctx . font = font ; var longest = 0 ; var ilen = arrayOfThings . length ; var i , j , jlen , thing , nestedThing ; for ( i = 0 ; i < ilen ; i ++ ) { thing = arrayOfThings [ i ] ; if ( thing !== undefined && thing !== null && helpers$1 . isArray ( thing ) !== true ) { longest = helpers$1 . measureText ( ctx , data , gc , longest , thing ) ; } else if ( helpers$1 . isArray ( thing ) ) { for ( j = 0 , jlen = thing . length ; j < jlen ; j ++ ) { nestedThing = thing [ j ] ; if ( nestedThing !== undefined && nestedThing !== null && ! helpers$1 . isArray ( nestedThing ) ) { longest = helpers$1 . measureText ( ctx , data , gc , longest , nestedThing ) ; } } } }
var gcLen = gc . length / 2 ; if ( gcLen > arrayOfThings . length ) { for ( i = 0 ; i < gcLen ; i ++ ) { delete data [ gc [ i ] ] ; }
gc . splice ( 0 , gcLen ) ; }
return longest ; } ; helpers$1 . measureText = function ( ctx , data , gc , longest , string ) { var textWidth = data [ string ] ; if ( ! textWidth ) { textWidth = data [ string ] = ctx . measureText ( string ) . width ; gc . push ( string ) ; }
if ( textWidth > longest ) { longest = textWidth ; }
return longest ; } ; helpers$1 . numberOfLabelLines = function ( arrayOfThings ) { var numberOfLines = 1 ; helpers$1 . each ( arrayOfThings , function ( thing ) { if ( helpers$1 . isArray ( thing ) ) { if ( thing . length > numberOfLines ) { numberOfLines = thing . length ; } } } ) ; return numberOfLines ; } ; helpers$1 . color = ! chartjsColor ? function ( value ) { console . error ( 'Color.js not found!' ) ; return value ; } : function ( value ) { if ( value instanceof CanvasGradient ) { value = core _defaults . global . defaultColor ; }
return chartjsColor ( value ) ; } ; helpers$1 . getHoverColor = function ( colorValue ) { return ( colorValue instanceof CanvasPattern || colorValue instanceof CanvasGradient ) ? colorValue : helpers$1 . color ( colorValue ) . saturate ( 0.5 ) . darken ( 0.1 ) . rgbString ( ) ; } ; } ; function abstract ( ) { throw new Error ( 'This method is not implemented: either no adapter can ' + 'be found or an incomplete integration was provided.' ) ; }
function DateAdapter ( options ) { this . options = options || { } ; }
helpers$1 . extend ( DateAdapter . prototype , { formats : abstract , parse : abstract , format : abstract , add : abstract , diff : abstract , startOf : abstract , endOf : abstract , _create : function ( value ) { return value ; } } ) ; DateAdapter . override = function ( members ) { helpers$1 . extend ( DateAdapter . prototype , members ) ; } ; var _date = DateAdapter ; var core _adapters = { _date : _date } ; var core _ticks = { formatters : { values : function ( value ) { return helpers$1 . isArray ( value ) ? value : '' + value ; } , linear : function ( tickValue , index , ticks ) { var delta = ticks . length > 3 ? ticks [ 2 ] - ticks [ 1 ] : ticks [ 1 ] - ticks [ 0 ] ; if ( Math . abs ( delta ) > 1 ) { if ( tickValue !== Math . floor ( tickValue ) ) { delta = tickValue - Math . floor ( tickValue ) ; } }
var logDelta = helpers$1 . log10 ( Math . abs ( delta ) ) ; var tickString = '' ; if ( tickValue !== 0 ) { var maxTick = Math . max ( Math . abs ( ticks [ 0 ] ) , Math . abs ( ticks [ ticks . length - 1 ] ) ) ; if ( maxTick < 1e-4 ) { var logTick = helpers$1 . log10 ( Math . abs ( tickValue ) ) ; var numExponential = Math . floor ( logTick ) - Math . floor ( logDelta ) ; numExponential = Math . max ( Math . min ( numExponential , 20 ) , 0 ) ; tickString = tickValue . toExponential ( numExponential ) ; } else { var numDecimal = - 1 * Math . floor ( logDelta ) ; numDecimal = Math . max ( Math . min ( numDecimal , 20 ) , 0 ) ; tickString = tickValue . toFixed ( numDecimal ) ; } } else { tickString = '0' ; }
return tickString ; } , logarithmic : function ( tickValue , index , ticks ) { var remain = tickValue / ( Math . pow ( 10 , Math . floor ( helpers$1 . log10 ( tickValue ) ) ) ) ; if ( tickValue === 0 ) { return '0' ; } else if ( remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks . length - 1 ) { return tickValue . toExponential ( ) ; }
return '' ; } } } ; var isArray = helpers$1 . isArray ; var isNullOrUndef = helpers$1 . isNullOrUndef ; var valueOrDefault$a = helpers$1 . valueOrDefault ; var valueAtIndexOrDefault = helpers$1 . valueAtIndexOrDefault ; core _defaults . _set ( 'scale' , { display : true , position : 'left' , offset : false , gridLines : { display : true , color : 'rgba(0,0,0,0.1)' , lineWidth : 1 , drawBorder : true , drawOnChartArea : true , drawTicks : true , tickMarkLength : 10 , zeroLineWidth : 1 , zeroLineColor : 'rgba(0,0,0,0.25)' , zeroLineBorderDash : [ ] , zeroLineBorderDashOffset : 0.0 , offsetGridLines : false , borderDash : [ ] , borderDashOffset : 0.0 } , scaleLabel : { display : false , labelString : '' , padding : { top : 4 , bottom : 4 } } , ticks : { beginAtZero : false , minRotation : 0 , maxRotation : 50 , mirror : false , padding : 0 , reverse : false , display : true , autoSkip : true , autoSkipPadding : 0 , labelOffset : 0 , callback : core _ticks . formatters . values , minor : { } , major : { } } } ) ; function sample ( arr , numItems ) { var result = [ ] ; var increment = arr . length / numItems ; var i = 0 ; var len = arr . length ; for ( ; i < len ; i += increment ) { result . push ( arr [ Math . floor ( i ) ] ) ; }
return result ; }
function getPixelForGridLine ( scale , index , offsetGridLines ) { var length = scale . getTicks ( ) . length ; var validIndex = Math . min ( index , length - 1 ) ; var lineValue = scale . getPixelForTick ( validIndex ) ; var start = scale . _startPixel ; var end = scale . _endPixel ; var epsilon = 1e-6 ; var offset ; if ( offsetGridLines ) { if ( length === 1 ) { offset = Math . max ( lineValue - start , end - lineValue ) ; } else if ( index === 0 ) { offset = ( scale . getPixelForTick ( 1 ) - lineValue ) / 2 ; } else { offset = ( lineValue - scale . getPixelForTick ( validIndex - 1 ) ) / 2 ; }
lineValue += validIndex < index ? offset : - offset ; if ( lineValue < start - epsilon || lineValue > end + epsilon ) { return ; } }
return lineValue ; }
function garbageCollect ( caches , length ) { helpers$1 . each ( caches , function ( cache ) { var gc = cache . gc ; var gcLen = gc . length / 2 ; var i ; if ( gcLen > length ) { for ( i = 0 ; i < gcLen ; ++ i ) { delete cache . data [ gc [ i ] ] ; }
gc . splice ( 0 , gcLen ) ; } } ) ; }
function computeLabelSizes ( ctx , tickFonts , ticks , caches ) { var length = ticks . length ; var widths = [ ] ; var heights = [ ] ; var offsets = [ ] ; var i , j , jlen , label , tickFont , fontString , cache , lineHeight , width , height , nestedLabel , widest , highest ; for ( i = 0 ; i < length ; ++ i ) { label = ticks [ i ] . label ; tickFont = ticks [ i ] . major ? tickFonts . major : tickFonts . minor ; ctx . font = fontString = tickFont . string ; cache = caches [ fontString ] = caches [ fontString ] || { data : { } , gc : [ ] } ; lineHeight = tickFont . lineHeight ; width = height = 0 ; if ( ! isNullOrUndef ( label ) && ! isArray ( label ) ) { width = helpers$1 . measureText ( ctx , cache . data , cache . gc , width , label ) ; height = lineHeight ; } else if ( isArray ( label ) ) { for ( j = 0 , jlen = label . length ; j < jlen ; ++ j ) { nestedLabel = label [ j ] ; if ( ! isNullOrUndef ( nestedLabel ) && ! isArray ( nestedLabel ) ) { width = helpers$1 . measureText ( ctx , cache . data , cache . gc , width , nestedLabel ) ; height += lineHeight ; } } }
widths . push ( width ) ; heights . push ( height ) ; offsets . push ( lineHeight / 2 ) ; }
garbageCollect ( caches , length ) ; widest = widths . indexOf ( Math . max . apply ( null , widths ) ) ; highest = heights . indexOf ( Math . max . apply ( null , heights ) ) ; function valueAt ( idx ) { return { width : widths [ idx ] || 0 , height : heights [ idx ] || 0 , offset : offsets [ idx ] || 0 } ; }
return { first : valueAt ( 0 ) , last : valueAt ( length - 1 ) , widest : valueAt ( widest ) , highest : valueAt ( highest ) } ; }
function getTickMarkLength ( options ) { return options . drawTicks ? options . tickMarkLength : 0 ; }
function getScaleLabelHeight ( options ) { var font , padding ; if ( ! options . display ) { return 0 ; }
font = helpers$1 . options . _parseFont ( options ) ; padding = helpers$1 . options . toPadding ( options . padding ) ; return font . lineHeight + padding . height ; }
function parseFontOptions ( options , nestedOpts ) { return helpers$1 . extend ( helpers$1 . options . _parseFont ( { fontFamily : valueOrDefault$a ( nestedOpts . fontFamily , options . fontFamily ) , fontSize : valueOrDefault$a ( nestedOpts . fontSize , options . fontSize ) , fontStyle : valueOrDefault$a ( nestedOpts . fontStyle , options . fontStyle ) , lineHeight : valueOrDefault$a ( nestedOpts . lineHeight , options . lineHeight ) } ) , { color : helpers$1 . options . resolve ( [ nestedOpts . fontColor , options . fontColor , core _defaults . global . defaultFontColor ] ) } ) ; }
function parseTickFontOptions ( options ) { var minor = parseFontOptions ( options , options . minor ) ; var major = options . major . enabled ? parseFontOptions ( options , options . major ) : minor ; return { minor : minor , major : major } ; }
function nonSkipped ( ticksToFilter ) { var filtered = [ ] ; var item , index , len ; for ( index = 0 , len = ticksToFilter . length ; index < len ; ++ index ) { item = ticksToFilter [ index ] ; if ( typeof item . _index !== 'undefined' ) { filtered . push ( item ) ; } }
return filtered ; }
function getEvenSpacing ( arr ) { var len = arr . length ; var i , diff ; if ( len < 2 ) { return false ; }
for ( diff = arr [ 0 ] , i = 1 ; i < len ; ++ i ) { if ( arr [ i ] - arr [ i - 1 ] !== diff ) { return false ; } }
return diff ; }
function calculateSpacing ( majorIndices , ticks , axisLength , ticksLimit ) { var evenMajorSpacing = getEvenSpacing ( majorIndices ) ; var spacing = ( ticks . length - 1 ) / ticksLimit ; var factors , factor , i , ilen ; if ( ! evenMajorSpacing ) { return Math . max ( spacing , 1 ) ; }
factors = helpers$1 . math . _factorize ( evenMajorSpacing ) ; for ( i = 0 , ilen = factors . length - 1 ; i < ilen ; i ++ ) { factor = factors [ i ] ; if ( factor > spacing ) { return factor ; } }
return Math . max ( spacing , 1 ) ; }
function getMajorIndices ( ticks ) { var result = [ ] ; var i , ilen ; for ( i = 0 , ilen = ticks . length ; i < ilen ; i ++ ) { if ( ticks [ i ] . major ) { result . push ( i ) ; } }
return result ; }
function skipMajors ( ticks , majorIndices , spacing ) { var count = 0 ; var next = majorIndices [ 0 ] ; var i , tick ; spacing = Math . ceil ( spacing ) ; for ( i = 0 ; i < ticks . length ; i ++ ) { tick = ticks [ i ] ; if ( i === next ) { tick . _index = i ; count ++ ; next = majorIndices [ count * spacing ] ; } else { delete tick . label ; } } }
function skip ( ticks , spacing , majorStart , majorEnd ) { var start = valueOrDefault$a ( majorStart , 0 ) ; var end = Math . min ( valueOrDefault$a ( majorEnd , ticks . length ) , ticks . length ) ; var count = 0 ; var length , i , tick , next ; spacing = Math . ceil ( spacing ) ; if ( majorEnd ) { length = majorEnd - majorStart ; spacing = length / Math . floor ( length / spacing ) ; }
next = start ; while ( next < 0 ) { count ++ ; next = Math . round ( start + count * spacing ) ; }
for ( i = Math . max ( start , 0 ) ; i < end ; i ++ ) { tick = ticks [ i ] ; if ( i === next ) { tick . _index = i ; count ++ ; next = Math . round ( start + count * spacing ) ; } else { delete tick . label ; } } }
var Scale = core _element . extend ( { zeroLineIndex : 0 , getPadding : function ( ) { var me = this ; return { left : me . paddingLeft || 0 , top : me . paddingTop || 0 , right : me . paddingRight || 0 , bottom : me . paddingBottom || 0 } ; } , getTicks : function ( ) { return this . _ticks ; } , _getLabels : function ( ) { var data = this . chart . data ; return this . options . labels || ( this . isHorizontal ( ) ? data . xLabels : data . yLabels ) || data . labels || [ ] ; } , mergeTicksOptions : function ( ) { } , beforeUpdate : function ( ) { helpers$1 . callback ( this . options . beforeUpdate , [ this ] ) ; } , update : function ( maxWidth , maxHeight , margins ) { var me = this ; var tickOpts = me . options . ticks ; var sampleSize = tickOpts . sampleSize ; var i , ilen , labels , ticks , samplingEnabled ; me . beforeUpdate ( ) ; me . maxWidth = maxWidth ; me . maxHeight = maxHeight ; me . margins = helpers$1 . extend ( { left : 0 , right : 0 , top : 0 , bottom : 0 } , margins ) ; me . _ticks = null ; me . ticks = null ; me . _labelSizes = null ; me . _maxLabelLines = 0 ; me . longestLabelWidth = 0 ; me . longestTextCache = me . longestTextCache || { } ; me . _gridLineItems = null ; me . _labelItems = null ; me . beforeSetDimensions ( ) ; me . setDimensions ( ) ; me . afterSetDimensions ( ) ; me . beforeDataLimits ( ) ; me . determineDataLimits ( ) ; me . afterDataLimits ( ) ; me . beforeBuildTicks ( ) ; ticks = me . buildTicks ( ) || [ ] ; ticks = me . afterBuildTicks ( ticks ) || ticks ; if ( ( ! ticks || ! ticks . length ) && me . ticks ) { ticks = [ ] ; for ( i = 0 , ilen = me . ticks . length ; i < ilen ; ++ i ) { ticks . push ( { value : me . ticks [ i ] , major : false } ) ; } }
me . _ticks = ticks ; samplingEnabled = sampleSize < ticks . length ; labels = me . _convertTicksToLabels ( samplingEnabled ? sample ( ticks , sampleSize ) : ticks ) ; me . _configure ( ) ; me . beforeCalculateTickRotation ( ) ; me . calculateTickRotation ( ) ; me . afterCalculateTickRotation ( ) ; me . beforeFit ( ) ; me . fit ( ) ; me . afterFit ( ) ; me . _ticksToDraw = tickOpts . display && ( tickOpts . autoSkip || tickOpts . source === 'auto' ) ? me . _autoSkip ( ticks ) : ticks ; if ( samplingEnabled ) { labels = me . _convertTicksToLabels ( me . _ticksToDraw ) ; }
me . ticks = labels ; me . afterUpdate ( ) ; return me . minSize ; } , _configure : function ( ) { var me = this ; var reversePixels = me . options . ticks . reverse ; var startPixel , endPixel ; if ( me . isHorizontal ( ) ) { startPixel = me . left ; endPixel = me . right ; } else { startPixel = me . top ; endPixel = me . bottom ; reversePixels = ! reversePixels ; }
me . _startPixel = startPixel ; me . _endPixel = endPixel ; me . _reversePixels = reversePixels ; me . _length = endPixel - startPixel ; } , afterUpdate : function ( ) { helpers$1 . callback ( this . options . afterUpdate , [ this ] ) ; } , beforeSetDimensions : function ( ) { helpers$1 . callback ( this . options . beforeSetDimensions , [ this ] ) ; } , setDimensions : function ( ) { var me = this ; if ( me . isHorizontal ( ) ) { me . width = me . maxWidth ; me . left = 0 ; me . right = me . width ; } else { me . height = me . maxHeight ; me . top = 0 ; me . bottom = me . height ; }
me . paddingLeft = 0 ; me . paddingTop = 0 ; me . paddingRight = 0 ; me . paddingBottom = 0 ; } , afterSetDimensions : function ( ) { helpers$1 . callback ( this . options . afterSetDimensions , [ this ] ) ; } , beforeDataLimits : function ( ) { helpers$1 . callback ( this . options . beforeDataLimits , [ this ] ) ; } , determineDataLimits : helpers$1 . noop , afterDataLimits : function ( ) { helpers$1 . callback ( this . options . afterDataLimits , [ this ] ) ; } , beforeBuildTicks : function ( ) { helpers$1 . callback ( this . options . beforeBuildTicks , [ this ] ) ; } , buildTicks : helpers$1 . noop , afterBuildTicks : function ( ticks ) { var me = this ; if ( isArray ( ticks ) && ticks . length ) { return helpers$1 . callback ( me . options . afterBuildTicks , [ me , ticks ] ) ; }
me . ticks = helpers$1 . callback ( me . options . afterBuildTicks , [ me , me . ticks ] ) || me . ticks ; return ticks ; } , beforeTickToLabelConversion : function ( ) { helpers$1 . callback ( this . options . beforeTickToLabelConversion , [ this ] ) ; } , convertTicksToLabels : function ( ) { var me = this ; var tickOpts = me . options . ticks ; me . ticks = me . ticks . map ( tickOpts . userCallback || tickOpts . callback , this ) ; } , afterTickToLabelConversion : function ( ) { helpers$1 . callback ( this . options . afterTickToLabelConversion , [ this ] ) ; } , beforeCalculateTickRotation : function ( ) { helpers$1 . callback ( this . options . beforeCalculateTickRotation , [ this ] ) ; } , calculateTickRotation : function ( ) { var me = this ; var options = me . options ; var tickOpts = options . ticks ; var numTicks = me . getTicks ( ) . length ; var minRotation = tickOpts . minRotation || 0 ; var maxRotation = tickOpts . maxRotation ; var labelRotation = minRotation ; var labelSizes , maxLabelWidth , maxLabelHeight , maxWidth , tickWidth , maxHeight , maxLabelDiagonal ; if ( ! me . _isVisible ( ) || ! tickOpts . display || minRotation >= maxRotation || numTicks <= 1 || ! me . isHorizontal ( ) ) { me . labelRotation = minRotation ; return ; }
labelSizes = me . _getLabelSizes ( ) ; maxLabelWidth = labelSizes . widest . width ; maxLabelHeight = labelSizes . highest . height - labelSizes . highest . offset ; maxWidth = Math . min ( me . maxWidth , me . chart . width - maxLabelWidth ) ; tickWidth = options . offset ? me . maxWidth / numTicks : maxWidth / ( numTicks - 1 ) ; if ( maxLabelWidth + 6 > tickWidth ) { tickWidth = maxWidth / ( numTicks - ( options . offset ? 0.5 : 1 ) ) ; maxHeight = me . maxHeight - getTickMarkLength ( options . gridLines )
- tickOpts . padding - getScaleLabelHeight ( options . scaleLabel ) ; maxLabelDiagonal = Math . sqrt ( maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight ) ; labelRotation = helpers$1 . toDegrees ( Math . min ( Math . asin ( Math . min ( ( labelSizes . highest . height + 6 ) / tickWidth , 1 ) ) , Math . asin ( Math . min ( maxHeight / maxLabelDiagonal , 1 ) ) - Math . asin ( maxLabelHeight / maxLabelDiagonal ) ) ) ; labelRotation = Math . max ( minRotation , Math . min ( maxRotation , labelRotation ) ) ; }
me . labelRotation = labelRotation ; } , afterCalculateTickRotation : function ( ) { helpers$1 . callback ( this . options . afterCalculateTickRotation , [ this ] ) ; } , beforeFit : function ( ) { helpers$1 . callback ( this . options . beforeFit , [ this ] ) ; } , fit : function ( ) { var me = this ; var minSize = me . minSize = { width : 0 , height : 0 } ; var chart = me . chart ; var opts = me . options ; var tickOpts = opts . ticks ; var scaleLabelOpts = opts . scaleLabel ; var gridLineOpts = opts . gridLines ; var display = me . _isVisible ( ) ; var isBottom = opts . position === 'bottom' ; var isHorizontal = me . isHorizontal ( ) ; if ( isHorizontal ) { minSize . width = me . maxWidth ; } else if ( display ) { minSize . width = getTickMarkLength ( gridLineOpts ) + getScaleLabelHeight ( scaleLabelOpts ) ; }
if ( ! isHorizontal ) { minSize . height = me . maxHeight ; } else if ( display ) { minSize . height = getTickMarkLength ( gridLineOpts ) + getScaleLabelHeight ( scaleLabelOpts ) ; }
if ( tickOpts . display && display ) { var tickFonts = parseTickFontOptions ( tickOpts ) ; var labelSizes = me . _getLabelSizes ( ) ; var firstLabelSize = labelSizes . first ; var lastLabelSize = labelSizes . last ; var widestLabelSize = labelSizes . widest ; var highestLabelSize = labelSizes . highest ; var lineSpace = tickFonts . minor . lineHeight * 0.4 ; var tickPadding = tickOpts . padding ; if ( isHorizontal ) { var isRotated = me . labelRotation !== 0 ; var angleRadians = helpers$1 . toRadians ( me . labelRotation ) ; var cosRotation = Math . cos ( angleRadians ) ; var sinRotation = Math . sin ( angleRadians ) ; var labelHeight = sinRotation * widestLabelSize . width
+ cosRotation * ( highestLabelSize . height - ( isRotated ? highestLabelSize . offset : 0 ) )
+ ( isRotated ? 0 : lineSpace ) ; minSize . height = Math . min ( me . maxHeight , minSize . height + labelHeight + tickPadding ) ; var offsetLeft = me . getPixelForTick ( 0 ) - me . left ; var offsetRight = me . right - me . getPixelForTick ( me . getTicks ( ) . length - 1 ) ; var paddingLeft , paddingRight ; if ( isRotated ) { paddingLeft = isBottom ? cosRotation * firstLabelSize . width + sinRotation * firstLabelSize . offset : sinRotation * ( firstLabelSize . height - firstLabelSize . offset ) ; paddingRight = isBottom ? sinRotation * ( lastLabelSize . height - lastLabelSize . offset ) : cosRotation * lastLabelSize . width + sinRotation * lastLabelSize . offset ; } else { paddingLeft = firstLabelSize . width / 2 ; paddingRight = lastLabelSize . width / 2 ; }
me . paddingLeft = Math . max ( ( paddingLeft - offsetLeft ) * me . width / ( me . width - offsetLeft ) , 0 ) + 3 ; me . paddingRight = Math . max ( ( paddingRight - offsetRight ) * me . width / ( me . width - offsetRight ) , 0 ) + 3 ; } else { var labelWidth = tickOpts . mirror ? 0 : widestLabelSize . width + tickPadding + lineSpace ; minSize . width = Math . min ( me . maxWidth , minSize . width + labelWidth ) ; me . paddingTop = firstLabelSize . height / 2 ; me . paddingBottom = lastLabelSize . height / 2 ; } }
me . handleMargins ( ) ; if ( isHorizontal ) { me . width = me . _length = chart . width - me . margins . left - me . margins . right ; me . height = minSize . height ; } else { me . width = minSize . width ; me . height = me . _length = chart . height - me . margins . top - me . margins . bottom ; } } , handleMargins : function ( ) { var me = this ; if ( me . margins ) { me . margins . left = Math . max ( me . paddingLeft , me . margins . left ) ; me . margins . top = Math . max ( me . paddingTop , me . margins . top ) ; me . margins . right = Math . max ( me . paddingRight , me . margins . right ) ; me . margins . bottom = Math . max ( me . paddingBottom , me . margins . bottom ) ; } } , afterFit : function ( ) { helpers$1 . callback ( this . options . afterFit , [ this ] ) ; } , isHorizontal : function ( ) { var pos = this . options . position ; return pos === 'top' || pos === 'bottom' ; } , isFullWidth : function ( ) { return this . options . fullWidth ; } , getRightValue : function ( rawValue ) { if ( isNullOrUndef ( rawValue ) ) { return NaN ; }
if ( ( typeof rawValue === 'number' || rawValue instanceof Number ) && ! isFinite ( rawValue ) ) { return NaN ; }
if ( rawValue ) { if ( this . isHorizontal ( ) ) { if ( rawValue . x !== undefined ) { return this . getRightValue ( rawValue . x ) ; } } else if ( rawValue . y !== undefined ) { return this . getRightValue ( rawValue . y ) ; } }
return rawValue ; } , _convertTicksToLabels : function ( ticks ) { var me = this ; var labels , i , ilen ; me . ticks = ticks . map ( function ( tick ) { return tick . value ; } ) ; me . beforeTickToLabelConversion ( ) ; labels = me . convertTicksToLabels ( ticks ) || me . ticks ; me . afterTickToLabelConversion ( ) ; for ( i = 0 , ilen = ticks . length ; i < ilen ; ++ i ) { ticks [ i ] . label = labels [ i ] ; }
return labels ; } , _getLabelSizes : function ( ) { var me = this ; var labelSizes = me . _labelSizes ; if ( ! labelSizes ) { me . _labelSizes = labelSizes = computeLabelSizes ( me . ctx , parseTickFontOptions ( me . options . ticks ) , me . getTicks ( ) , me . longestTextCache ) ; me . longestLabelWidth = labelSizes . widest . width ; }
return labelSizes ; } , _parseValue : function ( value ) { var start , end , min , max ; if ( isArray ( value ) ) { start = + this . getRightValue ( value [ 0 ] ) ; end = + this . getRightValue ( value [ 1 ] ) ; min = Math . min ( start , end ) ; max = Math . max ( start , end ) ; } else { value = + this . getRightValue ( value ) ; start = undefined ; end = value ; min = value ; max = value ; }
return { min : min , max : max , start : start , end : end } ; } , _getScaleLabel : function ( rawValue ) { var v = this . _parseValue ( rawValue ) ; if ( v . start !== undefined ) { return '[' + v . start + ', ' + v . end + ']' ; }
return + this . getRightValue ( rawValue ) ; } , getLabelForIndex : helpers$1 . noop , getPixelForValue : helpers$1 . noop , getValueForPixel : helpers$1 . noop , getPixelForTick : function ( index ) { var me = this ; var offset = me . options . offset ; var numTicks = me . _ticks . length ; var tickWidth = 1 / Math . max ( numTicks - ( offset ? 0 : 1 ) , 1 ) ; return index < 0 || index > numTicks - 1 ? null : me . getPixelForDecimal ( index * tickWidth + ( offset ? tickWidth / 2 : 0 ) ) ; } , getPixelForDecimal : function ( decimal ) { var me = this ; if ( me . _reversePixels ) { decimal = 1 - decimal ; }
return me . _startPixel + decimal * me . _length ; } , getDecimalForPixel : function ( pixel ) { var decimal = ( pixel - this . _startPixel ) / this . _length ; return this . _reversePixels ? 1 - decimal : decimal ; } , getBasePixel : function ( ) { return this . getPixelForValue ( this . getBaseValue ( ) ) ; } , getBaseValue : function ( ) { var me = this ; var min = me . min ; var max = me . max ; return me . beginAtZero ? 0 : min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0 ; } , _autoSkip : function ( ticks ) { var me = this ; var tickOpts = me . options . ticks ; var axisLength = me . _length ; var ticksLimit = tickOpts . maxTicksLimit || axisLength / me . _tickSize ( ) + 1 ; var majorIndices = tickOpts . major . enabled ? getMajorIndices ( ticks ) : [ ] ; var numMajorIndices = majorIndices . length ; var first = majorIndices [ 0 ] ; var last = majorIndices [ numMajorIndices - 1 ] ; var i , ilen , spacing , avgMajorSpacing ; if ( numMajorIndices > ticksLimit ) { skipMajors ( ticks , majorIndices , numMajorIndices / ticksLimit ) ; return nonSkipped ( ticks ) ; }
spacing = calculateSpacing ( majorIndices , ticks , axisLength , ticksLimit ) ; if ( numMajorIndices > 0 ) { for ( i = 0 , ilen = numMajorIndices - 1 ; i < ilen ; i ++ ) { skip ( ticks , spacing , majorIndices [ i ] , majorIndices [ i + 1 ] ) ; }
avgMajorSpacing = numMajorIndices > 1 ? ( last - first ) / ( numMajorIndices - 1 ) : null ; skip ( ticks , spacing , helpers$1 . isNullOrUndef ( avgMajorSpacing ) ? 0 : first - avgMajorSpacing , first ) ; skip ( ticks , spacing , last , helpers$1 . isNullOrUndef ( avgMajorSpacing ) ? ticks . length : last + avgMajorSpacing ) ; return nonSkipped ( ticks ) ; }
skip ( ticks , spacing ) ; return nonSkipped ( ticks ) ; } , _tickSize : function ( ) { var me = this ; var optionTicks = me . options . ticks ; var rot = helpers$1 . toRadians ( me . labelRotation ) ; var cos = Math . abs ( Math . cos ( rot ) ) ; var sin = Math . abs ( Math . sin ( rot ) ) ; var labelSizes = me . _getLabelSizes ( ) ; var padding = optionTicks . autoSkipPadding || 0 ; var w = labelSizes ? labelSizes . widest . width + padding : 0 ; var h = labelSizes ? labelSizes . highest . height + padding : 0 ; return me . isHorizontal ( ) ? h * cos > w * sin ? w / cos : h / sin : h * sin < w * cos ? h / cos : w / sin ; } , _isVisible : function ( ) { var me = this ; var chart = me . chart ; var display = me . options . display ; var i , ilen , meta ; if ( display !== 'auto' ) { return ! ! display ; }
for ( i = 0 , ilen = chart . data . datasets . length ; i < ilen ; ++ i ) { if ( chart . isDatasetVisible ( i ) ) { meta = chart . getDatasetMeta ( i ) ; if ( meta . xAxisID === me . id || meta . yAxisID === me . id ) { return true ; } } }
return false ; } , _computeGridLineItems : function ( chartArea ) { var me = this ; var chart = me . chart ; var options = me . options ; var gridLines = options . gridLines ; var position = options . position ; var offsetGridLines = gridLines . offsetGridLines ; var isHorizontal = me . isHorizontal ( ) ; var ticks = me . _ticksToDraw ; var ticksLength = ticks . length + ( offsetGridLines ? 1 : 0 ) ; var tl = getTickMarkLength ( gridLines ) ; var items = [ ] ; var axisWidth = gridLines . drawBorder ? valueAtIndexOrDefault ( gridLines . lineWidth , 0 , 0 ) : 0 ; var axisHalfWidth = axisWidth / 2 ; var alignPixel = helpers$1 . _alignPixel ; var alignBorderValue = function ( pixel ) { return alignPixel ( chart , pixel , axisWidth ) ; } ; var borderValue , i , tick , lineValue , alignedLineValue ; var tx1 , ty1 , tx2 , ty2 , x1 , y1 , x2 , y2 , lineWidth , lineColor , borderDash , borderDashOffset ; if ( position === 'top' ) { borderValue = alignBorderValue ( me . bottom ) ; ty1 = me . bottom - tl ; ty2 = borderValue - axisHalfWidth ; y1 = alignBorderValue ( chartArea . top ) + axisHalfWidth ; y2 = chartArea . bottom ; } else if ( position === 'bottom' ) { borderValue = alignBorderValue ( me . top ) ; y1 = chartArea . top ; y2 = alignBorderValue ( chartArea . bottom ) - axisHalfWidth ; ty1 = borderValue + axisHalfWidth ; ty2 = me . top + tl ; } else if ( position === 'left' ) { borderValue = alignBorderValue ( me . right ) ; tx1 = me . right - tl ; tx2 = borderValue - axisHalfWidth ; x1 = alignBorderValue ( chartArea . left ) + axisHalfWidth ; x2 = chartArea . right ; } else { borderValue = alignBorderValue ( me . left ) ; x1 = chartArea . left ; x2 = alignBorderValue ( chartArea . right ) - axisHalfWidth ; tx1 = borderValue + axisHalfWidth ; tx2 = me . left + tl ; }
for ( i = 0 ; i < ticksLength ; ++ i ) { tick = ticks [ i ] || { } ; if ( isNullOrUndef ( tick . label ) && i < ticks . length ) { continue ; }
if ( i === me . zeroLineIndex && options . offset === offsetGridLines ) { lineWidth = gridLines . zeroLineWidth ; lineColor = gridLines . zeroLineColor ; borderDash = gridLines . zeroLineBorderDash || [ ] ; borderDashOffset = gridLines . zeroLineBorderDashOffset || 0.0 ; } else { lineWidth = valueAtIndexOrDefault ( gridLines . lineWidth , i , 1 ) ; lineColor = valueAtIndexOrDefault ( gridLines . color , i , 'rgba(0,0,0,0.1)' ) ; borderDash = gridLines . borderDash || [ ] ; borderDashOffset = gridLines . borderDashOffset || 0.0 ; }
lineValue = getPixelForGridLine ( me , tick . _index || i , offsetGridLines ) ; if ( lineValue === undefined ) { continue ; }
alignedLineValue = alignPixel ( chart , lineValue , lineWidth ) ; if ( isHorizontal ) { tx1 = tx2 = x1 = x2 = alignedLineValue ; } else { ty1 = ty2 = y1 = y2 = alignedLineValue ; }
items . push ( { tx1 : tx1 , ty1 : ty1 , tx2 : tx2 , ty2 : ty2 , x1 : x1 , y1 : y1 , x2 : x2 , y2 : y2 , width : lineWidth , color : lineColor , borderDash : borderDash , borderDashOffset : borderDashOffset , } ) ; }
items . ticksLength = ticksLength ; items . borderValue = borderValue ; return items ; } , _computeLabelItems : function ( ) { var me = this ; var options = me . options ; var optionTicks = options . ticks ; var position = options . position ; var isMirrored = optionTicks . mirror ; var isHorizontal = me . isHorizontal ( ) ; var ticks = me . _ticksToDraw ; var fonts = parseTickFontOptions ( optionTicks ) ; var tickPadding = optionTicks . padding ; var tl = getTickMarkLength ( options . gridLines ) ; var rotation = - helpers$1 . toRadians ( me . labelRotation ) ; var items = [ ] ; var i , ilen , tick , label , x , y , textAlign , pixel , font , lineHeight , lineCount , textOffset ; if ( position === 'top' ) { y = me . bottom - tl - tickPadding ; textAlign = ! rotation ? 'center' : 'left' ; } else if ( position === 'bottom' ) { y = me . top + tl + tickPadding ; textAlign = ! rotation ? 'center' : 'right' ; } else if ( position === 'left' ) { x = me . right - ( isMirrored ? 0 : tl ) - tickPadding ; textAlign = isMirrored ? 'left' : 'right' ; } else { x = me . left + ( isMirrored ? 0 : tl ) + tickPadding ; textAlign = isMirrored ? 'right' : 'left' ; }
for ( i = 0 , ilen = ticks . length ; i < ilen ; ++ i ) { tick = ticks [ i ] ; label = tick . label ; if ( isNullOrUndef ( label ) ) { continue ; }
pixel = me . getPixelForTick ( tick . _index || i ) + optionTicks . labelOffset ; font = tick . major ? fonts . major : fonts . minor ; lineHeight = font . lineHeight ; lineCount = isArray ( label ) ? label . length : 1 ; if ( isHorizontal ) { x = pixel ; textOffset = position === 'top' ? ( ( ! rotation ? 0.5 : 1 ) - lineCount ) * lineHeight : ( ! rotation ? 0.5 : 0 ) * lineHeight ; } else { y = pixel ; textOffset = ( 1 - lineCount ) * lineHeight / 2 ; }
items . push ( { x : x , y : y , rotation : rotation , label : label , font : font , textOffset : textOffset , textAlign : textAlign } ) ; }
return items ; } , _drawGrid : function ( chartArea ) { var me = this ; var gridLines = me . options . gridLines ; if ( ! gridLines . display ) { return ; }
var ctx = me . ctx ; var chart = me . chart ; var alignPixel = helpers$1 . _alignPixel ; var axisWidth = gridLines . drawBorder ? valueAtIndexOrDefault ( gridLines . lineWidth , 0 , 0 ) : 0 ; var items = me . _gridLineItems || ( me . _gridLineItems = me . _computeGridLineItems ( chartArea ) ) ; var width , color , i , ilen , item ; for ( i = 0 , ilen = items . length ; i < ilen ; ++ i ) { item = items [ i ] ; width = item . width ; color = item . color ; if ( width && color ) { ctx . save ( ) ; ctx . lineWidth = width ; ctx . strokeStyle = color ; if ( ctx . setLineDash ) { ctx . setLineDash ( item . borderDash ) ; ctx . lineDashOffset = item . borderDashOffset ; }
ctx . beginPath ( ) ; if ( gridLines . drawTicks ) { ctx . moveTo ( item . tx1 , item . ty1 ) ; ctx . lineTo ( item . tx2 , item . ty2 ) ; }
if ( gridLines . drawOnChartArea ) { ctx . moveTo ( item . x1 , item . y1 ) ; ctx . lineTo ( item . x2 , item . y2 ) ; }
ctx . stroke ( ) ; ctx . restore ( ) ; } }
if ( axisWidth ) { var firstLineWidth = axisWidth ; var lastLineWidth = valueAtIndexOrDefault ( gridLines . lineWidth , items . ticksLength - 1 , 1 ) ; var borderValue = items . borderValue ; var x1 , x2 , y1 , y2 ; if ( me . isHorizontal ( ) ) { x1 = alignPixel ( chart , me . left , firstLineWidth ) - firstLineWidth / 2 ; x2 = alignPixel ( chart , me . right , lastLineWidth ) + lastLineWidth / 2 ; y1 = y2 = borderValue ; } else { y1 = alignPixel ( chart , me . top , firstLineWidth ) - firstLineWidth / 2 ; y2 = alignPixel ( chart , me . bottom , lastLineWidth ) + lastLineWidth / 2 ; x1 = x2 = borderValue ; }
ctx . lineWidth = axisWidth ; ctx . strokeStyle = valueAtIndexOrDefault ( gridLines . color , 0 ) ; ctx . beginPath ( ) ; ctx . moveTo ( x1 , y1 ) ; ctx . lineTo ( x2 , y2 ) ; ctx . stroke ( ) ; } } , _drawLabels : function ( ) { var me = this ; var optionTicks = me . options . ticks ; if ( ! optionTicks . display ) { return ; }
var ctx = me . ctx ; var items = me . _labelItems || ( me . _labelItems = me . _computeLabelItems ( ) ) ; var i , j , ilen , jlen , item , tickFont , label , y ; for ( i = 0 , ilen = items . length ; i < ilen ; ++ i ) { item = items [ i ] ; tickFont = item . font ; ctx . save ( ) ; ctx . translate ( item . x , item . y ) ; ctx . rotate ( item . rotation ) ; ctx . font = tickFont . string ; ctx . fillStyle = tickFont . color ; ctx . textBaseline = 'middle' ; ctx . textAlign = item . textAlign ; label = item . label ; y = item . textOffset ; if ( isArray ( label ) ) { for ( j = 0 , jlen = label . length ; j < jlen ; ++ j ) { ctx . fillText ( '' + label [ j ] , 0 , y ) ; y += tickFont . lineHeight ; } } else { ctx . fillText ( label , 0 , y ) ; }
ctx . restore ( ) ; } } , _drawTitle : function ( ) { var me = this ; var ctx = me . ctx ; var options = me . options ; var scaleLabel = options . scaleLabel ; if ( ! scaleLabel . display ) { return ; }
var scaleLabelFontColor = valueOrDefault$a ( scaleLabel . fontColor , core _defaults . global . defaultFontColor ) ; var scaleLabelFont = helpers$1 . options . _parseFont ( scaleLabel ) ; var scaleLabelPadding = helpers$1 . options . toPadding ( scaleLabel . padding ) ; var halfLineHeight = scaleLabelFont . lineHeight / 2 ; var position = options . position ; var rotation = 0 ; var scaleLabelX , scaleLabelY ; if ( me . isHorizontal ( ) ) { scaleLabelX = me . left + me . width / 2 ; scaleLabelY = position === 'bottom' ? me . bottom - halfLineHeight - scaleLabelPadding . bottom : me . top + halfLineHeight + scaleLabelPadding . top ; } else { var isLeft = position === 'left' ; scaleLabelX = isLeft ? me . left + halfLineHeight + scaleLabelPadding . top : me . right - halfLineHeight - scaleLabelPadding . top ; scaleLabelY = me . top + me . height / 2 ; rotation = isLeft ? - 0.5 * Math . PI : 0.5 * Math . PI ; }
ctx . save ( ) ; ctx . translate ( scaleLabelX , scaleLabelY ) ; ctx . rotate ( rotation ) ; ctx . textAlign = 'center' ; ctx . textBaseline = 'middle' ; ctx . fillStyle = scaleLabelFontColor ; ctx . font = scaleLabelFont . string ; ctx . fillText ( scaleLabel . labelString , 0 , 0 ) ; ctx . restore ( ) ; } , draw : function ( chartArea ) { var me = this ; if ( ! me . _isVisible ( ) ) { return ; }
me . _drawGrid ( chartArea ) ; me . _drawTitle ( ) ; me . _drawLabels ( ) ; } , _layers : function ( ) { var me = this ; var opts = me . options ; var tz = opts . ticks && opts . ticks . z || 0 ; var gz = opts . gridLines && opts . gridLines . z || 0 ; if ( ! me . _isVisible ( ) || tz === gz || me . draw !== me . _draw ) { return [ { z : tz , draw : function ( ) { me . draw . apply ( me , arguments ) ; } } ] ; }
return [ { z : gz , draw : function ( ) { me . _drawGrid . apply ( me , arguments ) ; me . _drawTitle . apply ( me , arguments ) ; } } , { z : tz , draw : function ( ) { me . _drawLabels . apply ( me , arguments ) ; } } ] ; } , _getMatchingVisibleMetas : function ( type ) { var me = this ; var isHorizontal = me . isHorizontal ( ) ; return me . chart . _getSortedVisibleDatasetMetas ( ) . filter ( function ( meta ) { return ( ! type || meta . type === type ) && ( isHorizontal ? meta . xAxisID === me . id : meta . yAxisID === me . id ) ; } ) ; } } ) ; Scale . prototype . _draw = Scale . prototype . draw ; var core _scale = Scale ; var isNullOrUndef$1 = helpers$1 . isNullOrUndef ; var defaultConfig = { position : 'bottom' } ; var scale _category = core _scale . extend ( { determineDataLimits : function ( ) { var me = this ; var labels = me . _getLabels ( ) ; var ticksOpts = me . options . ticks ; var min = ticksOpts . min ; var max = ticksOpts . max ; var minIndex = 0 ; var maxIndex = labels . length - 1 ; var findIndex ; if ( min !== undefined ) { findIndex = labels . indexOf ( min ) ; if ( findIndex >= 0 ) { minIndex = findIndex ; } }
if ( max !== undefined ) { findIndex = labels . indexOf ( max ) ; if ( findIndex >= 0 ) { maxIndex = findIndex ; } }
me . minIndex = minIndex ; me . maxIndex = maxIndex ; me . min = labels [ minIndex ] ; me . max = labels [ maxIndex ] ; } , buildTicks : function ( ) { var me = this ; var labels = me . _getLabels ( ) ; var minIndex = me . minIndex ; var maxIndex = me . maxIndex ; me . ticks = ( minIndex === 0 && maxIndex === labels . length - 1 ) ? labels : labels . slice ( minIndex , maxIndex + 1 ) ; } , getLabelForIndex : function ( index , datasetIndex ) { var me = this ; var chart = me . chart ; if ( chart . getDatasetMeta ( datasetIndex ) . controller . _getValueScaleId ( ) === me . id ) { return me . getRightValue ( chart . data . datasets [ datasetIndex ] . data [ index ] ) ; }
return me . _getLabels ( ) [ index ] ; } , _configure : function ( ) { var me = this ; var offset = me . options . offset ; var ticks = me . ticks ; core _scale . prototype . _configure . call ( me ) ; if ( ! me . isHorizontal ( ) ) { me . _reversePixels = ! me . _reversePixels ; }
if ( ! ticks ) { return ; }
me . _startValue = me . minIndex - ( offset ? 0.5 : 0 ) ; me . _valueRange = Math . max ( ticks . length - ( offset ? 0 : 1 ) , 1 ) ; } , getPixelForValue : function ( value , index , datasetIndex ) { var me = this ; var valueCategory , labels , idx ; if ( ! isNullOrUndef$1 ( index ) && ! isNullOrUndef$1 ( datasetIndex ) ) { value = me . chart . data . datasets [ datasetIndex ] . data [ index ] ; }
if ( ! isNullOrUndef$1 ( value ) ) { valueCategory = me . isHorizontal ( ) ? value . x : value . y ; }
if ( valueCategory !== undefined || ( value !== undefined && isNaN ( index ) ) ) { labels = me . _getLabels ( ) ; value = helpers$1 . valueOrDefault ( valueCategory , value ) ; idx = labels . indexOf ( value ) ; index = idx !== - 1 ? idx : index ; if ( isNaN ( index ) ) { index = value ; } }
return me . getPixelForDecimal ( ( index - me . _startValue ) / me . _valueRange ) ; } , getPixelForTick : function ( index ) { var ticks = this . ticks ; return index < 0 || index > ticks . length - 1 ? null : this . getPixelForValue ( ticks [ index ] , index + this . minIndex ) ; } , getValueForPixel : function ( pixel ) { var me = this ; var value = Math . round ( me . _startValue + me . getDecimalForPixel ( pixel ) * me . _valueRange ) ; return Math . min ( Math . max ( value , 0 ) , me . ticks . length - 1 ) ; } , getBasePixel : function ( ) { return this . bottom ; } } ) ; var _defaults = defaultConfig ; scale _category . _defaults = _defaults ; var noop = helpers$1 . noop ; var isNullOrUndef$2 = helpers$1 . isNullOrUndef ; function generateTicks ( generationOptions , dataRange ) { var ticks = [ ] ; var MIN _SPACING = 1e-14 ; var stepSize = generationOptions . stepSize ; var unit = stepSize || 1 ; var maxNumSpaces = generationOptions . maxTicks - 1 ; var min = generationOptions . min ; var max = generationOptions . max ; var precision = generationOptions . precision ; var rmin = dataRange . min ; var rmax = dataRange . max ; var spacing = helpers$1 . niceNum ( ( rmax - rmin ) / maxNumSpaces / unit ) * unit ; var factor , niceMin , niceMax , numSpaces ; if ( spacing < MIN _SPACING && isNullOrUndef$2 ( min ) && isNullOrUndef$2 ( max ) ) { return [ rmin , rmax ] ; }
numSpaces = Math . ceil ( rmax / spacing ) - Math . floor ( rmin / spacing ) ; if ( numSpaces > maxNumSpaces ) { spacing = helpers$1 . niceNum ( numSpaces * spacing / maxNumSpaces / unit ) * unit ; }
if ( stepSize || isNullOrUndef$2 ( precision ) ) { factor = Math . pow ( 10 , helpers$1 . _decimalPlaces ( spacing ) ) ; } else { factor = Math . pow ( 10 , precision ) ; spacing = Math . ceil ( spacing * factor ) / factor ; }
niceMin = Math . floor ( rmin / spacing ) * spacing ; niceMax = Math . ceil ( rmax / spacing ) * spacing ; if ( stepSize ) { if ( ! isNullOrUndef$2 ( min ) && helpers$1 . almostWhole ( min / spacing , spacing / 1000 ) ) { niceMin = min ; }
if ( ! isNullOrUndef$2 ( max ) && helpers$1 . almostWhole ( max / spacing , spacing / 1000 ) ) { niceMax = max ; } }
numSpaces = ( niceMax - niceMin ) / spacing ; if ( helpers$1 . almostEquals ( numSpaces , Math . round ( numSpaces ) , spacing / 1000 ) ) { numSpaces = Math . round ( numSpaces ) ; } else { numSpaces = Math . ceil ( numSpaces ) ; }
niceMin = Math . round ( niceMin * factor ) / factor ; niceMax = Math . round ( niceMax * factor ) / factor ; ticks . push ( isNullOrUndef$2 ( min ) ? niceMin : min ) ; for ( var j = 1 ; j < numSpaces ; ++ j ) { ticks . push ( Math . round ( ( niceMin + j * spacing ) * factor ) / factor ) ; }
ticks . push ( isNullOrUndef$2 ( max ) ? niceMax : max ) ; return ticks ; }
var scale _linearbase = core _scale . extend ( { getRightValue : function ( value ) { if ( typeof value === 'string' ) { return + value ; }
return core _scale . prototype . getRightValue . call ( this , value ) ; } , handleTickRangeOptions : function ( ) { var me = this ; var opts = me . options ; var tickOpts = opts . ticks ; if ( tickOpts . beginAtZero ) { var minSign = helpers$1 . sign ( me . min ) ; var maxSign = helpers$1 . sign ( me . max ) ; if ( minSign < 0 && maxSign < 0 ) { me . max = 0 ; } else if ( minSign > 0 && maxSign > 0 ) { me . min = 0 ; } }
2019-05-09 18:54:39 +12:00
var setMin = tickOpts . min !== undefined || tickOpts . suggestedMin !== undefined ; var setMax = tickOpts . max !== undefined || tickOpts . suggestedMax !== undefined ; if ( tickOpts . min !== undefined ) { me . min = tickOpts . min ; } else if ( tickOpts . suggestedMin !== undefined ) { if ( me . min === null ) { me . min = tickOpts . suggestedMin ; } else { me . min = Math . min ( me . min , tickOpts . suggestedMin ) ; } }
if ( tickOpts . max !== undefined ) { me . max = tickOpts . max ; } else if ( tickOpts . suggestedMax !== undefined ) { if ( me . max === null ) { me . max = tickOpts . suggestedMax ; } else { me . max = Math . max ( me . max , tickOpts . suggestedMax ) ; } }
if ( setMin !== setMax ) { if ( me . min >= me . max ) { if ( setMin ) { me . max = me . min + 1 ; } else { me . min = me . max - 1 ; } } }
2020-07-24 09:00:10 +12:00
if ( me . min === me . max ) { me . max ++ ; if ( ! tickOpts . beginAtZero ) { me . min -- ; } } } , getTickLimit : function ( ) { var me = this ; var tickOpts = me . options . ticks ; var stepSize = tickOpts . stepSize ; var maxTicksLimit = tickOpts . maxTicksLimit ; var maxTicks ; if ( stepSize ) { maxTicks = Math . ceil ( me . max / stepSize ) - Math . floor ( me . min / stepSize ) + 1 ; } else { maxTicks = me . _computeTickLimit ( ) ; maxTicksLimit = maxTicksLimit || 11 ; }
if ( maxTicksLimit ) { maxTicks = Math . min ( maxTicksLimit , maxTicks ) ; }
return maxTicks ; } , _computeTickLimit : function ( ) { return Number . POSITIVE _INFINITY ; } , handleDirectionalChanges : noop , buildTicks : function ( ) { var me = this ; var opts = me . options ; var tickOpts = opts . ticks ; var maxTicks = me . getTickLimit ( ) ; maxTicks = Math . max ( 2 , maxTicks ) ; var numericGeneratorOptions = { maxTicks : maxTicks , min : tickOpts . min , max : tickOpts . max , precision : tickOpts . precision , stepSize : helpers$1 . valueOrDefault ( tickOpts . fixedStepSize , tickOpts . stepSize ) } ; var ticks = me . ticks = generateTicks ( numericGeneratorOptions , me ) ; me . handleDirectionalChanges ( ) ; me . max = helpers$1 . max ( ticks ) ; me . min = helpers$1 . min ( ticks ) ; if ( tickOpts . reverse ) { ticks . reverse ( ) ; me . start = me . max ; me . end = me . min ; } else { me . start = me . min ; me . end = me . max ; } } , convertTicksToLabels : function ( ) { var me = this ; me . ticksAsNumbers = me . ticks . slice ( ) ; me . zeroLineIndex = me . ticks . indexOf ( 0 ) ; core _scale . prototype . convertTicksToLabels . call ( me ) ; } , _configure : function ( ) { var me = this ; var ticks = me . getTicks ( ) ; var start = me . min ; var end = me . max ; var offset ; core _scale . prototype . _configure . call ( me ) ; if ( me . options . offset && ticks . length ) { offset = ( end - start ) / Math . max ( ticks . length - 1 , 1 ) / 2 ; start -= offset ; end += offset ; }
me . _startValue = start ; me . _endValue = end ; me . _valueRange = end - start ; } } ) ; var defaultConfig$1 = { position : 'left' , ticks : { callback : core _ticks . formatters . linear } } ; var DEFAULT _MIN = 0 ; var DEFAULT _MAX = 1 ; function getOrCreateStack ( stacks , stacked , meta ) { var key = [ meta . type , stacked === undefined && meta . stack === undefined ? meta . index : '' , meta . stack ] . join ( '.' ) ; if ( stacks [ key ] === undefined ) { stacks [ key ] = { pos : [ ] , neg : [ ] } ; }
return stacks [ key ] ; }
function stackData ( scale , stacks , meta , data ) { var opts = scale . options ; var stacked = opts . stacked ; var stack = getOrCreateStack ( stacks , stacked , meta ) ; var pos = stack . pos ; var neg = stack . neg ; var ilen = data . length ; var i , value ; for ( i = 0 ; i < ilen ; ++ i ) { value = scale . _parseValue ( data [ i ] ) ; if ( isNaN ( value . min ) || isNaN ( value . max ) || meta . data [ i ] . hidden ) { continue ; }
pos [ i ] = pos [ i ] || 0 ; neg [ i ] = neg [ i ] || 0 ; if ( opts . relativePoints ) { pos [ i ] = 100 ; } else if ( value . min < 0 || value . max < 0 ) { neg [ i ] += value . min ; } else { pos [ i ] += value . max ; } } }
function updateMinMax ( scale , meta , data ) { var ilen = data . length ; var i , value ; for ( i = 0 ; i < ilen ; ++ i ) { value = scale . _parseValue ( data [ i ] ) ; if ( isNaN ( value . min ) || isNaN ( value . max ) || meta . data [ i ] . hidden ) { continue ; }
scale . min = Math . min ( scale . min , value . min ) ; scale . max = Math . max ( scale . max , value . max ) ; } }
var scale _linear = scale _linearbase . extend ( { determineDataLimits : function ( ) { var me = this ; var opts = me . options ; var chart = me . chart ; var datasets = chart . data . datasets ; var metasets = me . _getMatchingVisibleMetas ( ) ; var hasStacks = opts . stacked ; var stacks = { } ; var ilen = metasets . length ; var i , meta , data , values ; me . min = Number . POSITIVE _INFINITY ; me . max = Number . NEGATIVE _INFINITY ; if ( hasStacks === undefined ) { for ( i = 0 ; ! hasStacks && i < ilen ; ++ i ) { meta = metasets [ i ] ; hasStacks = meta . stack !== undefined ; } }
for ( i = 0 ; i < ilen ; ++ i ) { meta = metasets [ i ] ; data = datasets [ meta . index ] . data ; if ( hasStacks ) { stackData ( me , stacks , meta , data ) ; } else { updateMinMax ( me , meta , data ) ; } }
helpers$1 . each ( stacks , function ( stackValues ) { values = stackValues . pos . concat ( stackValues . neg ) ; me . min = Math . min ( me . min , helpers$1 . min ( values ) ) ; me . max = Math . max ( me . max , helpers$1 . max ( values ) ) ; } ) ; me . min = helpers$1 . isFinite ( me . min ) && ! isNaN ( me . min ) ? me . min : DEFAULT _MIN ; me . max = helpers$1 . isFinite ( me . max ) && ! isNaN ( me . max ) ? me . max : DEFAULT _MAX ; me . handleTickRangeOptions ( ) ; } , _computeTickLimit : function ( ) { var me = this ; var tickFont ; if ( me . isHorizontal ( ) ) { return Math . ceil ( me . width / 40 ) ; }
tickFont = helpers$1 . options . _parseFont ( me . options . ticks ) ; return Math . ceil ( me . height / tickFont . lineHeight ) ; } , handleDirectionalChanges : function ( ) { if ( ! this . isHorizontal ( ) ) { this . ticks . reverse ( ) ; } } , getLabelForIndex : function ( index , datasetIndex ) { return this . _getScaleLabel ( this . chart . data . datasets [ datasetIndex ] . data [ index ] ) ; } , getPixelForValue : function ( value ) { var me = this ; return me . getPixelForDecimal ( ( + me . getRightValue ( value ) - me . _startValue ) / me . _valueRange ) ; } , getValueForPixel : function ( pixel ) { return this . _startValue + this . getDecimalForPixel ( pixel ) * this . _valueRange ; } , getPixelForTick : function ( index ) { var ticks = this . ticksAsNumbers ; if ( index < 0 || index > ticks . length - 1 ) { return null ; }
return this . getPixelForValue ( ticks [ index ] ) ; } } ) ; var _defaults$1 = defaultConfig$1 ; scale _linear . _defaults = _defaults$1 ; var valueOrDefault$b = helpers$1 . valueOrDefault ; var log10 = helpers$1 . math . log10 ; function generateTicks$1 ( generationOptions , dataRange ) { var ticks = [ ] ; var tickVal = valueOrDefault$b ( generationOptions . min , Math . pow ( 10 , Math . floor ( log10 ( dataRange . min ) ) ) ) ; var endExp = Math . floor ( log10 ( dataRange . max ) ) ; var endSignificand = Math . ceil ( dataRange . max / Math . pow ( 10 , endExp ) ) ; var exp , significand ; if ( tickVal === 0 ) { exp = Math . floor ( log10 ( dataRange . minNotZero ) ) ; significand = Math . floor ( dataRange . minNotZero / Math . pow ( 10 , exp ) ) ; ticks . push ( tickVal ) ; tickVal = significand * Math . pow ( 10 , exp ) ; } else { exp = Math . floor ( log10 ( tickVal ) ) ; significand = Math . floor ( tickVal / Math . pow ( 10 , exp ) ) ; }
2019-05-09 18:54:39 +12:00
var precision = exp < 0 ? Math . pow ( 10 , Math . abs ( exp ) ) : 1 ; do { ticks . push ( tickVal ) ; ++ significand ; if ( significand === 10 ) { significand = 1 ; ++ exp ; precision = exp >= 0 ? 1 : precision ; }
2020-07-24 09:00:10 +12:00
tickVal = Math . round ( significand * Math . pow ( 10 , exp ) * precision ) / precision ; } while ( exp < endExp || ( exp === endExp && significand < endSignificand ) ) ; var lastTick = valueOrDefault$b ( generationOptions . max , tickVal ) ; ticks . push ( lastTick ) ; return ticks ; }
var defaultConfig$2 = { position : 'left' , ticks : { callback : core _ticks . formatters . logarithmic } } ; function nonNegativeOrDefault ( value , defaultValue ) { return helpers$1 . isFinite ( value ) && value >= 0 ? value : defaultValue ; }
var scale _logarithmic = core _scale . extend ( { determineDataLimits : function ( ) { var me = this ; var opts = me . options ; var chart = me . chart ; var datasets = chart . data . datasets ; var isHorizontal = me . isHorizontal ( ) ; function IDMatches ( meta ) { return isHorizontal ? meta . xAxisID === me . id : meta . yAxisID === me . id ; }
var datasetIndex , meta , value , data , i , ilen ; me . min = Number . POSITIVE _INFINITY ; me . max = Number . NEGATIVE _INFINITY ; me . minNotZero = Number . POSITIVE _INFINITY ; var hasStacks = opts . stacked ; if ( hasStacks === undefined ) { for ( datasetIndex = 0 ; datasetIndex < datasets . length ; datasetIndex ++ ) { meta = chart . getDatasetMeta ( datasetIndex ) ; if ( chart . isDatasetVisible ( datasetIndex ) && IDMatches ( meta ) && meta . stack !== undefined ) { hasStacks = true ; break ; } } }
if ( opts . stacked || hasStacks ) { var valuesPerStack = { } ; for ( datasetIndex = 0 ; datasetIndex < datasets . length ; datasetIndex ++ ) { meta = chart . getDatasetMeta ( datasetIndex ) ; var key = [ meta . type , ( ( opts . stacked === undefined && meta . stack === undefined ) ? datasetIndex : '' ) , meta . stack ] . join ( '.' ) ; if ( chart . isDatasetVisible ( datasetIndex ) && IDMatches ( meta ) ) { if ( valuesPerStack [ key ] === undefined ) { valuesPerStack [ key ] = [ ] ; }
data = datasets [ datasetIndex ] . data ; for ( i = 0 , ilen = data . length ; i < ilen ; i ++ ) { var values = valuesPerStack [ key ] ; value = me . _parseValue ( data [ i ] ) ; if ( isNaN ( value . min ) || isNaN ( value . max ) || meta . data [ i ] . hidden || value . min < 0 || value . max < 0 ) { continue ; }
values [ i ] = values [ i ] || 0 ; values [ i ] += value . max ; } } }
helpers$1 . each ( valuesPerStack , function ( valuesForType ) { if ( valuesForType . length > 0 ) { var minVal = helpers$1 . min ( valuesForType ) ; var maxVal = helpers$1 . max ( valuesForType ) ; me . min = Math . min ( me . min , minVal ) ; me . max = Math . max ( me . max , maxVal ) ; } } ) ; } else { for ( datasetIndex = 0 ; datasetIndex < datasets . length ; datasetIndex ++ ) { meta = chart . getDatasetMeta ( datasetIndex ) ; if ( chart . isDatasetVisible ( datasetIndex ) && IDMatches ( meta ) ) { data = datasets [ datasetIndex ] . data ; for ( i = 0 , ilen = data . length ; i < ilen ; i ++ ) { value = me . _parseValue ( data [ i ] ) ; if ( isNaN ( value . min ) || isNaN ( value . max ) || meta . data [ i ] . hidden || value . min < 0 || value . max < 0 ) { continue ; }
me . min = Math . min ( value . min , me . min ) ; me . max = Math . max ( value . max , me . max ) ; if ( value . min !== 0 ) { me . minNotZero = Math . min ( value . min , me . minNotZero ) ; } } } } }
me . min = helpers$1 . isFinite ( me . min ) ? me . min : null ; me . max = helpers$1 . isFinite ( me . max ) ? me . max : null ; me . minNotZero = helpers$1 . isFinite ( me . minNotZero ) ? me . minNotZero : null ; this . handleTickRangeOptions ( ) ; } , handleTickRangeOptions : function ( ) { var me = this ; var tickOpts = me . options . ticks ; var DEFAULT _MIN = 1 ; var DEFAULT _MAX = 10 ; me . min = nonNegativeOrDefault ( tickOpts . min , me . min ) ; me . max = nonNegativeOrDefault ( tickOpts . max , me . max ) ; if ( me . min === me . max ) { if ( me . min !== 0 && me . min !== null ) { me . min = Math . pow ( 10 , Math . floor ( log10 ( me . min ) ) - 1 ) ; me . max = Math . pow ( 10 , Math . floor ( log10 ( me . max ) ) + 1 ) ; } else { me . min = DEFAULT _MIN ; me . max = DEFAULT _MAX ; } }
if ( me . min === null ) { me . min = Math . pow ( 10 , Math . floor ( log10 ( me . max ) ) - 1 ) ; }
if ( me . max === null ) { me . max = me . min !== 0 ? Math . pow ( 10 , Math . floor ( log10 ( me . min ) ) + 1 ) : DEFAULT _MAX ; }
if ( me . minNotZero === null ) { if ( me . min > 0 ) { me . minNotZero = me . min ; } else if ( me . max < 1 ) { me . minNotZero = Math . pow ( 10 , Math . floor ( log10 ( me . max ) ) ) ; } else { me . minNotZero = DEFAULT _MIN ; } } } , buildTicks : function ( ) { var me = this ; var tickOpts = me . options . ticks ; var reverse = ! me . isHorizontal ( ) ; var generationOptions = { min : nonNegativeOrDefault ( tickOpts . min ) , max : nonNegativeOrDefault ( tickOpts . max ) } ; var ticks = me . ticks = generateTicks$1 ( generationOptions , me ) ; me . max = helpers$1 . max ( ticks ) ; me . min = helpers$1 . min ( ticks ) ; if ( tickOpts . reverse ) { reverse = ! reverse ; me . start = me . max ; me . end = me . min ; } else { me . start = me . min ; me . end = me . max ; }
if ( reverse ) { ticks . reverse ( ) ; } } , convertTicksToLabels : function ( ) { this . tickValues = this . ticks . slice ( ) ; core _scale . prototype . convertTicksToLabels . call ( this ) ; } , getLabelForIndex : function ( index , datasetIndex ) { return this . _getScaleLabel ( this . chart . data . datasets [ datasetIndex ] . data [ index ] ) ; } , getPixelForTick : function ( index ) { var ticks = this . tickValues ; if ( index < 0 || index > ticks . length - 1 ) { return null ; }
return this . getPixelForValue ( ticks [ index ] ) ; } , _getFirstTickValue : function ( value ) { var exp = Math . floor ( log10 ( value ) ) ; var significand = Math . floor ( value / Math . pow ( 10 , exp ) ) ; return significand * Math . pow ( 10 , exp ) ; } , _configure : function ( ) { var me = this ; var start = me . min ; var offset = 0 ; core _scale . prototype . _configure . call ( me ) ; if ( start === 0 ) { start = me . _getFirstTickValue ( me . minNotZero ) ; offset = valueOrDefault$b ( me . options . ticks . fontSize , core _defaults . global . defaultFontSize ) / me . _length ; }
me . _startValue = log10 ( start ) ; me . _valueOffset = offset ; me . _valueRange = ( log10 ( me . max ) - log10 ( start ) ) / ( 1 - offset ) ; } , getPixelForValue : function ( value ) { var me = this ; var decimal = 0 ; value = + me . getRightValue ( value ) ; if ( value > me . min && value > 0 ) { decimal = ( log10 ( value ) - me . _startValue ) / me . _valueRange + me . _valueOffset ; }
return me . getPixelForDecimal ( decimal ) ; } , getValueForPixel : function ( pixel ) { var me = this ; var decimal = me . getDecimalForPixel ( pixel ) ; return decimal === 0 && me . min === 0 ? 0 : Math . pow ( 10 , me . _startValue + ( decimal - me . _valueOffset ) * me . _valueRange ) ; } } ) ; var _defaults$2 = defaultConfig$2 ; scale _logarithmic . _defaults = _defaults$2 ; var valueOrDefault$c = helpers$1 . valueOrDefault ; var valueAtIndexOrDefault$1 = helpers$1 . valueAtIndexOrDefault ; var resolve$4 = helpers$1 . options . resolve ; var defaultConfig$3 = { display : true , animate : true , position : 'chartArea' , angleLines : { display : true , color : 'rgba(0,0,0,0.1)' , lineWidth : 1 , borderDash : [ ] , borderDashOffset : 0.0 } , gridLines : { circular : false } , ticks : { showLabelBackdrop : true , backdropColor : 'rgba(255,255,255,0.75)' , backdropPaddingY : 2 , backdropPaddingX : 2 , callback : core _ticks . formatters . linear } , pointLabels : { display : true , fontSize : 10 , callback : function ( label ) { return label ; } } } ; function getTickBackdropHeight ( opts ) { var tickOpts = opts . ticks ; if ( tickOpts . display && opts . display ) { return valueOrDefault$c ( tickOpts . fontSize , core _defaults . global . defaultFontSize ) + tickOpts . backdropPaddingY * 2 ; }
return 0 ; }
function measureLabelSize ( ctx , lineHeight , label ) { if ( helpers$1 . isArray ( label ) ) { return { w : helpers$1 . longestText ( ctx , ctx . font , label ) , h : label . length * lineHeight } ; }
return { w : ctx . measureText ( label ) . width , h : lineHeight } ; }
function determineLimits ( angle , pos , size , min , max ) { if ( angle === min || angle === max ) { return { start : pos - ( size / 2 ) , end : pos + ( size / 2 ) } ; } else if ( angle < min || angle > max ) { return { start : pos - size , end : pos } ; }
return { start : pos , end : pos + size } ; }
function fitWithPointLabels ( scale ) { var plFont = helpers$1 . options . _parseFont ( scale . options . pointLabels ) ; var furthestLimits = { l : 0 , r : scale . width , t : 0 , b : scale . height - scale . paddingTop } ; var furthestAngles = { } ; var i , textSize , pointPosition ; scale . ctx . font = plFont . string ; scale . _pointLabelSizes = [ ] ; var valueCount = scale . chart . data . labels . length ; for ( i = 0 ; i < valueCount ; i ++ ) { pointPosition = scale . getPointPosition ( i , scale . drawingArea + 5 ) ; textSize = measureLabelSize ( scale . ctx , plFont . lineHeight , scale . pointLabels [ i ] ) ; scale . _pointLabelSizes [ i ] = textSize ; var angleRadians = scale . getIndexAngle ( i ) ; var angle = helpers$1 . toDegrees ( angleRadians ) % 360 ; var hLimits = determineLimits ( angle , pointPosition . x , textSize . w , 0 , 180 ) ; var vLimits = determineLimits ( angle , pointPosition . y , textSize . h , 90 , 270 ) ; if ( hLimits . start < furthestLimits . l ) { furthestLimits . l = hLimits . start ; furthestAngles . l = angleRadians ; }
2019-05-09 18:54:39 +12:00
if ( hLimits . end > furthestLimits . r ) { furthestLimits . r = hLimits . end ; furthestAngles . r = angleRadians ; }
if ( vLimits . start < furthestLimits . t ) { furthestLimits . t = vLimits . start ; furthestAngles . t = angleRadians ; }
if ( vLimits . end > furthestLimits . b ) { furthestLimits . b = vLimits . end ; furthestAngles . b = angleRadians ; } }
2020-07-24 09:00:10 +12:00
scale . setReductions ( scale . drawingArea , furthestLimits , furthestAngles ) ; }
2019-05-09 18:54:39 +12:00
function getTextAlignForAngle ( angle ) { if ( angle === 0 || angle === 180 ) { return 'center' ; } else if ( angle < 180 ) { return 'left' ; }
return 'right' ; }
2020-07-24 09:00:10 +12:00
function fillText ( ctx , text , position , lineHeight ) { var y = position . y + lineHeight / 2 ; var i , ilen ; if ( helpers$1 . isArray ( text ) ) { for ( i = 0 , ilen = text . length ; i < ilen ; ++ i ) { ctx . fillText ( text [ i ] , position . x , y ) ; y += lineHeight ; } } else { ctx . fillText ( text , position . x , y ) ; } }
2019-05-09 18:54:39 +12:00
function adjustPointPositionForLabelHeight ( angle , textSize , position ) { if ( angle === 90 || angle === 270 ) { position . y -= ( textSize . h / 2 ) ; } else if ( angle > 270 || angle < 90 ) { position . y -= textSize . h ; } }
2020-07-24 09:00:10 +12:00
function drawPointLabels ( scale ) { var ctx = scale . ctx ; var opts = scale . options ; var pointLabelOpts = opts . pointLabels ; var tickBackdropHeight = getTickBackdropHeight ( opts ) ; var outerDistance = scale . getDistanceFromCenterForValue ( opts . ticks . reverse ? scale . min : scale . max ) ; var plFont = helpers$1 . options . _parseFont ( pointLabelOpts ) ; ctx . save ( ) ; ctx . font = plFont . string ; ctx . textBaseline = 'middle' ; for ( var i = scale . chart . data . labels . length - 1 ; i >= 0 ; i -- ) { var extra = ( i === 0 ? tickBackdropHeight / 2 : 0 ) ; var pointLabelPosition = scale . getPointPosition ( i , outerDistance + extra + 5 ) ; var pointLabelFontColor = valueAtIndexOrDefault$1 ( pointLabelOpts . fontColor , i , core _defaults . global . defaultFontColor ) ; ctx . fillStyle = pointLabelFontColor ; var angleRadians = scale . getIndexAngle ( i ) ; var angle = helpers$1 . toDegrees ( angleRadians ) ; ctx . textAlign = getTextAlignForAngle ( angle ) ; adjustPointPositionForLabelHeight ( angle , scale . _pointLabelSizes [ i ] , pointLabelPosition ) ; fillText ( ctx , scale . pointLabels [ i ] , pointLabelPosition , plFont . lineHeight ) ; }
ctx . restore ( ) ; }
function drawRadiusLine ( scale , gridLineOpts , radius , index ) { var ctx = scale . ctx ; var circular = gridLineOpts . circular ; var valueCount = scale . chart . data . labels . length ; var lineColor = valueAtIndexOrDefault$1 ( gridLineOpts . color , index - 1 ) ; var lineWidth = valueAtIndexOrDefault$1 ( gridLineOpts . lineWidth , index - 1 ) ; var pointPosition ; if ( ( ! circular && ! valueCount ) || ! lineColor || ! lineWidth ) { return ; }
ctx . save ( ) ; ctx . strokeStyle = lineColor ; ctx . lineWidth = lineWidth ; if ( ctx . setLineDash ) { ctx . setLineDash ( gridLineOpts . borderDash || [ ] ) ; ctx . lineDashOffset = gridLineOpts . borderDashOffset || 0.0 ; }
ctx . beginPath ( ) ; if ( circular ) { ctx . arc ( scale . xCenter , scale . yCenter , radius , 0 , Math . PI * 2 ) ; } else { pointPosition = scale . getPointPosition ( 0 , radius ) ; ctx . moveTo ( pointPosition . x , pointPosition . y ) ; for ( var i = 1 ; i < valueCount ; i ++ ) { pointPosition = scale . getPointPosition ( i , radius ) ; ctx . lineTo ( pointPosition . x , pointPosition . y ) ; } }
ctx . closePath ( ) ; ctx . stroke ( ) ; ctx . restore ( ) ; }
function numberOrZero ( param ) { return helpers$1 . isNumber ( param ) ? param : 0 ; }
var scale _radialLinear = scale _linearbase . extend ( { setDimensions : function ( ) { var me = this ; me . width = me . maxWidth ; me . height = me . maxHeight ; me . paddingTop = getTickBackdropHeight ( me . options ) / 2 ; me . xCenter = Math . floor ( me . width / 2 ) ; me . yCenter = Math . floor ( ( me . height - me . paddingTop ) / 2 ) ; me . drawingArea = Math . min ( me . height - me . paddingTop , me . width ) / 2 ; } , determineDataLimits : function ( ) { var me = this ; var chart = me . chart ; var min = Number . POSITIVE _INFINITY ; var max = Number . NEGATIVE _INFINITY ; helpers$1 . each ( chart . data . datasets , function ( dataset , datasetIndex ) { if ( chart . isDatasetVisible ( datasetIndex ) ) { var meta = chart . getDatasetMeta ( datasetIndex ) ; helpers$1 . each ( dataset . data , function ( rawValue , index ) { var value = + me . getRightValue ( rawValue ) ; if ( isNaN ( value ) || meta . data [ index ] . hidden ) { return ; }
min = Math . min ( value , min ) ; max = Math . max ( value , max ) ; } ) ; } } ) ; me . min = ( min === Number . POSITIVE _INFINITY ? 0 : min ) ; me . max = ( max === Number . NEGATIVE _INFINITY ? 0 : max ) ; me . handleTickRangeOptions ( ) ; } , _computeTickLimit : function ( ) { return Math . ceil ( this . drawingArea / getTickBackdropHeight ( this . options ) ) ; } , convertTicksToLabels : function ( ) { var me = this ; scale _linearbase . prototype . convertTicksToLabels . call ( me ) ; me . pointLabels = me . chart . data . labels . map ( function ( ) { var label = helpers$1 . callback ( me . options . pointLabels . callback , arguments , me ) ; return label || label === 0 ? label : '' ; } ) ; } , getLabelForIndex : function ( index , datasetIndex ) { return + this . getRightValue ( this . chart . data . datasets [ datasetIndex ] . data [ index ] ) ; } , fit : function ( ) { var me = this ; var opts = me . options ; if ( opts . display && opts . pointLabels . display ) { fitWithPointLabels ( me ) ; } else { me . setCenterPoint ( 0 , 0 , 0 , 0 ) ; } } , setReductions : function ( largestPossibleRadius , furthestLimits , furthestAngles ) { var me = this ; var radiusReductionLeft = furthestLimits . l / Math . sin ( furthestAngles . l ) ; var radiusReductionRight = Math . max ( furthestLimits . r - me . width , 0 ) / Math . sin ( furthestAngles . r ) ; var radiusReductionTop = - furthestLimits . t / Math . cos ( furthestAngles . t ) ; var radiusReductionBottom = - Math . max ( furthestLimits . b - ( me . height - me . paddingTop ) , 0 ) / Math . cos ( furthestAngles . b ) ; radiusReductionLeft = numberOrZero ( radiusReductionLeft ) ; radiusReductionRight = numberOrZero ( radiusReductionRight ) ; radiusReductionTop = numberOrZero ( radiusReductionTop ) ; radiusReductionBottom = numberOrZero ( radiusReductionBottom ) ; me . drawingArea = Math . min ( Math . floor ( largestPossibleRadius - ( radiusReductionLeft + radiusReductionRight ) / 2 ) , Math . floor ( largestPossibleRadius - ( radiusReductionTop + radiusReductionBottom ) / 2 ) ) ; me . setCenterPoint ( radiusReductionLeft , radiusReductionRight , radiusReductionTop , radiusReductionBottom ) ; } , setCenterPoint : function ( leftMovement , rightMovement , topMovement , bottomMovement ) { var me = this ; var maxRight = me . width - rightMovement - me . drawingArea ; var maxLeft = leftMovement + me . drawingArea ; var maxTop = topMovement + me . drawingArea ; var maxBottom = ( me . height - me . paddingTop ) - bottomMovement - me . drawingArea ; me . xCenter = Math . floor ( ( ( maxLeft + maxRight ) / 2 ) + me . left ) ; me . yCenter = Math . floor ( ( ( maxTop + maxBottom ) / 2 ) + me . top + me . paddingTop ) ; } , getIndexAngle : function ( index ) { var chart = this . chart ; var angleMultiplier = 360 / chart . data . labels . length ; var options = chart . options || { } ; var startAngle = options . startAngle || 0 ; var angle = ( index * angleMultiplier + startAngle ) % 360 ; return ( angle < 0 ? angle + 360 : angle ) * Math . PI * 2 / 360 ; } , getDistanceFromCenterForValue : function ( value ) { var me = this ; if ( helpers$1 . isNullOrUndef ( value ) ) { return NaN ; }
2019-05-09 18:54:39 +12:00
var scalingFactor = me . drawingArea / ( me . max - me . min ) ; if ( me . options . ticks . reverse ) { return ( me . max - value ) * scalingFactor ; }
2020-07-24 09:00:10 +12:00
return ( value - me . min ) * scalingFactor ; } , getPointPosition : function ( index , distanceFromCenter ) { var me = this ; var thisAngle = me . getIndexAngle ( index ) - ( Math . PI / 2 ) ; return { x : Math . cos ( thisAngle ) * distanceFromCenter + me . xCenter , y : Math . sin ( thisAngle ) * distanceFromCenter + me . yCenter } ; } , getPointPositionForValue : function ( index , value ) { return this . getPointPosition ( index , this . getDistanceFromCenterForValue ( value ) ) ; } , getBasePosition : function ( index ) { var me = this ; var min = me . min ; var max = me . max ; return me . getPointPositionForValue ( index || 0 , me . beginAtZero ? 0 : min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0 ) ; } , _drawGrid : function ( ) { var me = this ; var ctx = me . ctx ; var opts = me . options ; var gridLineOpts = opts . gridLines ; var angleLineOpts = opts . angleLines ; var lineWidth = valueOrDefault$c ( angleLineOpts . lineWidth , gridLineOpts . lineWidth ) ; var lineColor = valueOrDefault$c ( angleLineOpts . color , gridLineOpts . color ) ; var i , offset , position ; if ( opts . pointLabels . display ) { drawPointLabels ( me ) ; }
if ( gridLineOpts . display ) { helpers$1 . each ( me . ticks , function ( label , index ) { if ( index !== 0 ) { offset = me . getDistanceFromCenterForValue ( me . ticksAsNumbers [ index ] ) ; drawRadiusLine ( me , gridLineOpts , offset , index ) ; } } ) ; }
if ( angleLineOpts . display && lineWidth && lineColor ) { ctx . save ( ) ; ctx . lineWidth = lineWidth ; ctx . strokeStyle = lineColor ; if ( ctx . setLineDash ) { ctx . setLineDash ( resolve$4 ( [ angleLineOpts . borderDash , gridLineOpts . borderDash , [ ] ] ) ) ; ctx . lineDashOffset = resolve$4 ( [ angleLineOpts . borderDashOffset , gridLineOpts . borderDashOffset , 0.0 ] ) ; }
for ( i = me . chart . data . labels . length - 1 ; i >= 0 ; i -- ) { offset = me . getDistanceFromCenterForValue ( opts . ticks . reverse ? me . min : me . max ) ; position = me . getPointPosition ( i , offset ) ; ctx . beginPath ( ) ; ctx . moveTo ( me . xCenter , me . yCenter ) ; ctx . lineTo ( position . x , position . y ) ; ctx . stroke ( ) ; }
ctx . restore ( ) ; } } , _drawLabels : function ( ) { var me = this ; var ctx = me . ctx ; var opts = me . options ; var tickOpts = opts . ticks ; if ( ! tickOpts . display ) { return ; }
var startAngle = me . getIndexAngle ( 0 ) ; var tickFont = helpers$1 . options . _parseFont ( tickOpts ) ; var tickFontColor = valueOrDefault$c ( tickOpts . fontColor , core _defaults . global . defaultFontColor ) ; var offset , width ; ctx . save ( ) ; ctx . font = tickFont . string ; ctx . translate ( me . xCenter , me . yCenter ) ; ctx . rotate ( startAngle ) ; ctx . textAlign = 'center' ; ctx . textBaseline = 'middle' ; helpers$1 . each ( me . ticks , function ( label , index ) { if ( index === 0 && ! tickOpts . reverse ) { return ; }
offset = me . getDistanceFromCenterForValue ( me . ticksAsNumbers [ index ] ) ; if ( tickOpts . showLabelBackdrop ) { width = ctx . measureText ( label ) . width ; ctx . fillStyle = tickOpts . backdropColor ; ctx . fillRect ( - width / 2 - tickOpts . backdropPaddingX , - offset - tickFont . size / 2 - tickOpts . backdropPaddingY , width + tickOpts . backdropPaddingX * 2 , tickFont . size + tickOpts . backdropPaddingY * 2 ) ; }
ctx . fillStyle = tickFontColor ; ctx . fillText ( label , 0 , - offset ) ; } ) ; ctx . restore ( ) ; } , _drawTitle : helpers$1 . noop } ) ; var _defaults$3 = defaultConfig$3 ; scale _radialLinear . _defaults = _defaults$3 ; var deprecated$1 = helpers$1 . _deprecated ; var resolve$5 = helpers$1 . options . resolve ; var valueOrDefault$d = helpers$1 . valueOrDefault ; var MIN _INTEGER = Number . MIN _SAFE _INTEGER || - 9007199254740991 ; var MAX _INTEGER = Number . MAX _SAFE _INTEGER || 9007199254740991 ; var INTERVALS = { millisecond : { common : true , size : 1 , steps : 1000 } , second : { common : true , size : 1000 , steps : 60 } , minute : { common : true , size : 60000 , steps : 60 } , hour : { common : true , size : 3600000 , steps : 24 } , day : { common : true , size : 86400000 , steps : 30 } , week : { common : false , size : 604800000 , steps : 4 } , month : { common : true , size : 2.628 e9 , steps : 12 } , quarter : { common : false , size : 7.884 e9 , steps : 4 } , year : { common : true , size : 3.154 e10 } } ; var UNITS = Object . keys ( INTERVALS ) ; function sorter ( a , b ) { return a - b ; }
2019-05-09 18:54:39 +12:00
function arrayUnique ( items ) { var hash = { } ; var out = [ ] ; var i , ilen , item ; for ( i = 0 , ilen = items . length ; i < ilen ; ++ i ) { item = items [ i ] ; if ( ! hash [ item ] ) { hash [ item ] = true ; out . push ( item ) ; } }
return out ; }
2020-07-24 09:00:10 +12:00
function getMin ( options ) { return helpers$1 . valueOrDefault ( options . time . min , options . ticks . min ) ; }
function getMax ( options ) { return helpers$1 . valueOrDefault ( options . time . max , options . ticks . max ) ; }
2019-05-09 18:54:39 +12:00
function buildLookupTable ( timestamps , min , max , distribution ) { if ( distribution === 'linear' || ! timestamps . length ) { return [ { time : min , pos : 0 } , { time : max , pos : 1 } ] ; }
var table = [ ] ; var items = [ min ] ; var i , ilen , prev , curr , next ; for ( i = 0 , ilen = timestamps . length ; i < ilen ; ++ i ) { curr = timestamps [ i ] ; if ( curr > min && curr < max ) { items . push ( curr ) ; } }
items . push ( max ) ; for ( i = 0 , ilen = items . length ; i < ilen ; ++ i ) { next = items [ i + 1 ] ; prev = items [ i - 1 ] ; curr = items [ i ] ; if ( prev === undefined || next === undefined || Math . round ( ( next + prev ) / 2 ) !== curr ) { table . push ( { time : curr , pos : i / ( ilen - 1 ) } ) ; } }
return table ; }
function lookup ( table , key , value ) { var lo = 0 ; var hi = table . length - 1 ; var mid , i0 , i1 ; while ( lo >= 0 && lo <= hi ) { mid = ( lo + hi ) >> 1 ; i0 = table [ mid - 1 ] || null ; i1 = table [ mid ] ; if ( ! i0 ) { return { lo : null , hi : i1 } ; } else if ( i1 [ key ] < value ) { lo = mid + 1 ; } else if ( i0 [ key ] > value ) { hi = mid - 1 ; } else { return { lo : i0 , hi : i1 } ; } }
return { lo : i1 , hi : null } ; }
2020-07-24 09:00:10 +12:00
function interpolate$1 ( table , skey , sval , tkey ) { var range = lookup ( table , skey , sval ) ; var prev = ! range . lo ? table [ 0 ] : ! range . hi ? table [ table . length - 2 ] : range . lo ; var next = ! range . lo ? table [ 1 ] : ! range . hi ? table [ table . length - 1 ] : range . hi ; var span = next [ skey ] - prev [ skey ] ; var ratio = span ? ( sval - prev [ skey ] ) / span : 0 ; var offset = ( next [ tkey ] - prev [ tkey ] ) * ratio ; return prev [ tkey ] + offset ; }
function toTimestamp ( scale , input ) { var adapter = scale . _adapter ; var options = scale . options . time ; var parser = options . parser ; var format = parser || options . format ; var value = input ; if ( typeof parser === 'function' ) { value = parser ( value ) ; }
if ( ! helpers$1 . isFinite ( value ) ) { value = typeof format === 'string' ? adapter . parse ( value , format ) : adapter . parse ( value ) ; }
if ( value !== null ) { return + value ; }
if ( ! parser && typeof format === 'function' ) { value = format ( input ) ; if ( ! helpers$1 . isFinite ( value ) ) { value = adapter . parse ( value ) ; } }
2019-05-09 18:54:39 +12:00
return value ; }
2020-07-24 09:00:10 +12:00
function parse ( scale , input ) { if ( helpers$1 . isNullOrUndef ( input ) ) { return null ; }
var options = scale . options . time ; var value = toTimestamp ( scale , scale . getRightValue ( input ) ) ; if ( value === null ) { return value ; }
if ( options . round ) { value = + scale . _adapter . startOf ( value , options . round ) ; }
return value ; }
function determineUnitForAutoTicks ( minUnit , min , max , capacity ) { var ilen = UNITS . length ; var i , interval , factor ; for ( i = UNITS . indexOf ( minUnit ) ; i < ilen - 1 ; ++ i ) { interval = INTERVALS [ UNITS [ i ] ] ; factor = interval . steps ? interval . steps : MAX _INTEGER ; if ( interval . common && Math . ceil ( ( max - min ) / ( factor * interval . size ) ) <= capacity ) { return UNITS [ i ] ; } }
2019-05-09 18:54:39 +12:00
return UNITS [ ilen - 1 ] ; }
2020-07-24 09:00:10 +12:00
function determineUnitForFormatting ( scale , numTicks , minUnit , min , max ) { var i , unit ; for ( i = UNITS . length - 1 ; i >= UNITS . indexOf ( minUnit ) ; i -- ) { unit = UNITS [ i ] ; if ( INTERVALS [ unit ] . common && scale . _adapter . diff ( max , min , unit ) >= numTicks - 1 ) { return unit ; } }
2019-05-09 18:54:39 +12:00
return UNITS [ minUnit ? UNITS . indexOf ( minUnit ) : 0 ] ; }
function determineMajorUnit ( unit ) { for ( var i = UNITS . indexOf ( unit ) + 1 , ilen = UNITS . length ; i < ilen ; ++ i ) { if ( INTERVALS [ UNITS [ i ] ] . common ) { return UNITS [ i ] ; } } }
2020-07-24 09:00:10 +12:00
function generate ( scale , min , max , capacity ) { var adapter = scale . _adapter ; var options = scale . options ; var timeOpts = options . time ; var minor = timeOpts . unit || determineUnitForAutoTicks ( timeOpts . minUnit , min , max , capacity ) ; var stepSize = resolve$5 ( [ timeOpts . stepSize , timeOpts . unitStepSize , 1 ] ) ; var weekday = minor === 'week' ? timeOpts . isoWeekday : false ; var first = min ; var ticks = [ ] ; var time ; if ( weekday ) { first = + adapter . startOf ( first , 'isoWeek' , weekday ) ; }
first = + adapter . startOf ( first , weekday ? 'day' : minor ) ; if ( adapter . diff ( max , min , minor ) > 100000 * stepSize ) { throw min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor ; }
for ( time = first ; time < max ; time = + adapter . add ( time , stepSize , minor ) ) { ticks . push ( time ) ; }
if ( time === max || options . bounds === 'ticks' ) { ticks . push ( time ) ; }
return ticks ; }
function computeOffsets ( table , ticks , min , max , options ) { var start = 0 ; var end = 0 ; var first , last ; if ( options . offset && ticks . length ) { first = interpolate$1 ( table , 'time' , ticks [ 0 ] , 'pos' ) ; if ( ticks . length === 1 ) { start = 1 - first ; } else { start = ( interpolate$1 ( table , 'time' , ticks [ 1 ] , 'pos' ) - first ) / 2 ; }
last = interpolate$1 ( table , 'time' , ticks [ ticks . length - 1 ] , 'pos' ) ; if ( ticks . length === 1 ) { end = last ; } else { end = ( last - interpolate$1 ( table , 'time' , ticks [ ticks . length - 2 ] , 'pos' ) ) / 2 ; } }
return { start : start , end : end , factor : 1 / ( start + 1 + end ) } ; }
function setMajorTicks ( scale , ticks , map , majorUnit ) { var adapter = scale . _adapter ; var first = + adapter . startOf ( ticks [ 0 ] . value , majorUnit ) ; var last = ticks [ ticks . length - 1 ] . value ; var major , index ; for ( major = first ; major <= last ; major = + adapter . add ( major , 1 , majorUnit ) ) { index = map [ major ] ; if ( index >= 0 ) { ticks [ index ] . major = true ; } }
2019-05-09 18:54:39 +12:00
return ticks ; }
2020-07-24 09:00:10 +12:00
function ticksFromTimestamps ( scale , values , majorUnit ) { var ticks = [ ] ; var map = { } ; var ilen = values . length ; var i , value ; for ( i = 0 ; i < ilen ; ++ i ) { value = values [ i ] ; map [ value ] = i ; ticks . push ( { value : value , major : false } ) ; }
return ( ilen === 0 || ! majorUnit ) ? ticks : setMajorTicks ( scale , ticks , map , majorUnit ) ; }
var defaultConfig$4 = { position : 'bottom' , distribution : 'linear' , bounds : 'data' , adapters : { } , time : { parser : false , unit : false , round : false , displayFormat : false , isoWeekday : false , minUnit : 'millisecond' , displayFormats : { } } , ticks : { autoSkip : false , source : 'auto' , major : { enabled : false } } } ; var scale _time = core _scale . extend ( { initialize : function ( ) { this . mergeTicksOptions ( ) ; core _scale . prototype . initialize . call ( this ) ; } , update : function ( ) { var me = this ; var options = me . options ; var time = options . time || ( options . time = { } ) ; var adapter = me . _adapter = new core _adapters . _date ( options . adapters . date ) ; deprecated$1 ( 'time scale' , time . format , 'time.format' , 'time.parser' ) ; deprecated$1 ( 'time scale' , time . min , 'time.min' , 'ticks.min' ) ; deprecated$1 ( 'time scale' , time . max , 'time.max' , 'ticks.max' ) ; helpers$1 . mergeIf ( time . displayFormats , adapter . formats ( ) ) ; return core _scale . prototype . update . apply ( me , arguments ) ; } , getRightValue : function ( rawValue ) { if ( rawValue && rawValue . t !== undefined ) { rawValue = rawValue . t ; }
return core _scale . prototype . getRightValue . call ( this , rawValue ) ; } , determineDataLimits : function ( ) { var me = this ; var chart = me . chart ; var adapter = me . _adapter ; var options = me . options ; var unit = options . time . unit || 'day' ; var min = MAX _INTEGER ; var max = MIN _INTEGER ; var timestamps = [ ] ; var datasets = [ ] ; var labels = [ ] ; var i , j , ilen , jlen , data , timestamp , labelsAdded ; var dataLabels = me . _getLabels ( ) ; for ( i = 0 , ilen = dataLabels . length ; i < ilen ; ++ i ) { labels . push ( parse ( me , dataLabels [ i ] ) ) ; }
for ( i = 0 , ilen = ( chart . data . datasets || [ ] ) . length ; i < ilen ; ++ i ) { if ( chart . isDatasetVisible ( i ) ) { data = chart . data . datasets [ i ] . data ; if ( helpers$1 . isObject ( data [ 0 ] ) ) { datasets [ i ] = [ ] ; for ( j = 0 , jlen = data . length ; j < jlen ; ++ j ) { timestamp = parse ( me , data [ j ] ) ; timestamps . push ( timestamp ) ; datasets [ i ] [ j ] = timestamp ; } } else { datasets [ i ] = labels . slice ( 0 ) ; if ( ! labelsAdded ) { timestamps = timestamps . concat ( labels ) ; labelsAdded = true ; } } } else { datasets [ i ] = [ ] ; } }
if ( labels . length ) { min = Math . min ( min , labels [ 0 ] ) ; max = Math . max ( max , labels [ labels . length - 1 ] ) ; }
if ( timestamps . length ) { timestamps = ilen > 1 ? arrayUnique ( timestamps ) . sort ( sorter ) : timestamps . sort ( sorter ) ; min = Math . min ( min , timestamps [ 0 ] ) ; max = Math . max ( max , timestamps [ timestamps . length - 1 ] ) ; }
min = parse ( me , getMin ( options ) ) || min ; max = parse ( me , getMax ( options ) ) || max ; min = min === MAX _INTEGER ? + adapter . startOf ( Date . now ( ) , unit ) : min ; max = max === MIN _INTEGER ? + adapter . endOf ( Date . now ( ) , unit ) + 1 : max ; me . min = Math . min ( min , max ) ; me . max = Math . max ( min + 1 , max ) ; me . _table = [ ] ; me . _timestamps = { data : timestamps , datasets : datasets , labels : labels } ; } , buildTicks : function ( ) { var me = this ; var min = me . min ; var max = me . max ; var options = me . options ; var tickOpts = options . ticks ; var timeOpts = options . time ; var timestamps = me . _timestamps ; var ticks = [ ] ; var capacity = me . getLabelCapacity ( min ) ; var source = tickOpts . source ; var distribution = options . distribution ; var i , ilen , timestamp ; if ( source === 'data' || ( source === 'auto' && distribution === 'series' ) ) { timestamps = timestamps . data ; } else if ( source === 'labels' ) { timestamps = timestamps . labels ; } else { timestamps = generate ( me , min , max , capacity ) ; }
2019-05-09 18:54:39 +12:00
if ( options . bounds === 'ticks' && timestamps . length ) { min = timestamps [ 0 ] ; max = timestamps [ timestamps . length - 1 ] ; }
2020-07-24 09:00:10 +12:00
min = parse ( me , getMin ( options ) ) || min ; max = parse ( me , getMax ( options ) ) || max ; for ( i = 0 , ilen = timestamps . length ; i < ilen ; ++ i ) { timestamp = timestamps [ i ] ; if ( timestamp >= min && timestamp <= max ) { ticks . push ( timestamp ) ; } }
me . min = min ; me . max = max ; me . _unit = timeOpts . unit || ( tickOpts . autoSkip ? determineUnitForAutoTicks ( timeOpts . minUnit , me . min , me . max , capacity ) : determineUnitForFormatting ( me , ticks . length , timeOpts . minUnit , me . min , me . max ) ) ; me . _majorUnit = ! tickOpts . major . enabled || me . _unit === 'year' ? undefined : determineMajorUnit ( me . _unit ) ; me . _table = buildLookupTable ( me . _timestamps . data , min , max , distribution ) ; me . _offsets = computeOffsets ( me . _table , ticks , min , max , options ) ; if ( tickOpts . reverse ) { ticks . reverse ( ) ; }
return ticksFromTimestamps ( me , ticks , me . _majorUnit ) ; } , getLabelForIndex : function ( index , datasetIndex ) { var me = this ; var adapter = me . _adapter ; var data = me . chart . data ; var timeOpts = me . options . time ; var label = data . labels && index < data . labels . length ? data . labels [ index ] : '' ; var value = data . datasets [ datasetIndex ] . data [ index ] ; if ( helpers$1 . isObject ( value ) ) { label = me . getRightValue ( value ) ; }
if ( timeOpts . tooltipFormat ) { return adapter . format ( toTimestamp ( me , label ) , timeOpts . tooltipFormat ) ; }
2019-05-09 18:54:39 +12:00
if ( typeof label === 'string' ) { return label ; }
2020-07-24 09:00:10 +12:00
return adapter . format ( toTimestamp ( me , label ) , timeOpts . displayFormats . datetime ) ; } , tickFormatFunction : function ( time , index , ticks , format ) { var me = this ; var adapter = me . _adapter ; var options = me . options ; var formats = options . time . displayFormats ; var minorFormat = formats [ me . _unit ] ; var majorUnit = me . _majorUnit ; var majorFormat = formats [ majorUnit ] ; var tick = ticks [ index ] ; var tickOpts = options . ticks ; var major = majorUnit && majorFormat && tick && tick . major ; var label = adapter . format ( time , format ? format : major ? majorFormat : minorFormat ) ; var nestedTickOpts = major ? tickOpts . major : tickOpts . minor ; var formatter = resolve$5 ( [ nestedTickOpts . callback , nestedTickOpts . userCallback , tickOpts . callback , tickOpts . userCallback ] ) ; return formatter ? formatter ( label , index , ticks ) : label ; } , convertTicksToLabels : function ( ticks ) { var labels = [ ] ; var i , ilen ; for ( i = 0 , ilen = ticks . length ; i < ilen ; ++ i ) { labels . push ( this . tickFormatFunction ( ticks [ i ] . value , i , ticks ) ) ; }
return labels ; } , getPixelForOffset : function ( time ) { var me = this ; var offsets = me . _offsets ; var pos = interpolate$1 ( me . _table , 'time' , time , 'pos' ) ; return me . getPixelForDecimal ( ( offsets . start + pos ) * offsets . factor ) ; } , getPixelForValue : function ( value , index , datasetIndex ) { var me = this ; var time = null ; if ( index !== undefined && datasetIndex !== undefined ) { time = me . _timestamps . datasets [ datasetIndex ] [ index ] ; }
if ( time === null ) { time = parse ( me , value ) ; }
if ( time !== null ) { return me . getPixelForOffset ( time ) ; } } , getPixelForTick : function ( index ) { var ticks = this . getTicks ( ) ; return index >= 0 && index < ticks . length ? this . getPixelForOffset ( ticks [ index ] . value ) : null ; } , getValueForPixel : function ( pixel ) { var me = this ; var offsets = me . _offsets ; var pos = me . getDecimalForPixel ( pixel ) / offsets . factor - offsets . end ; var time = interpolate$1 ( me . _table , 'pos' , pos , 'time' ) ; return me . _adapter . _create ( time ) ; } , _getLabelSize : function ( label ) { var me = this ; var ticksOpts = me . options . ticks ; var tickLabelWidth = me . ctx . measureText ( label ) . width ; var angle = helpers$1 . toRadians ( me . isHorizontal ( ) ? ticksOpts . maxRotation : ticksOpts . minRotation ) ; var cosRotation = Math . cos ( angle ) ; var sinRotation = Math . sin ( angle ) ; var tickFontSize = valueOrDefault$d ( ticksOpts . fontSize , core _defaults . global . defaultFontSize ) ; return { w : ( tickLabelWidth * cosRotation ) + ( tickFontSize * sinRotation ) , h : ( tickLabelWidth * sinRotation ) + ( tickFontSize * cosRotation ) } ; } , getLabelWidth : function ( label ) { return this . _getLabelSize ( label ) . w ; } , getLabelCapacity : function ( exampleTime ) { var me = this ; var timeOpts = me . options . time ; var displayFormats = timeOpts . displayFormats ; var format = displayFormats [ timeOpts . unit ] || displayFormats . millisecond ; var exampleLabel = me . tickFormatFunction ( exampleTime , 0 , ticksFromTimestamps ( me , [ exampleTime ] , me . _majorUnit ) , format ) ; var size = me . _getLabelSize ( exampleLabel ) ; var capacity = Math . floor ( me . isHorizontal ( ) ? me . width / size . w : me . height / size . h ) ; if ( me . options . offset ) { capacity -- ; }
return capacity > 0 ? capacity : 1 ; } } ) ; var _defaults$4 = defaultConfig$4 ; scale _time . _defaults = _defaults$4 ; var scales = { category : scale _category , linear : scale _linear , logarithmic : scale _logarithmic , radialLinear : scale _radialLinear , time : scale _time } ; var FORMATS = { datetime : 'MMM D, YYYY, h:mm:ss a' , millisecond : 'h:mm:ss.SSS a' , second : 'h:mm:ss a' , minute : 'h:mm a' , hour : 'hA' , day : 'MMM D' , week : 'll' , month : 'MMM YYYY' , quarter : '[Q]Q - YYYY' , year : 'YYYY' } ; core _adapters . _date . override ( typeof moment === 'function' ? { _id : 'moment' , formats : function ( ) { return FORMATS ; } , parse : function ( value , format ) { if ( typeof value === 'string' && typeof format === 'string' ) { value = moment ( value , format ) ; } else if ( ! ( value instanceof moment ) ) { value = moment ( value ) ; }
return value . isValid ( ) ? value . valueOf ( ) : null ; } , format : function ( time , format ) { return moment ( time ) . format ( format ) ; } , add : function ( time , amount , unit ) { return moment ( time ) . add ( amount , unit ) . valueOf ( ) ; } , diff : function ( max , min , unit ) { return moment ( max ) . diff ( moment ( min ) , unit ) ; } , startOf : function ( time , unit , weekday ) { time = moment ( time ) ; if ( unit === 'isoWeek' ) { return time . isoWeekday ( weekday ) . valueOf ( ) ; }
return time . startOf ( unit ) . valueOf ( ) ; } , endOf : function ( time , unit ) { return moment ( time ) . endOf ( unit ) . valueOf ( ) ; } , _create : function ( time ) { return moment ( time ) ; } , } : { } ) ; core _defaults . _set ( 'global' , { plugins : { filler : { propagate : true } } } ) ; var mappers = { dataset : function ( source ) { var index = source . fill ; var chart = source . chart ; var meta = chart . getDatasetMeta ( index ) ; var visible = meta && chart . isDatasetVisible ( index ) ; var points = ( visible && meta . dataset . _children ) || [ ] ; var length = points . length || 0 ; return ! length ? null : function ( point , i ) { return ( i < length && points [ i ] . _view ) || null ; } ; } , boundary : function ( source ) { var boundary = source . boundary ; var x = boundary ? boundary . x : null ; var y = boundary ? boundary . y : null ; if ( helpers$1 . isArray ( boundary ) ) { return function ( point , i ) { return boundary [ i ] ; } ; }
return function ( point ) { return { x : x === null ? point . x : x , y : y === null ? point . y : y , } ; } ; } } ; function decodeFill ( el , index , count ) { var model = el . _model || { } ; var fill = model . fill ; var target ; if ( fill === undefined ) { fill = ! ! model . backgroundColor ; }
if ( fill === false || fill === null ) { return false ; }
if ( fill === true ) { return 'origin' ; }
target = parseFloat ( fill , 10 ) ; if ( isFinite ( target ) && Math . floor ( target ) === target ) { if ( fill [ 0 ] === '-' || fill [ 0 ] === '+' ) { target = index + target ; }
if ( target === index || target < 0 || target >= count ) { return false ; }
return target ; }
switch ( fill ) { case 'bottom' : return 'start' ; case 'top' : return 'end' ; case 'zero' : return 'origin' ; case 'origin' : case 'start' : case 'end' : return fill ; default : return false ; } }
function computeLinearBoundary ( source ) { var model = source . el . _model || { } ; var scale = source . el . _scale || { } ; var fill = source . fill ; var target = null ; var horizontal ; if ( isFinite ( fill ) ) { return null ; }
if ( fill === 'start' ) { target = model . scaleBottom === undefined ? scale . bottom : model . scaleBottom ; } else if ( fill === 'end' ) { target = model . scaleTop === undefined ? scale . top : model . scaleTop ; } else if ( model . scaleZero !== undefined ) { target = model . scaleZero ; } else if ( scale . getBasePixel ) { target = scale . getBasePixel ( ) ; }
if ( target !== undefined && target !== null ) { if ( target . x !== undefined && target . y !== undefined ) { return target ; }
if ( helpers$1 . isFinite ( target ) ) { horizontal = scale . isHorizontal ( ) ; return { x : horizontal ? target : null , y : horizontal ? null : target } ; } }
return null ; }
function computeCircularBoundary ( source ) { var scale = source . el . _scale ; var options = scale . options ; var length = scale . chart . data . labels . length ; var fill = source . fill ; var target = [ ] ; var start , end , center , i , point ; if ( ! length ) { return null ; }
start = options . ticks . reverse ? scale . max : scale . min ; end = options . ticks . reverse ? scale . min : scale . max ; center = scale . getPointPositionForValue ( 0 , start ) ; for ( i = 0 ; i < length ; ++ i ) { point = fill === 'start' || fill === 'end' ? scale . getPointPositionForValue ( i , fill === 'start' ? start : end ) : scale . getBasePosition ( i ) ; if ( options . gridLines . circular ) { point . cx = center . x ; point . cy = center . y ; point . angle = scale . getIndexAngle ( i ) - Math . PI / 2 ; }
target . push ( point ) ; }
return target ; }
function computeBoundary ( source ) { var scale = source . el . _scale || { } ; if ( scale . getPointPositionForValue ) { return computeCircularBoundary ( source ) ; }
return computeLinearBoundary ( source ) ; }
function resolveTarget ( sources , index , propagate ) { var source = sources [ index ] ; var fill = source . fill ; var visited = [ index ] ; var target ; if ( ! propagate ) { return fill ; }
while ( fill !== false && visited . indexOf ( fill ) === - 1 ) { if ( ! isFinite ( fill ) ) { return fill ; }
target = sources [ fill ] ; if ( ! target ) { return false ; }
if ( target . visible ) { return fill ; }
visited . push ( fill ) ; fill = target . fill ; }
return false ; }
function createMapper ( source ) { var fill = source . fill ; var type = 'dataset' ; if ( fill === false ) { return null ; }
if ( ! isFinite ( fill ) ) { type = 'boundary' ; }
return mappers [ type ] ( source ) ; }
function isDrawable ( point ) { return point && ! point . skip ; }
function drawArea ( ctx , curve0 , curve1 , len0 , len1 ) { var i , cx , cy , r ; if ( ! len0 || ! len1 ) { return ; }
ctx . moveTo ( curve0 [ 0 ] . x , curve0 [ 0 ] . y ) ; for ( i = 1 ; i < len0 ; ++ i ) { helpers$1 . canvas . lineTo ( ctx , curve0 [ i - 1 ] , curve0 [ i ] ) ; }
if ( curve1 [ 0 ] . angle !== undefined ) { cx = curve1 [ 0 ] . cx ; cy = curve1 [ 0 ] . cy ; r = Math . sqrt ( Math . pow ( curve1 [ 0 ] . x - cx , 2 ) + Math . pow ( curve1 [ 0 ] . y - cy , 2 ) ) ; for ( i = len1 - 1 ; i > 0 ; -- i ) { ctx . arc ( cx , cy , r , curve1 [ i ] . angle , curve1 [ i - 1 ] . angle , true ) ; }
return ; }
ctx . lineTo ( curve1 [ len1 - 1 ] . x , curve1 [ len1 - 1 ] . y ) ; for ( i = len1 - 1 ; i > 0 ; -- i ) { helpers$1 . canvas . lineTo ( ctx , curve1 [ i ] , curve1 [ i - 1 ] , true ) ; } }
function doFill ( ctx , points , mapper , view , color , loop ) { var count = points . length ; var span = view . spanGaps ; var curve0 = [ ] ; var curve1 = [ ] ; var len0 = 0 ; var len1 = 0 ; var i , ilen , index , p0 , p1 , d0 , d1 , loopOffset ; ctx . beginPath ( ) ; for ( i = 0 , ilen = count ; i < ilen ; ++ i ) { index = i % count ; p0 = points [ index ] . _view ; p1 = mapper ( p0 , index , view ) ; d0 = isDrawable ( p0 ) ; d1 = isDrawable ( p1 ) ; if ( loop && loopOffset === undefined && d0 ) { loopOffset = i + 1 ; ilen = count + loopOffset ; }
if ( d0 && d1 ) { len0 = curve0 . push ( p0 ) ; len1 = curve1 . push ( p1 ) ; } else if ( len0 && len1 ) { if ( ! span ) { drawArea ( ctx , curve0 , curve1 , len0 , len1 ) ; len0 = len1 = 0 ; curve0 = [ ] ; curve1 = [ ] ; } else { if ( d0 ) { curve0 . push ( p0 ) ; }
if ( d1 ) { curve1 . push ( p1 ) ; } } } }
drawArea ( ctx , curve0 , curve1 , len0 , len1 ) ; ctx . closePath ( ) ; ctx . fillStyle = color ; ctx . fill ( ) ; }
var plugin _filler = { id : 'filler' , afterDatasetsUpdate : function ( chart , options ) { var count = ( chart . data . datasets || [ ] ) . length ; var propagate = options . propagate ; var sources = [ ] ; var meta , i , el , source ; for ( i = 0 ; i < count ; ++ i ) { meta = chart . getDatasetMeta ( i ) ; el = meta . dataset ; source = null ; if ( el && el . _model && el instanceof elements . Line ) { source = { visible : chart . isDatasetVisible ( i ) , fill : decodeFill ( el , i , count ) , chart : chart , el : el } ; }
meta . $filler = source ; sources . push ( source ) ; }
for ( i = 0 ; i < count ; ++ i ) { source = sources [ i ] ; if ( ! source ) { continue ; }
source . fill = resolveTarget ( sources , i , propagate ) ; source . boundary = computeBoundary ( source ) ; source . mapper = createMapper ( source ) ; } } , beforeDatasetsDraw : function ( chart ) { var metasets = chart . _getSortedVisibleDatasetMetas ( ) ; var ctx = chart . ctx ; var meta , i , el , view , points , mapper , color ; for ( i = metasets . length - 1 ; i >= 0 ; -- i ) { meta = metasets [ i ] . $filler ; if ( ! meta || ! meta . visible ) { continue ; }
el = meta . el ; view = el . _view ; points = el . _children || [ ] ; mapper = meta . mapper ; color = view . backgroundColor || core _defaults . global . defaultColor ; if ( mapper && color && points . length ) { helpers$1 . canvas . clipArea ( ctx , chart . chartArea ) ; doFill ( ctx , points , mapper , view , color , el . _loop ) ; helpers$1 . canvas . unclipArea ( ctx ) ; } } } } ; var getRtlHelper$1 = helpers$1 . rtl . getRtlAdapter ; var noop$1 = helpers$1 . noop ; var valueOrDefault$e = helpers$1 . valueOrDefault ; core _defaults . _set ( 'global' , { legend : { display : true , position : 'top' , align : 'center' , fullWidth : true , reverse : false , weight : 1000 , onClick : function ( e , legendItem ) { var index = legendItem . datasetIndex ; var ci = this . chart ; var meta = ci . getDatasetMeta ( index ) ; meta . hidden = meta . hidden === null ? ! ci . data . datasets [ index ] . hidden : null ; ci . update ( ) ; } , onHover : null , onLeave : null , labels : { boxWidth : 40 , padding : 10 , generateLabels : function ( chart ) { var datasets = chart . data . datasets ; var options = chart . options . legend || { } ; var usePointStyle = options . labels && options . labels . usePointStyle ; return chart . _getSortedDatasetMetas ( ) . map ( function ( meta ) { var style = meta . controller . getStyle ( usePointStyle ? 0 : undefined ) ; return { text : datasets [ meta . index ] . label , fillStyle : style . backgroundColor , hidden : ! chart . isDatasetVisible ( meta . index ) , lineCap : style . borderCapStyle , lineDash : style . borderDash , lineDashOffset : style . borderDashOffset , lineJoin : style . borderJoinStyle , lineWidth : style . borderWidth , strokeStyle : style . borderColor , pointStyle : style . pointStyle , rotation : style . rotation , datasetIndex : meta . index } ; } , this ) ; } } } , legendCallback : function ( chart ) { var list = document . createElement ( 'ul' ) ; var datasets = chart . data . datasets ; var i , ilen , listItem , listItemSpan ; list . setAttribute ( 'class' , chart . id + '-legend' ) ; for ( i = 0 , ilen = datasets . length ; i < ilen ; i ++ ) { listItem = list . appendChild ( document . createElement ( 'li' ) ) ; listItemSpan = listItem . appendChild ( document . createElement ( 'span' ) ) ; listItemSpan . style . backgroundColor = datasets [ i ] . backgroundColor ; if ( datasets [ i ] . label ) { listItem . appendChild ( document . createTextNode ( datasets [ i ] . label ) ) ; } }
return list . outerHTML ; } } ) ; function getBoxWidth ( labelOpts , fontSize ) { return labelOpts . usePointStyle && labelOpts . boxWidth > fontSize ? fontSize : labelOpts . boxWidth ; }
var Legend = core _element . extend ( { initialize : function ( config ) { var me = this ; helpers$1 . extend ( me , config ) ; me . legendHitBoxes = [ ] ; me . _hoveredItem = null ; me . doughnutMode = false ; } , beforeUpdate : noop$1 , update : function ( maxWidth , maxHeight , margins ) { var me = this ; me . beforeUpdate ( ) ; me . maxWidth = maxWidth ; me . maxHeight = maxHeight ; me . margins = margins ; me . beforeSetDimensions ( ) ; me . setDimensions ( ) ; me . afterSetDimensions ( ) ; me . beforeBuildLabels ( ) ; me . buildLabels ( ) ; me . afterBuildLabels ( ) ; me . beforeFit ( ) ; me . fit ( ) ; me . afterFit ( ) ; me . afterUpdate ( ) ; return me . minSize ; } , afterUpdate : noop$1 , beforeSetDimensions : noop$1 , setDimensions : function ( ) { var me = this ; if ( me . isHorizontal ( ) ) { me . width = me . maxWidth ; me . left = 0 ; me . right = me . width ; } else { me . height = me . maxHeight ; me . top = 0 ; me . bottom = me . height ; }
me . paddingLeft = 0 ; me . paddingTop = 0 ; me . paddingRight = 0 ; me . paddingBottom = 0 ; me . minSize = { width : 0 , height : 0 } ; } , afterSetDimensions : noop$1 , beforeBuildLabels : noop$1 , buildLabels : function ( ) { var me = this ; var labelOpts = me . options . labels || { } ; var legendItems = helpers$1 . callback ( labelOpts . generateLabels , [ me . chart ] , me ) || [ ] ; if ( labelOpts . filter ) { legendItems = legendItems . filter ( function ( item ) { return labelOpts . filter ( item , me . chart . data ) ; } ) ; }
if ( me . options . reverse ) { legendItems . reverse ( ) ; }
me . legendItems = legendItems ; } , afterBuildLabels : noop$1 , beforeFit : noop$1 , fit : function ( ) { var me = this ; var opts = me . options ; var labelOpts = opts . labels ; var display = opts . display ; var ctx = me . ctx ; var labelFont = helpers$1 . options . _parseFont ( labelOpts ) ; var fontSize = labelFont . size ; var hitboxes = me . legendHitBoxes = [ ] ; var minSize = me . minSize ; var isHorizontal = me . isHorizontal ( ) ; if ( isHorizontal ) { minSize . width = me . maxWidth ; minSize . height = display ? 10 : 0 ; } else { minSize . width = display ? 10 : 0 ; minSize . height = me . maxHeight ; }
if ( ! display ) { me . width = minSize . width = me . height = minSize . height = 0 ; return ; }
ctx . font = labelFont . string ; if ( isHorizontal ) { var lineWidths = me . lineWidths = [ 0 ] ; var totalHeight = 0 ; ctx . textAlign = 'left' ; ctx . textBaseline = 'middle' ; helpers$1 . each ( me . legendItems , function ( legendItem , i ) { var boxWidth = getBoxWidth ( labelOpts , fontSize ) ; var width = boxWidth + ( fontSize / 2 ) + ctx . measureText ( legendItem . text ) . width ; if ( i === 0 || lineWidths [ lineWidths . length - 1 ] + width + 2 * labelOpts . padding > minSize . width ) { totalHeight += fontSize + labelOpts . padding ; lineWidths [ lineWidths . length - ( i > 0 ? 0 : 1 ) ] = 0 ; }
hitboxes [ i ] = { left : 0 , top : 0 , width : width , height : fontSize } ; lineWidths [ lineWidths . length - 1 ] += width + labelOpts . padding ; } ) ; minSize . height += totalHeight ; } else { var vPadding = labelOpts . padding ; var columnWidths = me . columnWidths = [ ] ; var columnHeights = me . columnHeights = [ ] ; var totalWidth = labelOpts . padding ; var currentColWidth = 0 ; var currentColHeight = 0 ; helpers$1 . each ( me . legendItems , function ( legendItem , i ) { var boxWidth = getBoxWidth ( labelOpts , fontSize ) ; var itemWidth = boxWidth + ( fontSize / 2 ) + ctx . measureText ( legendItem . text ) . width ; if ( i > 0 && currentColHeight + fontSize + 2 * vPadding > minSize . height ) { totalWidth += currentColWidth + labelOpts . padding ; columnWidths . push ( currentColWidth ) ; columnHeights . push ( currentColHeight ) ; currentColWidth = 0 ; currentColHeight = 0 ; }
currentColWidth = Math . max ( currentColWidth , itemWidth ) ; currentColHeight += fontSize + vPadding ; hitboxes [ i ] = { left : 0 , top : 0 , width : itemWidth , height : fontSize } ; } ) ; totalWidth += currentColWidth ; columnWidths . push ( currentColWidth ) ; columnHeights . push ( currentColHeight ) ; minSize . width += totalWidth ; }
me . width = minSize . width ; me . height = minSize . height ; } , afterFit : noop$1 , isHorizontal : function ( ) { return this . options . position === 'top' || this . options . position === 'bottom' ; } , draw : function ( ) { var me = this ; var opts = me . options ; var labelOpts = opts . labels ; var globalDefaults = core _defaults . global ; var defaultColor = globalDefaults . defaultColor ; var lineDefault = globalDefaults . elements . line ; var legendHeight = me . height ; var columnHeights = me . columnHeights ; var legendWidth = me . width ; var lineWidths = me . lineWidths ; if ( ! opts . display ) { return ; }
var rtlHelper = getRtlHelper$1 ( opts . rtl , me . left , me . minSize . width ) ; var ctx = me . ctx ; var fontColor = valueOrDefault$e ( labelOpts . fontColor , globalDefaults . defaultFontColor ) ; var labelFont = helpers$1 . options . _parseFont ( labelOpts ) ; var fontSize = labelFont . size ; var cursor ; ctx . textAlign = rtlHelper . textAlign ( 'left' ) ; ctx . textBaseline = 'middle' ; ctx . lineWidth = 0.5 ; ctx . strokeStyle = fontColor ; ctx . fillStyle = fontColor ; ctx . font = labelFont . string ; var boxWidth = getBoxWidth ( labelOpts , fontSize ) ; var hitboxes = me . legendHitBoxes ; var drawLegendBox = function ( x , y , legendItem ) { if ( isNaN ( boxWidth ) || boxWidth <= 0 ) { return ; }
ctx . save ( ) ; var lineWidth = valueOrDefault$e ( legendItem . lineWidth , lineDefault . borderWidth ) ; ctx . fillStyle = valueOrDefault$e ( legendItem . fillStyle , defaultColor ) ; ctx . lineCap = valueOrDefault$e ( legendItem . lineCap , lineDefault . borderCapStyle ) ; ctx . lineDashOffset = valueOrDefault$e ( legendItem . lineDashOffset , lineDefault . borderDashOffset ) ; ctx . lineJoin = valueOrDefault$e ( legendItem . lineJoin , lineDefault . borderJoinStyle ) ; ctx . lineWidth = lineWidth ; ctx . strokeStyle = valueOrDefault$e ( legendItem . strokeStyle , defaultColor ) ; if ( ctx . setLineDash ) { ctx . setLineDash ( valueOrDefault$e ( legendItem . lineDash , lineDefault . borderDash ) ) ; }
if ( labelOpts && labelOpts . usePointStyle ) { var radius = boxWidth * Math . SQRT2 / 2 ; var centerX = rtlHelper . xPlus ( x , boxWidth / 2 ) ; var centerY = y + fontSize / 2 ; helpers$1 . canvas . drawPoint ( ctx , legendItem . pointStyle , radius , centerX , centerY , legendItem . rotation ) ; } else { ctx . fillRect ( rtlHelper . leftForLtr ( x , boxWidth ) , y , boxWidth , fontSize ) ; if ( lineWidth !== 0 ) { ctx . strokeRect ( rtlHelper . leftForLtr ( x , boxWidth ) , y , boxWidth , fontSize ) ; } }
ctx . restore ( ) ; } ; var fillText = function ( x , y , legendItem , textWidth ) { var halfFontSize = fontSize / 2 ; var xLeft = rtlHelper . xPlus ( x , boxWidth + halfFontSize ) ; var yMiddle = y + halfFontSize ; ctx . fillText ( legendItem . text , xLeft , yMiddle ) ; if ( legendItem . hidden ) { ctx . beginPath ( ) ; ctx . lineWidth = 2 ; ctx . moveTo ( xLeft , yMiddle ) ; ctx . lineTo ( rtlHelper . xPlus ( xLeft , textWidth ) , yMiddle ) ; ctx . stroke ( ) ; } } ; var alignmentOffset = function ( dimension , blockSize ) { switch ( opts . align ) { case 'start' : return labelOpts . padding ; case 'end' : return dimension - blockSize ; default : return ( dimension - blockSize + labelOpts . padding ) / 2 ; } } ; var isHorizontal = me . isHorizontal ( ) ; if ( isHorizontal ) { cursor = { x : me . left + alignmentOffset ( legendWidth , lineWidths [ 0 ] ) , y : me . top + labelOpts . padding , line : 0 } ; } else { cursor = { x : me . left + labelOpts . padding , y : me . top + alignmentOffset ( legendHeight , columnHeights [ 0 ] ) , line : 0 } ; }
helpers$1 . rtl . overrideTextDirection ( me . ctx , opts . textDirection ) ; var itemHeight = fontSize + labelOpts . padding ; helpers$1 . each ( me . legendItems , function ( legendItem , i ) { var textWidth = ctx . measureText ( legendItem . text ) . width ; var width = boxWidth + ( fontSize / 2 ) + textWidth ; var x = cursor . x ; var y = cursor . y ; rtlHelper . setWidth ( me . minSize . width ) ; if ( isHorizontal ) { if ( i > 0 && x + width + labelOpts . padding > me . left + me . minSize . width ) { y = cursor . y += itemHeight ; cursor . line ++ ; x = cursor . x = me . left + alignmentOffset ( legendWidth , lineWidths [ cursor . line ] ) ; } } else if ( i > 0 && y + itemHeight > me . top + me . minSize . height ) { x = cursor . x = x + me . columnWidths [ cursor . line ] + labelOpts . padding ; cursor . line ++ ; y = cursor . y = me . top + alignmentOffset ( legendHeight , columnHeights [ cursor . line ] ) ; }
var realX = rtlHelper . x ( x ) ; drawLegendBox ( realX , y , legendItem ) ; hitboxes [ i ] . left = rtlHelper . leftForLtr ( realX , hitboxes [ i ] . width ) ; hitboxes [ i ] . top = y ; fillText ( realX , y , legendItem , textWidth ) ; if ( isHorizontal ) { cursor . x += width + labelOpts . padding ; } else { cursor . y += itemHeight ; } } ) ; helpers$1 . rtl . restoreTextDirection ( me . ctx , opts . textDirection ) ; } , _getLegendItemAt : function ( x , y ) { var me = this ; var i , hitBox , lh ; if ( x >= me . left && x <= me . right && y >= me . top && y <= me . bottom ) { lh = me . legendHitBoxes ; for ( i = 0 ; i < lh . length ; ++ i ) { hitBox = lh [ i ] ; if ( x >= hitBox . left && x <= hitBox . left + hitBox . width && y >= hitBox . top && y <= hitBox . top + hitBox . height ) { return me . legendItems [ i ] ; } } }
return null ; } , handleEvent : function ( e ) { var me = this ; var opts = me . options ; var type = e . type === 'mouseup' ? 'click' : e . type ; var hoveredItem ; if ( type === 'mousemove' ) { if ( ! opts . onHover && ! opts . onLeave ) { return ; } } else if ( type === 'click' ) { if ( ! opts . onClick ) { return ; } } else { return ; }
hoveredItem = me . _getLegendItemAt ( e . x , e . y ) ; if ( type === 'click' ) { if ( hoveredItem && opts . onClick ) { opts . onClick . call ( me , e . native , hoveredItem ) ; } } else { if ( opts . onLeave && hoveredItem !== me . _hoveredItem ) { if ( me . _hoveredItem ) { opts . onLeave . call ( me , e . native , me . _hoveredItem ) ; }
me . _hoveredItem = hoveredItem ; }
if ( opts . onHover && hoveredItem ) { opts . onHover . call ( me , e . native , hoveredItem ) ; } } } } ) ; function createNewLegendAndAttach ( chart , legendOpts ) { var legend = new Legend ( { ctx : chart . ctx , options : legendOpts , chart : chart } ) ; core _layouts . configure ( chart , legend , legendOpts ) ; core _layouts . addBox ( chart , legend ) ; chart . legend = legend ; }
var plugin _legend = { id : 'legend' , _element : Legend , beforeInit : function ( chart ) { var legendOpts = chart . options . legend ; if ( legendOpts ) { createNewLegendAndAttach ( chart , legendOpts ) ; } } , beforeUpdate : function ( chart ) { var legendOpts = chart . options . legend ; var legend = chart . legend ; if ( legendOpts ) { helpers$1 . mergeIf ( legendOpts , core _defaults . global . legend ) ; if ( legend ) { core _layouts . configure ( chart , legend , legendOpts ) ; legend . options = legendOpts ; } else { createNewLegendAndAttach ( chart , legendOpts ) ; } } else if ( legend ) { core _layouts . removeBox ( chart , legend ) ; delete chart . legend ; } } , afterEvent : function ( chart , e ) { var legend = chart . legend ; if ( legend ) { legend . handleEvent ( e ) ; } } } ; var noop$2 = helpers$1 . noop ; core _defaults . _set ( 'global' , { title : { display : false , fontStyle : 'bold' , fullWidth : true , padding : 10 , position : 'top' , text : '' , weight : 2000 } } ) ; var Title = core _element . extend ( { initialize : function ( config ) { var me = this ; helpers$1 . extend ( me , config ) ; me . legendHitBoxes = [ ] ; } , beforeUpdate : noop$2 , update : function ( maxWidth , maxHeight , margins ) { var me = this ; me . beforeUpdate ( ) ; me . maxWidth = maxWidth ; me . maxHeight = maxHeight ; me . margins = margins ; me . beforeSetDimensions ( ) ; me . setDimensions ( ) ; me . afterSetDimensions ( ) ; me . beforeBuildLabels ( ) ; me . buildLabels ( ) ; me . afterBuildLabels ( ) ; me . beforeFit ( ) ; me . fit ( ) ; me . afterFit ( ) ; me . afterUpdate ( ) ; return me . minSize ; } , afterUpdate : noop$2 , beforeSetDimensions : noop$2 , setDimensions : function ( ) { var me = this ; if ( me . isHorizontal ( ) ) { me . width = me . maxWidth ; me . left = 0 ; me . right = me . width ; } else { me . height = me . maxHeight ; me . top = 0 ; me . bottom = me . height ; }
me . paddingLeft = 0 ; me . paddingTop = 0 ; me . paddingRight = 0 ; me . paddingBottom = 0 ; me . minSize = { width : 0 , height : 0 } ; } , afterSetDimensions : noop$2 , beforeBuildLabels : noop$2 , buildLabels : noop$2 , afterBuildLabels : noop$2 , beforeFit : noop$2 , fit : function ( ) { var me = this ; var opts = me . options ; var minSize = me . minSize = { } ; var isHorizontal = me . isHorizontal ( ) ; var lineCount , textSize ; if ( ! opts . display ) { me . width = minSize . width = me . height = minSize . height = 0 ; return ; }
lineCount = helpers$1 . isArray ( opts . text ) ? opts . text . length : 1 ; textSize = lineCount * helpers$1 . options . _parseFont ( opts ) . lineHeight + opts . padding * 2 ; me . width = minSize . width = isHorizontal ? me . maxWidth : textSize ; me . height = minSize . height = isHorizontal ? textSize : me . maxHeight ; } , afterFit : noop$2 , isHorizontal : function ( ) { var pos = this . options . position ; return pos === 'top' || pos === 'bottom' ; } , draw : function ( ) { var me = this ; var ctx = me . ctx ; var opts = me . options ; if ( ! opts . display ) { return ; }
var fontOpts = helpers$1 . options . _parseFont ( opts ) ; var lineHeight = fontOpts . lineHeight ; var offset = lineHeight / 2 + opts . padding ; var rotation = 0 ; var top = me . top ; var left = me . left ; var bottom = me . bottom ; var right = me . right ; var maxWidth , titleX , titleY ; ctx . fillStyle = helpers$1 . valueOrDefault ( opts . fontColor , core _defaults . global . defaultFontColor ) ; ctx . font = fontOpts . string ; if ( me . isHorizontal ( ) ) { titleX = left + ( ( right - left ) / 2 ) ; titleY = top + offset ; maxWidth = right - left ; } else { titleX = opts . position === 'left' ? left + offset : right - offset ; titleY = top + ( ( bottom - top ) / 2 ) ; maxWidth = bottom - top ; rotation = Math . PI * ( opts . position === 'left' ? - 0.5 : 0.5 ) ; }
ctx . save ( ) ; ctx . translate ( titleX , titleY ) ; ctx . rotate ( rotation ) ; ctx . textAlign = 'center' ; ctx . textBaseline = 'middle' ; var text = opts . text ; if ( helpers$1 . isArray ( text ) ) { var y = 0 ; for ( var i = 0 ; i < text . length ; ++ i ) { ctx . fillText ( text [ i ] , 0 , y , maxWidth ) ; y += lineHeight ; } } else { ctx . fillText ( text , 0 , 0 , maxWidth ) ; }
ctx . restore ( ) ; } } ) ; function createNewTitleBlockAndAttach ( chart , titleOpts ) { var title = new Title ( { ctx : chart . ctx , options : titleOpts , chart : chart } ) ; core _layouts . configure ( chart , title , titleOpts ) ; core _layouts . addBox ( chart , title ) ; chart . titleBlock = title ; }
var plugin _title = { id : 'title' , _element : Title , beforeInit : function ( chart ) { var titleOpts = chart . options . title ; if ( titleOpts ) { createNewTitleBlockAndAttach ( chart , titleOpts ) ; } } , beforeUpdate : function ( chart ) { var titleOpts = chart . options . title ; var titleBlock = chart . titleBlock ; if ( titleOpts ) { helpers$1 . mergeIf ( titleOpts , core _defaults . global . title ) ; if ( titleBlock ) { core _layouts . configure ( chart , titleBlock , titleOpts ) ; titleBlock . options = titleOpts ; } else { createNewTitleBlockAndAttach ( chart , titleOpts ) ; } } else if ( titleBlock ) { core _layouts . removeBox ( chart , titleBlock ) ; delete chart . titleBlock ; } } } ; var plugins = { } ; var filler = plugin _filler ; var legend = plugin _legend ; var title = plugin _title ; plugins . filler = filler ; plugins . legend = legend ; plugins . title = title ; core _controller . helpers = helpers$1 ; core _helpers ( ) ; core _controller . _adapters = core _adapters ; core _controller . Animation = core _animation ; core _controller . animationService = core _animations ; core _controller . controllers = controllers ; core _controller . DatasetController = core _datasetController ; core _controller . defaults = core _defaults ; core _controller . Element = core _element ; core _controller . elements = elements ; core _controller . Interaction = core _interaction ; core _controller . layouts = core _layouts ; core _controller . platform = platform ; core _controller . plugins = core _plugins ; core _controller . Scale = core _scale ; core _controller . scaleService = core _scaleService ; core _controller . Ticks = core _ticks ; core _controller . Tooltip = core _tooltip ; core _controller . helpers . each ( scales , function ( scale , type ) { core _controller . scaleService . registerScaleType ( type , scale , scale . _defaults ) ; } ) ; for ( var k in plugins ) { if ( plugins . hasOwnProperty ( k ) ) { core _controller . plugins . register ( plugins [ k ] ) ; } }
core _controller . platform . initialize ( ) ; var src = core _controller ; if ( typeof window !== 'undefined' ) { window . Chart = core _controller ; }
core _controller . Chart = core _controller ; core _controller . Legend = plugins . legend . _element ; core _controller . Title = plugins . title . _element ; core _controller . pluginService = core _controller . plugins ; core _controller . PluginBase = core _controller . Element . extend ( { } ) ; core _controller . canvasHelpers = core _controller . helpers . canvas ; core _controller . layoutService = core _controller . layouts ; core _controller . LinearScaleBase = scale _linearbase ; core _controller . helpers . each ( [ 'Bar' , 'Bubble' , 'Doughnut' , 'Line' , 'PolarArea' , 'Radar' , 'Scatter' ] , function ( klass ) { core _controller [ klass ] = function ( ctx , cfg ) { return new core _controller ( ctx , core _controller . helpers . merge ( cfg || { } , { type : klass . charAt ( 0 ) . toLowerCase ( ) + klass . slice ( 1 ) } ) ) ; } ; } ) ; return src ; } ) ) ) ; ( function ( f ) { if ( typeof exports === "object" && typeof module !== "undefined" ) { module . exports = f ( ) } else if ( typeof define === "function" && define . amd ) { define ( [ ] , f ) } else { var g ; if ( typeof window !== "undefined" ) { g = window } else if ( typeof global !== "undefined" ) { g = global } else if ( typeof self !== "undefined" ) { g = self } else { g = this } g . markdownit = f ( ) } } ) ( function ( ) { var define , module , exports ; return ( function e ( t , n , r ) { function s ( o , u ) { if ( ! n [ o ] ) { if ( ! t [ o ] ) { var a = typeof require == "function" && require ; if ( ! u && a ) return a ( o , ! 0 ) ; if ( i ) return i ( o , ! 0 ) ; var f = new Error ( "Cannot find module '" + o + "'" ) ; throw f . code = "MODULE_NOT_FOUND" , f } var l = n [ o ] = { exports : { } } ; t [ o ] [ 0 ] . call ( l . exports , function ( e ) { var n = t [ o ] [ 1 ] [ e ] ; return s ( n ? n : e ) } , l , l . exports , e , t , n , r ) } return n [ o ] . exports } var i = typeof require == "function" && require ; for ( var o = 0 ; o < r . length ; o ++ ) s ( r [ o ] ) ; return s } ) ( { 1 : [ function ( require , module , exports ) { 'use strict' ; module . exports = require ( 'entities/maps/entities.json' ) ; } , { "entities/maps/entities.json" : 52 } ] , 2 : [ function ( require , module , exports ) { 'use strict' ; module . exports = [ 'address' , 'article' , 'aside' , 'base' , 'basefont' , 'blockquote' , 'body' , 'caption' , 'center' , 'col' , 'colgroup' , 'dd' , 'details' , 'dialog' , 'dir' , 'div' , 'dl' , 'dt' , 'fieldset' , 'figcaption' , 'figure' , 'footer' , 'form' , 'frame' , 'frameset' , 'h1' , 'h2' , 'h3' , 'h4' , 'h5' , 'h6' , 'head' , 'header' , 'hr' , 'html' , 'iframe' , 'legend' , 'li' , 'link' , 'main' , 'menu' , 'menuitem' , 'meta' , 'nav' , 'noframes' , 'ol' , 'optgroup' , 'option' , 'p' , 'param' , 'section' , 'source' , 'summary' , 'table' , 'tbody' , 'td' , 'tfoot' , 'th' , 'thead' , 'title' , 'tr' , 'track' , 'ul' ] ; } , { } ] , 3 : [ function ( require , module , exports ) { 'use strict' ; var attr _name = '[a-zA-Z_:][a-zA-Z0-9:._-]*' ; var unquoted = '[^"\'=<>`\\x00-\\x20]+' ; var single _quoted = "'[^']*'" ; var double _quoted = '"[^"]*"' ; var attr _value = '(?:' + unquoted + '|' + single _quoted + '|' + double _quoted + ')' ; var attribute = '(?:\\s+' + attr _name + '(?:\\s*=\\s*' + attr _value + ')?)' ; var open _tag = '<[A-Za-z][A-Za-z0-9\\-]*' + attribute + '*\\s*\\/?>' ; var close _tag = '<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>' ; var comment = '<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->' ; var processing = '<[?].*?[?]>' ; var declaration = '<![A-Z]+\\s+[^>]*>' ; var cdata = '<!\\[CDATA\\[[\\s\\S]*?\\]\\]>' ; var HTML _TAG _RE = new RegExp ( '^(?:' + open _tag + '|' + close _tag + '|' + comment + '|' + processing + '|' + declaration + '|' + cdata + ')' ) ; var HTML _OPEN _CLOSE _TAG _RE = new RegExp ( '^(?:' + open _tag + '|' + close _tag + ')' ) ; module . exports . HTML _TAG _RE = HTML _TAG _RE ; module . exports . HTML _OPEN _CLOSE _TAG _RE = HTML _OPEN _CLOSE _TAG _RE ; } , { } ] , 4 : [ function ( require , module , exports ) { 'use strict' ; function _class ( obj ) { return Object . prototype . toString . call ( obj ) ; }
2019-05-09 18:54:39 +12:00
function isString ( obj ) { return _class ( obj ) === '[object String]' ; }
var _hasOwnProperty = Object . prototype . hasOwnProperty ; function has ( object , key ) { return _hasOwnProperty . call ( object , key ) ; }
function assign ( obj ) { var sources = Array . prototype . slice . call ( arguments , 1 ) ; sources . forEach ( function ( source ) { if ( ! source ) { return ; }
if ( typeof source !== 'object' ) { throw new TypeError ( source + 'must be object' ) ; }
Object . keys ( source ) . forEach ( function ( key ) { obj [ key ] = source [ key ] ; } ) ; } ) ; return obj ; }
function arrayReplaceAt ( src , pos , newElements ) { return [ ] . concat ( src . slice ( 0 , pos ) , newElements , src . slice ( pos + 1 ) ) ; }
function isValidEntityCode ( c ) { if ( c >= 0xD800 && c <= 0xDFFF ) { return false ; }
if ( c >= 0xFDD0 && c <= 0xFDEF ) { return false ; }
if ( ( c & 0xFFFF ) === 0xFFFF || ( c & 0xFFFF ) === 0xFFFE ) { return false ; }
if ( c >= 0x00 && c <= 0x08 ) { return false ; }
if ( c === 0x0B ) { return false ; }
if ( c >= 0x0E && c <= 0x1F ) { return false ; }
if ( c >= 0x7F && c <= 0x9F ) { return false ; }
if ( c > 0x10FFFF ) { return false ; }
return true ; }
function fromCodePoint ( c ) { if ( c > 0xffff ) { c -= 0x10000 ; var surrogate1 = 0xd800 + ( c >> 10 ) , surrogate2 = 0xdc00 + ( c & 0x3ff ) ; return String . fromCharCode ( surrogate1 , surrogate2 ) ; }
return String . fromCharCode ( c ) ; }
var UNESCAPE _MD _RE = /\\([!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])/g ; var ENTITY _RE = /&([a-z#][a-z0-9]{1,31});/gi ; var UNESCAPE _ALL _RE = new RegExp ( UNESCAPE _MD _RE . source + '|' + ENTITY _RE . source , 'gi' ) ; var DIGITAL _ENTITY _TEST _RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i ; var entities = require ( './entities' ) ; function replaceEntityPattern ( match , name ) { var code = 0 ; if ( has ( entities , name ) ) { return entities [ name ] ; }
if ( name . charCodeAt ( 0 ) === 0x23 && DIGITAL _ENTITY _TEST _RE . test ( name ) ) { code = name [ 1 ] . toLowerCase ( ) === 'x' ? parseInt ( name . slice ( 2 ) , 16 ) : parseInt ( name . slice ( 1 ) , 10 ) ; if ( isValidEntityCode ( code ) ) { return fromCodePoint ( code ) ; } }
return match ; }
function unescapeMd ( str ) { if ( str . indexOf ( '\\' ) < 0 ) { return str ; }
return str . replace ( UNESCAPE _MD _RE , '$1' ) ; }
function unescapeAll ( str ) { if ( str . indexOf ( '\\' ) < 0 && str . indexOf ( '&' ) < 0 ) { return str ; }
return str . replace ( UNESCAPE _ALL _RE , function ( match , escaped , entity ) { if ( escaped ) { return escaped ; }
return replaceEntityPattern ( match , entity ) ; } ) ; }
var HTML _ESCAPE _TEST _RE = /[&<>"]/ ; var HTML _ESCAPE _REPLACE _RE = /[&<>"]/g ; var HTML _REPLACEMENTS = { '&' : '&' , '<' : '<' , '>' : '>' , '"' : '"' } ; function replaceUnsafeChar ( ch ) { return HTML _REPLACEMENTS [ ch ] ; }
function escapeHtml ( str ) { if ( HTML _ESCAPE _TEST _RE . test ( str ) ) { return str . replace ( HTML _ESCAPE _REPLACE _RE , replaceUnsafeChar ) ; }
return str ; }
var REGEXP _ESCAPE _RE = /[.?*+^$[\]\\(){}|-]/g ; function escapeRE ( str ) { return str . replace ( REGEXP _ESCAPE _RE , '\\$&' ) ; }
function isSpace ( code ) { switch ( code ) { case 0x09 : case 0x20 : return true ; }
return false ; }
function isWhiteSpace ( code ) { if ( code >= 0x2000 && code <= 0x200A ) { return true ; }
switch ( code ) { case 0x09 : case 0x0A : case 0x0B : case 0x0C : case 0x0D : case 0x20 : case 0xA0 : case 0x1680 : case 0x202F : case 0x205F : case 0x3000 : return true ; }
return false ; }
var UNICODE _PUNCT _RE = require ( 'uc.micro/categories/P/regex' ) ; function isPunctChar ( ch ) { return UNICODE _PUNCT _RE . test ( ch ) ; }
function isMdAsciiPunct ( ch ) { switch ( ch ) { case 0x21 : case 0x22 : case 0x23 : case 0x24 : case 0x25 : case 0x26 : case 0x27 : case 0x28 : case 0x29 : case 0x2A : case 0x2B : case 0x2C : case 0x2D : case 0x2E : case 0x2F : case 0x3A : case 0x3B : case 0x3C : case 0x3D : case 0x3E : case 0x3F : case 0x40 : case 0x5B : case 0x5C : case 0x5D : case 0x5E : case 0x5F : case 0x60 : case 0x7B : case 0x7C : case 0x7D : case 0x7E : return true ; default : return false ; } }
function normalizeReference ( str ) { return str . trim ( ) . replace ( /\s+/g , ' ' ) . toUpperCase ( ) ; }
exports . lib = { } ; exports . lib . mdurl = require ( 'mdurl' ) ; exports . lib . ucmicro = require ( 'uc.micro' ) ; exports . assign = assign ; exports . isString = isString ; exports . has = has ; exports . unescapeMd = unescapeMd ; exports . unescapeAll = unescapeAll ; exports . isValidEntityCode = isValidEntityCode ; exports . fromCodePoint = fromCodePoint ; exports . escapeHtml = escapeHtml ; exports . arrayReplaceAt = arrayReplaceAt ; exports . isSpace = isSpace ; exports . isWhiteSpace = isWhiteSpace ; exports . isMdAsciiPunct = isMdAsciiPunct ; exports . isPunctChar = isPunctChar ; exports . escapeRE = escapeRE ; exports . normalizeReference = normalizeReference ; } , { "./entities" : 1 , "mdurl" : 58 , "uc.micro" : 65 , "uc.micro/categories/P/regex" : 63 } ] , 5 : [ function ( require , module , exports ) { 'use strict' ; exports . parseLinkLabel = require ( './parse_link_label' ) ; exports . parseLinkDestination = require ( './parse_link_destination' ) ; exports . parseLinkTitle = require ( './parse_link_title' ) ; } , { "./parse_link_destination" : 6 , "./parse_link_label" : 7 , "./parse_link_title" : 8 } ] , 6 : [ function ( require , module , exports ) { 'use strict' ; var isSpace = require ( '../common/utils' ) . isSpace ; var unescapeAll = require ( '../common/utils' ) . unescapeAll ; module . exports = function parseLinkDestination ( str , pos , max ) { var code , level , lines = 0 , start = pos , result = { ok : false , pos : 0 , lines : 0 , str : '' } ; if ( str . charCodeAt ( pos ) === 0x3C ) { pos ++ ; while ( pos < max ) { code = str . charCodeAt ( pos ) ; if ( code === 0x0A || isSpace ( code ) ) { return result ; }
if ( code === 0x3E ) { result . pos = pos + 1 ; result . str = unescapeAll ( str . slice ( start + 1 , pos ) ) ; result . ok = true ; return result ; }
if ( code === 0x5C && pos + 1 < max ) { pos += 2 ; continue ; }
pos ++ ; }
return result ; }
level = 0 ; while ( pos < max ) { code = str . charCodeAt ( pos ) ; if ( code === 0x20 ) { break ; }
if ( code < 0x20 || code === 0x7F ) { break ; }
if ( code === 0x5C && pos + 1 < max ) { pos += 2 ; continue ; }
if ( code === 0x28 ) { level ++ ; }
if ( code === 0x29 ) { if ( level === 0 ) { break ; }
level -- ; }
pos ++ ; }
if ( start === pos ) { return result ; }
if ( level !== 0 ) { return result ; }
result . str = unescapeAll ( str . slice ( start , pos ) ) ; result . lines = lines ; result . pos = pos ; result . ok = true ; return result ; } ; } , { "../common/utils" : 4 } ] , 7 : [ function ( require , module , exports ) { 'use strict' ; module . exports = function parseLinkLabel ( state , start , disableNested ) { var level , found , marker , prevPos , labelEnd = - 1 , max = state . posMax , oldPos = state . pos ; state . pos = start + 1 ; level = 1 ; while ( state . pos < max ) { marker = state . src . charCodeAt ( state . pos ) ; if ( marker === 0x5D ) { level -- ; if ( level === 0 ) { found = true ; break ; } }
prevPos = state . pos ; state . md . inline . skipToken ( state ) ; if ( marker === 0x5B ) { if ( prevPos === state . pos - 1 ) { level ++ ; } else if ( disableNested ) { state . pos = oldPos ; return - 1 ; } } }
if ( found ) { labelEnd = state . pos ; }
state . pos = oldPos ; return labelEnd ; } ; } , { } ] , 8 : [ function ( require , module , exports ) { 'use strict' ; var unescapeAll = require ( '../common/utils' ) . unescapeAll ; module . exports = function parseLinkTitle ( str , pos , max ) { var code , marker , lines = 0 , start = pos , result = { ok : false , pos : 0 , lines : 0 , str : '' } ; if ( pos >= max ) { return result ; }
marker = str . charCodeAt ( pos ) ; if ( marker !== 0x22 && marker !== 0x27 && marker !== 0x28 ) { return result ; }
pos ++ ; if ( marker === 0x28 ) { marker = 0x29 ; }
while ( pos < max ) { code = str . charCodeAt ( pos ) ; if ( code === marker ) { result . pos = pos + 1 ; result . lines = lines ; result . str = unescapeAll ( str . slice ( start + 1 , pos ) ) ; result . ok = true ; return result ; } else if ( code === 0x0A ) { lines ++ ; } else if ( code === 0x5C && pos + 1 < max ) { pos ++ ; if ( str . charCodeAt ( pos ) === 0x0A ) { lines ++ ; } }
pos ++ ; }
return result ; } ; } , { "../common/utils" : 4 } ] , 9 : [ function ( require , module , exports ) { 'use strict' ; var utils = require ( './common/utils' ) ; var helpers = require ( './helpers' ) ; var Renderer = require ( './renderer' ) ; var ParserCore = require ( './parser_core' ) ; var ParserBlock = require ( './parser_block' ) ; var ParserInline = require ( './parser_inline' ) ; var LinkifyIt = require ( 'linkify-it' ) ; var mdurl = require ( 'mdurl' ) ; var punycode = require ( 'punycode' ) ; var config = { 'default' : require ( './presets/default' ) , zero : require ( './presets/zero' ) , commonmark : require ( './presets/commonmark' ) } ; var BAD _PROTO _RE = /^(vbscript|javascript|file|data):/ ; var GOOD _DATA _RE = /^data:image\/(gif|png|jpeg|webp);/ ; function validateLink ( url ) { var str = url . trim ( ) . toLowerCase ( ) ; return BAD _PROTO _RE . test ( str ) ? ( GOOD _DATA _RE . test ( str ) ? true : false ) : true ; }
var RECODE _HOSTNAME _FOR = [ 'http:' , 'https:' , 'mailto:' ] ; function normalizeLink ( url ) { var parsed = mdurl . parse ( url , true ) ; if ( parsed . hostname ) { if ( ! parsed . protocol || RECODE _HOSTNAME _FOR . indexOf ( parsed . protocol ) >= 0 ) { try { parsed . hostname = punycode . toASCII ( parsed . hostname ) ; } catch ( er ) { } } }
return mdurl . encode ( mdurl . format ( parsed ) ) ; }
function normalizeLinkText ( url ) { var parsed = mdurl . parse ( url , true ) ; if ( parsed . hostname ) { if ( ! parsed . protocol || RECODE _HOSTNAME _FOR . indexOf ( parsed . protocol ) >= 0 ) { try { parsed . hostname = punycode . toUnicode ( parsed . hostname ) ; } catch ( er ) { } } }
return mdurl . decode ( mdurl . format ( parsed ) ) ; }
function MarkdownIt ( presetName , options ) { if ( ! ( this instanceof MarkdownIt ) ) { return new MarkdownIt ( presetName , options ) ; }
if ( ! options ) { if ( ! utils . isString ( presetName ) ) { options = presetName || { } ; presetName = 'default' ; } }
this . inline = new ParserInline ( ) ; this . block = new ParserBlock ( ) ; this . core = new ParserCore ( ) ; this . renderer = new Renderer ( ) ; this . linkify = new LinkifyIt ( ) ; this . validateLink = validateLink ; this . normalizeLink = normalizeLink ; this . normalizeLinkText = normalizeLinkText ; this . utils = utils ; this . helpers = utils . assign ( { } , helpers ) ; this . options = { } ; this . configure ( presetName ) ; if ( options ) { this . set ( options ) ; } }
MarkdownIt . prototype . set = function ( options ) { utils . assign ( this . options , options ) ; return this ; } ; MarkdownIt . prototype . configure = function ( presets ) { var self = this , presetName ; if ( utils . isString ( presets ) ) { presetName = presets ; presets = config [ presetName ] ; if ( ! presets ) { throw new Error ( 'Wrong `markdown-it` preset "' + presetName + '", check name' ) ; } }
if ( ! presets ) { throw new Error ( 'Wrong `markdown-it` preset, can\'t be empty' ) ; }
if ( presets . options ) { self . set ( presets . options ) ; }
if ( presets . components ) { Object . keys ( presets . components ) . forEach ( function ( name ) { if ( presets . components [ name ] . rules ) { self [ name ] . ruler . enableOnly ( presets . components [ name ] . rules ) ; }
if ( presets . components [ name ] . rules2 ) { self [ name ] . ruler2 . enableOnly ( presets . components [ name ] . rules2 ) ; } } ) ; }
return this ; } ; MarkdownIt . prototype . enable = function ( list , ignoreInvalid ) { var result = [ ] ; if ( ! Array . isArray ( list ) ) { list = [ list ] ; }
[ 'core' , 'block' , 'inline' ] . forEach ( function ( chain ) { result = result . concat ( this [ chain ] . ruler . enable ( list , true ) ) ; } , this ) ; result = result . concat ( this . inline . ruler2 . enable ( list , true ) ) ; var missed = list . filter ( function ( name ) { return result . indexOf ( name ) < 0 ; } ) ; if ( missed . length && ! ignoreInvalid ) { throw new Error ( 'MarkdownIt. Failed to enable unknown rule(s): ' + missed ) ; }
return this ; } ; MarkdownIt . prototype . disable = function ( list , ignoreInvalid ) { var result = [ ] ; if ( ! Array . isArray ( list ) ) { list = [ list ] ; }
[ 'core' , 'block' , 'inline' ] . forEach ( function ( chain ) { result = result . concat ( this [ chain ] . ruler . disable ( list , true ) ) ; } , this ) ; result = result . concat ( this . inline . ruler2 . disable ( list , true ) ) ; var missed = list . filter ( function ( name ) { return result . indexOf ( name ) < 0 ; } ) ; if ( missed . length && ! ignoreInvalid ) { throw new Error ( 'MarkdownIt. Failed to disable unknown rule(s): ' + missed ) ; }
return this ; } ; MarkdownIt . prototype . use = function ( plugin ) { var args = [ this ] . concat ( Array . prototype . slice . call ( arguments , 1 ) ) ; plugin . apply ( plugin , args ) ; return this ; } ; MarkdownIt . prototype . parse = function ( src , env ) { if ( typeof src !== 'string' ) { throw new Error ( 'Input data should be a String' ) ; }
var state = new this . core . State ( src , this , env ) ; this . core . process ( state ) ; return state . tokens ; } ; MarkdownIt . prototype . render = function ( src , env ) { env = env || { } ; return this . renderer . render ( this . parse ( src , env ) , this . options , env ) ; } ; MarkdownIt . prototype . parseInline = function ( src , env ) { var state = new this . core . State ( src , this , env ) ; state . inlineMode = true ; this . core . process ( state ) ; return state . tokens ; } ; MarkdownIt . prototype . renderInline = function ( src , env ) { env = env || { } ; return this . renderer . render ( this . parseInline ( src , env ) , this . options , env ) ; } ; module . exports = MarkdownIt ; } , { "./common/utils" : 4 , "./helpers" : 5 , "./parser_block" : 10 , "./parser_core" : 11 , "./parser_inline" : 12 , "./presets/commonmark" : 13 , "./presets/default" : 14 , "./presets/zero" : 15 , "./renderer" : 16 , "linkify-it" : 53 , "mdurl" : 58 , "punycode" : 60 } ] , 10 : [ function ( require , module , exports ) { 'use strict' ; var Ruler = require ( './ruler' ) ; var _rules = [ [ 'table' , require ( './rules_block/table' ) , [ 'paragraph' , 'reference' ] ] , [ 'code' , require ( './rules_block/code' ) ] , [ 'fence' , require ( './rules_block/fence' ) , [ 'paragraph' , 'reference' , 'blockquote' , 'list' ] ] , [ 'blockquote' , require ( './rules_block/blockquote' ) , [ 'paragraph' , 'reference' , 'blockquote' , 'list' ] ] , [ 'hr' , require ( './rules_block/hr' ) , [ 'paragraph' , 'reference' , 'blockquote' , 'list' ] ] , [ 'list' , require ( './rules_block/list' ) , [ 'paragraph' , 'reference' , 'blockquote' ] ] , [ 'reference' , require ( './rules_block/reference' ) ] , [ 'heading' , require ( './rules_block/heading' ) , [ 'paragraph' , 'reference' , 'blockquote' ] ] , [ 'lheading' , require ( './rules_block/lheading' ) ] , [ 'html_block' , require ( './rules_block/html_block' ) , [ 'paragraph' , 'reference' , 'blockquote' ] ] , [ 'paragraph' , require ( './rules_block/paragraph' ) ] ] ; function ParserBlock ( ) { this . ruler = new Ruler ( ) ; for ( var i = 0 ; i < _rules . length ; i ++ ) { this . ruler . push ( _rules [ i ] [ 0 ] , _rules [ i ] [ 1 ] , { alt : ( _rules [ i ] [ 2 ] || [ ] ) . slice ( ) } ) ; } }
ParserBlock . prototype . tokenize = function ( state , startLine , endLine ) { var ok , i , rules = this . ruler . getRules ( '' ) , len = rules . length , line = startLine , hasEmptyLines = false , maxNesting = state . md . options . maxNesting ; while ( line < endLine ) { state . line = line = state . skipEmptyLines ( line ) ; if ( line >= endLine ) { break ; }
if ( state . sCount [ line ] < state . blkIndent ) { break ; }
if ( state . level >= maxNesting ) { state . line = endLine ; break ; }
for ( i = 0 ; i < len ; i ++ ) { ok = rules [ i ] ( state , line , endLine , false ) ; if ( ok ) { break ; } }
state . tight = ! hasEmptyLines ; if ( state . isEmpty ( state . line - 1 ) ) { hasEmptyLines = true ; }
line = state . line ; if ( line < endLine && state . isEmpty ( line ) ) { hasEmptyLines = true ; line ++ ; state . line = line ; } } } ; ParserBlock . prototype . parse = function ( src , md , env , outTokens ) { var state ; if ( ! src ) { return ; }
state = new this . State ( src , md , env , outTokens ) ; this . tokenize ( state , state . line , state . lineMax ) ; } ; ParserBlock . prototype . State = require ( './rules_block/state_block' ) ; module . exports = ParserBlock ; } , { "./ruler" : 17 , "./rules_block/blockquote" : 18 , "./rules_block/code" : 19 , "./rules_block/fence" : 20 , "./rules_block/heading" : 21 , "./rules_block/hr" : 22 , "./rules_block/html_block" : 23 , "./rules_block/lheading" : 24 , "./rules_block/list" : 25 , "./rules_block/paragraph" : 26 , "./rules_block/reference" : 27 , "./rules_block/state_block" : 28 , "./rules_block/table" : 29 } ] , 11 : [ function ( require , module , exports ) { 'use strict' ; var Ruler = require ( './ruler' ) ; var _rules = [ [ 'normalize' , require ( './rules_core/normalize' ) ] , [ 'block' , require ( './rules_core/block' ) ] , [ 'inline' , require ( './rules_core/inline' ) ] , [ 'linkify' , require ( './rules_core/linkify' ) ] , [ 'replacements' , require ( './rules_core/replacements' ) ] , [ 'smartquotes' , require ( './rules_core/smartquotes' ) ] ] ; function Core ( ) { this . ruler = new Ruler ( ) ; for ( var i = 0 ; i < _rules . length ; i ++ ) { this . ruler . push ( _rules [ i ] [ 0 ] , _rules [ i ] [ 1 ] ) ; } }
Core . prototype . process = function ( state ) { var i , l , rules ; rules = this . ruler . getRules ( '' ) ; for ( i = 0 , l = rules . length ; i < l ; i ++ ) { rules [ i ] ( state ) ; } } ; Core . prototype . State = require ( './rules_core/state_core' ) ; module . exports = Core ; } , { "./ruler" : 17 , "./rules_core/block" : 30 , "./rules_core/inline" : 31 , "./rules_core/linkify" : 32 , "./rules_core/normalize" : 33 , "./rules_core/replacements" : 34 , "./rules_core/smartquotes" : 35 , "./rules_core/state_core" : 36 } ] , 12 : [ function ( require , module , exports ) { 'use strict' ; var Ruler = require ( './ruler' ) ; var _rules = [ [ 'text' , require ( './rules_inline/text' ) ] , [ 'newline' , require ( './rules_inline/newline' ) ] , [ 'escape' , require ( './rules_inline/escape' ) ] , [ 'backticks' , require ( './rules_inline/backticks' ) ] , [ 'strikethrough' , require ( './rules_inline/strikethrough' ) . tokenize ] , [ 'emphasis' , require ( './rules_inline/emphasis' ) . tokenize ] , [ 'link' , require ( './rules_inline/link' ) ] , [ 'image' , require ( './rules_inline/image' ) ] , [ 'autolink' , require ( './rules_inline/autolink' ) ] , [ 'html_inline' , require ( './rules_inline/html_inline' ) ] , [ 'entity' , require ( './rules_inline/entity' ) ] ] ; var _rules2 = [ [ 'balance_pairs' , require ( './rules_inline/balance_pairs' ) ] , [ 'strikethrough' , require ( './rules_inline/strikethrough' ) . postProcess ] , [ 'emphasis' , require ( './rules_inline/emphasis' ) . postProcess ] , [ 'text_collapse' , require ( './rules_inline/text_collapse' ) ] ] ; function ParserInline ( ) { var i ; this . ruler = new Ruler ( ) ; for ( i = 0 ; i < _rules . length ; i ++ ) { this . ruler . push ( _rules [ i ] [ 0 ] , _rules [ i ] [ 1 ] ) ; }
this . ruler2 = new Ruler ( ) ; for ( i = 0 ; i < _rules2 . length ; i ++ ) { this . ruler2 . push ( _rules2 [ i ] [ 0 ] , _rules2 [ i ] [ 1 ] ) ; } }
ParserInline . prototype . skipToken = function ( state ) { var ok , i , pos = state . pos , rules = this . ruler . getRules ( '' ) , len = rules . length , maxNesting = state . md . options . maxNesting , cache = state . cache ; if ( typeof cache [ pos ] !== 'undefined' ) { state . pos = cache [ pos ] ; return ; }
if ( state . level < maxNesting ) { for ( i = 0 ; i < len ; i ++ ) { state . level ++ ; ok = rules [ i ] ( state , true ) ; state . level -- ; if ( ok ) { break ; } } } else { state . pos = state . posMax ; }
if ( ! ok ) { state . pos ++ ; }
cache [ pos ] = state . pos ; } ; ParserInline . prototype . tokenize = function ( state ) { var ok , i , rules = this . ruler . getRules ( '' ) , len = rules . length , end = state . posMax , maxNesting = state . md . options . maxNesting ; while ( state . pos < end ) { if ( state . level < maxNesting ) { for ( i = 0 ; i < len ; i ++ ) { ok = rules [ i ] ( state , false ) ; if ( ok ) { break ; } } }
if ( ok ) { if ( state . pos >= end ) { break ; }
continue ; }
state . pending += state . src [ state . pos ++ ] ; }
if ( state . pending ) { state . pushPending ( ) ; } } ; ParserInline . prototype . parse = function ( str , md , env , outTokens ) { var i , rules , len ; var state = new this . State ( str , md , env , outTokens ) ; this . tokenize ( state ) ; rules = this . ruler2 . getRules ( '' ) ; len = rules . length ; for ( i = 0 ; i < len ; i ++ ) { rules [ i ] ( state ) ; } } ; ParserInline . prototype . State = require ( './rules_inline/state_inline' ) ; module . exports = ParserInline ; } , { "./ruler" : 17 , "./rules_inline/autolink" : 37 , "./rules_inline/backticks" : 38 , "./rules_inline/balance_pairs" : 39 , "./rules_inline/emphasis" : 40 , "./rules_inline/entity" : 41 , "./rules_inline/escape" : 42 , "./rules_inline/html_inline" : 43 , "./rules_inline/image" : 44 , "./rules_inline/link" : 45 , "./rules_inline/newline" : 46 , "./rules_inline/state_inline" : 47 , "./rules_inline/strikethrough" : 48 , "./rules_inline/text" : 49 , "./rules_inline/text_collapse" : 50 } ] , 13 : [ function ( require , module , exports ) { 'use strict' ; module . exports = { options : { html : true , xhtmlOut : true , breaks : false , langPrefix : 'language-' , linkify : false , typographer : false , quotes : '\u201c\u201d\u2018\u2019' , highlight : null , maxNesting : 20 } , components : { core : { rules : [ 'normalize' , 'block' , 'inline' ] } , block : { rules : [ 'blockquote' , 'code' , 'fence' , 'heading' , 'hr' , 'html_block' , 'lheading' , 'list' , 'reference' , 'paragraph' ] } , inline : { rules : [ 'autolink' , 'backticks' , 'emphasis' , 'entity' , 'escape' , 'html_inline' , 'image' , 'link' , 'newline' , 'text' ] , rules2 : [ 'balance_pairs' , 'emphasis' , 'text_collapse' ] } } } ; } , { } ] , 14 : [ function ( require , module , exports ) { 'use strict' ; module . exports = { options : { html : false , xhtmlOut : false , breaks : false , langPrefix : 'language-' , linkify : false , typographer : false , quotes : '\u201c\u201d\u2018\u2019' , highlight : null , maxNesting : 100 } , components : { core : { } , block : { } , inline : { } } } ; } , { } ] , 15 : [ function ( require , module , exports ) { 'use strict' ; module . exports = { options : { html : false , xhtmlOut : false , breaks : false , langPrefix : 'language-' , linkify : false , typographer : false , quotes : '\u201c\u201d\u2018\u2019' , highlight : null , maxNesting : 20 } , components : { core : { rules : [ 'normalize' , 'block' , 'inline' ] } , block : { rules : [ 'paragraph' ] } , inline : { rules : [ 'text' ] , rules2 : [ 'balance_pairs' , 'text_collapse' ] } } } ; } , { } ] , 16 : [ function ( require , module , exports ) { 'use strict' ; var assign = require ( './common/utils' ) . assign ; var unescapeAll = require ( './common/utils' ) . unescapeAll ; var escapeHtml = require ( './common/utils' ) . escapeHtml ; var default _rules = { } ; default _rules . code _inline = function ( tokens , idx , options , env , slf ) { var token = tokens [ idx ] ; return '<code' + slf . renderAttrs ( token ) + '>' +
escapeHtml ( tokens [ idx ] . content ) + '</code>' ; } ; default _rules . code _block = function ( tokens , idx , options , env , slf ) { var token = tokens [ idx ] ; return '<pre' + slf . renderAttrs ( token ) + '><code>' +
escapeHtml ( tokens [ idx ] . content ) + '</code></pre>\n' ; } ; default _rules . fence = function ( tokens , idx , options , env , slf ) { var token = tokens [ idx ] , info = token . info ? unescapeAll ( token . info ) . trim ( ) : '' , langName = '' , highlighted , i , tmpAttrs , tmpToken ; if ( info ) { langName = info . split ( /\s+/g ) [ 0 ] ; }
if ( options . highlight ) { highlighted = options . highlight ( token . content , langName ) || escapeHtml ( token . content ) ; } else { highlighted = escapeHtml ( token . content ) ; }
if ( highlighted . indexOf ( '<pre' ) === 0 ) { return highlighted + '\n' ; }
if ( info ) { i = token . attrIndex ( 'class' ) ; tmpAttrs = token . attrs ? token . attrs . slice ( ) : [ ] ; if ( i < 0 ) { tmpAttrs . push ( [ 'class' , options . langPrefix + langName ] ) ; } else { tmpAttrs [ i ] [ 1 ] += ' ' + options . langPrefix + langName ; }
tmpToken = { attrs : tmpAttrs } ; return '<pre><code' + slf . renderAttrs ( tmpToken ) + '>'
+ highlighted
+ '</code></pre>\n' ; }
return '<pre><code' + slf . renderAttrs ( token ) + '>'
+ highlighted
+ '</code></pre>\n' ; } ; default _rules . image = function ( tokens , idx , options , env , slf ) { var token = tokens [ idx ] ; token . attrs [ token . attrIndex ( 'alt' ) ] [ 1 ] = slf . renderInlineAsText ( token . children , options , env ) ; return slf . renderToken ( tokens , idx , options ) ; } ; default _rules . hardbreak = function ( tokens , idx , options ) { return options . xhtmlOut ? '<br />\n' : '<br>\n' ; } ; default _rules . softbreak = function ( tokens , idx , options ) { return options . breaks ? ( options . xhtmlOut ? '<br />\n' : '<br>\n' ) : '\n' ; } ; default _rules . text = function ( tokens , idx ) { return escapeHtml ( tokens [ idx ] . content ) ; } ; default _rules . html _block = function ( tokens , idx ) { return tokens [ idx ] . content ; } ; default _rules . html _inline = function ( tokens , idx ) { return tokens [ idx ] . content ; } ; function Renderer ( ) { this . rules = assign ( { } , default _rules ) ; }
Renderer . prototype . renderAttrs = function renderAttrs ( token ) { var i , l , result ; if ( ! token . attrs ) { return '' ; }
result = '' ; for ( i = 0 , l = token . attrs . length ; i < l ; i ++ ) { result += ' ' + escapeHtml ( token . attrs [ i ] [ 0 ] ) + '="' + escapeHtml ( token . attrs [ i ] [ 1 ] ) + '"' ; }
return result ; } ; Renderer . prototype . renderToken = function renderToken ( tokens , idx , options ) { var nextToken , result = '' , needLf = false , token = tokens [ idx ] ; if ( token . hidden ) { return '' ; }
if ( token . block && token . nesting !== - 1 && idx && tokens [ idx - 1 ] . hidden ) { result += '\n' ; }
result += ( token . nesting === - 1 ? '</' : '<' ) + token . tag ; result += this . renderAttrs ( token ) ; if ( token . nesting === 0 && options . xhtmlOut ) { result += ' /' ; }
if ( token . block ) { needLf = true ; if ( token . nesting === 1 ) { if ( idx + 1 < tokens . length ) { nextToken = tokens [ idx + 1 ] ; if ( nextToken . type === 'inline' || nextToken . hidden ) { needLf = false ; } else if ( nextToken . nesting === - 1 && nextToken . tag === token . tag ) { needLf = false ; } } } }
result += needLf ? '>\n' : '>' ; return result ; } ; Renderer . prototype . renderInline = function ( tokens , options , env ) { var type , result = '' , rules = this . rules ; for ( var i = 0 , len = tokens . length ; i < len ; i ++ ) { type = tokens [ i ] . type ; if ( typeof rules [ type ] !== 'undefined' ) { result += rules [ type ] ( tokens , i , options , env , this ) ; } else { result += this . renderToken ( tokens , i , options ) ; } }
return result ; } ; Renderer . prototype . renderInlineAsText = function ( tokens , options , env ) { var result = '' ; for ( var i = 0 , len = tokens . length ; i < len ; i ++ ) { if ( tokens [ i ] . type === 'text' ) { result += tokens [ i ] . content ; } else if ( tokens [ i ] . type === 'image' ) { result += this . renderInlineAsText ( tokens [ i ] . children , options , env ) ; } }
return result ; } ; Renderer . prototype . render = function ( tokens , options , env ) { var i , len , type , result = '' , rules = this . rules ; for ( i = 0 , len = tokens . length ; i < len ; i ++ ) { type = tokens [ i ] . type ; if ( type === 'inline' ) { result += this . renderInline ( tokens [ i ] . children , options , env ) ; } else if ( typeof rules [ type ] !== 'undefined' ) { result += rules [ tokens [ i ] . type ] ( tokens , i , options , env , this ) ; } else { result += this . renderToken ( tokens , i , options , env ) ; } }
return result ; } ; module . exports = Renderer ; } , { "./common/utils" : 4 } ] , 17 : [ function ( require , module , exports ) { 'use strict' ; function Ruler ( ) { this . _ _rules _ _ = [ ] ; this . _ _cache _ _ = null ; }
Ruler . prototype . _ _find _ _ = function ( name ) { for ( var i = 0 ; i < this . _ _rules _ _ . length ; i ++ ) { if ( this . _ _rules _ _ [ i ] . name === name ) { return i ; } }
return - 1 ; } ; Ruler . prototype . _ _compile _ _ = function ( ) { var self = this ; var chains = [ '' ] ; self . _ _rules _ _ . forEach ( function ( rule ) { if ( ! rule . enabled ) { return ; }
rule . alt . forEach ( function ( altName ) { if ( chains . indexOf ( altName ) < 0 ) { chains . push ( altName ) ; } } ) ; } ) ; self . _ _cache _ _ = { } ; chains . forEach ( function ( chain ) { self . _ _cache _ _ [ chain ] = [ ] ; self . _ _rules _ _ . forEach ( function ( rule ) { if ( ! rule . enabled ) { return ; }
if ( chain && rule . alt . indexOf ( chain ) < 0 ) { return ; }
self . _ _cache _ _ [ chain ] . push ( rule . fn ) ; } ) ; } ) ; } ; Ruler . prototype . at = function ( name , fn , options ) { var index = this . _ _find _ _ ( name ) ; var opt = options || { } ; if ( index === - 1 ) { throw new Error ( 'Parser rule not found: ' + name ) ; }
this . _ _rules _ _ [ index ] . fn = fn ; this . _ _rules _ _ [ index ] . alt = opt . alt || [ ] ; this . _ _cache _ _ = null ; } ; Ruler . prototype . before = function ( beforeName , ruleName , fn , options ) { var index = this . _ _find _ _ ( beforeName ) ; var opt = options || { } ; if ( index === - 1 ) { throw new Error ( 'Parser rule not found: ' + beforeName ) ; }
this . _ _rules _ _ . splice ( index , 0 , { name : ruleName , enabled : true , fn : fn , alt : opt . alt || [ ] } ) ; this . _ _cache _ _ = null ; } ; Ruler . prototype . after = function ( afterName , ruleName , fn , options ) { var index = this . _ _find _ _ ( afterName ) ; var opt = options || { } ; if ( index === - 1 ) { throw new Error ( 'Parser rule not found: ' + afterName ) ; }
this . _ _rules _ _ . splice ( index + 1 , 0 , { name : ruleName , enabled : true , fn : fn , alt : opt . alt || [ ] } ) ; this . _ _cache _ _ = null ; } ; Ruler . prototype . push = function ( ruleName , fn , options ) { var opt = options || { } ; this . _ _rules _ _ . push ( { name : ruleName , enabled : true , fn : fn , alt : opt . alt || [ ] } ) ; this . _ _cache _ _ = null ; } ; Ruler . prototype . enable = function ( list , ignoreInvalid ) { if ( ! Array . isArray ( list ) ) { list = [ list ] ; }
var result = [ ] ; list . forEach ( function ( name ) { var idx = this . _ _find _ _ ( name ) ; if ( idx < 0 ) { if ( ignoreInvalid ) { return ; }
throw new Error ( 'Rules manager: invalid rule name ' + name ) ; }
this . _ _rules _ _ [ idx ] . enabled = true ; result . push ( name ) ; } , this ) ; this . _ _cache _ _ = null ; return result ; } ; Ruler . prototype . enableOnly = function ( list , ignoreInvalid ) { if ( ! Array . isArray ( list ) ) { list = [ list ] ; }
this . _ _rules _ _ . forEach ( function ( rule ) { rule . enabled = false ; } ) ; this . enable ( list , ignoreInvalid ) ; } ; Ruler . prototype . disable = function ( list , ignoreInvalid ) { if ( ! Array . isArray ( list ) ) { list = [ list ] ; }
var result = [ ] ; list . forEach ( function ( name ) { var idx = this . _ _find _ _ ( name ) ; if ( idx < 0 ) { if ( ignoreInvalid ) { return ; }
throw new Error ( 'Rules manager: invalid rule name ' + name ) ; }
this . _ _rules _ _ [ idx ] . enabled = false ; result . push ( name ) ; } , this ) ; this . _ _cache _ _ = null ; return result ; } ; Ruler . prototype . getRules = function ( chainName ) { if ( this . _ _cache _ _ === null ) { this . _ _compile _ _ ( ) ; }
return this . _ _cache _ _ [ chainName ] || [ ] ; } ; module . exports = Ruler ; } , { } ] , 18 : [ function ( require , module , exports ) { 'use strict' ; var isSpace = require ( '../common/utils' ) . isSpace ; module . exports = function blockquote ( state , startLine , endLine , silent ) { var adjustTab , ch , i , initial , l , lastLineEmpty , lines , nextLine , offset , oldBMarks , oldBSCount , oldIndent , oldParentType , oldSCount , oldTShift , spaceAfterMarker , terminate , terminatorRules , token , wasOutdented , oldLineMax = state . lineMax , pos = state . bMarks [ startLine ] + state . tShift [ startLine ] , max = state . eMarks [ startLine ] ; if ( state . sCount [ startLine ] - state . blkIndent >= 4 ) { return false ; }
if ( state . src . charCodeAt ( pos ++ ) !== 0x3E ) { return false ; }
if ( silent ) { return true ; }
initial = offset = state . sCount [ startLine ] + pos - ( state . bMarks [ startLine ] + state . tShift [ startLine ] ) ; if ( state . src . charCodeAt ( pos ) === 0x20 ) { pos ++ ; initial ++ ; offset ++ ; adjustTab = false ; spaceAfterMarker = true ; } else if ( state . src . charCodeAt ( pos ) === 0x09 ) { spaceAfterMarker = true ; if ( ( state . bsCount [ startLine ] + offset ) % 4 === 3 ) { pos ++ ; initial ++ ; offset ++ ; adjustTab = false ; } else { adjustTab = true ; } } else { spaceAfterMarker = false ; }
oldBMarks = [ state . bMarks [ startLine ] ] ; state . bMarks [ startLine ] = pos ; while ( pos < max ) { ch = state . src . charCodeAt ( pos ) ; if ( isSpace ( ch ) ) { if ( ch === 0x09 ) { offset += 4 - ( offset + state . bsCount [ startLine ] + ( adjustTab ? 1 : 0 ) ) % 4 ; } else { offset ++ ; } } else { break ; }
pos ++ ; }
oldBSCount = [ state . bsCount [ startLine ] ] ; state . bsCount [ startLine ] = state . sCount [ startLine ] + 1 + ( spaceAfterMarker ? 1 : 0 ) ; lastLineEmpty = pos >= max ; oldSCount = [ state . sCount [ startLine ] ] ; state . sCount [ startLine ] = offset - initial ; oldTShift = [ state . tShift [ startLine ] ] ; state . tShift [ startLine ] = pos - state . bMarks [ startLine ] ; terminatorRules = state . md . block . ruler . getRules ( 'blockquote' ) ; oldParentType = state . parentType ; state . parentType = 'blockquote' ; wasOutdented = false ; for ( nextLine = startLine + 1 ; nextLine < endLine ; nextLine ++ ) { if ( state . sCount [ nextLine ] < state . blkIndent ) wasOutdented = true ; pos = state . bMarks [ nextLine ] + state . tShift [ nextLine ] ; max = state . eMarks [ nextLine ] ; if ( pos >= max ) { break ; }
if ( state . src . charCodeAt ( pos ++ ) === 0x3E && ! wasOutdented ) { initial = offset = state . sCount [ nextLine ] + pos - ( state . bMarks [ nextLine ] + state . tShift [ nextLine ] ) ; if ( state . src . charCodeAt ( pos ) === 0x20 ) { pos ++ ; initial ++ ; offset ++ ; adjustTab = false ; spaceAfterMarker = true ; } else if ( state . src . charCodeAt ( pos ) === 0x09 ) { spaceAfterMarker = true ; if ( ( state . bsCount [ nextLine ] + offset ) % 4 === 3 ) { pos ++ ; initial ++ ; offset ++ ; adjustTab = false ; } else { adjustTab = true ; } } else { spaceAfterMarker = false ; }
oldBMarks . push ( state . bMarks [ nextLine ] ) ; state . bMarks [ nextLine ] = pos ; while ( pos < max ) { ch = state . src . charCodeAt ( pos ) ; if ( isSpace ( ch ) ) { if ( ch === 0x09 ) { offset += 4 - ( offset + state . bsCount [ nextLine ] + ( adjustTab ? 1 : 0 ) ) % 4 ; } else { offset ++ ; } } else { break ; }
pos ++ ; }
lastLineEmpty = pos >= max ; oldBSCount . push ( state . bsCount [ nextLine ] ) ; state . bsCount [ nextLine ] = state . sCount [ nextLine ] + 1 + ( spaceAfterMarker ? 1 : 0 ) ; oldSCount . push ( state . sCount [ nextLine ] ) ; state . sCount [ nextLine ] = offset - initial ; oldTShift . push ( state . tShift [ nextLine ] ) ; state . tShift [ nextLine ] = pos - state . bMarks [ nextLine ] ; continue ; }
if ( lastLineEmpty ) { break ; }
terminate = false ; for ( i = 0 , l = terminatorRules . length ; i < l ; i ++ ) { if ( terminatorRules [ i ] ( state , nextLine , endLine , true ) ) { terminate = true ; break ; } }
if ( terminate ) { state . lineMax = nextLine ; if ( state . blkIndent !== 0 ) { oldBMarks . push ( state . bMarks [ nextLine ] ) ; oldBSCount . push ( state . bsCount [ nextLine ] ) ; oldTShift . push ( state . tShift [ nextLine ] ) ; oldSCount . push ( state . sCount [ nextLine ] ) ; state . sCount [ nextLine ] -= state . blkIndent ; }
break ; }
oldBMarks . push ( state . bMarks [ nextLine ] ) ; oldBSCount . push ( state . bsCount [ nextLine ] ) ; oldTShift . push ( state . tShift [ nextLine ] ) ; oldSCount . push ( state . sCount [ nextLine ] ) ; state . sCount [ nextLine ] = - 1 ; }
oldIndent = state . blkIndent ; state . blkIndent = 0 ; token = state . push ( 'blockquote_open' , 'blockquote' , 1 ) ; token . markup = '>' ; token . map = lines = [ startLine , 0 ] ; state . md . block . tokenize ( state , startLine , nextLine ) ; token = state . push ( 'blockquote_close' , 'blockquote' , - 1 ) ; token . markup = '>' ; state . lineMax = oldLineMax ; state . parentType = oldParentType ; lines [ 1 ] = state . line ; for ( i = 0 ; i < oldTShift . length ; i ++ ) { state . bMarks [ i + startLine ] = oldBMarks [ i ] ; state . tShift [ i + startLine ] = oldTShift [ i ] ; state . sCount [ i + startLine ] = oldSCount [ i ] ; state . bsCount [ i + startLine ] = oldBSCount [ i ] ; }
state . blkIndent = oldIndent ; return true ; } ; } , { "../common/utils" : 4 } ] , 19 : [ function ( require , module , exports ) { 'use strict' ; module . exports = function code ( state , startLine , endLine ) { var nextLine , last , token ; if ( state . sCount [ startLine ] - state . blkIndent < 4 ) { return false ; }
last = nextLine = startLine + 1 ; while ( nextLine < endLine ) { if ( state . isEmpty ( nextLine ) ) { nextLine ++ ; continue ; }
if ( state . sCount [ nextLine ] - state . blkIndent >= 4 ) { nextLine ++ ; last = nextLine ; continue ; }
break ; }
state . line = last ; token = state . push ( 'code_block' , 'code' , 0 ) ; token . content = state . getLines ( startLine , last , 4 + state . blkIndent , true ) ; token . map = [ startLine , state . line ] ; return true ; } ; } , { } ] , 20 : [ function ( require , module , exports ) { 'use strict' ; module . exports = function fence ( state , startLine , endLine , silent ) { var marker , len , params , nextLine , mem , token , markup , haveEndMarker = false , pos = state . bMarks [ startLine ] + state . tShift [ startLine ] , max = state . eMarks [ startLine ] ; if ( state . sCount [ startLine ] - state . blkIndent >= 4 ) { return false ; }
if ( pos + 3 > max ) { return false ; }
marker = state . src . charCodeAt ( pos ) ; if ( marker !== 0x7E && marker !== 0x60 ) { return false ; }
mem = pos ; pos = state . skipChars ( pos , marker ) ; len = pos - mem ; if ( len < 3 ) { return false ; }
markup = state . src . slice ( mem , pos ) ; params = state . src . slice ( pos , max ) ; if ( params . indexOf ( String . fromCharCode ( marker ) ) >= 0 ) { return false ; }
if ( silent ) { return true ; }
nextLine = startLine ; for ( ; ; ) { nextLine ++ ; if ( nextLine >= endLine ) { break ; }
pos = mem = state . bMarks [ nextLine ] + state . tShift [ nextLine ] ; max = state . eMarks [ nextLine ] ; if ( pos < max && state . sCount [ nextLine ] < state . blkIndent ) { break ; }
if ( state . src . charCodeAt ( pos ) !== marker ) { continue ; }
if ( state . sCount [ nextLine ] - state . blkIndent >= 4 ) { continue ; }
pos = state . skipChars ( pos , marker ) ; if ( pos - mem < len ) { continue ; }
pos = state . skipSpaces ( pos ) ; if ( pos < max ) { continue ; }
haveEndMarker = true ; break ; }
len = state . sCount [ startLine ] ; state . line = nextLine + ( haveEndMarker ? 1 : 0 ) ; token = state . push ( 'fence' , 'code' , 0 ) ; token . info = params ; token . content = state . getLines ( startLine + 1 , nextLine , len , true ) ; token . markup = markup ; token . map = [ startLine , state . line ] ; return true ; } ; } , { } ] , 21 : [ function ( require , module , exports ) { 'use strict' ; var isSpace = require ( '../common/utils' ) . isSpace ; module . exports = function heading ( state , startLine , endLine , silent ) { var ch , level , tmp , token , pos = state . bMarks [ startLine ] + state . tShift [ startLine ] , max = state . eMarks [ startLine ] ; if ( state . sCount [ startLine ] - state . blkIndent >= 4 ) { return false ; }
ch = state . src . charCodeAt ( pos ) ; if ( ch !== 0x23 || pos >= max ) { return false ; }
level = 1 ; ch = state . src . charCodeAt ( ++ pos ) ; while ( ch === 0x23 && pos < max && level <= 6 ) { level ++ ; ch = state . src . charCodeAt ( ++ pos ) ; }
if ( level > 6 || ( pos < max && ! isSpace ( ch ) ) ) { return false ; }
if ( silent ) { return true ; }
max = state . skipSpacesBack ( max , pos ) ; tmp = state . skipCharsBack ( max , 0x23 , pos ) ; if ( tmp > pos && isSpace ( state . src . charCodeAt ( tmp - 1 ) ) ) { max = tmp ; }
state . line = startLine + 1 ; token = state . push ( 'heading_open' , 'h' + String ( level ) , 1 ) ; token . markup = '########' . slice ( 0 , level ) ; token . map = [ startLine , state . line ] ; token = state . push ( 'inline' , '' , 0 ) ; token . content = state . src . slice ( pos , max ) . trim ( ) ; token . map = [ startLine , state . line ] ; token . children = [ ] ; token = state . push ( 'heading_close' , 'h' + String ( level ) , - 1 ) ; token . markup = '########' . slice ( 0 , level ) ; return true ; } ; } , { "../common/utils" : 4 } ] , 22 : [ function ( require , module , exports ) { 'use strict' ; var isSpace = require ( '../common/utils' ) . isSpace ; module . exports = function hr ( state , startLine , endLine , silent ) { var marker , cnt , ch , token , pos = state . bMarks [ startLine ] + state . tShift [ startLine ] , max = state . eMarks [ startLine ] ; if ( state . sCount [ startLine ] - state . blkIndent >= 4 ) { return false ; }
marker = state . src . charCodeAt ( pos ++ ) ; if ( marker !== 0x2A && marker !== 0x2D && marker !== 0x5F ) { return false ; }
cnt = 1 ; while ( pos < max ) { ch = state . src . charCodeAt ( pos ++ ) ; if ( ch !== marker && ! isSpace ( ch ) ) { return false ; }
if ( ch === marker ) { cnt ++ ; } }
if ( cnt < 3 ) { return false ; }
if ( silent ) { return true ; }
state . line = startLine + 1 ; token = state . push ( 'hr' , 'hr' , 0 ) ; token . map = [ startLine , state . line ] ; token . markup = Array ( cnt + 1 ) . join ( String . fromCharCode ( marker ) ) ; return true ; } ; } , { "../common/utils" : 4 } ] , 23 : [ function ( require , module , exports ) { 'use strict' ; var block _names = require ( '../common/html_blocks' ) ; var HTML _OPEN _CLOSE _TAG _RE = require ( '../common/html_re' ) . HTML _OPEN _CLOSE _TAG _RE ; var HTML _SEQUENCES = [ [ /^<(script|pre|style)(?=(\s|>|$))/i , /<\/(script|pre|style)>/i , true ] , [ /^<!--/ , /-->/ , true ] , [ /^<\?/ , /\?>/ , true ] , [ /^<![A-Z]/ , />/ , true ] , [ /^<!\[CDATA\[/ , /\]\]>/ , true ] , [ new RegExp ( '^</?(' + block _names . join ( '|' ) + ')(?=(\\s|/?>|$))' , 'i' ) , /^$/ , true ] , [ new RegExp ( HTML _OPEN _CLOSE _TAG _RE . source + '\\s*$' ) , /^$/ , false ] ] ; module . exports = function html _block ( state , startLine , endLine , silent ) { var i , nextLine , token , lineText , pos = state . bMarks [ startLine ] + state . tShift [ startLine ] , max = state . eMarks [ startLine ] ; if ( state . sCount [ startLine ] - state . blkIndent >= 4 ) { return false ; }
if ( ! state . md . options . html ) { return false ; }
if ( state . src . charCodeAt ( pos ) !== 0x3C ) { return false ; }
lineText = state . src . slice ( pos , max ) ; for ( i = 0 ; i < HTML _SEQUENCES . length ; i ++ ) { if ( HTML _SEQUENCES [ i ] [ 0 ] . test ( lineText ) ) { break ; } }
if ( i === HTML _SEQUENCES . length ) { return false ; }
if ( silent ) { return HTML _SEQUENCES [ i ] [ 2 ] ; }
nextLine = startLine + 1 ; if ( ! HTML _SEQUENCES [ i ] [ 1 ] . test ( lineText ) ) { for ( ; nextLine < endLine ; nextLine ++ ) { if ( state . sCount [ nextLine ] < state . blkIndent ) { break ; }
pos = state . bMarks [ nextLine ] + state . tShift [ nextLine ] ; max = state . eMarks [ nextLine ] ; lineText = state . src . slice ( pos , max ) ; if ( HTML _SEQUENCES [ i ] [ 1 ] . test ( lineText ) ) { if ( lineText . length !== 0 ) { nextLine ++ ; }
break ; } } }
state . line = nextLine ; token = state . push ( 'html_block' , '' , 0 ) ; token . map = [ startLine , nextLine ] ; token . content = state . getLines ( startLine , nextLine , state . blkIndent , true ) ; return true ; } ; } , { "../common/html_blocks" : 2 , "../common/html_re" : 3 } ] , 24 : [ function ( require , module , exports ) { 'use strict' ; module . exports = function lheading ( state , startLine , endLine ) { var content , terminate , i , l , token , pos , max , level , marker , nextLine = startLine + 1 , oldParentType , terminatorRules = state . md . block . ruler . getRules ( 'paragraph' ) ; if ( state . sCount [ startLine ] - state . blkIndent >= 4 ) { return false ; }
oldParentType = state . parentType ; state . parentType = 'paragraph' ; for ( ; nextLine < endLine && ! state . isEmpty ( nextLine ) ; nextLine ++ ) { if ( state . sCount [ nextLine ] - state . blkIndent > 3 ) { continue ; }
if ( state . sCount [ nextLine ] >= state . blkIndent ) { pos = state . bMarks [ nextLine ] + state . tShift [ nextLine ] ; max = state . eMarks [ nextLine ] ; if ( pos < max ) { marker = state . src . charCodeAt ( pos ) ; if ( marker === 0x2D || marker === 0x3D ) { pos = state . skipChars ( pos , marker ) ; pos = state . skipSpaces ( pos ) ; if ( pos >= max ) { level = ( marker === 0x3D ? 1 : 2 ) ; break ; } } } }
if ( state . sCount [ nextLine ] < 0 ) { continue ; }
terminate = false ; for ( i = 0 , l = terminatorRules . length ; i < l ; i ++ ) { if ( terminatorRules [ i ] ( state , nextLine , endLine , true ) ) { terminate = true ; break ; } }
if ( terminate ) { break ; } }
if ( ! level ) { return false ; }
content = state . getLines ( startLine , nextLine , state . blkIndent , false ) . trim ( ) ; state . line = nextLine + 1 ; token = state . push ( 'heading_open' , 'h' + String ( level ) , 1 ) ; token . markup = String . fromCharCode ( marker ) ; token . map = [ startLine , state . line ] ; token = state . push ( 'inline' , '' , 0 ) ; token . content = content ; token . map = [ startLine , state . line - 1 ] ; token . children = [ ] ; token = state . push ( 'heading_close' , 'h' + String ( level ) , - 1 ) ; token . markup = String . fromCharCode ( marker ) ; state . parentType = oldParentType ; return true ; } ; } , { } ] , 25 : [ function ( require , module , exports ) { 'use strict' ; var isSpace = require ( '../common/utils' ) . isSpace ; function skipBulletListMarker ( state , startLine ) { var marker , pos , max , ch ; pos = state . bMarks [ startLine ] + state . tShift [ startLine ] ; max = state . eMarks [ startLine ] ; marker = state . src . charCodeAt ( pos ++ ) ; if ( marker !== 0x2A && marker !== 0x2D && marker !== 0x2B ) { return - 1 ; }
if ( pos < max ) { ch = state . src . charCodeAt ( pos ) ; if ( ! isSpace ( ch ) ) { return - 1 ; } }
return pos ; }
function skipOrderedListMarker ( state , startLine ) { var ch , start = state . bMarks [ startLine ] + state . tShift [ startLine ] , pos = start , max = state . eMarks [ startLine ] ; if ( pos + 1 >= max ) { return - 1 ; }
ch = state . src . charCodeAt ( pos ++ ) ; if ( ch < 0x30 || ch > 0x39 ) { return - 1 ; }
for ( ; ; ) { if ( pos >= max ) { return - 1 ; }
ch = state . src . charCodeAt ( pos ++ ) ; if ( ch >= 0x30 && ch <= 0x39 ) { if ( pos - start >= 10 ) { return - 1 ; }
continue ; }
if ( ch === 0x29 || ch === 0x2e ) { break ; }
return - 1 ; }
if ( pos < max ) { ch = state . src . charCodeAt ( pos ) ; if ( ! isSpace ( ch ) ) { return - 1 ; } }
return pos ; }
function markTightParagraphs ( state , idx ) { var i , l , level = state . level + 2 ; for ( i = idx + 2 , l = state . tokens . length - 2 ; i < l ; i ++ ) { if ( state . tokens [ i ] . level === level && state . tokens [ i ] . type === 'paragraph_open' ) { state . tokens [ i + 2 ] . hidden = true ; state . tokens [ i ] . hidden = true ; i += 2 ; } } }
module . exports = function list ( state , startLine , endLine , silent ) { var ch , contentStart , i , indent , indentAfterMarker , initial , isOrdered , itemLines , l , listLines , listTokIdx , markerCharCode , markerValue , max , nextLine , offset , oldIndent , oldLIndent , oldParentType , oldTShift , oldTight , pos , posAfterMarker , prevEmptyEnd , start , terminate , terminatorRules , token , isTerminatingParagraph = false , tight = true ; if ( state . sCount [ startLine ] - state . blkIndent >= 4 ) { return false ; }
if ( silent && state . parentType === 'paragraph' ) { if ( state . tShift [ startLine ] >= state . blkIndent ) { isTerminatingParagraph = true ; } }
if ( ( posAfterMarker = skipOrderedListMarker ( state , startLine ) ) >= 0 ) { isOrdered = true ; start = state . bMarks [ startLine ] + state . tShift [ startLine ] ; markerValue = Number ( state . src . substr ( start , posAfterMarker - start - 1 ) ) ; if ( isTerminatingParagraph && markerValue !== 1 ) return false ; } else if ( ( posAfterMarker = skipBulletListMarker ( state , startLine ) ) >= 0 ) { isOrdered = false ; } else { return false ; }
if ( isTerminatingParagraph ) { if ( state . skipSpaces ( posAfterMarker ) >= state . eMarks [ startLine ] ) return false ; }
markerCharCode = state . src . charCodeAt ( posAfterMarker - 1 ) ; if ( silent ) { return true ; }
listTokIdx = state . tokens . length ; if ( isOrdered ) { token = state . push ( 'ordered_list_open' , 'ol' , 1 ) ; if ( markerValue !== 1 ) { token . attrs = [ [ 'start' , markerValue ] ] ; } } else { token = state . push ( 'bullet_list_open' , 'ul' , 1 ) ; }
token . map = listLines = [ startLine , 0 ] ; token . markup = String . fromCharCode ( markerCharCode ) ; nextLine = startLine ; prevEmptyEnd = false ; terminatorRules = state . md . block . ruler . getRules ( 'list' ) ; oldParentType = state . parentType ; state . parentType = 'list' ; while ( nextLine < endLine ) { pos = posAfterMarker ; max = state . eMarks [ nextLine ] ; initial = offset = state . sCount [ nextLine ] + posAfterMarker - ( state . bMarks [ startLine ] + state . tShift [ startLine ] ) ; while ( pos < max ) { ch = state . src . charCodeAt ( pos ) ; if ( ch === 0x09 ) { offset += 4 - ( offset + state . bsCount [ nextLine ] ) % 4 ; } else if ( ch === 0x20 ) { offset ++ ; } else { break ; }
pos ++ ; }
contentStart = pos ; if ( contentStart >= max ) { indentAfterMarker = 1 ; } else { indentAfterMarker = offset - initial ; }
if ( indentAfterMarker > 4 ) { indentAfterMarker = 1 ; }
indent = initial + indentAfterMarker ; token = state . push ( 'list_item_open' , 'li' , 1 ) ; token . markup = String . fromCharCode ( markerCharCode ) ; token . map = itemLines = [ startLine , 0 ] ; oldIndent = state . blkIndent ; oldTight = state . tight ; oldTShift = state . tShift [ startLine ] ; oldLIndent = state . sCount [ startLine ] ; state . blkIndent = indent ; state . tight = true ; state . tShift [ startLine ] = contentStart - state . bMarks [ startLine ] ; state . sCount [ startLine ] = offset ; if ( contentStart >= max && state . isEmpty ( startLine + 1 ) ) { state . line = Math . min ( state . line + 2 , endLine ) ; } else { state . md . block . tokenize ( state , startLine , endLine , true ) ; }
if ( ! state . tight || prevEmptyEnd ) { tight = false ; }
prevEmptyEnd = ( state . line - startLine ) > 1 && state . isEmpty ( state . line - 1 ) ; state . blkIndent = oldIndent ; state . tShift [ startLine ] = oldTShift ; state . sCount [ startLine ] = oldLIndent ; state . tight = oldTight ; token = state . push ( 'list_item_close' , 'li' , - 1 ) ; token . markup = String . fromCharCode ( markerCharCode ) ; nextLine = startLine = state . line ; itemLines [ 1 ] = nextLine ; contentStart = state . bMarks [ startLine ] ; if ( nextLine >= endLine ) { break ; }
if ( state . sCount [ nextLine ] < state . blkIndent ) { break ; }
terminate = false ; for ( i = 0 , l = terminatorRules . length ; i < l ; i ++ ) { if ( terminatorRules [ i ] ( state , nextLine , endLine , true ) ) { terminate = true ; break ; } }
if ( terminate ) { break ; }
if ( isOrdered ) { posAfterMarker = skipOrderedListMarker ( state , nextLine ) ; if ( posAfterMarker < 0 ) { break ; } } else { posAfterMarker = skipBulletListMarker ( state , nextLine ) ; if ( posAfterMarker < 0 ) { break ; } }
if ( markerCharCode !== state . src . charCodeAt ( posAfterMarker - 1 ) ) { break ; } }
if ( isOrdered ) { token = state . push ( 'ordered_list_close' , 'ol' , - 1 ) ; } else { token = state . push ( 'bullet_list_close' , 'ul' , - 1 ) ; }
token . markup = String . fromCharCode ( markerCharCode ) ; listLines [ 1 ] = nextLine ; state . line = nextLine ; state . parentType = oldParentType ; if ( tight ) { markTightParagraphs ( state , listTokIdx ) ; }
return true ; } ; } , { "../common/utils" : 4 } ] , 26 : [ function ( require , module , exports ) { 'use strict' ; module . exports = function paragraph ( state , startLine ) { var content , terminate , i , l , token , oldParentType , nextLine = startLine + 1 , terminatorRules = state . md . block . ruler . getRules ( 'paragraph' ) , endLine = state . lineMax ; oldParentType = state . parentType ; state . parentType = 'paragraph' ; for ( ; nextLine < endLine && ! state . isEmpty ( nextLine ) ; nextLine ++ ) { if ( state . sCount [ nextLine ] - state . blkIndent > 3 ) { continue ; }
if ( state . sCount [ nextLine ] < 0 ) { continue ; }
terminate = false ; for ( i = 0 , l = terminatorRules . length ; i < l ; i ++ ) { if ( terminatorRules [ i ] ( state , nextLine , endLine , true ) ) { terminate = true ; break ; } }
if ( terminate ) { break ; } }
content = state . getLines ( startLine , nextLine , state . blkIndent , false ) . trim ( ) ; state . line = nextLine ; token = state . push ( 'paragraph_open' , 'p' , 1 ) ; token . map = [ startLine , state . line ] ; token = state . push ( 'inline' , '' , 0 ) ; token . content = content ; token . map = [ startLine , state . line ] ; token . children = [ ] ; token = state . push ( 'paragraph_close' , 'p' , - 1 ) ; state . parentType = oldParentType ; return true ; } ; } , { } ] , 27 : [ function ( require , module , exports ) { 'use strict' ; var normalizeReference = require ( '../common/utils' ) . normalizeReference ; var isSpace = require ( '../common/utils' ) . isSpace ; module . exports = function reference ( state , startLine , _endLine , silent ) { var ch , destEndPos , destEndLineNo , endLine , href , i , l , label , labelEnd , oldParentType , res , start , str , terminate , terminatorRules , title , lines = 0 , pos = state . bMarks [ startLine ] + state . tShift [ startLine ] , max = state . eMarks [ startLine ] , nextLine = startLine + 1 ; if ( state . sCount [ startLine ] - state . blkIndent >= 4 ) { return false ; }
if ( state . src . charCodeAt ( pos ) !== 0x5B ) { return false ; }
while ( ++ pos < max ) { if ( state . src . charCodeAt ( pos ) === 0x5D && state . src . charCodeAt ( pos - 1 ) !== 0x5C ) { if ( pos + 1 === max ) { return false ; }
if ( state . src . charCodeAt ( pos + 1 ) !== 0x3A ) { return false ; }
break ; } }
endLine = state . lineMax ; terminatorRules = state . md . block . ruler . getRules ( 'reference' ) ; oldParentType = state . parentType ; state . parentType = 'reference' ; for ( ; nextLine < endLine && ! state . isEmpty ( nextLine ) ; nextLine ++ ) { if ( state . sCount [ nextLine ] - state . blkIndent > 3 ) { continue ; }
if ( state . sCount [ nextLine ] < 0 ) { continue ; }
terminate = false ; for ( i = 0 , l = terminatorRules . length ; i < l ; i ++ ) { if ( terminatorRules [ i ] ( state , nextLine , endLine , true ) ) { terminate = true ; break ; } }
if ( terminate ) { break ; } }
str = state . getLines ( startLine , nextLine , state . blkIndent , false ) . trim ( ) ; max = str . length ; for ( pos = 1 ; pos < max ; pos ++ ) { ch = str . charCodeAt ( pos ) ; if ( ch === 0x5B ) { return false ; } else if ( ch === 0x5D ) { labelEnd = pos ; break ; } else if ( ch === 0x0A ) { lines ++ ; } else if ( ch === 0x5C ) { pos ++ ; if ( pos < max && str . charCodeAt ( pos ) === 0x0A ) { lines ++ ; } } }
if ( labelEnd < 0 || str . charCodeAt ( labelEnd + 1 ) !== 0x3A ) { return false ; }
for ( pos = labelEnd + 2 ; pos < max ; pos ++ ) { ch = str . charCodeAt ( pos ) ; if ( ch === 0x0A ) { lines ++ ; } else if ( isSpace ( ch ) ) { } else { break ; } }
res = state . md . helpers . parseLinkDestination ( str , pos , max ) ; if ( ! res . ok ) { return false ; }
href = state . md . normalizeLink ( res . str ) ; if ( ! state . md . validateLink ( href ) ) { return false ; }
pos = res . pos ; lines += res . lines ; destEndPos = pos ; destEndLineNo = lines ; start = pos ; for ( ; pos < max ; pos ++ ) { ch = str . charCodeAt ( pos ) ; if ( ch === 0x0A ) { lines ++ ; } else if ( isSpace ( ch ) ) { } else { break ; } }
res = state . md . helpers . parseLinkTitle ( str , pos , max ) ; if ( pos < max && start !== pos && res . ok ) { title = res . str ; pos = res . pos ; lines += res . lines ; } else { title = '' ; pos = destEndPos ; lines = destEndLineNo ; }
while ( pos < max ) { ch = str . charCodeAt ( pos ) ; if ( ! isSpace ( ch ) ) { break ; }
pos ++ ; }
if ( pos < max && str . charCodeAt ( pos ) !== 0x0A ) { if ( title ) { title = '' ; pos = destEndPos ; lines = destEndLineNo ; while ( pos < max ) { ch = str . charCodeAt ( pos ) ; if ( ! isSpace ( ch ) ) { break ; }
pos ++ ; } } }
if ( pos < max && str . charCodeAt ( pos ) !== 0x0A ) { return false ; }
label = normalizeReference ( str . slice ( 1 , labelEnd ) ) ; if ( ! label ) { return false ; }
if ( silent ) { return true ; }
if ( typeof state . env . references === 'undefined' ) { state . env . references = { } ; }
if ( typeof state . env . references [ label ] === 'undefined' ) { state . env . references [ label ] = { title : title , href : href } ; }
state . parentType = oldParentType ; state . line = startLine + lines + 1 ; return true ; } ; } , { "../common/utils" : 4 } ] , 28 : [ function ( require , module , exports ) { 'use strict' ; var Token = require ( '../token' ) ; var isSpace = require ( '../common/utils' ) . isSpace ; function StateBlock ( src , md , env , tokens ) { var ch , s , start , pos , len , indent , offset , indent _found ; this . src = src ; this . md = md ; this . env = env ; this . tokens = tokens ; this . bMarks = [ ] ; this . eMarks = [ ] ; this . tShift = [ ] ; this . sCount = [ ] ; this . bsCount = [ ] ; this . blkIndent = 0 ; this . line = 0 ; this . lineMax = 0 ; this . tight = false ; this . ddIndent = - 1 ; this . parentType = 'root' ; this . level = 0 ; this . result = '' ; s = this . src ; indent _found = false ; for ( start = pos = indent = offset = 0 , len = s . length ; pos < len ; pos ++ ) { ch = s . charCodeAt ( pos ) ; if ( ! indent _found ) { if ( isSpace ( ch ) ) { indent ++ ; if ( ch === 0x09 ) { offset += 4 - offset % 4 ; } else { offset ++ ; }
continue ; } else { indent _found = true ; } }
if ( ch === 0x0A || pos === len - 1 ) { if ( ch !== 0x0A ) { pos ++ ; }
this . bMarks . push ( start ) ; this . eMarks . push ( pos ) ; this . tShift . push ( indent ) ; this . sCount . push ( offset ) ; this . bsCount . push ( 0 ) ; indent _found = false ; indent = 0 ; offset = 0 ; start = pos + 1 ; } }
this . bMarks . push ( s . length ) ; this . eMarks . push ( s . length ) ; this . tShift . push ( 0 ) ; this . sCount . push ( 0 ) ; this . bsCount . push ( 0 ) ; this . lineMax = this . bMarks . length - 1 ; }
StateBlock . prototype . push = function ( type , tag , nesting ) { var token = new Token ( type , tag , nesting ) ; token . block = true ; if ( nesting < 0 ) { this . level -- ; }
token . level = this . level ; if ( nesting > 0 ) { this . level ++ ; }
this . tokens . push ( token ) ; return token ; } ; StateBlock . prototype . isEmpty = function isEmpty ( line ) { return this . bMarks [ line ] + this . tShift [ line ] >= this . eMarks [ line ] ; } ; StateBlock . prototype . skipEmptyLines = function skipEmptyLines ( from ) { for ( var max = this . lineMax ; from < max ; from ++ ) { if ( this . bMarks [ from ] + this . tShift [ from ] < this . eMarks [ from ] ) { break ; } }
return from ; } ; StateBlock . prototype . skipSpaces = function skipSpaces ( pos ) { var ch ; for ( var max = this . src . length ; pos < max ; pos ++ ) { ch = this . src . charCodeAt ( pos ) ; if ( ! isSpace ( ch ) ) { break ; } }
return pos ; } ; StateBlock . prototype . skipSpacesBack = function skipSpacesBack ( pos , min ) { if ( pos <= min ) { return pos ; }
while ( pos > min ) { if ( ! isSpace ( this . src . charCodeAt ( -- pos ) ) ) { return pos + 1 ; } }
return pos ; } ; StateBlock . prototype . skipChars = function skipChars ( pos , code ) { for ( var max = this . src . length ; pos < max ; pos ++ ) { if ( this . src . charCodeAt ( pos ) !== code ) { break ; } }
return pos ; } ; StateBlock . prototype . skipCharsBack = function skipCharsBack ( pos , code , min ) { if ( pos <= min ) { return pos ; }
while ( pos > min ) { if ( code !== this . src . charCodeAt ( -- pos ) ) { return pos + 1 ; } }
return pos ; } ; StateBlock . prototype . getLines = function getLines ( begin , end , indent , keepLastLF ) { var i , lineIndent , ch , first , last , queue , lineStart , line = begin ; if ( begin >= end ) { return '' ; }
queue = new Array ( end - begin ) ; for ( i = 0 ; line < end ; line ++ , i ++ ) { lineIndent = 0 ; lineStart = first = this . bMarks [ line ] ; if ( line + 1 < end || keepLastLF ) { last = this . eMarks [ line ] + 1 ; } else { last = this . eMarks [ line ] ; }
while ( first < last && lineIndent < indent ) { ch = this . src . charCodeAt ( first ) ; if ( isSpace ( ch ) ) { if ( ch === 0x09 ) { lineIndent += 4 - ( lineIndent + this . bsCount [ line ] ) % 4 ; } else { lineIndent ++ ; } } else if ( first - lineStart < this . tShift [ line ] ) { lineIndent ++ ; } else { break ; }
first ++ ; }
if ( lineIndent > indent ) { queue [ i ] = new Array ( lineIndent - indent + 1 ) . join ( ' ' ) + this . src . slice ( first , last ) ; } else { queue [ i ] = this . src . slice ( first , last ) ; } }
return queue . join ( '' ) ; } ; StateBlock . prototype . Token = Token ; module . exports = StateBlock ; } , { "../common/utils" : 4 , "../token" : 51 } ] , 29 : [ function ( require , module , exports ) { 'use strict' ; var isSpace = require ( '../common/utils' ) . isSpace ; function getLine ( state , line ) { var pos = state . bMarks [ line ] + state . blkIndent , max = state . eMarks [ line ] ; return state . src . substr ( pos , max - pos ) ; }
function escapedSplit ( str ) { var result = [ ] , pos = 0 , max = str . length , ch , escapes = 0 , lastPos = 0 , backTicked = false , lastBackTick = 0 ; ch = str . charCodeAt ( pos ) ; while ( pos < max ) { if ( ch === 0x60 ) { if ( backTicked ) { backTicked = false ; lastBackTick = pos ; } else if ( escapes % 2 === 0 ) { backTicked = true ; lastBackTick = pos ; } } else if ( ch === 0x7c && ( escapes % 2 === 0 ) && ! backTicked ) { result . push ( str . substring ( lastPos , pos ) ) ; lastPos = pos + 1 ; }
if ( ch === 0x5c ) { escapes ++ ; } else { escapes = 0 ; }
pos ++ ; if ( pos === max && backTicked ) { backTicked = false ; pos = lastBackTick + 1 ; }
ch = str . charCodeAt ( pos ) ; }
result . push ( str . substring ( lastPos ) ) ; return result ; }
module . exports = function table ( state , startLine , endLine , silent ) { var ch , lineText , pos , i , nextLine , columns , columnCount , token , aligns , t , tableLines , tbodyLines ; if ( startLine + 2 > endLine ) { return false ; }
nextLine = startLine + 1 ; if ( state . sCount [ nextLine ] < state . blkIndent ) { return false ; }
if ( state . sCount [ nextLine ] - state . blkIndent >= 4 ) { return false ; }
pos = state . bMarks [ nextLine ] + state . tShift [ nextLine ] ; if ( pos >= state . eMarks [ nextLine ] ) { return false ; }
ch = state . src . charCodeAt ( pos ++ ) ; if ( ch !== 0x7C && ch !== 0x2D && ch !== 0x3A ) { return false ; }
while ( pos < state . eMarks [ nextLine ] ) { ch = state . src . charCodeAt ( pos ) ; if ( ch !== 0x7C && ch !== 0x2D && ch !== 0x3A && ! isSpace ( ch ) ) { return false ; }
pos ++ ; }
lineText = getLine ( state , startLine + 1 ) ; columns = lineText . split ( '|' ) ; aligns = [ ] ; for ( i = 0 ; i < columns . length ; i ++ ) { t = columns [ i ] . trim ( ) ; if ( ! t ) { if ( i === 0 || i === columns . length - 1 ) { continue ; } else { return false ; } }
if ( ! /^:?-+:?$/ . test ( t ) ) { return false ; }
if ( t . charCodeAt ( t . length - 1 ) === 0x3A ) { aligns . push ( t . charCodeAt ( 0 ) === 0x3A ? 'center' : 'right' ) ; } else if ( t . charCodeAt ( 0 ) === 0x3A ) { aligns . push ( 'left' ) ; } else { aligns . push ( '' ) ; } }
lineText = getLine ( state , startLine ) . trim ( ) ; if ( lineText . indexOf ( '|' ) === - 1 ) { return false ; }
if ( state . sCount [ startLine ] - state . blkIndent >= 4 ) { return false ; }
columns = escapedSplit ( lineText . replace ( /^\||\|$/g , '' ) ) ; columnCount = columns . length ; if ( columnCount > aligns . length ) { return false ; }
if ( silent ) { return true ; }
token = state . push ( 'table_open' , 'table' , 1 ) ; token . map = tableLines = [ startLine , 0 ] ; token = state . push ( 'thead_open' , 'thead' , 1 ) ; token . map = [ startLine , startLine + 1 ] ; token = state . push ( 'tr_open' , 'tr' , 1 ) ; token . map = [ startLine , startLine + 1 ] ; for ( i = 0 ; i < columns . length ; i ++ ) { token = state . push ( 'th_open' , 'th' , 1 ) ; token . map = [ startLine , startLine + 1 ] ; if ( aligns [ i ] ) { token . attrs = [ [ 'style' , 'text-align:' + aligns [ i ] ] ] ; }
token = state . push ( 'inline' , '' , 0 ) ; token . content = columns [ i ] . trim ( ) ; token . map = [ startLine , startLine + 1 ] ; token . children = [ ] ; token = state . push ( 'th_close' , 'th' , - 1 ) ; }
token = state . push ( 'tr_close' , 'tr' , - 1 ) ; token = state . push ( 'thead_close' , 'thead' , - 1 ) ; token = state . push ( 'tbody_open' , 'tbody' , 1 ) ; token . map = tbodyLines = [ startLine + 2 , 0 ] ; for ( nextLine = startLine + 2 ; nextLine < endLine ; nextLine ++ ) { if ( state . sCount [ nextLine ] < state . blkIndent ) { break ; }
lineText = getLine ( state , nextLine ) . trim ( ) ; if ( lineText . indexOf ( '|' ) === - 1 ) { break ; }
if ( state . sCount [ nextLine ] - state . blkIndent >= 4 ) { break ; }
columns = escapedSplit ( lineText . replace ( /^\||\|$/g , '' ) ) ; token = state . push ( 'tr_open' , 'tr' , 1 ) ; for ( i = 0 ; i < columnCount ; i ++ ) { token = state . push ( 'td_open' , 'td' , 1 ) ; if ( aligns [ i ] ) { token . attrs = [ [ 'style' , 'text-align:' + aligns [ i ] ] ] ; }
token = state . push ( 'inline' , '' , 0 ) ; token . content = columns [ i ] ? columns [ i ] . trim ( ) : '' ; token . children = [ ] ; token = state . push ( 'td_close' , 'td' , - 1 ) ; }
token = state . push ( 'tr_close' , 'tr' , - 1 ) ; }
token = state . push ( 'tbody_close' , 'tbody' , - 1 ) ; token = state . push ( 'table_close' , 'table' , - 1 ) ; tableLines [ 1 ] = tbodyLines [ 1 ] = nextLine ; state . line = nextLine ; return true ; } ; } , { "../common/utils" : 4 } ] , 30 : [ function ( require , module , exports ) { 'use strict' ; module . exports = function block ( state ) { var token ; if ( state . inlineMode ) { token = new state . Token ( 'inline' , '' , 0 ) ; token . content = state . src ; token . map = [ 0 , 1 ] ; token . children = [ ] ; state . tokens . push ( token ) ; } else { state . md . block . parse ( state . src , state . md , state . env , state . tokens ) ; } } ; } , { } ] , 31 : [ function ( require , module , exports ) { 'use strict' ; module . exports = function inline ( state ) { var tokens = state . tokens , tok , i , l ; for ( i = 0 , l = tokens . length ; i < l ; i ++ ) { tok = tokens [ i ] ; if ( tok . type === 'inline' ) { state . md . inline . parse ( tok . content , state . md , state . env , tok . children ) ; } } } ; } , { } ] , 32 : [ function ( require , module , exports ) { 'use strict' ; var arrayReplaceAt = require ( '../common/utils' ) . arrayReplaceAt ; function isLinkOpen ( str ) { return /^<a[>\s]/i . test ( str ) ; }
function isLinkClose ( str ) { return /^<\/a\s*>/i . test ( str ) ; }
module . exports = function linkify ( state ) { var i , j , l , tokens , token , currentToken , nodes , ln , text , pos , lastPos , level , htmlLinkLevel , url , fullUrl , urlText , blockTokens = state . tokens , links ; if ( ! state . md . options . linkify ) { return ; }
for ( j = 0 , l = blockTokens . length ; j < l ; j ++ ) { if ( blockTokens [ j ] . type !== 'inline' || ! state . md . linkify . pretest ( blockTokens [ j ] . content ) ) { continue ; }
tokens = blockTokens [ j ] . children ; htmlLinkLevel = 0 ; for ( i = tokens . length - 1 ; i >= 0 ; i -- ) { currentToken = tokens [ i ] ; if ( currentToken . type === 'link_close' ) { i -- ; while ( tokens [ i ] . level !== currentToken . level && tokens [ i ] . type !== 'link_open' ) { i -- ; }
continue ; }
if ( currentToken . type === 'html_inline' ) { if ( isLinkOpen ( currentToken . content ) && htmlLinkLevel > 0 ) { htmlLinkLevel -- ; }
if ( isLinkClose ( currentToken . content ) ) { htmlLinkLevel ++ ; } }
if ( htmlLinkLevel > 0 ) { continue ; }
if ( currentToken . type === 'text' && state . md . linkify . test ( currentToken . content ) ) { text = currentToken . content ; links = state . md . linkify . match ( text ) ; nodes = [ ] ; level = currentToken . level ; lastPos = 0 ; for ( ln = 0 ; ln < links . length ; ln ++ ) { url = links [ ln ] . url ; fullUrl = state . md . normalizeLink ( url ) ; if ( ! state . md . validateLink ( fullUrl ) ) { continue ; }
urlText = links [ ln ] . text ; if ( ! links [ ln ] . schema ) { urlText = state . md . normalizeLinkText ( 'http://' + urlText ) . replace ( /^http:\/\// , '' ) ; } else if ( links [ ln ] . schema === 'mailto:' && ! /^mailto:/i . test ( urlText ) ) { urlText = state . md . normalizeLinkText ( 'mailto:' + urlText ) . replace ( /^mailto:/ , '' ) ; } else { urlText = state . md . normalizeLinkText ( urlText ) ; }
pos = links [ ln ] . index ; if ( pos > lastPos ) { token = new state . Token ( 'text' , '' , 0 ) ; token . content = text . slice ( lastPos , pos ) ; token . level = level ; nodes . push ( token ) ; }
token = new state . Token ( 'link_open' , 'a' , 1 ) ; token . attrs = [ [ 'href' , fullUrl ] ] ; token . level = level ++ ; token . markup = 'linkify' ; token . info = 'auto' ; nodes . push ( token ) ; token = new state . Token ( 'text' , '' , 0 ) ; token . content = urlText ; token . level = level ; nodes . push ( token ) ; token = new state . Token ( 'link_close' , 'a' , - 1 ) ; token . level = -- level ; token . markup = 'linkify' ; token . info = 'auto' ; nodes . push ( token ) ; lastPos = links [ ln ] . lastIndex ; }
if ( lastPos < text . length ) { token = new state . Token ( 'text' , '' , 0 ) ; token . content = text . slice ( lastPos ) ; token . level = level ; nodes . push ( token ) ; }
blockTokens [ j ] . children = tokens = arrayReplaceAt ( tokens , i , nodes ) ; } } } } ; } , { "../common/utils" : 4 } ] , 33 : [ function ( require , module , exports ) { 'use strict' ; var NEWLINES _RE = /\r[\n\u0085]?|[\u2424\u2028\u0085]/g ; var NULL _RE = /\u0000/g ; module . exports = function inline ( state ) { var str ; str = state . src . replace ( NEWLINES _RE , '\n' ) ; str = str . replace ( NULL _RE , '\uFFFD' ) ; state . src = str ; } ; } , { } ] , 34 : [ function ( require , module , exports ) { 'use strict' ; var RARE _RE = /\+-|\.\.|\?\?\?\?|!!!!|,,|--/ ; var SCOPED _ABBR _TEST _RE = /\((c|tm|r|p)\)/i ; var SCOPED _ABBR _RE = /\((c|tm|r|p)\)/ig ; var SCOPED _ABBR = { c : '©' , r : '®' , p : '§' , tm : '™' } ; function replaceFn ( match , name ) { return SCOPED _ABBR [ name . toLowerCase ( ) ] ; }
function replace _scoped ( inlineTokens ) { var i , token , inside _autolink = 0 ; for ( i = inlineTokens . length - 1 ; i >= 0 ; i -- ) { token = inlineTokens [ i ] ; if ( token . type === 'text' && ! inside _autolink ) { token . content = token . content . replace ( SCOPED _ABBR _RE , replaceFn ) ; }
if ( token . type === 'link_open' && token . info === 'auto' ) { inside _autolink -- ; }
if ( token . type === 'link_close' && token . info === 'auto' ) { inside _autolink ++ ; } } }
function replace _rare ( inlineTokens ) { var i , token , inside _autolink = 0 ; for ( i = inlineTokens . length - 1 ; i >= 0 ; i -- ) { token = inlineTokens [ i ] ; if ( token . type === 'text' && ! inside _autolink ) { if ( RARE _RE . test ( token . content ) ) { token . content = token . content . replace ( /\+-/g , '±' ) . replace ( /\.{2,}/g , '…' ) . replace ( /([?!])…/g , '$1..' ) . replace ( /([?!]){4,}/g , '$1$1$1' ) . replace ( /,{2,}/g , ',' ) . replace ( /(^|[^-])---([^-]|$)/mg , '$1\u2014$2' ) . replace ( /(^|\s)--(\s|$)/mg , '$1\u2013$2' ) . replace ( /(^|[^-\s])--([^-\s]|$)/mg , '$1\u2013$2' ) ; } }
if ( token . type === 'link_open' && token . info === 'auto' ) { inside _autolink -- ; }
if ( token . type === 'link_close' && token . info === 'auto' ) { inside _autolink ++ ; } } }
module . exports = function replace ( state ) { var blkIdx ; if ( ! state . md . options . typographer ) { return ; }
for ( blkIdx = state . tokens . length - 1 ; blkIdx >= 0 ; blkIdx -- ) { if ( state . tokens [ blkIdx ] . type !== 'inline' ) { continue ; }
if ( SCOPED _ABBR _TEST _RE . test ( state . tokens [ blkIdx ] . content ) ) { replace _scoped ( state . tokens [ blkIdx ] . children ) ; }
if ( RARE _RE . test ( state . tokens [ blkIdx ] . content ) ) { replace _rare ( state . tokens [ blkIdx ] . children ) ; } } } ; } , { } ] , 35 : [ function ( require , module , exports ) { 'use strict' ; var isWhiteSpace = require ( '../common/utils' ) . isWhiteSpace ; var isPunctChar = require ( '../common/utils' ) . isPunctChar ; var isMdAsciiPunct = require ( '../common/utils' ) . isMdAsciiPunct ; var QUOTE _TEST _RE = /['"]/ ; var QUOTE _RE = /['"]/g ; var APOSTROPHE = '\u2019' ; function replaceAt ( str , index , ch ) { return str . substr ( 0 , index ) + ch + str . substr ( index + 1 ) ; }
function process _inlines ( tokens , state ) { var i , token , text , t , pos , max , thisLevel , item , lastChar , nextChar , isLastPunctChar , isNextPunctChar , isLastWhiteSpace , isNextWhiteSpace , canOpen , canClose , j , isSingle , stack , openQuote , closeQuote ; stack = [ ] ; for ( i = 0 ; i < tokens . length ; i ++ ) { token = tokens [ i ] ; thisLevel = tokens [ i ] . level ; for ( j = stack . length - 1 ; j >= 0 ; j -- ) { if ( stack [ j ] . level <= thisLevel ) { break ; } }
stack . length = j + 1 ; if ( token . type !== 'text' ) { continue ; }
text = token . content ; pos = 0 ; max = text . length ; OUTER : while ( pos < max ) { QUOTE _RE . lastIndex = pos ; t = QUOTE _RE . exec ( text ) ; if ( ! t ) { break ; }
canOpen = canClose = true ; pos = t . index + 1 ; isSingle = ( t [ 0 ] === "'" ) ; lastChar = 0x20 ; if ( t . index - 1 >= 0 ) { lastChar = text . charCodeAt ( t . index - 1 ) ; } else { for ( j = i - 1 ; j >= 0 ; j -- ) { if ( tokens [ j ] . type === 'softbreak' || tokens [ j ] . type === 'hardbreak' ) break ; if ( tokens [ j ] . type !== 'text' ) continue ; lastChar = tokens [ j ] . content . charCodeAt ( tokens [ j ] . content . length - 1 ) ; break ; } }
nextChar = 0x20 ; if ( pos < max ) { nextChar = text . charCodeAt ( pos ) ; } else { for ( j = i + 1 ; j < tokens . length ; j ++ ) { if ( tokens [ j ] . type === 'softbreak' || tokens [ j ] . type === 'hardbreak' ) break ; if ( tokens [ j ] . type !== 'text' ) continue ; nextChar = tokens [ j ] . content . charCodeAt ( 0 ) ; break ; } }
isLastPunctChar = isMdAsciiPunct ( lastChar ) || isPunctChar ( String . fromCharCode ( lastChar ) ) ; isNextPunctChar = isMdAsciiPunct ( nextChar ) || isPunctChar ( String . fromCharCode ( nextChar ) ) ; isLastWhiteSpace = isWhiteSpace ( lastChar ) ; isNextWhiteSpace = isWhiteSpace ( nextChar ) ; if ( isNextWhiteSpace ) { canOpen = false ; } else if ( isNextPunctChar ) { if ( ! ( isLastWhiteSpace || isLastPunctChar ) ) { canOpen = false ; } }
if ( isLastWhiteSpace ) { canClose = false ; } else if ( isLastPunctChar ) { if ( ! ( isNextWhiteSpace || isNextPunctChar ) ) { canClose = false ; } }
if ( nextChar === 0x22 && t [ 0 ] === '"' ) { if ( lastChar >= 0x30 && lastChar <= 0x39 ) { canClose = canOpen = false ; } }
if ( canOpen && canClose ) { canOpen = false ; canClose = isNextPunctChar ; }
if ( ! canOpen && ! canClose ) { if ( isSingle ) { token . content = replaceAt ( token . content , t . index , APOSTROPHE ) ; }
continue ; }
if ( canClose ) { for ( j = stack . length - 1 ; j >= 0 ; j -- ) { item = stack [ j ] ; if ( stack [ j ] . level < thisLevel ) { break ; }
if ( item . single === isSingle && stack [ j ] . level === thisLevel ) { item = stack [ j ] ; if ( isSingle ) { openQuote = state . md . options . quotes [ 2 ] ; closeQuote = state . md . options . quotes [ 3 ] ; } else { openQuote = state . md . options . quotes [ 0 ] ; closeQuote = state . md . options . quotes [ 1 ] ; }
token . content = replaceAt ( token . content , t . index , closeQuote ) ; tokens [ item . token ] . content = replaceAt ( tokens [ item . token ] . content , item . pos , openQuote ) ; pos += closeQuote . length - 1 ; if ( item . token === i ) { pos += openQuote . length - 1 ; }
text = token . content ; max = text . length ; stack . length = j ; continue OUTER ; } } }
if ( canOpen ) { stack . push ( { token : i , pos : t . index , single : isSingle , level : thisLevel } ) ; } else if ( canClose && isSingle ) { token . content = replaceAt ( token . content , t . index , APOSTROPHE ) ; } } } }
module . exports = function smartquotes ( state ) { var blkIdx ; if ( ! state . md . options . typographer ) { return ; }
for ( blkIdx = state . tokens . length - 1 ; blkIdx >= 0 ; blkIdx -- ) { if ( state . tokens [ blkIdx ] . type !== 'inline' || ! QUOTE _TEST _RE . test ( state . tokens [ blkIdx ] . content ) ) { continue ; }
process _inlines ( state . tokens [ blkIdx ] . children , state ) ; } } ; } , { "../common/utils" : 4 } ] , 36 : [ function ( require , module , exports ) { 'use strict' ; var Token = require ( '../token' ) ; function StateCore ( src , md , env ) { this . src = src ; this . env = env ; this . tokens = [ ] ; this . inlineMode = false ; this . md = md ; }
StateCore . prototype . Token = Token ; module . exports = StateCore ; } , { "../token" : 51 } ] , 37 : [ function ( require , module , exports ) { 'use strict' ; var EMAIL _RE = /^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/ ; var AUTOLINK _RE = /^<([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)>/ ; module . exports = function autolink ( state , silent ) { var tail , linkMatch , emailMatch , url , fullUrl , token , pos = state . pos ; if ( state . src . charCodeAt ( pos ) !== 0x3C ) { return false ; }
tail = state . src . slice ( pos ) ; if ( tail . indexOf ( '>' ) < 0 ) { return false ; }
if ( AUTOLINK _RE . test ( tail ) ) { linkMatch = tail . match ( AUTOLINK _RE ) ; url = linkMatch [ 0 ] . slice ( 1 , - 1 ) ; fullUrl = state . md . normalizeLink ( url ) ; if ( ! state . md . validateLink ( fullUrl ) ) { return false ; }
if ( ! silent ) { token = state . push ( 'link_open' , 'a' , 1 ) ; token . attrs = [ [ 'href' , fullUrl ] ] ; token . markup = 'autolink' ; token . info = 'auto' ; token = state . push ( 'text' , '' , 0 ) ; token . content = state . md . normalizeLinkText ( url ) ; token = state . push ( 'link_close' , 'a' , - 1 ) ; token . markup = 'autolink' ; token . info = 'auto' ; }
state . pos += linkMatch [ 0 ] . length ; return true ; }
if ( EMAIL _RE . test ( tail ) ) { emailMatch = tail . match ( EMAIL _RE ) ; url = emailMatch [ 0 ] . slice ( 1 , - 1 ) ; fullUrl = state . md . normalizeLink ( 'mailto:' + url ) ; if ( ! state . md . validateLink ( fullUrl ) ) { return false ; }
if ( ! silent ) { token = state . push ( 'link_open' , 'a' , 1 ) ; token . attrs = [ [ 'href' , fullUrl ] ] ; token . markup = 'autolink' ; token . info = 'auto' ; token = state . push ( 'text' , '' , 0 ) ; token . content = state . md . normalizeLinkText ( url ) ; token = state . push ( 'link_close' , 'a' , - 1 ) ; token . markup = 'autolink' ; token . info = 'auto' ; }
state . pos += emailMatch [ 0 ] . length ; return true ; }
return false ; } ; } , { } ] , 38 : [ function ( require , module , exports ) { 'use strict' ; module . exports = function backtick ( state , silent ) { var start , max , marker , matchStart , matchEnd , token , pos = state . pos , ch = state . src . charCodeAt ( pos ) ; if ( ch !== 0x60 ) { return false ; }
start = pos ; pos ++ ; max = state . posMax ; while ( pos < max && state . src . charCodeAt ( pos ) === 0x60 ) { pos ++ ; }
marker = state . src . slice ( start , pos ) ; matchStart = matchEnd = pos ; while ( ( matchStart = state . src . indexOf ( '`' , matchEnd ) ) !== - 1 ) { matchEnd = matchStart + 1 ; while ( matchEnd < max && state . src . charCodeAt ( matchEnd ) === 0x60 ) { matchEnd ++ ; }
if ( matchEnd - matchStart === marker . length ) { if ( ! silent ) { token = state . push ( 'code_inline' , 'code' , 0 ) ; token . markup = marker ; token . content = state . src . slice ( pos , matchStart ) . replace ( /[ \n]+/g , ' ' ) . trim ( ) ; }
state . pos = matchEnd ; return true ; } }
if ( ! silent ) { state . pending += marker ; }
state . pos += marker . length ; return true ; } ; } , { } ] , 39 : [ function ( require , module , exports ) { 'use strict' ; module . exports = function link _pairs ( state ) { var i , j , lastDelim , currDelim , delimiters = state . delimiters , max = state . delimiters . length ; for ( i = 0 ; i < max ; i ++ ) { lastDelim = delimiters [ i ] ; if ( ! lastDelim . close ) { continue ; }
j = i - lastDelim . jump - 1 ; while ( j >= 0 ) { currDelim = delimiters [ j ] ; if ( currDelim . open && currDelim . marker === lastDelim . marker && currDelim . end < 0 && currDelim . level === lastDelim . level ) { var odd _match = ( currDelim . close || lastDelim . open ) && typeof currDelim . length !== 'undefined' && typeof lastDelim . length !== 'undefined' && ( currDelim . length + lastDelim . length ) % 3 === 0 ; if ( ! odd _match ) { lastDelim . jump = i - j ; lastDelim . open = false ; currDelim . end = i ; currDelim . jump = 0 ; break ; } }
j -= currDelim . jump + 1 ; } } } ; } , { } ] , 40 : [ function ( require , module , exports ) { 'use strict' ; module . exports . tokenize = function emphasis ( state , silent ) { var i , scanned , token , start = state . pos , marker = state . src . charCodeAt ( start ) ; if ( silent ) { return false ; }
if ( marker !== 0x5F && marker !== 0x2A ) { return false ; }
scanned = state . scanDelims ( state . pos , marker === 0x2A ) ; for ( i = 0 ; i < scanned . length ; i ++ ) { token = state . push ( 'text' , '' , 0 ) ; token . content = String . fromCharCode ( marker ) ; state . delimiters . push ( { marker : marker , length : scanned . length , jump : i , token : state . tokens . length - 1 , level : state . level , end : - 1 , open : scanned . can _open , close : scanned . can _close } ) ; }
state . pos += scanned . length ; return true ; } ; module . exports . postProcess = function emphasis ( state ) { var i , startDelim , endDelim , token , ch , isStrong , delimiters = state . delimiters , max = state . delimiters . length ; for ( i = max - 1 ; i >= 0 ; i -- ) { startDelim = delimiters [ i ] ; if ( startDelim . marker !== 0x5F && startDelim . marker !== 0x2A ) { continue ; }
if ( startDelim . end === - 1 ) { continue ; }
endDelim = delimiters [ startDelim . end ] ; isStrong = i > 0 && delimiters [ i - 1 ] . end === startDelim . end + 1 && delimiters [ i - 1 ] . token === startDelim . token - 1 && delimiters [ startDelim . end + 1 ] . token === endDelim . token + 1 && delimiters [ i - 1 ] . marker === startDelim . marker ; ch = String . fromCharCode ( startDelim . marker ) ; token = state . tokens [ startDelim . token ] ; token . type = isStrong ? 'strong_open' : 'em_open' ; token . tag = isStrong ? 'strong' : 'em' ; token . nesting = 1 ; token . markup = isStrong ? ch + ch : ch ; token . content = '' ; token = state . tokens [ endDelim . token ] ; token . type = isStrong ? 'strong_close' : 'em_close' ; token . tag = isStrong ? 'strong' : 'em' ; token . nesting = - 1 ; token . markup = isStrong ? ch + ch : ch ; token . content = '' ; if ( isStrong ) { state . tokens [ delimiters [ i - 1 ] . token ] . content = '' ; state . tokens [ delimiters [ startDelim . end + 1 ] . token ] . content = '' ; i -- ; } } } ; } , { } ] , 41 : [ function ( require , module , exports ) { 'use strict' ; var entities = require ( '../common/entities' ) ; var has = require ( '../common/utils' ) . has ; var isValidEntityCode = require ( '../common/utils' ) . isValidEntityCode ; var fromCodePoint = require ( '../common/utils' ) . fromCodePoint ; var DIGITAL _RE = /^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i ; var NAMED _RE = /^&([a-z][a-z0-9]{1,31});/i ; module . exports = function entity ( state , silent ) { var ch , code , match , pos = state . pos , max = state . posMax ; if ( state . src . charCodeAt ( pos ) !== 0x26 ) { return false ; }
if ( pos + 1 < max ) { ch = state . src . charCodeAt ( pos + 1 ) ; if ( ch === 0x23 ) { match = state . src . slice ( pos ) . match ( DIGITAL _RE ) ; if ( match ) { if ( ! silent ) { code = match [ 1 ] [ 0 ] . toLowerCase ( ) === 'x' ? parseInt ( match [ 1 ] . slice ( 1 ) , 16 ) : parseInt ( match [ 1 ] , 10 ) ; state . pending += isValidEntityCode ( code ) ? fromCodePoint ( code ) : fromCodePoint ( 0xFFFD ) ; }
state . pos += match [ 0 ] . length ; return true ; } } else { match = state . src . slice ( pos ) . match ( NAMED _RE ) ; if ( match ) { if ( has ( entities , match [ 1 ] ) ) { if ( ! silent ) { state . pending += entities [ match [ 1 ] ] ; }
state . pos += match [ 0 ] . length ; return true ; } } } }
if ( ! silent ) { state . pending += '&' ; }
state . pos ++ ; return true ; } ; } , { "../common/entities" : 1 , "../common/utils" : 4 } ] , 42 : [ function ( require , module , exports ) { 'use strict' ; var isSpace = require ( '../common/utils' ) . isSpace ; var ESCAPED = [ ] ; for ( var i = 0 ; i < 256 ; i ++ ) { ESCAPED . push ( 0 ) ; } '\\!"#$%&\'()*+,./:;<=>?@[]^_`{|}~-' . split ( '' ) . forEach ( function ( ch ) { ESCAPED [ ch . charCodeAt ( 0 ) ] = 1 ; } ) ; module . exports = function escape ( state , silent ) { var ch , pos = state . pos , max = state . posMax ; if ( state . src . charCodeAt ( pos ) !== 0x5C ) { return false ; }
pos ++ ; if ( pos < max ) { ch = state . src . charCodeAt ( pos ) ; if ( ch < 256 && ESCAPED [ ch ] !== 0 ) { if ( ! silent ) { state . pending += state . src [ pos ] ; }
state . pos += 2 ; return true ; }
if ( ch === 0x0A ) { if ( ! silent ) { state . push ( 'hardbreak' , 'br' , 0 ) ; }
pos ++ ; while ( pos < max ) { ch = state . src . charCodeAt ( pos ) ; if ( ! isSpace ( ch ) ) { break ; }
pos ++ ; }
state . pos = pos ; return true ; } }
if ( ! silent ) { state . pending += '\\' ; }
state . pos ++ ; return true ; } ; } , { "../common/utils" : 4 } ] , 43 : [ function ( require , module , exports ) { 'use strict' ; var HTML _TAG _RE = require ( '../common/html_re' ) . HTML _TAG _RE ; function isLetter ( ch ) { var lc = ch | 0x20 ; return ( lc >= 0x61 ) && ( lc <= 0x7a ) ; }
module . exports = function html _inline ( state , silent ) { var ch , match , max , token , pos = state . pos ; if ( ! state . md . options . html ) { return false ; }
max = state . posMax ; if ( state . src . charCodeAt ( pos ) !== 0x3C || pos + 2 >= max ) { return false ; }
ch = state . src . charCodeAt ( pos + 1 ) ; if ( ch !== 0x21 && ch !== 0x3F && ch !== 0x2F && ! isLetter ( ch ) ) { return false ; }
match = state . src . slice ( pos ) . match ( HTML _TAG _RE ) ; if ( ! match ) { return false ; }
if ( ! silent ) { token = state . push ( 'html_inline' , '' , 0 ) ; token . content = state . src . slice ( pos , pos + match [ 0 ] . length ) ; }
state . pos += match [ 0 ] . length ; return true ; } ; } , { "../common/html_re" : 3 } ] , 44 : [ function ( require , module , exports ) { 'use strict' ; var normalizeReference = require ( '../common/utils' ) . normalizeReference ; var isSpace = require ( '../common/utils' ) . isSpace ; module . exports = function image ( state , silent ) { var attrs , code , content , label , labelEnd , labelStart , pos , ref , res , title , token , tokens , start , href = '' , oldPos = state . pos , max = state . posMax ; if ( state . src . charCodeAt ( state . pos ) !== 0x21 ) { return false ; }
if ( state . src . charCodeAt ( state . pos + 1 ) !== 0x5B ) { return false ; }
labelStart = state . pos + 2 ; labelEnd = state . md . helpers . parseLinkLabel ( state , state . pos + 1 , false ) ; if ( labelEnd < 0 ) { return false ; }
pos = labelEnd + 1 ; if ( pos < max && state . src . charCodeAt ( pos ) === 0x28 ) { pos ++ ; for ( ; pos < max ; pos ++ ) { code = state . src . charCodeAt ( pos ) ; if ( ! isSpace ( code ) && code !== 0x0A ) { break ; } }
if ( pos >= max ) { return false ; }
start = pos ; res = state . md . helpers . parseLinkDestination ( state . src , pos , state . posMax ) ; if ( res . ok ) { href = state . md . normalizeLink ( res . str ) ; if ( state . md . validateLink ( href ) ) { pos = res . pos ; } else { href = '' ; } }
start = pos ; for ( ; pos < max ; pos ++ ) { code = state . src . charCodeAt ( pos ) ; if ( ! isSpace ( code ) && code !== 0x0A ) { break ; } }
res = state . md . helpers . parseLinkTitle ( state . src , pos , state . posMax ) ; if ( pos < max && start !== pos && res . ok ) { title = res . str ; pos = res . pos ; for ( ; pos < max ; pos ++ ) { code = state . src . charCodeAt ( pos ) ; if ( ! isSpace ( code ) && code !== 0x0A ) { break ; } } } else { title = '' ; }
if ( pos >= max || state . src . charCodeAt ( pos ) !== 0x29 ) { state . pos = oldPos ; return false ; }
pos ++ ; } else { if ( typeof state . env . references === 'undefined' ) { return false ; }
if ( pos < max && state . src . charCodeAt ( pos ) === 0x5B ) { start = pos + 1 ; pos = state . md . helpers . parseLinkLabel ( state , pos ) ; if ( pos >= 0 ) { label = state . src . slice ( start , pos ++ ) ; } else { pos = labelEnd + 1 ; } } else { pos = labelEnd + 1 ; }
if ( ! label ) { label = state . src . slice ( labelStart , labelEnd ) ; }
ref = state . env . references [ normalizeReference ( label ) ] ; if ( ! ref ) { state . pos = oldPos ; return false ; }
href = ref . href ; title = ref . title ; }
if ( ! silent ) { content = state . src . slice ( labelStart , labelEnd ) ; state . md . inline . parse ( content , state . md , state . env , tokens = [ ] ) ; token = state . push ( 'image' , 'img' , 0 ) ; token . attrs = attrs = [ [ 'src' , href ] , [ 'alt' , '' ] ] ; token . children = tokens ; token . content = content ; if ( title ) { attrs . push ( [ 'title' , title ] ) ; } }
state . pos = pos ; state . posMax = max ; return true ; } ; } , { "../common/utils" : 4 } ] , 45 : [ function ( require , module , exports ) { 'use strict' ; var normalizeReference = require ( '../common/utils' ) . normalizeReference ; var isSpace = require ( '../common/utils' ) . isSpace ; module . exports = function link ( state , silent ) { var attrs , code , label , labelEnd , labelStart , pos , res , ref , title , token , href = '' , oldPos = state . pos , max = state . posMax , start = state . pos , parseReference = true ; if ( state . src . charCodeAt ( state . pos ) !== 0x5B ) { return false ; }
labelStart = state . pos + 1 ; labelEnd = state . md . helpers . parseLinkLabel ( state , state . pos , true ) ; if ( labelEnd < 0 ) { return false ; }
pos = labelEnd + 1 ; if ( pos < max && state . src . charCodeAt ( pos ) === 0x28 ) { parseReference = false ; pos ++ ; for ( ; pos < max ; pos ++ ) { code = state . src . charCodeAt ( pos ) ; if ( ! isSpace ( code ) && code !== 0x0A ) { break ; } }
if ( pos >= max ) { return false ; }
start = pos ; res = state . md . helpers . parseLinkDestination ( state . src , pos , state . posMax ) ; if ( res . ok ) { href = state . md . normalizeLink ( res . str ) ; if ( state . md . validateLink ( href ) ) { pos = res . pos ; } else { href = '' ; } }
start = pos ; for ( ; pos < max ; pos ++ ) { code = state . src . charCodeAt ( pos ) ; if ( ! isSpace ( code ) && code !== 0x0A ) { break ; } }
res = state . md . helpers . parseLinkTitle ( state . src , pos , state . posMax ) ; if ( pos < max && start !== pos && res . ok ) { title = res . str ; pos = res . pos ; for ( ; pos < max ; pos ++ ) { code = state . src . charCodeAt ( pos ) ; if ( ! isSpace ( code ) && code !== 0x0A ) { break ; } } } else { title = '' ; }
if ( pos >= max || state . src . charCodeAt ( pos ) !== 0x29 ) { parseReference = true ; }
pos ++ ; }
if ( parseReference ) { if ( typeof state . env . references === 'undefined' ) { return false ; }
if ( pos < max && state . src . charCodeAt ( pos ) === 0x5B ) { start = pos + 1 ; pos = state . md . helpers . parseLinkLabel ( state , pos ) ; if ( pos >= 0 ) { label = state . src . slice ( start , pos ++ ) ; } else { pos = labelEnd + 1 ; } } else { pos = labelEnd + 1 ; }
if ( ! label ) { label = state . src . slice ( labelStart , labelEnd ) ; }
ref = state . env . references [ normalizeReference ( label ) ] ; if ( ! ref ) { state . pos = oldPos ; return false ; }
href = ref . href ; title = ref . title ; }
if ( ! silent ) { state . pos = labelStart ; state . posMax = labelEnd ; token = state . push ( 'link_open' , 'a' , 1 ) ; token . attrs = attrs = [ [ 'href' , href ] ] ; if ( title ) { attrs . push ( [ 'title' , title ] ) ; }
state . md . inline . tokenize ( state ) ; token = state . push ( 'link_close' , 'a' , - 1 ) ; }
state . pos = pos ; state . posMax = max ; return true ; } ; } , { "../common/utils" : 4 } ] , 46 : [ function ( require , module , exports ) { 'use strict' ; var isSpace = require ( '../common/utils' ) . isSpace ; module . exports = function newline ( state , silent ) { var pmax , max , pos = state . pos ; if ( state . src . charCodeAt ( pos ) !== 0x0A ) { return false ; }
pmax = state . pending . length - 1 ; max = state . posMax ; if ( ! silent ) { if ( pmax >= 0 && state . pending . charCodeAt ( pmax ) === 0x20 ) { if ( pmax >= 1 && state . pending . charCodeAt ( pmax - 1 ) === 0x20 ) { state . pending = state . pending . replace ( / +$/ , '' ) ; state . push ( 'hardbreak' , 'br' , 0 ) ; } else { state . pending = state . pending . slice ( 0 , - 1 ) ; state . push ( 'softbreak' , 'br' , 0 ) ; } } else { state . push ( 'softbreak' , 'br' , 0 ) ; } }
pos ++ ; while ( pos < max && isSpace ( state . src . charCodeAt ( pos ) ) ) { pos ++ ; }
state . pos = pos ; return true ; } ; } , { "../common/utils" : 4 } ] , 47 : [ function ( require , module , exports ) { 'use strict' ; var Token = require ( '../token' ) ; var isWhiteSpace = require ( '../common/utils' ) . isWhiteSpace ; var isPunctChar = require ( '../common/utils' ) . isPunctChar ; var isMdAsciiPunct = require ( '../common/utils' ) . isMdAsciiPunct ; function StateInline ( src , md , env , outTokens ) { this . src = src ; this . env = env ; this . md = md ; this . tokens = outTokens ; this . pos = 0 ; this . posMax = this . src . length ; this . level = 0 ; this . pending = '' ; this . pendingLevel = 0 ; this . cache = { } ; this . delimiters = [ ] ; }
StateInline . prototype . pushPending = function ( ) { var token = new Token ( 'text' , '' , 0 ) ; token . content = this . pending ; token . level = this . pendingLevel ; this . tokens . push ( token ) ; this . pending = '' ; return token ; } ; StateInline . prototype . push = function ( type , tag , nesting ) { if ( this . pending ) { this . pushPending ( ) ; }
var token = new Token ( type , tag , nesting ) ; if ( nesting < 0 ) { this . level -- ; }
token . level = this . level ; if ( nesting > 0 ) { this . level ++ ; }
this . pendingLevel = this . level ; this . tokens . push ( token ) ; return token ; } ; StateInline . prototype . scanDelims = function ( start , canSplitWord ) { var pos = start , lastChar , nextChar , count , can _open , can _close , isLastWhiteSpace , isLastPunctChar , isNextWhiteSpace , isNextPunctChar , left _flanking = true , right _flanking = true , max = this . posMax , marker = this . src . charCodeAt ( start ) ; lastChar = start > 0 ? this . src . charCodeAt ( start - 1 ) : 0x20 ; while ( pos < max && this . src . charCodeAt ( pos ) === marker ) { pos ++ ; }
count = pos - start ; nextChar = pos < max ? this . src . charCodeAt ( pos ) : 0x20 ; isLastPunctChar = isMdAsciiPunct ( lastChar ) || isPunctChar ( String . fromCharCode ( lastChar ) ) ; isNextPunctChar = isMdAsciiPunct ( nextChar ) || isPunctChar ( String . fromCharCode ( nextChar ) ) ; isLastWhiteSpace = isWhiteSpace ( lastChar ) ; isNextWhiteSpace = isWhiteSpace ( nextChar ) ; if ( isNextWhiteSpace ) { left _flanking = false ; } else if ( isNextPunctChar ) { if ( ! ( isLastWhiteSpace || isLastPunctChar ) ) { left _flanking = false ; } }
if ( isLastWhiteSpace ) { right _flanking = false ; } else if ( isLastPunctChar ) { if ( ! ( isNextWhiteSpace || isNextPunctChar ) ) { right _flanking = false ; } }
if ( ! canSplitWord ) { can _open = left _flanking && ( ! right _flanking || isLastPunctChar ) ; can _close = right _flanking && ( ! left _flanking || isNextPunctChar ) ; } else { can _open = left _flanking ; can _close = right _flanking ; }
return { can _open : can _open , can _close : can _close , length : count } ; } ; StateInline . prototype . Token = Token ; module . exports = StateInline ; } , { "../common/utils" : 4 , "../token" : 51 } ] , 48 : [ function ( require , module , exports ) { 'use strict' ; module . exports . tokenize = function strikethrough ( state , silent ) { var i , scanned , token , len , ch , start = state . pos , marker = state . src . charCodeAt ( start ) ; if ( silent ) { return false ; }
if ( marker !== 0x7E ) { return false ; }
scanned = state . scanDelims ( state . pos , true ) ; len = scanned . length ; ch = String . fromCharCode ( marker ) ; if ( len < 2 ) { return false ; }
if ( len % 2 ) { token = state . push ( 'text' , '' , 0 ) ; token . content = ch ; len -- ; }
for ( i = 0 ; i < len ; i += 2 ) { token = state . push ( 'text' , '' , 0 ) ; token . content = ch + ch ; state . delimiters . push ( { marker : marker , jump : i , token : state . tokens . length - 1 , level : state . level , end : - 1 , open : scanned . can _open , close : scanned . can _close } ) ; }
state . pos += scanned . length ; return true ; } ; module . exports . postProcess = function strikethrough ( state ) { var i , j , startDelim , endDelim , token , loneMarkers = [ ] , delimiters = state . delimiters , max = state . delimiters . length ; for ( i = 0 ; i < max ; i ++ ) { startDelim = delimiters [ i ] ; if ( startDelim . marker !== 0x7E ) { continue ; }
if ( startDelim . end === - 1 ) { continue ; }
endDelim = delimiters [ startDelim . end ] ; token = state . tokens [ startDelim . token ] ; token . type = 's_open' ; token . tag = 's' ; token . nesting = 1 ; token . markup = '~~' ; token . content = '' ; token = state . tokens [ endDelim . token ] ; token . type = 's_close' ; token . tag = 's' ; token . nesting = - 1 ; token . markup = '~~' ; token . content = '' ; if ( state . tokens [ endDelim . token - 1 ] . type === 'text' && state . tokens [ endDelim . token - 1 ] . content === '~' ) { loneMarkers . push ( endDelim . token - 1 ) ; } }
while ( loneMarkers . length ) { i = loneMarkers . pop ( ) ; j = i + 1 ; while ( j < state . tokens . length && state . tokens [ j ] . type === 's_close' ) { j ++ ; }
j -- ; if ( i !== j ) { token = state . tokens [ j ] ; state . tokens [ j ] = state . tokens [ i ] ; state . tokens [ i ] = token ; } } } ; } , { } ] , 49 : [ function ( require , module , exports ) { 'use strict' ; function isTerminatorChar ( ch ) { switch ( ch ) { case 0x0A : case 0x21 : case 0x23 : case 0x24 : case 0x25 : case 0x26 : case 0x2A : case 0x2B : case 0x2D : case 0x3A : case 0x3C : case 0x3D : case 0x3E : case 0x40 : case 0x5B : case 0x5C : case 0x5D : case 0x5E : case 0x5F : case 0x60 : case 0x7B : case 0x7D : case 0x7E : return true ; default : return false ; } }
module . exports = function text ( state , silent ) { var pos = state . pos ; while ( pos < state . posMax && ! isTerminatorChar ( state . src . charCodeAt ( pos ) ) ) { pos ++ ; }
if ( pos === state . pos ) { return false ; }
if ( ! silent ) { state . pending += state . src . slice ( state . pos , pos ) ; }
state . pos = pos ; return true ; } ; } , { } ] , 50 : [ function ( require , module , exports ) { 'use strict' ; module . exports = function text _collapse ( state ) { var curr , last , level = 0 , tokens = state . tokens , max = state . tokens . length ; for ( curr = last = 0 ; curr < max ; curr ++ ) { level += tokens [ curr ] . nesting ; tokens [ curr ] . level = level ; if ( tokens [ curr ] . type === 'text' && curr + 1 < max && tokens [ curr + 1 ] . type === 'text' ) { tokens [ curr + 1 ] . content = tokens [ curr ] . content + tokens [ curr + 1 ] . content ; } else { if ( curr !== last ) { tokens [ last ] = tokens [ curr ] ; }
last ++ ; } }
if ( curr !== last ) { tokens . length = last ; } } ; } , { } ] , 51 : [ function ( require , module , exports ) { 'use strict' ; function Token ( type , tag , nesting ) { this . type = type ; this . tag = tag ; this . attrs = null ; this . map = null ; this . nesting = nesting ; this . level = 0 ; this . children = null ; this . content = '' ; this . markup = '' ; this . info = '' ; this . meta = null ; this . block = false ; this . hidden = false ; }
Token . prototype . attrIndex = function attrIndex ( name ) { var attrs , i , len ; if ( ! this . attrs ) { return - 1 ; }
attrs = this . attrs ; for ( i = 0 , len = attrs . length ; i < len ; i ++ ) { if ( attrs [ i ] [ 0 ] === name ) { return i ; } }
return - 1 ; } ; Token . prototype . attrPush = function attrPush ( attrData ) { if ( this . attrs ) { this . attrs . push ( attrData ) ; } else { this . attrs = [ attrData ] ; } } ; Token . prototype . attrSet = function attrSet ( name , value ) { var idx = this . attrIndex ( name ) , attrData = [ name , value ] ; if ( idx < 0 ) { this . attrPush ( attrData ) ; } else { this . attrs [ idx ] = attrData ; } } ; Token . prototype . attrGet = function attrGet ( name ) { var idx = this . attrIndex ( name ) , value = null ; if ( idx >= 0 ) { value = this . attrs [ idx ] [ 1 ] ; }
return value ; } ; Token . prototype . attrJoin = function attrJoin ( name , value ) { var idx = this . attrIndex ( name ) ; if ( idx < 0 ) { this . attrPush ( [ name , value ] ) ; } else { this . attrs [ idx ] [ 1 ] = this . attrs [ idx ] [ 1 ] + ' ' + value ; } } ; module . exports = Token ; } , { } ] , 52 : [ function ( require , module , exports ) { module . exports = { "Aacute" : "\u00C1" , "aacute" : "\u00E1" , "Abreve" : "\u0102" , "abreve" : "\u0103" , "ac" : "\u223E" , "acd" : "\u223F" , "acE" : "\u223E\u0333" , "Acirc" : "\u00C2" , "acirc" : "\u00E2" , "acute" : "\u00B4" , "Acy" : "\u0410" , "acy" : "\u0430" , "AElig" : "\u00C6" , "aelig" : "\u00E6" , "af" : "\u2061" , "Afr" : "\uD835\uDD04" , "afr" : "\uD835\uDD1E" , "Agrave" : "\u00C0" , "agrave" : "\u00E0" , "alefsym" : "\u2135" , "aleph" : "\u2135" , "Alpha" : "\u0391" , "alpha" : "\u03B1" , "Amacr" : "\u0100" , "amacr" : "\u0101" , "amalg" : "\u2A3F" , "amp" : "&" , "AMP" : "&" , "andand" : "\u2A55" , "And" : "\u2A53" , "and" : "\u2227" , "andd" : "\u2A5C" , "andslope" : "\u2A58" , "andv" : "\u2A5A" , "ang" : "\u2220" , "ange" : "\u29A4" , "angle" : "\u2220" , "angmsdaa" : "\u29A8" , "angmsdab" : "\u29A9" , "angmsdac" : "\u29AA" , "angmsdad" : "\u29AB" , "angmsdae" : "\u29AC" , "angmsdaf" : "\u29AD" , "angmsdag" : "\u29AE" , "angmsdah" : "\u29AF" , "angmsd" : "\u2221" , "angrt" : "\u221F" , "angrtvb" : "\u22BE" , "angrtvbd" : "\u299D" , "angsph" : "\u2222" , "angst" : "\u00C5" , "angzarr" : "\u237C" , "Aogon" : "\u0104" , "aogon" : "\u0105" , "Aopf" : "\uD835\uDD38" , "aopf" : "\uD835\uDD52" , "apacir" : "\u2A6F" , "ap" : "\u2248" , "apE" : "\u2A70" , "ape" : "\u224A" , "apid" : "\u224B" , "apos" : "'" , "ApplyFunction" : "\u2061" , "approx" : "\u2248" , "approxeq" : "\u224A" , "Aring" : "\u00C5" , "aring" : "\u00E5" , "Ascr" : "\uD835\uDC9C" , "ascr" : "\uD835\uDCB6" , "Assign" : "\u2254" , "ast" : "*" , "asymp" : "\u2248" , "asympeq" : "\u224D" , "Atilde" : "\u00C3" , "atilde" : "\u00E3" , "Auml" : "\u00C4" , "auml" : "\u00E4" , "awconint" : "\u2233" , "awint" : "\u2A11" , "backcong" : "\u224C" , "backepsilon" : "\u03F6" , "backprime" : "\u2035" , "backsim" : "\u223D" , "backsimeq" : "\u22CD" , "Backslash" : "\u2216" , "Barv" : "\u2AE7" , "barvee" : "\u22BD" , "barwed" : "\u2305" , "Barwed" : "\u2306" , "barwedge" : "\u2305" , "bbrk" : "\u23B5" , "bbrktbrk" : "\u23B6" , "bcong" : "\u224C" , "Bcy" : "\u0411" , "bcy" : "\u0431" , "bdquo" : "\u201E" , "becaus" : "\u2235" , "because" : "\u2235" , "Because" : "\u2235" , "bemptyv" : "\u29B0" , "bepsi" : "\u03F6" , "bernou" : "\u212C" , "Bernoullis" : "\u212C" , "Beta" : "\u0392" , "beta" : "\u03B2" , "beth" : "\u2136" , "between" : "\u226C" , "Bfr" : "\uD835\uDD05" , "bfr" : "\uD835\uDD1F" , "bigcap" : "\u22C2" , "bigcirc" : "\u25EF" , "bigcup" : "\u22C3" , "bigodot" : "\u2A00" , "bigoplus" : "\u2A01" , "bigotimes" : "\u2A02" , "bigsqcup" : "\u2A06" , "bigstar" : "\u2605" , "bigtriangledown" : "\u25BD" , "bigtriangleup" : "\u25B3" , "biguplus" : "\u2A04" , "bigvee" : "\u22C1" , "bigwedge" : "\u22C0" , "bkarow" : "\u290D" , "blacklozenge" : "\u29EB" , "blacksquare" : "\u25AA" , "blacktriangle" : "\u25B4" , "blacktriangledown" : "\u25BE" , "blacktriangleleft" : "\u25C2" , "blacktriangleright" : "\u25B8" , "blank" : "\u2423" , "blk12" : "\u2592" , "blk14" : "\u2591" , "blk34" : "\u2593" , "block" : "\u2588" , "bne" : "=\u20E5" , "bnequiv" : "\u2261\u20E5" , "bNot" : "\u2AED" , "bnot" : "\u2310" , "Bopf" : "\uD835\uDD39" , "bopf" : "\uD835\uDD53" , "bot" : "\u22A5" , "bottom" : "\u22A5" , "bowtie" : "\u22C8" , "boxbox" : "\u29C9" , "boxdl" : "\u2510" , "boxdL" : "\u2555" , "boxDl" : "\u2556" , "boxDL" : "\u2557" , "boxdr" : "\u250C" , "boxdR" : "\u2552" , "boxDr" : "\u2553" , "boxDR" : "\u2554" , "boxh" : "\u2500" , "boxH" : "\u2550" , "boxhd" : "\u252C" , "boxHd" : "\u2564" , "boxhD" : "\u2565" , "boxHD" : "\u2566" , "boxhu" : "\u2534" , "boxHu" : "\u2567" , "boxhU" : "\u2568" , "boxHU" : "\u2569" , "boxminus" : "\u229F" , "boxplus" : "\u229E" , "boxtimes" : "\u22A0" , "boxul" : "\u2518" , "boxuL" : "\u255B" , "boxUl" : "\u255C" , "boxUL" : "\u255D" , "boxur" : "\u2514" , "boxuR" : "\u2558" , "boxUr" : "\u2559" , "boxUR" : "\u255A" , "boxv" : "\u2502" , "boxV" : "\u2551" , "boxvh" : "\u253C" , "boxvH" : "\u256A" , "boxVh" : "\u256B" , "boxVH" : "\u256C" , "boxvl" : "\u2524" , "boxvL" : "\u2561" , "boxVl" : "\u2562" , "boxVL" : "\u2563" , "boxvr" : "\u251C" , "boxvR" : "\u255E" , "boxVr" : "\u255F" , "boxVR" : "\u2560" , "bprime" : "\u2035" , "breve" : "\u02D8" , "Breve" : "\u02D8" , "brvbar" : "\u00A6" , "bscr" : "\uD835\uDCB7" , "Bscr" : "\u212C" , "bsemi" : "\u204F" , "bsim" : "\u223D" , "bsime" : "\u22CD" , "bsolb" : "\u29C5" , "bsol" : "\\" , "bsolhsub" : "\u27C8" , "bull" : "\u2022" , "bullet" : "\u2022" , "bump" : "\u224E" , "bumpE" : "\u2AAE" , "bumpe" : "\u224F" , "Bumpeq" : "\u224E" , "bumpeq" : "\u224F" , "Cacute" : "\u0106" , "cacute" : "\u0107" , "capand" : "\u2A44" , "capbrcup" : "\u2A49" , "capcap" : "\u2A4B" , "cap" : "\u2229" ,
Object . keys ( source ) . forEach ( function ( key ) { obj [ key ] = source [ key ] ; } ) ; } ) ; return obj ; }
function _class ( obj ) { return Object . prototype . toString . call ( obj ) ; }
function isString ( obj ) { return _class ( obj ) === '[object String]' ; }
function isObject ( obj ) { return _class ( obj ) === '[object Object]' ; }
function isRegExp ( obj ) { return _class ( obj ) === '[object RegExp]' ; }
function isFunction ( obj ) { return _class ( obj ) === '[object Function]' ; }
function escapeRE ( str ) { return str . replace ( /[.?*+^$[\]\\(){}|-]/g , '\\$&' ) ; }
var defaultOptions = { fuzzyLink : true , fuzzyEmail : true , fuzzyIP : false } ; function isOptionsObj ( obj ) { return Object . keys ( obj || { } ) . reduce ( function ( acc , k ) { return acc || defaultOptions . hasOwnProperty ( k ) ; } , false ) ; }
var defaultSchemas = { 'http:' : { validate : function ( text , pos , self ) { var tail = text . slice ( pos ) ; if ( ! self . re . http ) { self . re . http = new RegExp ( '^\\/\\/' + self . re . src _auth + self . re . src _host _port _strict + self . re . src _path , 'i' ) ; }
if ( self . re . http . test ( tail ) ) { return tail . match ( self . re . http ) [ 0 ] . length ; }
return 0 ; } } , 'https:' : 'http:' , 'ftp:' : 'http:' , '//' : { validate : function ( text , pos , self ) { var tail = text . slice ( pos ) ; if ( ! self . re . no _http ) { self . re . no _http = new RegExp ( '^' +
self . re . src _auth + '(?:localhost|(?:(?:' + self . re . src _domain + ')\\.)+' + self . re . src _domain _root + ')' +
self . re . src _port +
self . re . src _host _terminator +
self . re . src _path , 'i' ) ; }
if ( self . re . no _http . test ( tail ) ) { if ( pos >= 3 && text [ pos - 3 ] === ':' ) { return 0 ; }
if ( pos >= 3 && text [ pos - 3 ] === '/' ) { return 0 ; }
return tail . match ( self . re . no _http ) [ 0 ] . length ; }
return 0 ; } } , 'mailto:' : { validate : function ( text , pos , self ) { var tail = text . slice ( pos ) ; if ( ! self . re . mailto ) { self . re . mailto = new RegExp ( '^' + self . re . src _email _name + '@' + self . re . src _host _strict , 'i' ) ; }
if ( self . re . mailto . test ( tail ) ) { return tail . match ( self . re . mailto ) [ 0 ] . length ; }
return 0 ; } } } ; var tlds _2ch _src _re = 'a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]' ; var tlds _default = 'biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф' . split ( '|' ) ; function resetScanCache ( self ) { self . _ _index _ _ = - 1 ; self . _ _text _cache _ _ = '' ; }
function createValidator ( re ) { return function ( text , pos ) { var tail = text . slice ( pos ) ; if ( re . test ( tail ) ) { return tail . match ( re ) [ 0 ] . length ; }
return 0 ; } ; }
function createNormalizer ( ) { return function ( match , self ) { self . normalize ( match ) ; } ; }
function compile ( self ) { var re = self . re = require ( './lib/re' ) ( self . _ _opts _ _ ) ; var tlds = self . _ _tlds _ _ . slice ( ) ; self . onCompile ( ) ; if ( ! self . _ _tlds _replaced _ _ ) { tlds . push ( tlds _2ch _src _re ) ; }
tlds . push ( re . src _xn ) ; re . src _tlds = tlds . join ( '|' ) ; function untpl ( tpl ) { return tpl . replace ( '%TLDS%' , re . src _tlds ) ; }
re . email _fuzzy = RegExp ( untpl ( re . tpl _email _fuzzy ) , 'i' ) ; re . link _fuzzy = RegExp ( untpl ( re . tpl _link _fuzzy ) , 'i' ) ; re . link _no _ip _fuzzy = RegExp ( untpl ( re . tpl _link _no _ip _fuzzy ) , 'i' ) ; re . host _fuzzy _test = RegExp ( untpl ( re . tpl _host _fuzzy _test ) , 'i' ) ; var aliases = [ ] ; self . _ _compiled _ _ = { } ; function schemaError ( name , val ) { throw new Error ( '(LinkifyIt) Invalid schema "' + name + '": ' + val ) ; }
Object . keys ( self . _ _schemas _ _ ) . forEach ( function ( name ) { var val = self . _ _schemas _ _ [ name ] ; if ( val === null ) { return ; }
var compiled = { validate : null , link : null } ; self . _ _compiled _ _ [ name ] = compiled ; if ( isObject ( val ) ) { if ( isRegExp ( val . validate ) ) { compiled . validate = createValidator ( val . validate ) ; } else if ( isFunction ( val . validate ) ) { compiled . validate = val . validate ; } else { schemaError ( name , val ) ; }
if ( isFunction ( val . normalize ) ) { compiled . normalize = val . normalize ; } else if ( ! val . normalize ) { compiled . normalize = createNormalizer ( ) ; } else { schemaError ( name , val ) ; }
return ; }
if ( isString ( val ) ) { aliases . push ( name ) ; return ; }
schemaError ( name , val ) ; } ) ; aliases . forEach ( function ( alias ) { if ( ! self . _ _compiled _ _ [ self . _ _schemas _ _ [ alias ] ] ) { return ; }
self . _ _compiled _ _ [ alias ] . validate = self . _ _compiled _ _ [ self . _ _schemas _ _ [ alias ] ] . validate ; self . _ _compiled _ _ [ alias ] . normalize = self . _ _compiled _ _ [ self . _ _schemas _ _ [ alias ] ] . normalize ; } ) ; self . _ _compiled _ _ [ '' ] = { validate : null , normalize : createNormalizer ( ) } ; var slist = Object . keys ( self . _ _compiled _ _ ) . filter ( function ( name ) { return name . length > 0 && self . _ _compiled _ _ [ name ] ; } ) . map ( escapeRE ) . join ( '|' ) ; self . re . schema _test = RegExp ( '(^|(?!_)(?:[><\uff5c]|' + re . src _ZPCc + '))(' + slist + ')' , 'i' ) ; self . re . schema _search = RegExp ( '(^|(?!_)(?:[><\uff5c]|' + re . src _ZPCc + '))(' + slist + ')' , 'ig' ) ; self . re . pretest = RegExp ( '(' + self . re . schema _test . source + ')|' + '(' + self . re . host _fuzzy _test . source + ')|' + '@' , 'i' ) ; resetScanCache ( self ) ; }
function Match ( self , shift ) { var start = self . _ _index _ _ , end = self . _ _last _index _ _ , text = self . _ _text _cache _ _ . slice ( start , end ) ; this . schema = self . _ _schema _ _ . toLowerCase ( ) ; this . index = start + shift ; this . lastIndex = end + shift ; this . raw = text ; this . text = text ; this . url = text ; }
function createMatch ( self , shift ) { var match = new Match ( self , shift ) ; self . _ _compiled _ _ [ match . schema ] . normalize ( match , self ) ; return match ; }
function LinkifyIt ( schemas , options ) { if ( ! ( this instanceof LinkifyIt ) ) { return new LinkifyIt ( schemas , options ) ; }
if ( ! options ) { if ( isOptionsObj ( schemas ) ) { options = schemas ; schemas = { } ; } }
this . _ _opts _ _ = assign ( { } , defaultOptions , options ) ; this . _ _index _ _ = - 1 ; this . _ _last _index _ _ = - 1 ; this . _ _schema _ _ = '' ; this . _ _text _cache _ _ = '' ; this . _ _schemas _ _ = assign ( { } , defaultSchemas , schemas ) ; this . _ _compiled _ _ = { } ; this . _ _tlds _ _ = tlds _default ; this . _ _tlds _replaced _ _ = false ; this . re = { } ; compile ( this ) ; }
LinkifyIt . prototype . add = function add ( schema , definition ) { this . _ _schemas _ _ [ schema ] = definition ; compile ( this ) ; return this ; } ; LinkifyIt . prototype . set = function set ( options ) { this . _ _opts _ _ = assign ( this . _ _opts _ _ , options ) ; return this ; } ; LinkifyIt . prototype . test = function test ( text ) { this . _ _text _cache _ _ = text ; this . _ _index _ _ = - 1 ; if ( ! text . length ) { return false ; }
var m , ml , me , len , shift , next , re , tld _pos , at _pos ; if ( this . re . schema _test . test ( text ) ) { re = this . re . schema _search ; re . lastIndex = 0 ; while ( ( m = re . exec ( text ) ) !== null ) { len = this . testSchemaAt ( text , m [ 2 ] , re . lastIndex ) ; if ( len ) { this . _ _schema _ _ = m [ 2 ] ; this . _ _index _ _ = m . index + m [ 1 ] . length ; this . _ _last _index _ _ = m . index + m [ 0 ] . length + len ; break ; } } }
if ( this . _ _opts _ _ . fuzzyLink && this . _ _compiled _ _ [ 'http:' ] ) { tld _pos = text . search ( this . re . host _fuzzy _test ) ; if ( tld _pos >= 0 ) { if ( this . _ _index _ _ < 0 || tld _pos < this . _ _index _ _ ) { if ( ( ml = text . match ( this . _ _opts _ _ . fuzzyIP ? this . re . link _fuzzy : this . re . link _no _ip _fuzzy ) ) !== null ) { shift = ml . index + ml [ 1 ] . length ; if ( this . _ _index _ _ < 0 || shift < this . _ _index _ _ ) { this . _ _schema _ _ = '' ; this . _ _index _ _ = shift ; this . _ _last _index _ _ = ml . index + ml [ 0 ] . length ; } } } } }
if ( this . _ _opts _ _ . fuzzyEmail && this . _ _compiled _ _ [ 'mailto:' ] ) { at _pos = text . indexOf ( '@' ) ; if ( at _pos >= 0 ) { if ( ( me = text . match ( this . re . email _fuzzy ) ) !== null ) { shift = me . index + me [ 1 ] . length ; next = me . index + me [ 0 ] . length ; if ( this . _ _index _ _ < 0 || shift < this . _ _index _ _ || ( shift === this . _ _index _ _ && next > this . _ _last _index _ _ ) ) { this . _ _schema _ _ = 'mailto:' ; this . _ _index _ _ = shift ; this . _ _last _index _ _ = next ; } } } }
return this . _ _index _ _ >= 0 ; } ; LinkifyIt . prototype . pretest = function pretest ( text ) { return this . re . pretest . test ( text ) ; } ; LinkifyIt . prototype . testSchemaAt = function testSchemaAt ( text , schema , pos ) { if ( ! this . _ _compiled _ _ [ schema . toLowerCase ( ) ] ) { return 0 ; }
return this . _ _compiled _ _ [ schema . toLowerCase ( ) ] . validate ( text , pos , this ) ; } ; LinkifyIt . prototype . match = function match ( text ) { var shift = 0 , result = [ ] ; if ( this . _ _index _ _ >= 0 && this . _ _text _cache _ _ === text ) { result . push ( createMatch ( this , shift ) ) ; shift = this . _ _last _index _ _ ; }
var tail = shift ? text . slice ( shift ) : text ; while ( this . test ( tail ) ) { result . push ( createMatch ( this , shift ) ) ; tail = tail . slice ( this . _ _last _index _ _ ) ; shift += this . _ _last _index _ _ ; }
if ( result . length ) { return result ; }
return null ; } ; LinkifyIt . prototype . tlds = function tlds ( list , keepOld ) { list = Array . isArray ( list ) ? list : [ list ] ; if ( ! keepOld ) { this . _ _tlds _ _ = list . slice ( ) ; this . _ _tlds _replaced _ _ = true ; compile ( this ) ; return this ; }
this . _ _tlds _ _ = this . _ _tlds _ _ . concat ( list ) . sort ( ) . filter ( function ( el , idx , arr ) { return el !== arr [ idx - 1 ] ; } ) . reverse ( ) ; compile ( this ) ; return this ; } ; LinkifyIt . prototype . normalize = function normalize ( match ) { if ( ! match . schema ) { match . url = 'http://' + match . url ; }
if ( match . schema === 'mailto:' && ! /^mailto:/i . test ( match . url ) ) { match . url = 'mailto:' + match . url ; } } ; LinkifyIt . prototype . onCompile = function onCompile ( ) { } ; module . exports = LinkifyIt ; } , { "./lib/re" : 54 } ] , 54 : [ function ( require , module , exports ) { 'use strict' ; module . exports = function ( opts ) { var re = { } ; re . src _Any = require ( 'uc.micro/properties/Any/regex' ) . source ; re . src _Cc = require ( 'uc.micro/categories/Cc/regex' ) . source ; re . src _Z = require ( 'uc.micro/categories/Z/regex' ) . source ; re . src _P = require ( 'uc.micro/categories/P/regex' ) . source ; re . src _ZPCc = [ re . src _Z , re . src _P , re . src _Cc ] . join ( '|' ) ; re . src _ZCc = [ re . src _Z , re . src _Cc ] . join ( '|' ) ; var text _separators = '[><\uff5c]' ; re . src _pseudo _letter = '(?:(?!' + text _separators + '|' + re . src _ZPCc + ')' + re . src _Any + ')' ; re . src _ip4 = '(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' ; re . src _auth = '(?:(?:(?!' + re . src _ZCc + '|[@/\\[\\]()]).)+@)?' ; re . src _port = '(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?' ; re . src _host _terminator = '(?=$|' + text _separators + '|' + re . src _ZPCc + ')(?!-|_|:\\d|\\.-|\\.(?!$|' + re . src _ZPCc + '))' ; re . src _path = '(?:' + '[/?#]' + '(?:' + '(?!' + re . src _ZCc + '|' + text _separators + '|[()[\\]{}.,"\'?!\\-]).|' + '\\[(?:(?!' + re . src _ZCc + '|\\]).)*\\]|' + '\\((?:(?!' + re . src _ZCc + '|[)]).)*\\)|' + '\\{(?:(?!' + re . src _ZCc + '|[}]).)*\\}|' + '\\"(?:(?!' + re . src _ZCc + '|["]).)+\\"|' + "\\'(?:(?!" + re . src _ZCc + "|[']).)+\\'|" + "\\'(?=" + re . src _pseudo _letter + '|[-]).|' + '\\.{2,3}[a-zA-Z0-9%/]|' + '\\.(?!' + re . src _ZCc + '|[.]).|' +
( opts && opts [ '---' ] ? '\\-(?!--(?:[^-]|$))(?:-*)|' : '\\-+|' ) + '\\,(?!' + re . src _ZCc + ').|' + '\\!(?!' + re . src _ZCc + '|[!]).|' + '\\?(?!' + re . src _ZCc + '|[?]).' + ')+' + '|\\/' + ')?' ; re . src _email _name = '[\\-;:&=\\+\\$,\\"\\.a-zA-Z0-9_]+' ; re . src _xn = 'xn--[a-z0-9\\-]{1,59}' ; re . src _domain _root = '(?:' +
re . src _xn + '|' +
re . src _pseudo _letter + '{1,63}' + ')' ; re . src _domain = '(?:' +
re . src _xn + '|' + '(?:' + re . src _pseudo _letter + ')' + '|' + '(?:' + re . src _pseudo _letter + '(?:-(?!-)|' + re . src _pseudo _letter + '){0,61}' + re . src _pseudo _letter + ')' + ')' ; re . src _host = '(?:' + '(?:(?:(?:' + re . src _domain + ')\\.)*' + re . src _domain + ')' + ')' ; re . tpl _host _fuzzy = '(?:' +
re . src _ip4 + '|' + '(?:(?:(?:' + re . src _domain + ')\\.)+(?:%TLDS%))' + ')' ; re . tpl _host _no _ip _fuzzy = '(?:(?:(?:' + re . src _domain + ')\\.)+(?:%TLDS%))' ; re . src _host _strict = re . src _host + re . src _host _terminator ; re . tpl _host _fuzzy _strict = re . tpl _host _fuzzy + re . src _host _terminator ; re . src _host _port _strict = re . src _host + re . src _port + re . src _host _terminator ; re . tpl _host _port _fuzzy _strict = re . tpl _host _fuzzy + re . src _port + re . src _host _terminator ; re . tpl _host _port _no _ip _fuzzy _strict = re . tpl _host _no _ip _fuzzy + re . src _port + re . src _host _terminator ; re . tpl _host _fuzzy _test = 'localhost|www\\.|\\.\\d{1,3}\\.|(?:\\.(?:%TLDS%)(?:' + re . src _ZPCc + '|>|$))' ; re . tpl _email _fuzzy = '(^|' + text _separators + '|\\(|' + re . src _ZCc + ')(' + re . src _email _name + '@' + re . tpl _host _fuzzy _strict + ')' ; re . tpl _link _fuzzy = '(^|(?![.:/\\-_@])(?:[$+<=>^`|\uff5c]|' + re . src _ZPCc + '))' + '((?![$+<=>^`|\uff5c])' + re . tpl _host _port _fuzzy _strict + re . src _path + ')' ; re . tpl _link _no _ip _fuzzy = '(^|(?![.:/\\-_@])(?:[$+<=>^`|\uff5c]|' + re . src _ZPCc + '))' + '((?![$+<=>^`|\uff5c])' + re . tpl _host _port _no _ip _fuzzy _strict + re . src _path + ')' ; return re ; } ; } , { "uc.micro/categories/Cc/regex" : 61 , "uc.micro/categories/P/regex" : 63 , "uc.micro/categories/Z/regex" : 64 , "uc.micro/properties/Any/regex" : 66 } ] , 55 : [ function ( require , module , exports ) { 'use strict' ; var decodeCache = { } ; function getDecodeCache ( exclude ) { var i , ch , cache = decodeCache [ exclude ] ; if ( cache ) { return cache ; }
cache = decodeCache [ exclude ] = [ ] ; for ( i = 0 ; i < 128 ; i ++ ) { ch = String . fromCharCode ( i ) ; cache . push ( ch ) ; }
for ( i = 0 ; i < exclude . length ; i ++ ) { ch = exclude . charCodeAt ( i ) ; cache [ ch ] = '%' + ( '0' + ch . toString ( 16 ) . toUpperCase ( ) ) . slice ( - 2 ) ; }
return cache ; }
function decode ( string , exclude ) { var cache ; if ( typeof exclude !== 'string' ) { exclude = decode . defaultChars ; }
cache = getDecodeCache ( exclude ) ; return string . replace ( /(%[a-f0-9]{2})+/gi , function ( seq ) { var i , l , b1 , b2 , b3 , b4 , chr , result = '' ; for ( i = 0 , l = seq . length ; i < l ; i += 3 ) { b1 = parseInt ( seq . slice ( i + 1 , i + 3 ) , 16 ) ; if ( b1 < 0x80 ) { result += cache [ b1 ] ; continue ; }
if ( ( b1 & 0xE0 ) === 0xC0 && ( i + 3 < l ) ) { b2 = parseInt ( seq . slice ( i + 4 , i + 6 ) , 16 ) ; if ( ( b2 & 0xC0 ) === 0x80 ) { chr = ( ( b1 << 6 ) & 0x7C0 ) | ( b2 & 0x3F ) ; if ( chr < 0x80 ) { result += '\ufffd\ufffd' ; } else { result += String . fromCharCode ( chr ) ; }
i += 3 ; continue ; } }
if ( ( b1 & 0xF0 ) === 0xE0 && ( i + 6 < l ) ) { b2 = parseInt ( seq . slice ( i + 4 , i + 6 ) , 16 ) ; b3 = parseInt ( seq . slice ( i + 7 , i + 9 ) , 16 ) ; if ( ( b2 & 0xC0 ) === 0x80 && ( b3 & 0xC0 ) === 0x80 ) { chr = ( ( b1 << 12 ) & 0xF000 ) | ( ( b2 << 6 ) & 0xFC0 ) | ( b3 & 0x3F ) ; if ( chr < 0x800 || ( chr >= 0xD800 && chr <= 0xDFFF ) ) { result += '\ufffd\ufffd\ufffd' ; } else { result += String . fromCharCode ( chr ) ; }
i += 6 ; continue ; } }
if ( ( b1 & 0xF8 ) === 0xF0 && ( i + 9 < l ) ) { b2 = parseInt ( seq . slice ( i + 4 , i + 6 ) , 16 ) ; b3 = parseInt ( seq . slice ( i + 7 , i + 9 ) , 16 ) ; b4 = parseInt ( seq . slice ( i + 10 , i + 12 ) , 16 ) ; if ( ( b2 & 0xC0 ) === 0x80 && ( b3 & 0xC0 ) === 0x80 && ( b4 & 0xC0 ) === 0x80 ) { chr = ( ( b1 << 18 ) & 0x1C0000 ) | ( ( b2 << 12 ) & 0x3F000 ) | ( ( b3 << 6 ) & 0xFC0 ) | ( b4 & 0x3F ) ; if ( chr < 0x10000 || chr > 0x10FFFF ) { result += '\ufffd\ufffd\ufffd\ufffd' ; } else { chr -= 0x10000 ; result += String . fromCharCode ( 0xD800 + ( chr >> 10 ) , 0xDC00 + ( chr & 0x3FF ) ) ; }
i += 9 ; continue ; } }
result += '\ufffd' ; }
return result ; } ) ; }
decode . defaultChars = ';/?:@&=+$,#' ; decode . componentChars = '' ; module . exports = decode ; } , { } ] , 56 : [ function ( require , module , exports ) { 'use strict' ; var encodeCache = { } ; function getEncodeCache ( exclude ) { var i , ch , cache = encodeCache [ exclude ] ; if ( cache ) { return cache ; }
cache = encodeCache [ exclude ] = [ ] ; for ( i = 0 ; i < 128 ; i ++ ) { ch = String . fromCharCode ( i ) ; if ( /^[0-9a-z]$/i . test ( ch ) ) { cache . push ( ch ) ; } else { cache . push ( '%' + ( '0' + i . toString ( 16 ) . toUpperCase ( ) ) . slice ( - 2 ) ) ; } }
for ( i = 0 ; i < exclude . length ; i ++ ) { cache [ exclude . charCodeAt ( i ) ] = exclude [ i ] ; }
return cache ; }
function encode ( string , exclude , keepEscaped ) { var i , l , code , nextCode , cache , result = '' ; if ( typeof exclude !== 'string' ) { keepEscaped = exclude ; exclude = encode . defaultChars ; }
if ( typeof keepEscaped === 'undefined' ) { keepEscaped = true ; }
cache = getEncodeCache ( exclude ) ; for ( i = 0 , l = string . length ; i < l ; i ++ ) { code = string . charCodeAt ( i ) ; if ( keepEscaped && code === 0x25 && i + 2 < l ) { if ( /^[0-9a-f]{2}$/i . test ( string . slice ( i + 1 , i + 3 ) ) ) { result += string . slice ( i , i + 3 ) ; i += 2 ; continue ; } }
if ( code < 128 ) { result += cache [ code ] ; continue ; }
if ( code >= 0xD800 && code <= 0xDFFF ) { if ( code >= 0xD800 && code <= 0xDBFF && i + 1 < l ) { nextCode = string . charCodeAt ( i + 1 ) ; if ( nextCode >= 0xDC00 && nextCode <= 0xDFFF ) { result += encodeURIComponent ( string [ i ] + string [ i + 1 ] ) ; i ++ ; continue ; } }
result += '%EF%BF%BD' ; continue ; }
result += encodeURIComponent ( string [ i ] ) ; }
return result ; }
encode . defaultChars = ";/?:@&=+$,-_.!~*'()#" ; encode . componentChars = "-_.!~*'()" ; module . exports = encode ; } , { } ] , 57 : [ function ( require , module , exports ) { 'use strict' ; module . exports = function format ( url ) { var result = '' ; result += url . protocol || '' ; result += url . slashes ? '//' : '' ; result += url . auth ? url . auth + '@' : '' ; if ( url . hostname && url . hostname . indexOf ( ':' ) !== - 1 ) { result += '[' + url . hostname + ']' ; } else { result += url . hostname || '' ; }
result += url . port ? ':' + url . port : '' ; result += url . pathname || '' ; result += url . search || '' ; result += url . hash || '' ; return result ; } ; } , { } ] , 58 : [ function ( require , module , exports ) { 'use strict' ; module . exports . encode = require ( './encode' ) ; module . exports . decode = require ( './decode' ) ; module . exports . format = require ( './format' ) ; module . exports . parse = require ( './parse' ) ; } , { "./decode" : 55 , "./encode" : 56 , "./format" : 57 , "./parse" : 59 } ] , 59 : [ function ( require , module , exports ) { 'use strict' ; function Url ( ) { this . protocol = null ; this . slashes = null ; this . auth = null ; this . port = null ; this . hostname = null ; this . hash = null ; this . search = null ; this . pathname = null ; }
var protocolPattern = /^([a-z0-9.+-]+:)/i , portPattern = /:[0-9]*$/ , simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/ , delims = [ '<' , '>' , '"' , '`' , ' ' , '\r' , '\n' , '\t' ] , unwise = [ '{' , '}' , '|' , '\\' , '^' , '`' ] . concat ( delims ) , autoEscape = [ '\'' ] . concat ( unwise ) , nonHostChars = [ '%' , '/' , '?' , ';' , '#' ] . concat ( autoEscape ) , hostEndingChars = [ '/' , '?' , '#' ] , hostnameMaxLen = 255 , hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/ , hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/ , hostlessProtocol = { 'javascript' : true , 'javascript:' : true } , slashedProtocol = { 'http' : true , 'https' : true , 'ftp' : true , 'gopher' : true , 'file' : true , 'http:' : true , 'https:' : true , 'ftp:' : true , 'gopher:' : true , 'file:' : true } ; function urlParse ( url , slashesDenoteHost ) { if ( url && url instanceof Url ) { return url ; }
var u = new Url ( ) ; u . parse ( url , slashesDenoteHost ) ; return u ; }
Url . prototype . parse = function ( url , slashesDenoteHost ) { var i , l , lowerProto , hec , slashes , rest = url ; rest = rest . trim ( ) ; if ( ! slashesDenoteHost && url . split ( '#' ) . length === 1 ) { var simplePath = simplePathPattern . exec ( rest ) ; if ( simplePath ) { this . pathname = simplePath [ 1 ] ; if ( simplePath [ 2 ] ) { this . search = simplePath [ 2 ] ; }
return this ; } }
var proto = protocolPattern . exec ( rest ) ; if ( proto ) { proto = proto [ 0 ] ; lowerProto = proto . toLowerCase ( ) ; this . protocol = proto ; rest = rest . substr ( proto . length ) ; }
if ( slashesDenoteHost || proto || rest . match ( /^\/\/[^@\/]+@[^@\/]+/ ) ) { slashes = rest . substr ( 0 , 2 ) === '//' ; if ( slashes && ! ( proto && hostlessProtocol [ proto ] ) ) { rest = rest . substr ( 2 ) ; this . slashes = true ; } }
if ( ! hostlessProtocol [ proto ] && ( slashes || ( proto && ! slashedProtocol [ proto ] ) ) ) { var hostEnd = - 1 ; for ( i = 0 ; i < hostEndingChars . length ; i ++ ) { hec = rest . indexOf ( hostEndingChars [ i ] ) ; if ( hec !== - 1 && ( hostEnd === - 1 || hec < hostEnd ) ) { hostEnd = hec ; } }
var auth , atSign ; if ( hostEnd === - 1 ) { atSign = rest . lastIndexOf ( '@' ) ; } else { atSign = rest . lastIndexOf ( '@' , hostEnd ) ; }
if ( atSign !== - 1 ) { auth = rest . slice ( 0 , atSign ) ; rest = rest . slice ( atSign + 1 ) ; this . auth = auth ; }
hostEnd = - 1 ; for ( i = 0 ; i < nonHostChars . length ; i ++ ) { hec = rest . indexOf ( nonHostChars [ i ] ) ; if ( hec !== - 1 && ( hostEnd === - 1 || hec < hostEnd ) ) { hostEnd = hec ; } }
if ( hostEnd === - 1 ) { hostEnd = rest . length ; }
if ( rest [ hostEnd - 1 ] === ':' ) { hostEnd -- ; }
var host = rest . slice ( 0 , hostEnd ) ; rest = rest . slice ( hostEnd ) ; this . parseHost ( host ) ; this . hostname = this . hostname || '' ; var ipv6Hostname = this . hostname [ 0 ] === '[' && this . hostname [ this . hostname . length - 1 ] === ']' ; if ( ! ipv6Hostname ) { var hostparts = this . hostname . split ( /\./ ) ; for ( i = 0 , l = hostparts . length ; i < l ; i ++ ) { var part = hostparts [ i ] ; if ( ! part ) { continue ; }
if ( ! part . match ( hostnamePartPattern ) ) { var newpart = '' ; for ( var j = 0 , k = part . length ; j < k ; j ++ ) { if ( part . charCodeAt ( j ) > 127 ) { newpart += 'x' ; } else { newpart += part [ j ] ; } }
if ( ! newpart . match ( hostnamePartPattern ) ) { var validParts = hostparts . slice ( 0 , i ) ; var notHost = hostparts . slice ( i + 1 ) ; var bit = part . match ( hostnamePartStart ) ; if ( bit ) { validParts . push ( bit [ 1 ] ) ; notHost . unshift ( bit [ 2 ] ) ; }
if ( notHost . length ) { rest = notHost . join ( '.' ) + rest ; }
this . hostname = validParts . join ( '.' ) ; break ; } } } }
if ( this . hostname . length > hostnameMaxLen ) { this . hostname = '' ; }
if ( ipv6Hostname ) { this . hostname = this . hostname . substr ( 1 , this . hostname . length - 2 ) ; } }
var hash = rest . indexOf ( '#' ) ; if ( hash !== - 1 ) { this . hash = rest . substr ( hash ) ; rest = rest . slice ( 0 , hash ) ; }
var qm = rest . indexOf ( '?' ) ; if ( qm !== - 1 ) { this . search = rest . substr ( qm ) ; rest = rest . slice ( 0 , qm ) ; }
if ( rest ) { this . pathname = rest ; }
if ( slashedProtocol [ lowerProto ] && this . hostname && ! this . pathname ) { this . pathname = '' ; }
return this ; } ; Url . prototype . parseHost = function ( host ) { var port = portPattern . exec ( host ) ; if ( port ) { port = port [ 0 ] ; if ( port !== ':' ) { this . port = port . substr ( 1 ) ; }
host = host . substr ( 0 , host . length - port . length ) ; }
if ( host ) { this . hostname = host ; } } ; module . exports = urlParse ; } , { } ] , 60 : [ function ( require , module , exports ) { ( function ( global ) { ; ( function ( root ) { var freeExports = typeof exports == 'object' && exports && ! exports . nodeType && exports ; var freeModule = typeof module == 'object' && module && ! module . nodeType && module ; var freeGlobal = typeof global == 'object' && global ; if ( freeGlobal . global === freeGlobal || freeGlobal . window === freeGlobal || freeGlobal . self === freeGlobal ) { root = freeGlobal ; }
var punycode , maxInt = 2147483647 , base = 36 , tMin = 1 , tMax = 26 , skew = 38 , damp = 700 , initialBias = 72 , initialN = 128 , delimiter = '-' , regexPunycode = /^xn--/ , regexNonASCII = /[^\x20-\x7E]/ , regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g , errors = { 'overflow' : 'Overflow: input needs wider integers to process' , 'not-basic' : 'Illegal input >= 0x80 (not a basic code point)' , 'invalid-input' : 'Invalid input' } , baseMinusTMin = base - tMin , floor = Math . floor , stringFromCharCode = String . fromCharCode , key ; function error ( type ) { throw new RangeError ( errors [ type ] ) ; }
function map ( array , fn ) { var length = array . length ; var result = [ ] ; while ( length -- ) { result [ length ] = fn ( array [ length ] ) ; }
return result ; }
function mapDomain ( string , fn ) { var parts = string . split ( '@' ) ; var result = '' ; if ( parts . length > 1 ) { result = parts [ 0 ] + '@' ; string = parts [ 1 ] ; }
string = string . replace ( regexSeparators , '\x2E' ) ; var labels = string . split ( '.' ) ; var encoded = map ( labels , fn ) . join ( '.' ) ; return result + encoded ; }
function ucs2decode ( string ) { var output = [ ] , counter = 0 , length = string . length , value , extra ; while ( counter < length ) { value = string . charCodeAt ( counter ++ ) ; if ( value >= 0xD800 && value <= 0xDBFF && counter < length ) { extra = string . charCodeAt ( counter ++ ) ; if ( ( extra & 0xFC00 ) == 0xDC00 ) { output . push ( ( ( value & 0x3FF ) << 10 ) + ( extra & 0x3FF ) + 0x10000 ) ; } else { output . push ( value ) ; counter -- ; } } else { output . push ( value ) ; } }
return output ; }
function ucs2encode ( array ) { return map ( array , function ( value ) { var output = '' ; if ( value > 0xFFFF ) { value -= 0x10000 ; output += stringFromCharCode ( value >>> 10 & 0x3FF | 0xD800 ) ; value = 0xDC00 | value & 0x3FF ; }
output += stringFromCharCode ( value ) ; return output ; } ) . join ( '' ) ; }
function basicToDigit ( codePoint ) { if ( codePoint - 48 < 10 ) { return codePoint - 22 ; }
if ( codePoint - 65 < 26 ) { return codePoint - 65 ; }
if ( codePoint - 97 < 26 ) { return codePoint - 97 ; }
return base ; }
function digitToBasic ( digit , flag ) { return digit + 22 + 75 * ( digit < 26 ) - ( ( flag != 0 ) << 5 ) ; }
function adapt ( delta , numPoints , firstTime ) { var k = 0 ; delta = firstTime ? floor ( delta / damp ) : delta >> 1 ; delta += floor ( delta / numPoints ) ; for ( ; delta > baseMinusTMin * tMax >> 1 ; k += base ) { delta = floor ( delta / baseMinusTMin ) ; }
return floor ( k + ( baseMinusTMin + 1 ) * delta / ( delta + skew ) ) ; }
function decode ( input ) { var output = [ ] , inputLength = input . length , out , i = 0 , n = initialN , bias = initialBias , basic , j , index , oldi , w , k , digit , t , baseMinusT ; basic = input . lastIndexOf ( delimiter ) ; if ( basic < 0 ) { basic = 0 ; }
for ( j = 0 ; j < basic ; ++ j ) { if ( input . charCodeAt ( j ) >= 0x80 ) { error ( 'not-basic' ) ; }
output . push ( input . charCodeAt ( j ) ) ; }
for ( index = basic > 0 ? basic + 1 : 0 ; index < inputLength ; ) { for ( oldi = i , w = 1 , k = base ; ; k += base ) { if ( index >= inputLength ) { error ( 'invalid-input' ) ; }
digit = basicToDigit ( input . charCodeAt ( index ++ ) ) ; if ( digit >= base || digit > floor ( ( maxInt - i ) / w ) ) { error ( 'overflow' ) ; }
i += digit * w ; t = k <= bias ? tMin : ( k >= bias + tMax ? tMax : k - bias ) ; if ( digit < t ) { break ; }
baseMinusT = base - t ; if ( w > floor ( maxInt / baseMinusT ) ) { error ( 'overflow' ) ; }
w *= baseMinusT ; }
out = output . length + 1 ; bias = adapt ( i - oldi , out , oldi == 0 ) ; if ( floor ( i / out ) > maxInt - n ) { error ( 'overflow' ) ; }
n += floor ( i / out ) ; i %= out ; output . splice ( i ++ , 0 , n ) ; }
return ucs2encode ( output ) ; }
function encode ( input ) { var n , delta , handledCPCount , basicLength , bias , j , m , q , k , t , currentValue , output = [ ] , inputLength , handledCPCountPlusOne , baseMinusT , qMinusT ; input = ucs2decode ( input ) ; inputLength = input . length ; n = initialN ; delta = 0 ; bias = initialBias ; for ( j = 0 ; j < inputLength ; ++ j ) { currentValue = input [ j ] ; if ( currentValue < 0x80 ) { output . push ( stringFromCharCode ( currentValue ) ) ; } }
handledCPCount = basicLength = output . length ; if ( basicLength ) { output . push ( delimiter ) ; }
while ( handledCPCount < inputLength ) { for ( m = maxInt , j = 0 ; j < inputLength ; ++ j ) { currentValue = input [ j ] ; if ( currentValue >= n && currentValue < m ) { m = currentValue ; } }
handledCPCountPlusOne = handledCPCount + 1 ; if ( m - n > floor ( ( maxInt - delta ) / handledCPCountPlusOne ) ) { error ( 'overflow' ) ; }
delta += ( m - n ) * handledCPCountPlusOne ; n = m ; for ( j = 0 ; j < inputLength ; ++ j ) { currentValue = input [ j ] ; if ( currentValue < n && ++ delta > maxInt ) { error ( 'overflow' ) ; }
if ( currentValue == n ) { for ( q = delta , k = base ; ; k += base ) { t = k <= bias ? tMin : ( k >= bias + tMax ? tMax : k - bias ) ; if ( q < t ) { break ; }
qMinusT = q - t ; baseMinusT = base - t ; output . push ( stringFromCharCode ( digitToBasic ( t + qMinusT % baseMinusT , 0 ) ) ) ; q = floor ( qMinusT / baseMinusT ) ; }
output . push ( stringFromCharCode ( digitToBasic ( q , 0 ) ) ) ; bias = adapt ( delta , handledCPCountPlusOne , handledCPCount == basicLength ) ; delta = 0 ; ++ handledCPCount ; } }
++ delta ; ++ n ; }
return output . join ( '' ) ; }
function toUnicode ( input ) { return mapDomain ( input , function ( string ) { return regexPunycode . test ( string ) ? decode ( string . slice ( 4 ) . toLowerCase ( ) ) : string ; } ) ; }
function toASCII ( input ) { return mapDomain ( input , function ( string ) { return regexNonASCII . test ( string ) ? 'xn--' + encode ( string ) : string ; } ) ; }
2021-01-31 10:05:52 +13:00
punycode = { 'version' : '1.4.1' , 'ucs2' : { 'decode' : ucs2decode , 'encode' : ucs2encode } , 'decode' : decode , 'encode' : encode , 'toASCII' : toASCII , 'toUnicode' : toUnicode } ; if ( typeof define == 'function' && typeof define . amd == 'object' && define . amd ) { define ( 'punycode' , function ( ) { return punycode ; } ) ; } else if ( freeExports && freeModule ) { if ( module . exports == freeExports ) { freeModule . exports = punycode ; } else { for ( key in punycode ) { punycode . hasOwnProperty ( key ) && ( freeExports [ key ] = punycode [ key ] ) ; } } } else { root . punycode = punycode ; } } ( this ) ) ; } ) . call ( this , typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : { } ) } , { } ] , 61 : [ function ( require , module , exports ) { module . exports = /[\0-\x1F\x7F-\x9F]/ } , { } ] , 62 : [ function ( require , module , exports ) { module . exports = /[\xAD\u0600-\u0605\u061C\u06DD\u070F\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804\uDCBD|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/ } , { } ] , 63 : [ function ( require , module , exports ) { module . exports = /[!-#%-\*,-/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E49\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD806[\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/ } , { } ] , 64 : [ function ( require , module , exports ) { module . exports = /[ \xA0\u1680\u2000-\u200A\u202F\u205F\u3000]/ } , { } ] , 65 : [ function ( require , module , exports ) { 'use strict' ; exports . Any = require ( './properties/Any/regex' ) ; exports . Cc = require ( './categories/Cc/regex' ) ; exports . Cf = require ( './categories/Cf/regex' ) ; exports . P = require ( './categories/P/regex' ) ; exports . Z = require ( './categories/Z/regex' ) ; } , { "./categories/Cc/regex" : 61 , "./categories/Cf/regex" : 62 , "./categories/P/regex" : 63 , "./categories/Z/regex" : 64 , "./properties/Any/regex" : 66 } ] , 66 : [ function ( require , module , exports ) { module . exports = /[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/ } , { } ] , 67 : [ function ( require , module , exports ) { 'use strict' ; module . exports = require ( './lib/' ) ; } , { "./lib/" : 9 } ] } , { } , [ 67 ] ) ( 67 ) } ) ; ! function ( t , e ) { "object" == typeof exports && "undefined" != typeof module ? e ( exports ) : "function" == typeof define && define . amd ? define ( [ "exports" ] , e ) : e ( t . pell = { } ) } ( this , function ( t ) { "use strict" ; var e = Object . assign || function ( t ) { for ( var e = 1 ; e < arguments . length ; e ++ ) { var n = arguments [ e ] ; for ( var r in n ) Object . prototype . hasOwnProperty . call ( n , r ) && ( t [ r ] = n [ r ] ) } return t } , n = function ( t , e , n ) { return t . addEventListener ( e , n ) } , r = function ( t , e ) { return t . appendChild ( e ) } , i = fu
2019-05-09 18:54:39 +12:00
return destination }
function repeat ( character , count ) { return Array ( count + 1 ) . join ( character ) }
var blockElements = [ 'address' , 'article' , 'aside' , 'audio' , 'blockquote' , 'body' , 'canvas' , 'center' , 'dd' , 'dir' , 'div' , 'dl' , 'dt' , 'fieldset' , 'figcaption' , 'figure' , 'footer' , 'form' , 'frameset' , 'h1' , 'h2' , 'h3' , 'h4' , 'h5' , 'h6' , 'header' , 'hgroup' , 'hr' , 'html' , 'isindex' , 'li' , 'main' , 'menu' , 'nav' , 'noframes' , 'noscript' , 'ol' , 'output' , 'p' , 'pre' , 'section' , 'table' , 'tbody' , 'td' , 'tfoot' , 'th' , 'thead' , 'tr' , 'ul' ] ; function isBlock ( node ) { return blockElements . indexOf ( node . nodeName . toLowerCase ( ) ) !== - 1 }
var voidElements = [ 'area' , 'base' , 'br' , 'col' , 'command' , 'embed' , 'hr' , 'img' , 'input' , 'keygen' , 'link' , 'meta' , 'param' , 'source' , 'track' , 'wbr' ] ; function isVoid ( node ) { return voidElements . indexOf ( node . nodeName . toLowerCase ( ) ) !== - 1 }
var voidSelector = voidElements . join ( ) ; function hasVoid ( node ) { return node . querySelector && node . querySelector ( voidSelector ) }
var rules = { } ; rules . paragraph = { filter : 'p' , replacement : function ( content ) { return '\n\n' + content + '\n\n' } } ; rules . lineBreak = { filter : 'br' , replacement : function ( content , node , options ) { return options . br + '\n' } } ; rules . heading = { filter : [ 'h1' , 'h2' , 'h3' , 'h4' , 'h5' , 'h6' ] , replacement : function ( content , node , options ) { var hLevel = Number ( node . nodeName . charAt ( 1 ) ) ; if ( options . headingStyle === 'setext' && hLevel < 3 ) { var underline = repeat ( ( hLevel === 1 ? '=' : '-' ) , content . length ) ; return ( '\n\n' + content + '\n' + underline + '\n\n' ) } else { return '\n\n' + repeat ( '#' , hLevel ) + ' ' + content + '\n\n' } } } ; rules . blockquote = { filter : 'blockquote' , replacement : function ( content ) { content = content . replace ( /^\n+|\n+$/g , '' ) ; content = content . replace ( /^/gm , '> ' ) ; return '\n\n' + content + '\n\n' } } ; rules . list = { filter : [ 'ul' , 'ol' ] , replacement : function ( content , node ) { var parent = node . parentNode ; if ( parent . nodeName === 'LI' && parent . lastElementChild === node ) { return '\n' + content } else { return '\n\n' + content + '\n\n' } } } ; rules . listItem = { filter : 'li' , replacement : function ( content , node , options ) { content = content . replace ( /^\n+/ , '' ) . replace ( /\n+$/ , '\n' ) . replace ( /\n/gm , '\n ' ) ; var prefix = options . bulletListMarker + ' ' ; var parent = node . parentNode ; if ( parent . nodeName === 'OL' ) { var start = parent . getAttribute ( 'start' ) ; var index = Array . prototype . indexOf . call ( parent . children , node ) ; prefix = ( start ? Number ( start ) + index : index + 1 ) + '. ' ; }
return ( prefix + content + ( node . nextSibling && ! /\n$/ . test ( content ) ? '\n' : '' ) ) } } ; rules . indentedCodeBlock = { filter : function ( node , options ) { return ( options . codeBlockStyle === 'indented' && node . nodeName === 'PRE' && node . firstChild && node . firstChild . nodeName === 'CODE' ) } , replacement : function ( content , node , options ) { return ( '\n\n ' +
node . firstChild . textContent . replace ( /\n/g , '\n ' ) + '\n\n' ) } } ; rules . fencedCodeBlock = { filter : function ( node , options ) { return ( options . codeBlockStyle === 'fenced' && node . nodeName === 'PRE' && node . firstChild && node . firstChild . nodeName === 'CODE' ) } , replacement : function ( content , node , options ) { var className = node . firstChild . className || '' ; var language = ( className . match ( /language-(\S+)/ ) || [ null , '' ] ) [ 1 ] ; return ( '\n\n' + options . fence + language + '\n' +
node . firstChild . textContent + '\n' + options . fence + '\n\n' ) } } ; rules . horizontalRule = { filter : 'hr' , replacement : function ( content , node , options ) { return '\n\n' + options . hr + '\n\n' } } ; rules . inlineLink = { filter : function ( node , options ) { return ( options . linkStyle === 'inlined' && node . nodeName === 'A' && node . getAttribute ( 'href' ) ) } , replacement : function ( content , node ) { var href = node . getAttribute ( 'href' ) ; var title = node . title ? ' "' + node . title + '"' : '' ; return '[' + content + '](' + href + title + ')' } } ; rules . referenceLink = { filter : function ( node , options ) { return ( options . linkStyle === 'referenced' && node . nodeName === 'A' && node . getAttribute ( 'href' ) ) } , replacement : function ( content , node , options ) { var href = node . getAttribute ( 'href' ) ; var title = node . title ? ' "' + node . title + '"' : '' ; var replacement ; var reference ; switch ( options . linkReferenceStyle ) { case 'collapsed' : replacement = '[' + content + '][]' ; reference = '[' + content + ']: ' + href + title ; break
case 'shortcut' : replacement = '[' + content + ']' ; reference = '[' + content + ']: ' + href + title ; break
default : var id = this . references . length + 1 ; replacement = '[' + content + '][' + id + ']' ; reference = '[' + id + ']: ' + href + title ; }
this . references . push ( reference ) ; return replacement } , references : [ ] , append : function ( options ) { var references = '' ; if ( this . references . length ) { references = '\n\n' + this . references . join ( '\n' ) + '\n\n' ; this . references = [ ] ; }
return references } } ; rules . emphasis = { filter : [ 'em' , 'i' ] , replacement : function ( content , node , options ) { if ( ! content . trim ( ) ) return ''
return options . emDelimiter + content + options . emDelimiter } } ; rules . strong = { filter : [ 'strong' , 'b' ] , replacement : function ( content , node , options ) { if ( ! content . trim ( ) ) return ''
return options . strongDelimiter + content + options . strongDelimiter } } ; rules . code = { filter : function ( node ) { var hasSiblings = node . previousSibling || node . nextSibling ; var isCodeBlock = node . parentNode . nodeName === 'PRE' && ! hasSiblings ; return node . nodeName === 'CODE' && ! isCodeBlock } , replacement : function ( content ) { if ( ! content . trim ( ) ) return ''
var delimiter = '`' ; var leadingSpace = '' ; var trailingSpace = '' ; var matches = content . match ( /`+/gm ) ; if ( matches ) { if ( /^`/ . test ( content ) ) leadingSpace = ' ' ; if ( /`$/ . test ( content ) ) trailingSpace = ' ' ; while ( matches . indexOf ( delimiter ) !== - 1 ) delimiter = delimiter + '`' ; }
return delimiter + leadingSpace + content + trailingSpace + delimiter } } ; rules . image = { filter : 'img' , replacement : function ( content , node ) { var alt = node . alt || '' ; var src = node . getAttribute ( 'src' ) || '' ; var title = node . title || '' ; var titlePart = title ? ' "' + title + '"' : '' ; return src ? '![' + alt + ']' + '(' + src + titlePart + ')' : '' } } ; function Rules ( options ) { this . options = options ; this . _keep = [ ] ; this . _remove = [ ] ; this . blankRule = { replacement : options . blankReplacement } ; this . keepReplacement = options . keepReplacement ; this . defaultRule = { replacement : options . defaultReplacement } ; this . array = [ ] ; for ( var key in options . rules ) this . array . push ( options . rules [ key ] ) ; }
Rules . prototype = { add : function ( key , rule ) { this . array . unshift ( rule ) ; } , keep : function ( filter ) { this . _keep . unshift ( { filter : filter , replacement : this . keepReplacement } ) ; } , remove : function ( filter ) { this . _remove . unshift ( { filter : filter , replacement : function ( ) { return '' } } ) ; } , forNode : function ( node ) { if ( node . isBlank ) return this . blankRule
var rule ; if ( ( rule = findRule ( this . array , node , this . options ) ) ) return rule
if ( ( rule = findRule ( this . _keep , node , this . options ) ) ) return rule
if ( ( rule = findRule ( this . _remove , node , this . options ) ) ) return rule
return this . defaultRule } , forEach : function ( fn ) { for ( var i = 0 ; i < this . array . length ; i ++ ) fn ( this . array [ i ] , i ) ; } } ; function findRule ( rules , node , options ) { for ( var i = 0 ; i < rules . length ; i ++ ) { var rule = rules [ i ] ; if ( filterValue ( rule , node , options ) ) return rule }
return void 0 }
function filterValue ( rule , node , options ) { var filter = rule . filter ; if ( typeof filter === 'string' ) { if ( filter === node . nodeName . toLowerCase ( ) ) return true } else if ( Array . isArray ( filter ) ) { if ( filter . indexOf ( node . nodeName . toLowerCase ( ) ) > - 1 ) return true } else if ( typeof filter === 'function' ) { if ( filter . call ( rule , node , options ) ) return true } else { throw new TypeError ( '`filter` needs to be a string, array, or function' ) } }
function collapseWhitespace ( options ) { var element = options . element ; var isBlock = options . isBlock ; var isVoid = options . isVoid ; var isPre = options . isPre || function ( node ) { return node . nodeName === 'PRE' } ; if ( ! element . firstChild || isPre ( element ) ) return
var prevText = null ; var prevVoid = false ; var prev = null ; var node = next ( prev , element , isPre ) ; while ( node !== element ) { if ( node . nodeType === 3 || node . nodeType === 4 ) { var text = node . data . replace ( /[ \r\n\t]+/g , ' ' ) ; if ( ( ! prevText || / $/ . test ( prevText . data ) ) && ! prevVoid && text [ 0 ] === ' ' ) { text = text . substr ( 1 ) ; }
if ( ! text ) { node = remove ( node ) ; continue }
node . data = text ; prevText = node ; } else if ( node . nodeType === 1 ) { if ( isBlock ( node ) || node . nodeName === 'BR' ) { if ( prevText ) { prevText . data = prevText . data . replace ( / $/ , '' ) ; }
prevText = null ; prevVoid = false ; } else if ( isVoid ( node ) ) { prevText = null ; prevVoid = true ; } } else { node = remove ( node ) ; continue }
var nextNode = next ( prev , node , isPre ) ; prev = node ; node = nextNode ; }
if ( prevText ) { prevText . data = prevText . data . replace ( / $/ , '' ) ; if ( ! prevText . data ) { remove ( prevText ) ; } } }
function remove ( node ) { var next = node . nextSibling || node . parentNode ; node . parentNode . removeChild ( node ) ; return next }
function next ( prev , current , isPre ) { if ( ( prev && prev . parentNode === current ) || isPre ( current ) ) { return current . nextSibling || current . parentNode }
return current . firstChild || current . nextSibling || current . parentNode }
var root = ( typeof window !== 'undefined' ? window : { } ) ; function canParseHTMLNatively ( ) { var Parser = root . DOMParser ; var canParse = false ; try { if ( new Parser ( ) . parseFromString ( '' , 'text/html' ) ) { canParse = true ; } } catch ( e ) { }
return canParse }
function createHTMLParser ( ) { var Parser = function ( ) { } ; { if ( shouldUseActiveX ( ) ) { Parser . prototype . parseFromString = function ( string ) { var doc = new window . ActiveXObject ( 'htmlfile' ) ; doc . designMode = 'on' ; doc . open ( ) ; doc . write ( string ) ; doc . close ( ) ; return doc } ; } else { Parser . prototype . parseFromString = function ( string ) { var doc = document . implementation . createHTMLDocument ( '' ) ; doc . open ( ) ; doc . write ( string ) ; doc . close ( ) ; return doc } ; } }
return Parser }
function shouldUseActiveX ( ) { var useActiveX = false ; try { document . implementation . createHTMLDocument ( '' ) . open ( ) ; } catch ( e ) { if ( window . ActiveXObject ) useActiveX = true ; }
return useActiveX }
var HTMLParser = canParseHTMLNatively ( ) ? root . DOMParser : createHTMLParser ( ) ; function RootNode ( input ) { var root ; if ( typeof input === 'string' ) { var doc = htmlParser ( ) . parseFromString ( '<x-turndown id="turndown-root">' + input + '</x-turndown>' , 'text/html' ) ; root = doc . getElementById ( 'turndown-root' ) ; } else { root = input . cloneNode ( true ) ; }
collapseWhitespace ( { element : root , isBlock : isBlock , isVoid : isVoid } ) ; return root }
var _htmlParser ; function htmlParser ( ) { _htmlParser = _htmlParser || new HTMLParser ( ) ; return _htmlParser }
function Node ( node ) { node . isBlock = isBlock ( node ) ; node . isCode = node . nodeName . toLowerCase ( ) === 'code' || node . parentNode . isCode ; node . isBlank = isBlank ( node ) ; node . flankingWhitespace = flankingWhitespace ( node ) ; return node }
function isBlank ( node ) { return ( [ 'A' , 'TH' , 'TD' ] . indexOf ( node . nodeName ) === - 1 && /^\s*$/i . test ( node . textContent ) && ! isVoid ( node ) && ! hasVoid ( node ) ) }
function flankingWhitespace ( node ) { var leading = '' ; var trailing = '' ; if ( ! node . isBlock ) { var hasLeading = /^[ \r\n\t]/ . test ( node . textContent ) ; var hasTrailing = /[ \r\n\t]$/ . test ( node . textContent ) ; if ( hasLeading && ! isFlankedByWhitespace ( 'left' , node ) ) { leading = ' ' ; }
if ( hasTrailing && ! isFlankedByWhitespace ( 'right' , node ) ) { trailing = ' ' ; } }
return { leading : leading , trailing : trailing } }
function isFlankedByWhitespace ( side , node ) { var sibling ; var regExp ; var isFlanked ; if ( side === 'left' ) { sibling = node . previousSibling ; regExp = / $/ ; } else { sibling = node . nextSibling ; regExp = /^ / ; }
if ( sibling ) { if ( sibling . nodeType === 3 ) { isFlanked = regExp . test ( sibling . nodeValue ) ; } else if ( sibling . nodeType === 1 && ! isBlock ( sibling ) ) { isFlanked = regExp . test ( sibling . textContent ) ; } }
return isFlanked }
var reduce = Array . prototype . reduce ; var leadingNewLinesRegExp = /^\n*/ ; var trailingNewLinesRegExp = /\n*$/ ; function TurndownService ( options ) { if ( ! ( this instanceof TurndownService ) ) return new TurndownService ( options )
var defaults = { rules : rules , headingStyle : 'setext' , hr : '* * *' , bulletListMarker : '*' , codeBlockStyle : 'indented' , fence : '```' , emDelimiter : '_' , strongDelimiter : '**' , linkStyle : 'inlined' , linkReferenceStyle : 'full' , br : ' ' , blankReplacement : function ( content , node ) { return node . isBlock ? '\n\n' : '' } , keepReplacement : function ( content , node ) { return node . isBlock ? '\n\n' + node . outerHTML + '\n\n' : node . outerHTML } , defaultReplacement : function ( content , node ) { return node . isBlock ? '\n\n' + content + '\n\n' : content } } ; this . options = extend ( { } , defaults , options ) ; this . rules = new Rules ( this . options ) ; }
TurndownService . prototype = { turndown : function ( input ) { if ( ! canConvert ( input ) ) { throw new TypeError ( input + ' is not a string, or an element/document/fragment node.' ) }
if ( input === '' ) return ''
var output = process . call ( this , new RootNode ( input ) ) ; return postProcess . call ( this , output ) } , use : function ( plugin ) { if ( Array . isArray ( plugin ) ) { for ( var i = 0 ; i < plugin . length ; i ++ ) this . use ( plugin [ i ] ) ; } else if ( typeof plugin === 'function' ) { plugin ( this ) ; } else { throw new TypeError ( 'plugin must be a Function or an Array of Functions' ) }
return this } , addRule : function ( key , rule ) { this . rules . add ( key , rule ) ; return this } , keep : function ( filter ) { this . rules . keep ( filter ) ; return this } , remove : function ( filter ) { this . rules . remove ( filter ) ; return this } , escape : function ( string ) { return ( string . replace ( /\\(\S)/g , '\\\\$1' ) . replace ( /^(#{1,6} )/gm , '\\$1' ) . replace ( /^([-*_] *){3,}$/gm , function ( match , character ) { return match . split ( character ) . join ( '\\' + character ) } ) . replace ( /^(\W* {0,3})(\d+)\. /gm , '$1$2\\. ' ) . replace ( /^([^\\\w]*)[*+-] /gm , function ( match ) { return match . replace ( /([*+-])/g , '\\$1' ) } ) . replace ( /^(\W* {0,3})> /gm , '$1\\> ' ) . replace ( /\*+(?![*\s\W]).+?\*+/g , function ( match ) { return match . replace ( /\*/g , '\\*' ) } ) . replace ( /_+(?![_\s\W]).+?_+/g , function ( match ) { return match . replace ( /_/g , '\\_' ) } ) . replace ( /`+(?![`\s\W]).+?`+/g , function ( match ) { return match . replace ( /`/g , '\\`' ) } ) . replace ( /[\[\]]/g , '\\$&' ) ) } } ; function process ( parentNode ) { var self = this ; return reduce . call ( parentNode . childNodes , function ( output , node ) { node = new Node ( node ) ; var replacement = '' ; if ( node . nodeType === 3 ) { replacement = node . isCode ? node . nodeValue : self . escape ( node . nodeValue ) ; } else if ( node . nodeType === 1 ) { replacement = replacementForNode . call ( self , node ) ; }
return join ( output , replacement ) } , '' ) }
function postProcess ( output ) { var self = this ; this . rules . forEach ( function ( rule ) { if ( typeof rule . append === 'function' ) { output = join ( output , rule . append ( self . options ) ) ; } } ) ; return output . replace ( /^[\t\r\n]+/ , '' ) . replace ( /[\t\r\n\s]+$/ , '' ) }
function replacementForNode ( node ) { var rule = this . rules . forNode ( node ) ; var content = process . call ( this , node ) ; var whitespace = node . flankingWhitespace ; if ( whitespace . leading || whitespace . trailing ) content = content . trim ( ) ; return ( whitespace . leading +
rule . replacement ( content , node , this . options ) +
whitespace . trailing ) }
function separatingNewlines ( output , replacement ) { var newlines = [ output . match ( trailingNewLinesRegExp ) [ 0 ] , replacement . match ( leadingNewLinesRegExp ) [ 0 ] ] . sort ( ) ; var maxNewlines = newlines [ newlines . length - 1 ] ; return maxNewlines . length < 2 ? maxNewlines : '\n\n' }
function join ( string1 , string2 ) { var separator = separatingNewlines ( string1 , string2 ) ; string1 = string1 . replace ( trailingNewLinesRegExp , '' ) ; string2 = string2 . replace ( leadingNewLinesRegExp , '' ) ; return string1 + separator + string2 }
function canConvert ( input ) { return ( input != null && ( typeof input === 'string' || ( input . nodeType && ( input . nodeType === 1 || input . nodeType === 9 || input . nodeType === 11 ) ) ) ) }
2019-08-24 02:00:30 +12:00
return TurndownService ; } ( ) ) ;
2019-05-10 04:15:51 +12:00
2020-03-17 07:41:56 +13:00
window . ls = window . ls || { } ; window . ls . container = function ( ) { let stock = { } ; let listeners = { } ; let namespaces = { } ; let set = function ( name , object , singleton , watch = true ) { if ( typeof name !== 'string' ) { throw new Error ( 'var name must be of type string' ) ; }
2019-05-10 04:15:51 +12:00
if ( typeof singleton !== 'boolean' ) { throw new Error ( 'var singleton "' + singleton + '" of service "' + name + '" must be of type boolean' ) ; }
2019-08-06 16:19:16 +12:00
stock [ name ] = { name : name , object : object , singleton : singleton , instance : null , watch : watch , } ; if ( ! watch ) { return this ; }
let binds = listeners [ name ] || { } ; for ( let key in binds ) { if ( binds . hasOwnProperty ( key ) ) { document . dispatchEvent ( new CustomEvent ( key ) ) ; } }
2019-05-12 23:20:51 +12:00
return this ; } ; let get = function ( name ) { let service = ( undefined !== stock [ name ] ) ? stock [ name ] : null ; if ( null == service ) { return null ; }
if ( service . instance ) { return service . instance ; }
let instance = ( typeof service . object === 'function' ) ? this . resolve ( service . object ) : service . object ; let skip = false ; if ( service . watch && name !== 'window' && name !== 'document' && name !== 'element' && typeof instance === 'object' && instance !== null ) { let handler = { name : service . name , watch : function ( ) { } , get : function ( target , key ) { if ( key === "__name" ) { return this . name ; }
2019-05-10 04:15:51 +12:00
if ( key === "__watch" ) { return this . watch ; }
if ( key === "__proxy" ) { return true ; }
2020-09-24 18:40:41 +12:00
if ( typeof target [ key ] === 'object' && target [ key ] !== null && ! target [ key ] . _ _proxy ) { let handler = Object . assign ( { } , this ) ; handler . name = handler . name + '.' + key ; return new Proxy ( target [ key ] , handler ) }
else { return target [ key ] ; } } , set : function ( target , key , value , receiver ) { if ( key === "__name" ) { return this . name = value ; }
2019-05-09 19:40:39 +12:00
if ( key === "__watch" ) { return this . watch = value ; }
target [ key ] = value ; let path = receiver . _ _name + '.' + key ; document . dispatchEvent ( new CustomEvent ( path + '.changed' ) ) ; if ( skip ) { return true ; }
skip = true ; container . set ( '$prop' , key , true ) ; container . set ( '$value' , value , true ) ; container . resolve ( this . watch ) ; container . set ( '$key' , null , true ) ; container . set ( '$value' , null , true ) ; skip = false ; return true ; } , } ; instance = new Proxy ( instance , handler ) ; }
if ( service . singleton ) { service . instance = instance ; }
2019-06-08 08:52:38 +12:00
return instance ; } ; let resolve = function ( target ) { if ( ! target ) { return ( ) => { } ; }
let self = this ; const REGEX _COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg ; const REGEX _FUNCTION _PARAMS = /(?:\s*(?:function\s*[^(]*)?\s*)((?:[^'"]|(?:(?:(['"])(?:(?:.*?[^\\]\2)|\2))))*?)\s*(?=(?:=>)|{)/m ; const REGEX _PARAMETERS _VALUES = /\s*([\w\\$]+)\s*(?:=\s*((?:(?:(['"])(?:\3|(?:.*?[^\\]\3)))((\s*\+\s*)(?:(?:(['"])(?:\6|(?:.*?[^\\]\6)))|(?:[\w$]*)))*)|.*?))?\s*(?:,|$)/gm ; function getParams ( func ) { let functionAsString = func . toString ( ) ; let params = [ ] ; let match ; functionAsString = functionAsString . replace ( REGEX _COMMENTS , '' ) ; functionAsString = functionAsString . match ( REGEX _FUNCTION _PARAMS ) [ 1 ] ; if ( functionAsString . charAt ( 0 ) === '(' ) { functionAsString = functionAsString . slice ( 1 , - 1 ) ; }
while ( match = REGEX _PARAMETERS _VALUES . exec ( functionAsString ) ) { params . push ( match [ 1 ] ) ; }
return params ; }
2020-03-17 07:41:56 +13:00
let args = getParams ( target ) ; return target . apply ( target , args . map ( function ( value ) { return self . get ( value . trim ( ) ) ; } ) ) ; } ; let path = function ( path , value , type ) { type = ( type ) ? type : 'assign' ; path = container . scope ( path ) . split ( '.' ) ; let name = path . shift ( ) ; let object = container . get ( name ) ; let result = null ; while ( path . length > 1 ) { if ( ! object ) { return null ; }
2019-05-09 19:40:39 +12:00
object = object [ path . shift ( ) ] ; }
2020-03-15 17:54:55 +13:00
let shift = path . shift ( ) ; if ( value !== null && value !== undefined && object && shift && ( object [ shift ] !== undefined || object [ shift ] !== null ) ) { switch ( type ) { case 'append' : if ( ! Array . isArray ( object [ shift ] ) ) { object [ shift ] = [ ] ; }
object [ shift ] . push ( value ) ; break ; case 'prepend' : if ( ! Array . isArray ( object [ shift ] ) ) { object [ shift ] = [ ] ; }
2020-04-28 06:38:06 +12:00
object [ shift ] . unshift ( value ) ; break ; case 'splice' : if ( ! Array . isArray ( object [ shift ] ) ) { object [ shift ] = [ ] ; }
2020-05-18 04:12:48 +12:00
object [ shift ] . splice ( value , 1 ) ; break ; default : object [ shift ] = value ; }
2020-03-15 17:54:55 +13:00
return true ; }
2019-05-12 23:20:51 +12:00
if ( ! object ) { return null ; }
2020-09-24 18:40:41 +12:00
if ( ! shift ) { result = object ; }
else { return object [ shift ] ; }
2020-03-17 07:41:56 +13:00
return result ; } ; let bind = function ( element , path , callback ) { let event = container . scope ( path ) + '.changed' ; let service = event . split ( '.' ) . slice ( 0 , 1 ) . pop ( ) ; let debug = element . getAttribute ( 'data-debug' ) || false ; listeners [ service ] = listeners [ service ] || { } ; listeners [ service ] [ event ] = true ; let printer = ( function ( x ) { return function ( ) { if ( ! document . body . contains ( element ) ) { element = null ; document . removeEventListener ( event , printer , false ) ; return false ; }
let oldNamespaces = namespaces ; namespaces = x ; callback ( ) ; namespaces = oldNamespaces ; } } ( Object . assign ( { } , namespaces ) ) ) ; document . addEventListener ( event , printer ) ; } ; let addNamespace = function ( key , scope ) { namespaces [ key ] = scope ; return this ; }
let removeNamespace = function ( key ) { delete namespaces [ key ] ; return this ; }
let scope = function ( path ) { for ( let [ key , value ] of Object . entries ( namespaces ) ) { path = ( path . indexOf ( '.' ) > - 1 ) ? path . replace ( key + '.' , value + '.' ) : path . replace ( key , value ) ; }
return path ; }
let container = { set : set , get : get , resolve : resolve , path : path , bind : bind , scope : scope , addNamespace : addNamespace , removeNamespace : removeNamespace , stock : stock , listeners : listeners , namespaces : namespaces , } ; set ( 'container' , container , true , false ) ; return container ; } ( ) ; window . ls . container . set ( 'http' , function ( document ) { let globalParams = [ ] , globalHeaders = [ ] ; let addParam = function ( url , param , value ) { param = encodeURIComponent ( param ) ; let a = document . createElement ( 'a' ) ; param += ( value ? "=" + encodeURIComponent ( value ) : "" ) ; a . href = url ; a . search += ( a . search ? "&" : "" ) + param ; return a . href ; } ; let request = function ( method , url , headers , payload , progress ) { let i ; if ( - 1 === [ 'GET' , 'POST' , 'PUT' , 'DELETE' , 'TRACE' , 'HEAD' , 'OPTIONS' , 'CONNECT' , 'PATCH' ] . indexOf ( method ) ) { throw new Error ( 'var method must contain a valid HTTP method name' ) ; }
2019-05-09 19:40:39 +12:00
if ( typeof url !== 'string' ) { throw new Error ( 'var url must be of type string' ) ; }
if ( typeof headers !== 'object' ) { throw new Error ( 'var headers must be of type object' ) ; }
if ( typeof url !== 'string' ) { throw new Error ( 'var url must be of type string' ) ; }
for ( i = 0 ; i < globalParams . length ; i ++ ) { url = addParam ( url , globalParams [ i ] . key , globalParams [ i ] . value ) ; }
2020-09-24 18:40:41 +12:00
return new Promise ( function ( resolve , reject ) { let xmlhttp = new XMLHttpRequest ( ) ; xmlhttp . open ( method , url , true ) ; for ( i = 0 ; i < globalHeaders . length ; i ++ ) { xmlhttp . setRequestHeader ( globalHeaders [ i ] . key , globalHeaders [ i ] . value ) ; }
2019-05-09 19:40:39 +12:00
for ( let key in headers ) { if ( headers . hasOwnProperty ( key ) ) { xmlhttp . setRequestHeader ( key , headers [ key ] ) ; } }
2020-09-24 18:40:41 +12:00
xmlhttp . onload = function ( ) { if ( 4 === xmlhttp . readyState && 200 === xmlhttp . status ) { resolve ( xmlhttp . response ) ; }
else { document . dispatchEvent ( new CustomEvent ( 'http-' + method . toLowerCase ( ) + '-' + xmlhttp . status ) ) ; reject ( new Error ( xmlhttp . statusText ) ) ; } } ; if ( progress ) { xmlhttp . addEventListener ( 'progress' , progress ) ; xmlhttp . upload . addEventListener ( 'progress' , progress , false ) ; }
2019-05-12 23:20:51 +12:00
xmlhttp . onerror = function ( ) { reject ( new Error ( "Network Error" ) ) ; } ; xmlhttp . send ( payload ) ; } ) } ; return { 'get' : function ( url ) { return request ( 'GET' , url , { } , '' ) } , 'post' : function ( url , headers , payload ) { return request ( 'POST' , url , headers , payload ) } , 'put' : function ( url , headers , payload ) { return request ( 'PUT' , url , headers , payload ) } , 'patch' : function ( url , headers , payload ) { return request ( 'PATCH' , url , headers , payload ) } , 'delete' : function ( url ) { return request ( 'DELETE' , url , { } , '' ) } , 'addGlobalParam' : function ( key , value ) { globalParams . push ( { key : key , value : value } ) ; } , 'addGlobalHeader' : function ( key , value ) { globalHeaders . push ( { key : key , value : value } ) ; } } } , true , false ) ; window . ls . container . set ( 'cookie' , function ( document ) { function get ( name ) { let value = "; " + document . cookie , parts = value . split ( "; " + name + "=" ) ; if ( parts . length === 2 ) { return parts . pop ( ) . split ( ";" ) . shift ( ) ; }
2019-05-09 19:40:39 +12:00
return null ; }
function set ( name , value , days ) { let date = new Date ( ) ; date . setTime ( date . getTime ( ) + ( days * 24 * 60 * 60 * 1000 ) ) ; let expires = ( 0 < days ) ? 'expires=' + date . toUTCString ( ) : 'expires=0' ; document . cookie = name + "=" + value + ";" + expires + ";path=/" ; return this ; }
2020-02-03 11:17:24 +13:00
return { 'get' : get , 'set' : set } } , true , false ) ; window . ls . container . set ( 'view' , function ( http , container ) { let stock = { } ; let execute = function ( view , node , container ) { container . set ( 'element' , node , true , false ) ; container . resolve ( view . controller ) ; if ( true !== view . repeat ) { node . removeAttribute ( view . selector ) ; } } ; let parse = function ( node , skip , callback ) { if ( node . tagName === 'SCRIPT' ) { return ; }
2019-08-06 16:19:16 +12:00
if ( node . attributes && skip !== true ) { let attrs = [ ] ; let attrsLen = node . attributes . length ; for ( let x = 0 ; x < attrsLen ; x ++ ) { attrs . push ( node . attributes [ x ] . nodeName ) ; }
2019-05-09 19:40:39 +12:00
if ( 1 !== node . nodeType ) { return ; }
if ( attrs && attrsLen ) { for ( let x = 0 ; x < attrsLen ; x ++ ) { if ( node . $lsSkip === true ) { break ; }
let pointer = ( ! /Edge/ . test ( navigator . userAgent ) ) ? x : ( attrsLen - 1 ) - x ; let length = attrsLen ; let attr = attrs [ pointer ] ; if ( ! stock [ attr ] ) { continue ; }
let comp = stock [ attr ] ; if ( typeof comp . template === "function" ) { comp . template = container . resolve ( comp . template ) ; }
if ( ! comp . template ) { ( function ( comp , node , container ) { execute ( comp , node , container ) ; } ) ( comp , node , container ) ; if ( length !== attrsLen ) { x -- ; }
2020-02-03 11:17:24 +13:00
if ( callback ) { callback ( ) ; }
2019-05-09 19:40:39 +12:00
continue ; }
2020-02-03 11:17:24 +13:00
node . classList . remove ( 'load-end' ) ; node . classList . add ( 'load-start' ) ; node . $lsSkip = true ; http . get ( comp . template ) . then ( function ( node , comp ) { return function ( data ) { node . $lsSkip = false ; node . innerHTML = data ; node . classList . remove ( 'load-start' ) ; node . classList . add ( 'load-end' ) ; ( function ( comp , node , container ) { execute ( comp , node , container ) ; } ) ( comp , node , container ) ; parse ( node , true ) ; if ( callback ) { callback ( ) ; } } } ( node , comp ) , function ( error ) { throw new Error ( 'Failed to load comp template: ' + error . message ) ; } ) ; } } }
2019-05-09 19:40:39 +12:00
if ( true === node . $lsSkip ) { return ; }
let list = ( node ) ? node . childNodes : [ ] ; if ( node . $lsSkip === true ) { list = [ ] ; }
for ( let i = 0 ; i < list . length ; i ++ ) { let child = list [ i ] ; parse ( child ) ; } } ; return { stock : stock , add : function ( object ) { if ( typeof object !== 'object' ) { throw new Error ( 'object must be of type object' ) ; }
let defaults = { 'selector' : '' , 'controller' : function ( ) { } , 'template' : '' , 'repeat' : false , 'protected' : false } ; for ( let prop in defaults ) { if ( ! defaults . hasOwnProperty ( prop ) ) { continue ; }
if ( prop in object ) { continue ; }
object [ prop ] = defaults [ prop ] ; }
if ( ! object . selector ) { throw new Error ( 'View component is missing a selector attribute' ) ; }
2020-02-10 20:58:27 +13:00
stock [ object . selector ] = object ; return this ; } , render : function ( element , callback ) { parse ( element , false , callback ) ; element . dispatchEvent ( new window . Event ( 'rendered' , { bubbles : false } ) ) ; } } } , true , false ) ; window . ls . container . set ( 'router' , function ( window ) { let getJsonFromUrl = function ( URL ) { let query ; if ( URL ) { let pos = location . search . indexOf ( '?' ) ; if ( pos === - 1 ) return [ ] ; query = location . search . substr ( pos + 1 ) ; } else { query = location . search . substr ( 1 ) ; }
2019-08-13 02:19:54 +12:00
let result = { } ; query . split ( '&' ) . forEach ( function ( part ) { if ( ! part ) { return ; }
2020-09-24 18:40:41 +12:00
part = part . split ( '+' ) . join ( ' ' ) ; let eq = part . indexOf ( '=' ) ; let key = eq > - 1 ? part . substr ( 0 , eq ) : part ; let val = eq > - 1 ? decodeURIComponent ( part . substr ( eq + 1 ) ) : '' ; let from = key . indexOf ( '[' ) ; if ( from === - 1 ) { result [ decodeURIComponent ( key ) ] = val ; }
else { let to = key . indexOf ( ']' ) ; let index = decodeURIComponent ( key . substring ( from + 1 , to ) ) ; key = decodeURIComponent ( key . substring ( 0 , from ) ) ; if ( ! result [ key ] ) { result [ key ] = [ ] ; }
if ( ! index ) { result [ key ] . push ( val ) ; }
else { result [ key ] [ index ] = val ; } } } ) ; return result ; } ; let states = [ ] ; let params = getJsonFromUrl ( window . location . search ) ; let hash = window . location . hash ; let current = null ; let previous = null ; let getPrevious = ( ) => previous ; let getCurrent = ( ) => current ; let setPrevious = ( value ) => { previous = value ; return this ; } ; let setCurrent = ( value ) => { current = value ; return this ; } ; let setParam = function ( key , value ) { params [ key ] = value ; return this ; } ; let getParam = function ( key , def ) { if ( key in params ) { return params [ key ] ; }
2019-08-13 02:19:54 +12:00
return def ; } ; let getParams = function ( ) { return params ; } ; let getURL = function ( ) { return window . location . href ; } ; let add = function ( path , view ) { if ( typeof path !== 'string' ) { throw new Error ( 'path must be of type string' ) ; }
2019-05-09 19:40:39 +12:00
if ( typeof view !== 'object' ) { throw new Error ( 'view must be of type object' ) ; }
2019-08-25 19:42:10 +12:00
states [ states . length ++ ] = { path : path , view : view } ; return this ; } ; let match = function ( location ) { let url = location . pathname ; states . sort ( function ( a , b ) { return b . path . length - a . path . length ; } ) ; states . sort ( function ( a , b ) { let n = b . path . split ( '/' ) . length - a . path . split ( '/' ) . length ; if ( n !== 0 ) { return n ; }
2019-05-09 19:40:39 +12:00
return b . path . length - a . path . length ; } ) ; for ( let i = 0 ; i < states . length ; i ++ ) { let value = states [ i ] ; value . path = ( value . path . substring ( 0 , 1 ) !== '/' ) ? location . pathname + value . path : value . path ; let match = new RegExp ( "^" + value . path . replace ( /:[^\s/]+/g , '([\\w-]+)' ) + "$" ) ; let found = url . match ( match ) ; if ( found ) { previous = current ; current = value ; return value ; } }
2020-09-24 18:40:41 +12:00
return null } ; let change = function ( URL , replace ) { if ( ! replace ) { window . history . pushState ( { } , '' , URL ) ; }
else { window . history . replaceState ( { } , '' , URL ) ; }
2020-05-01 04:35:22 +12:00
window . dispatchEvent ( new PopStateEvent ( 'popstate' , { } ) ) ; return this ; } ; let reload = function ( ) { return change ( window . location . href ) ; } ; return { setParam : setParam , getParam : getParam , getParams : getParams , getURL : getURL , add : add , change : change , reload : reload , match : match , getCurrent : getCurrent , setCurrent : setCurrent , getPrevious : getPrevious , setPrevious : setPrevious , params : params , hash : hash , reset : function ( ) { this . params = getJsonFromUrl ( window . location . search ) ; this . hash = window . location . hash ; } } ; } , true , true ) ; window . ls . container . set ( 'expression' , function ( container , filter ) { let paths = [ ] ; return { regex : /(\{{.*?\}})/gi , parse : function ( string , def , cast = false ) { def = def || '' ; paths = [ ] ; return string . replace ( this . regex , match => { let reference = match . substring ( 2 , match . length - 2 ) . replace ( '[\'' , '.' ) . replace ( '\']' , '' ) . trim ( ) ; reference = reference . split ( '|' ) ; let path = container . scope ( ( reference [ 0 ] || '' ) ) ; let result = container . path ( path ) ; path = container . scope ( path ) ; if ( ! paths . includes ( path ) ) { paths . push ( path ) ; }
2019-08-06 16:19:16 +12:00
if ( reference . length >= 2 ) { for ( let i = 1 ; i < reference . length ; i ++ ) { result = filter . apply ( reference [ i ] , result ) ; } }
2020-09-24 18:40:41 +12:00
if ( null === result || undefined === result ) { result = def ; }
else if ( typeof result === 'object' ) { result = JSON . stringify ( result , null , 4 ) ; }
else if ( ( ( typeof result === 'object' ) || ( typeof result === 'string' ) ) && cast ) { result = '\'' + result + '\'' ; }
2020-04-16 16:58:27 +12:00
return result ; } ) . replace ( /\\{/g , "{" ) . replace ( /\\}/g , "}" ) ; } , getPaths : ( ) => paths , } } , true , false ) ; window . ls . container . set ( 'filter' , function ( container ) { let filters = { } ; let add = function ( name , callback ) { filters [ name ] = callback ; return this ; } ; let apply = function ( name , value ) { container . set ( '$value' , value , true , false ) ; return container . resolve ( filters [ name ] ) ; } ; add ( 'uppercase' , ( $value ) => { if ( typeof $value !== 'string' ) { return $value ; }
2019-08-20 22:10:32 +12:00
return $value . toUpperCase ( ) ; } ) ; add ( 'lowercase' , ( $value ) => { if ( typeof $value !== 'string' ) { return $value ; }
return $value . toLowerCase ( ) ; } ) ; return { add : add , apply : apply } } , true , false ) ; window . ls . container . get ( 'filter' ) . add ( 'escape' , value => { if ( typeof value !== 'string' ) { return value ; }
2020-09-24 18:40:41 +12:00
return value . replace ( /&/g , '&' ) . replace ( /</g , '<' ) . replace ( />/g , '>' ) . replace ( /\"/g , '"' ) . replace ( /\'/g , ''' ) . replace ( /\//g , '/' ) ; } ) ; window . ls = window . ls || { } ; window . ls . container . set ( 'window' , window , true , false ) . set ( 'document' , window . document , true , false ) . set ( 'element' , window . document , true , false ) ; window . ls . run = function ( window ) { try { this . view . render ( window . document ) ; }
catch ( error ) { let handler = window . ls . container . resolve ( this . error ) ; handler ( error ) ; } } ; window . ls . error = ( ) => { return error => { console . error ( 'ls-error' , error . message , error . stack , error . toString ( ) ) ; } } ; window . ls . router = window . ls . container . get ( 'router' ) ; window . ls . view = window . ls . container . get ( 'view' ) ; window . ls . filter = window . ls . container . get ( 'filter' ) ; window . ls . container . get ( 'view' ) . add ( { selector : 'data-ls-router' , controller : function ( element , window , document , view , router ) { let firstFromServer = ( element . getAttribute ( 'data-first-from-server' ) === 'true' ) ; let scope = { selector : 'data-ls-scope' , template : false , repeat : true , controller : function ( ) { } , } ; let init = function ( route ) { let count = parseInt ( element . getAttribute ( 'data-ls-scope-count' ) || 0 ) ; element . setAttribute ( 'data-ls-scope-count' , count + 1 ) ; window . scrollTo ( 0 , 0 ) ; if ( window . document . body . scrollTo ) { window . document . body . scrollTo ( 0 , 0 ) ; }
2019-05-09 19:40:39 +12:00
router . reset ( ) ; if ( null === route ) { return ; }
2020-09-24 18:40:41 +12:00
scope . template = ( undefined !== route . view . template ) ? route . view . template : null ; scope . controller = ( undefined !== route . view . controller ) ? route . view . controller : function ( ) { } ; document . dispatchEvent ( new CustomEvent ( 'state-change' ) ) ; if ( firstFromServer && null === router . getPrevious ( ) ) { scope . template = '' ; document . dispatchEvent ( new CustomEvent ( 'state-changed' ) ) ; }
else if ( count === 1 ) { view . render ( element , function ( ) { document . dispatchEvent ( new CustomEvent ( 'state-changed' ) ) ; } ) ; }
else if ( null !== router . getPrevious ( ) ) { view . render ( element , function ( ) { document . dispatchEvent ( new CustomEvent ( 'state-changed' ) ) ; } ) ; } } ; let findParent = function ( tagName , el ) { if ( ( el . nodeName || el . tagName ) . toLowerCase ( ) === tagName . toLowerCase ( ) ) { return el ; }
2019-05-09 19:40:39 +12:00
while ( el = el . parentNode ) { if ( ( el . nodeName || el . tagName ) . toLowerCase ( ) === tagName . toLowerCase ( ) ) { return el ; } }
2019-08-06 16:19:16 +12:00
return null ; } ; element . removeAttribute ( 'data-ls-router' ) ; element . setAttribute ( 'data-ls-scope' , '' ) ; element . setAttribute ( 'data-ls-scope-count' , 1 ) ; view . add ( scope ) ; document . addEventListener ( 'click' , function ( event ) { let target = findParent ( 'a' , event . target ) ; if ( ! target ) { return false ; }
2019-05-09 19:40:39 +12:00
if ( ! target . href ) { return false ; }
if ( ( event . metaKey ) ) { return false ; }
if ( ( target . hasAttribute ( 'target' ) ) && ( '_blank' === target . getAttribute ( 'target' ) ) ) { return false ; }
if ( target . hostname !== window . location . hostname ) { return false ; }
let route = router . match ( target ) ; if ( null === route ) { return false ; }
event . preventDefault ( ) ; if ( window . location === target . href ) { return false ; }
route . view . state = ( undefined === route . view . state ) ? true : route . view . state ; if ( true === route . view . state ) { if ( router . getPrevious ( ) && router . getPrevious ( ) . view && ( router . getPrevious ( ) . view . scope !== route . view . scope ) ) { window . location . href = target . href ; return false ; }
window . history . pushState ( { } , 'Unknown' , target . href ) ; }
2020-03-17 07:41:56 +13:00
init ( route ) ; return true ; } ) ; window . addEventListener ( 'popstate' , function ( ) { init ( router . match ( window . location ) ) ; } ) ; window . addEventListener ( 'hashchange' , function ( ) { init ( router . match ( window . location ) ) ; } ) ; init ( router . match ( window . location ) ) ; } } ) ; window . ls . container . get ( 'view' ) . add ( { selector : 'data-ls-attrs' , controller : function ( element , expression , container ) { let attrs = element . getAttribute ( 'data-ls-attrs' ) . trim ( ) . split ( ',' ) ; let paths = [ ] ; let debug = element . getAttribute ( 'data-debug' ) || false ; let check = ( ) => { container . set ( 'element' , element , true , false ) ; if ( debug ) { console . info ( 'debug-ls-attrs attributes:' , attrs ) ; }
for ( let i = 0 ; i < attrs . length ; i ++ ) { let attr = attrs [ i ] ; let key = expression . parse ( ( attr . substring ( 0 , attr . indexOf ( '=' ) ) || attr ) ) ; paths = paths . concat ( expression . getPaths ( ) ) ; let value = '' ; if ( attr . indexOf ( '=' ) > - 1 ) { value = expression . parse ( attr . substring ( attr . indexOf ( '=' ) + 1 ) ) || '' ; paths = paths . concat ( expression . getPaths ( ) ) ; }
2019-08-14 09:07:41 +12:00
if ( ! key ) { return null ; }
2020-09-24 18:40:41 +12:00
element . setAttribute ( key , value ) ; } } ; check ( ) ; for ( let i = 0 ; i < paths . length ; i ++ ) { let path = paths [ i ] . split ( '.' ) ; while ( path . length ) { container . bind ( element , path . join ( '.' ) , check ) ; path . pop ( ) ; } } } } ) ; window . ls . container . get ( 'view' ) . add ( { selector : 'data-ls-bind' , controller : function ( element , expression , container ) { let debug = element . getAttribute ( 'data-debug' ) || false ; let echo = function ( value , bind = true ) { if ( element . tagName === 'INPUT' || element . tagName === 'SELECT' || element . tagName === 'BUTTON' || element . tagName === 'TEXTAREA' ) { let type = element . getAttribute ( 'type' ) ; if ( 'radio' === type ) { if ( value . toString ( ) === element . value ) { element . setAttribute ( 'checked' , 'checked' ) ; }
else { element . removeAttribute ( 'checked' ) ; }
2019-08-06 16:19:16 +12:00
if ( bind ) { element . addEventListener ( 'change' , ( ) => { for ( let i = 0 ; i < paths . length ; i ++ ) { if ( element . checked ) { value = element . value ; }
2020-03-17 07:41:56 +13:00
container . path ( paths [ i ] , value ) ; } } ) ; }
2019-08-06 16:19:16 +12:00
return ; }
2020-09-24 18:40:41 +12:00
if ( 'checkbox' === type ) { if ( typeof value === 'boolean' || value === 'true' || value === 'false' ) { if ( value === true || value === 'true' ) { element . setAttribute ( 'checked' , 'checked' ) ; element . checked = true ; }
else { element . removeAttribute ( 'checked' ) ; element . checked = false ; } }
else { try { value = JSON . parse ( value ) ; element . checked = ( Array . isArray ( value ) && ( value . indexOf ( element . value ) > - 1 ) ) ; value = element . value ; }
catch { return null ; } }
2020-03-17 07:41:56 +13:00
if ( bind ) { element . addEventListener ( 'change' , ( ) => { for ( let i = 0 ; i < paths . length ; i ++ ) { let value = container . path ( paths [ i ] ) ; let index = value . indexOf ( element . value ) ; if ( element . checked && index < 0 ) { value . push ( element . value ) ; }
2019-08-06 16:19:16 +12:00
if ( ! element . checked && index > - 1 ) { value . splice ( index , 1 ) ; }
2020-03-17 07:41:56 +13:00
container . path ( paths [ i ] , value ) ; } } ) ; }
2019-08-06 16:19:16 +12:00
return ; }
2019-08-21 23:00:32 +12:00
if ( element . value !== value ) { element . value = value ; element . dispatchEvent ( new Event ( 'change' ) ) ; }
2020-09-24 18:40:41 +12:00
if ( bind ) { element . addEventListener ( 'input' , sync ) ; element . addEventListener ( 'change' , sync ) ; } }
2021-02-24 05:17:45 +13:00
else { if ( element . textContent != value ) { element . textContent = value ; } } } ; let sync = ( ( ) => { return ( ) => { if ( debug ) { console . info ( 'debug-ls-bind' , 'sync-path' , paths ) ; console . info ( 'debug-ls-bind' , 'sync-syntax' , syntax ) ; console . info ( 'debug-ls-bind' , 'sync-syntax-parsed' , parsedSyntax ) ; console . info ( 'debug-ls-bind' , 'sync-value' , element . value ) ; }
2020-03-13 20:21:33 +13:00
for ( let i = 0 ; i < paths . length ; i ++ ) { if ( '{{' + paths [ i ] + '}}' !== parsedSyntax ) { if ( debug ) { console . info ( 'debug-ls-bind' , 'sync-skipped-path' , paths [ i ] ) ; console . info ( 'debug-ls-bind' , 'sync-skipped-syntax' , syntax ) ; console . info ( 'debug-ls-bind' , 'sync-skipped-syntax-parsed' , parsedSyntax ) ; }
continue ; }
if ( debug ) { console . info ( 'debug-ls-bind' , 'sync-loop-path' , paths [ i ] ) ; console . info ( 'debug-ls-bind' , 'sync-loop-syntax' , parsedSyntax ) ; }
2020-03-17 07:41:56 +13:00
container . path ( paths [ i ] , element . value ) ; } } } ) ( ) ; let syntax = element . getAttribute ( 'data-ls-bind' ) ; let parsedSyntax = container . scope ( syntax ) ; let unsync = ( ! ! element . getAttribute ( 'data-unsync' ) ) || false ; let result = expression . parse ( syntax ) ; let paths = expression . getPaths ( ) ; echo ( result , ! unsync ) ; element . addEventListener ( 'looped' , function ( ) { echo ( expression . parse ( parsedSyntax ) , false ) ; } ) ; for ( let i = 0 ; i < paths . length ; i ++ ) { let path = paths [ i ] . split ( '.' ) ; if ( debug ) { console . info ( 'debug-ls-bind' , 'bind-path' , path ) ; console . info ( 'debug-ls-bind' , 'bind-syntax' , syntax ) ; }
while ( path . length ) { container . bind ( element , path . join ( '.' ) , ( ) => { echo ( expression . parse ( parsedSyntax ) , false ) ; } ) ; path . pop ( ) ; } } } } ) ; window . ls . container . get ( 'view' ) . add ( { selector : 'data-ls-if' , controller : function ( element , expression , container , view ) { let result = '' ; let syntax = element . getAttribute ( 'data-ls-if' ) || '' ; let debug = element . getAttribute ( 'data-debug' ) || false ; let paths = [ ] ; let check = ( ) => { if ( debug ) { console . info ( 'debug-ls-if' , expression . parse ( syntax . replace ( /(\r\n|\n|\r)/gm , ' ' ) , 'undefined' , true ) ) ; }
2020-09-24 18:40:41 +12:00
try { result = ( eval ( expression . parse ( syntax . replace ( /(\r\n|\n|\r)/gm , ' ' ) , 'undefined' , true ) ) ) ; }
catch ( error ) { throw new Error ( 'Failed to evaluate expression "' + syntax + ' (resulted with: "' + result + '")": ' + error ) ; }
2019-05-10 07:30:30 +12:00
if ( debug ) { console . info ( 'debug-ls-if result:' , result ) ; }
2020-09-24 18:40:41 +12:00
paths = expression . getPaths ( ) ; let prv = element . $lsSkip ; element . $lsSkip = ! result ; if ( ! result ) { element . style . visibility = 'hidden' ; element . style . display = 'none' ; }
else { element . style . removeProperty ( 'display' ) ; element . style . removeProperty ( 'visibility' ) ; }
if ( prv === true && element . $lsSkip === false ) { view . render ( element ) } } ; check ( ) ; for ( let i = 0 ; i < paths . length ; i ++ ) { let path = paths [ i ] . split ( '.' ) ; while ( path . length ) { container . bind ( element , path . join ( '.' ) , check ) ; path . pop ( ) ; } } } } ) ; window . ls . container . get ( 'view' ) . add ( { selector : 'data-ls-loop' , template : false , nested : false , controller : function ( element , view , container , window , expression ) { let expr = expression . parse ( element . getAttribute ( 'data-ls-loop' ) ) ; let as = element . getAttribute ( 'data-ls-as' ) ; let key = element . getAttribute ( 'data-ls-key' ) || '$index' ; let limit = parseInt ( expression . parse ( element . getAttribute ( 'data-limit' ) || '' ) || - 1 ) ; let debug = element . getAttribute ( 'data-debug' ) || false ; let echo = function ( ) { let array = container . path ( expr ) ; let counter = 0 ; array = ( ! array ) ? [ ] : array ; let watch = ! ! ( array && array . _ _proxy ) ; while ( element . hasChildNodes ( ) ) { element . removeChild ( element . lastChild ) ; element . lastChild = null ; }
2019-05-09 19:40:39 +12:00
if ( array instanceof Array && typeof array !== 'object' ) { throw new Error ( 'Reference value must be array or object. ' + ( typeof array ) + ' given' ) ; }
2021-01-19 06:12:02 +13:00
let children = [ ] ; element . $lsSkip = true ; element . style . visibility = ( 0 === array . length && element . style . visibility == '' ) ? 'hidden' : 'visible' ; for ( let prop in array ) { if ( counter == limit ) { break ; }
2020-04-16 16:58:27 +12:00
counter ++ ; if ( ! array . hasOwnProperty ( prop ) ) { continue ; }
2020-03-17 07:41:56 +13:00
children [ prop ] = template . cloneNode ( true ) ; element . appendChild ( children [ prop ] ) ; ( index => { let context = expr + '.' + index ; container . addNamespace ( as , context ) ; if ( debug ) { console . info ( 'debug-ls-loop' , 'index' , index ) ; console . info ( 'debug-ls-loop' , 'context' , context ) ; console . info ( 'debug-ls-loop' , 'context-path' , container . path ( context ) . name ) ; console . info ( 'debug-ls-loop' , 'namespaces' , container . namespaces ) ; }
2020-04-28 06:38:06 +12:00
container . set ( as , container . path ( context ) , true , watch ) ; container . set ( key , index , true , false ) ; view . render ( children [ prop ] ) ; container . removeNamespace ( as ) ; } ) ( prop ) ; }
2020-09-24 18:40:41 +12:00
element . dispatchEvent ( new Event ( 'looped' ) ) ; } ; let template = ( element . children . length === 1 ) ? element . children [ 0 ] : window . document . createElement ( 'li' ) ; echo ( ) ; container . bind ( element , expr + '.length' , echo ) ; let path = ( expr + '.length' ) . split ( '.' ) ; while ( path . length ) { container . bind ( element , path . join ( '.' ) , echo ) ; path . pop ( ) ; } } } ) ; window . ls . container . get ( 'view' ) . add ( { selector : 'data-ls-template' , template : false , controller : function ( element , view , http , expression , document , container ) { let template = element . getAttribute ( 'data-ls-template' ) || '' ; let type = element . getAttribute ( 'data-type' ) || 'url' ; let debug = element . getAttribute ( 'data-debug' ) || false ; let paths = [ ] ; let check = function ( init = false ) { let source = expression . parse ( template ) ; paths = expression . getPaths ( ) ; element . innerHTML = '' ; if ( 'script' === type ) { let inlineTemplate = document . getElementById ( source ) ; if ( inlineTemplate && inlineTemplate . innerHTML ) { element . innerHTML = inlineTemplate . innerHTML ; element . dispatchEvent ( new CustomEvent ( 'template-loaded' , { bubbles : true , cancelable : false } ) ) ; }
else { if ( debug ) { console . error ( 'Missing template "' + source + '"' ) ; } }
2020-04-04 08:26:52 +13:00
if ( ! init ) { view . render ( element ) ; }
2019-05-09 19:40:39 +12:00
return ; }
2021-05-14 00:37:54 +12:00
http . get ( source ) . then ( function ( element ) { return function ( data ) { element . innerHTML = data ; view . render ( element ) ; element . dispatchEvent ( new CustomEvent ( 'template-loaded' , { bubbles : true , cancelable : false } ) ) ; } } ( element ) , function ( ) { throw new Error ( 'Failed loading template' ) ; } ) ; } ; check ( true ) ; for ( let i = 0 ; i < paths . length ; i ++ ) { let path = paths [ i ] . split ( '.' ) ; while ( path . length ) { container . bind ( element , path . join ( '.' ) , check ) ; path . pop ( ) ; } } } } ) ; window . ls . error = function ( ) { return function ( error ) { window . console . error ( error ) ; if ( window . location . pathname !== '/console' ) { window . location = '/console' ; } } ; } ; window . addEventListener ( "error" , function ( event ) { console . error ( "ERROR-EVENT:" , event . error . message , event . error . stack ) ; } ) ; document . addEventListener ( "account.deleteSession" , function ( ) { window . location = "/auth/signin" ; } ) ; document . addEventListener ( "account.create" , function ( ) { let container = window . ls . container ; let form = container . get ( 'serviceForm' ) ; let sdk = container . get ( 'console' ) ; let promise = sdk . account . createSession ( form . email , form . password ) ; container . set ( "serviceForm" , { } , true , true ) ; let subscribe = function ( c ) { if ( subscribe ) { return } } ; promise . then ( function ( ) { var subscribe = document . getElementById ( 'newsletter' ) . checked ; if ( subscribe ) { fetch ( 'https://appwrite.io/v1/newsletter/subscribe' , { method : 'POST' , headers : { 'Content-Type' : 'application/json' } , body : JSON . stringify ( { name : form . name , email : form . email , } ) , } ) . finally ( function ( ) { window . location = '/console' ; } ) ; } else { window . location = '/console' ; } } , function ( error ) { window . location = '/auth/signup?failure=1' ; } ) ; } ) ; ( function ( window ) { "use strict" ; window . ls . container . set ( 'alerts' , function ( window ) { return { list : [ ] , ids : 0 , counter : 0 , max : 5 , add : function ( message , time ) { var scope = this ; message . id = scope . ids ++ ; message . remove = function ( ) { scope . remove ( message . id ) ; } ; scope . counter ++ ; scope . list . unshift ( message ) ; if ( scope . counter > scope . max ) { scope . list . pop ( ) ; scope . counter -- ; }
2019-12-17 09:30:14 +13:00
if ( time > 0 ) { window . setTimeout ( function ( message ) { return function ( ) { scope . remove ( message . id ) } } ( message ) , time ) ; }
return message . id ; } , remove : function ( id ) { let scope = this ; for ( let index = 0 ; index < scope . list . length ; index ++ ) { let obj = scope . list [ index ] ; if ( obj . id === parseInt ( id ) ) { scope . counter -- ; if ( typeof obj . callback === "function" ) { obj . callback ( ) ; }
2021-01-19 06:02:48 +13:00
scope . list . splice ( index , 1 ) ; } ; } } } ; } , true , true ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . set ( 'appwrite' , function ( window , env ) { let config = { endpoint : 'https://appwrite.io/v1' , } ; let http = function ( document , env ) { let globalParams = [ ] , globalHeaders = [ ] ; let addParam = function ( url , param , value ) { let a = document . createElement ( 'a' ) , regex = /(?:\?|&|&)+([^=]+)(?:=([^&]*))*/g ; let match , str = [ ] ; a . href = url ; param = encodeURIComponent ( param ) ; while ( match = regex . exec ( a . search ) ) if ( param !== match [ 1 ] ) str . push ( match [ 1 ] + ( match [ 2 ] ? "=" + match [ 2 ] : "" ) ) ; str . push ( param + ( value ? "=" + encodeURIComponent ( value ) : "" ) ) ; a . search = str . join ( "&" ) ; return a . href ; } ; let buildQuery = function ( params ) { let str = [ ] ; for ( let p in params ) { if ( params . hasOwnProperty ( p ) ) { str . push ( encodeURIComponent ( p ) + "=" + encodeURIComponent ( params [ p ] ) ) ; } }
2021-01-18 19:29:26 +13:00
return str . join ( "&" ) ; } ; let addGlobalHeader = function ( key , value ) { globalHeaders [ key ] = { key : key . toLowerCase ( ) , value : value . toLowerCase ( ) } ; } ; let addGlobalParam = function ( key , value ) { globalParams . push ( { key : key , value : value } ) ; } ; addGlobalHeader ( 'content-type' , '' ) ; let call = function ( method , path , headers = { } , params = { } , progress = null ) { let i ; path = config . endpoint + path ; if ( - 1 === [ 'GET' , 'POST' , 'PUT' , 'DELETE' , 'TRACE' , 'HEAD' , 'OPTIONS' , 'CONNECT' , 'PATCH' ] . indexOf ( method ) ) { throw new Error ( 'var method must contain a valid HTTP method name' ) ; }
if ( typeof path !== 'string' ) { throw new Error ( 'var path must be of type string' ) ; }
if ( typeof headers !== 'object' ) { throw new Error ( 'var headers must be of type object' ) ; }
for ( i = 0 ; i < globalParams . length ; i ++ ) { path = addParam ( path , globalParams [ i ] . key , globalParams [ i ] . value ) ; }
for ( let key in globalHeaders ) { if ( globalHeaders . hasOwnProperty ( key ) ) { if ( ! headers [ globalHeaders [ key ] . key ] ) { headers [ globalHeaders [ key ] . key ] = globalHeaders [ key ] . value ; } } }
if ( method === 'GET' ) { for ( let param in params ) { if ( param . hasOwnProperty ( key ) ) { path = addParam ( path , key , params [ key ] ) ; } } }
switch ( headers [ 'content-type' ] ) { case 'application/json' : params = JSON . stringify ( params ) ; break ; case 'multipart/form-data' : let formData = new FormData ( ) ; for ( let param in params ) { if ( param . hasOwnProperty ( key ) ) { formData . append ( key , param [ key ] ) ; } }
params = formData ; break ; }
return new Promise ( function ( resolve , reject ) { let request = new XMLHttpRequest ( ) , key ; request . withCredentials = true ; request . open ( method , path , true ) ; for ( key in headers ) { if ( headers . hasOwnProperty ( key ) ) { request . setRequestHeader ( key , headers [ key ] ) ; } }
request . onload = function ( ) { if ( 4 === request . readyState && 399 >= request . status ) { let data = request . response ; let contentType = this . getResponseHeader ( 'content-type' ) ; contentType = contentType . substring ( 0 , contentType . indexOf ( ';' ) ) ; switch ( contentType ) { case 'application/json' : data = JSON . parse ( data ) ; break ; }
resolve ( data ) ; } else { reject ( new Error ( request . statusText ) ) ; } } ; if ( progress ) { request . addEventListener ( 'progress' , progress ) ; request . upload . addEventListener ( 'progress' , progress , false ) ; }
2021-01-19 06:02:48 +13:00
request . onerror = function ( ) { reject ( new Error ( "Network Error" ) ) ; } ; request . send ( params ) ; } ) } ; return { 'get' : function ( path , headers = { } , params = { } ) { return call ( 'GET' , path + ( ( params . length > 0 ) ? '?' + buildQuery ( params ) : '' ) , headers , { } ) ; } , 'post' : function ( path , headers = { } , params = { } , progress = null ) { return call ( 'POST' , path , headers , params , progress ) ; } , 'put' : function ( path , headers = { } , params = { } , progress = null ) { return call ( 'PUT' , headers , params , progress ) ; } , 'patch' : function ( path , headers = { } , params = { } , progress = null ) { return call ( 'PATCH' , path , headers , params , progress ) ; } , 'delete' : function ( path , headers = { } , params = { } , progress = null ) { return call ( 'DELETE' , path , headers , params , progress ) ; } , 'addGlobalParam' : addGlobalParam , 'addGlobalHeader' : addGlobalHeader } } ( window . document ) ; let analytics = { create : function ( id , source , activity , url ) { return http . post ( '/analytics' , { 'content-type' : 'application/json' } , { id : id , source : source , activity : activity , url : url , version : env . VERSION , setup : env . SETUP } ) ; } , } ; return { analytics : analytics , } ; } , true ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . set ( 'console' , function ( window ) { var sdk = new window . Appwrite ( ) ; sdk . setEndpoint ( APP _ENV . API ) . setProject ( 'console' ) . setLocale ( APP _ENV . LOCALE ) ; return sdk ; } , true ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . set ( 'date' , function ( ) { function format ( format , timestamp ) { var jsdate , f
2019-05-09 18:54:39 +12:00
var txtWords = [ 'Sun' , 'Mon' , 'Tues' , 'Wednes' , 'Thurs' , 'Fri' , 'Satur' , 'January' , 'February' , 'March' , 'April' , 'May' , 'June' , 'July' , 'August' , 'September' , 'October' , 'November' , 'December' ]
var formatChr = /\\?(.?)/gi
var formatChrCb = function ( t , s ) { return f [ t ] ? f [ t ] ( ) : s }
var _pad = function ( n , c ) { n = String ( n )
while ( n . length < c ) { n = '0' + n }
return n }
f = { d : function ( ) { return _pad ( f . j ( ) , 2 ) } , D : function ( ) { return f . l ( ) . slice ( 0 , 3 ) } , j : function ( ) { return jsdate . getDate ( ) } , l : function ( ) { return txtWords [ f . w ( ) ] + 'day' } , N : function ( ) { return f . w ( ) || 7 } , S : function ( ) { var j = f . j ( )
var i = j % 10
if ( i <= 3 && parseInt ( ( j % 100 ) / 10 , 10 ) === 1 ) { i = 0 }
return [ 'st' , 'nd' , 'rd' ] [ i - 1 ] || 'th' } , w : function ( ) { return jsdate . getDay ( ) } , z : function ( ) { var a = new Date ( f . Y ( ) , f . n ( ) - 1 , f . j ( ) )
var b = new Date ( f . Y ( ) , 0 , 1 )
return Math . round ( ( a - b ) / 864e5 ) } , W : function ( ) { var a = new Date ( f . Y ( ) , f . n ( ) - 1 , f . j ( ) - f . N ( ) + 3 )
var b = new Date ( a . getFullYear ( ) , 0 , 4 )
return _pad ( 1 + Math . round ( ( a - b ) / 864e5 / 7 ) , 2 ) } , F : function ( ) { return txtWords [ 6 + f . n ( ) ] } , m : function ( ) { return _pad ( f . n ( ) , 2 ) } , M : function ( ) { return f . F ( ) . slice ( 0 , 3 ) } , n : function ( ) { return jsdate . getMonth ( ) + 1 } , t : function ( ) { return ( new Date ( f . Y ( ) , f . n ( ) , 0 ) ) . getDate ( ) } , L : function ( ) { var j = f . Y ( )
return j % 4 === 0 & j % 100 !== 0 | j % 400 === 0 } , o : function ( ) { var n = f . n ( )
var W = f . W ( )
var Y = f . Y ( )
return Y + ( n === 12 && W < 9 ? 1 : n === 1 && W > 9 ? - 1 : 0 ) } , Y : function ( ) { return jsdate . getFullYear ( ) } , y : function ( ) { return f . Y ( ) . toString ( ) . slice ( - 2 ) } , a : function ( ) { return jsdate . getHours ( ) > 11 ? 'pm' : 'am' } , A : function ( ) { return f . a ( ) . toUpperCase ( ) } , B : function ( ) { var H = jsdate . getUTCHours ( ) * 36e2
var i = jsdate . getUTCMinutes ( ) * 60
var s = jsdate . getUTCSeconds ( )
return _pad ( Math . floor ( ( H + i + s + 36e2 ) / 86.4 ) % 1e3 , 3 ) } , g : function ( ) { return f . G ( ) % 12 || 12 } , G : function ( ) { return jsdate . getHours ( ) } , h : function ( ) { return _pad ( f . g ( ) , 2 ) } , H : function ( ) { return _pad ( f . G ( ) , 2 ) } , i : function ( ) { return _pad ( jsdate . getMinutes ( ) , 2 ) } , s : function ( ) { return _pad ( jsdate . getSeconds ( ) , 2 ) } , u : function ( ) { return _pad ( jsdate . getMilliseconds ( ) * 1000 , 6 ) } , e : function ( ) { var msg = 'Not supported (see source code of date() for timezone on how to add support)'
throw new Error ( msg ) } , I : function ( ) { var a = new Date ( f . Y ( ) , 0 )
var c = Date . UTC ( f . Y ( ) , 0 )
var b = new Date ( f . Y ( ) , 6 )
var d = Date . UTC ( f . Y ( ) , 6 )
return ( ( a - c ) !== ( b - d ) ) ? 1 : 0 } , O : function ( ) { var tzo = jsdate . getTimezoneOffset ( )
var a = Math . abs ( tzo )
return ( tzo > 0 ? '-' : '+' ) + _pad ( Math . floor ( a / 60 ) * 100 + a % 60 , 4 ) } , P : function ( ) { var O = f . O ( )
return ( O . substr ( 0 , 3 ) + ':' + O . substr ( 3 , 2 ) ) } , T : function ( ) { return 'UTC' } , Z : function ( ) { return - jsdate . getTimezoneOffset ( ) * 60 } , c : function ( ) { return 'Y-m-d\\TH:i:sP' . replace ( formatChr , formatChrCb ) } , r : function ( ) { return 'D, d M Y H:i:s O' . replace ( formatChr , formatChrCb ) } , U : function ( ) { return jsdate / 1000 | 0 } }
var _date = function ( format , timestamp ) { jsdate = ( timestamp === undefined ? new Date ( ) : ( timestamp instanceof Date ) ? new Date ( timestamp ) : new Date ( timestamp * 1000 ) )
return format . replace ( formatChr , formatChrCb ) }
return _date ( format , timestamp ) }
function strtotime ( text , now ) { var parsed
var match
var today
var year
var date
var days
var ranges
var len
var times
var regex
var i
var fail = false
if ( ! text ) { return fail }
text = text . replace ( /^\s+|\s+$/g , '' ) . replace ( /\s{2,}/g , ' ' ) . replace ( /[\t\r\n]/g , '' ) . toLowerCase ( )
var pattern = new RegExp ( [ '^(\\d{1,4})' , '([\\-\\.\\/:])' , '(\\d{1,2})' , '([\\-\\.\\/:])' , '(\\d{1,4})' , '(?:\\s(\\d{1,2}):(\\d{2})?:?(\\d{2})?)?' , '(?:\\s([A-Z]+)?)?$' ] . join ( '' ) )
match = text . match ( pattern )
if ( match && match [ 2 ] === match [ 4 ] ) { if ( match [ 1 ] > 1901 ) { switch ( match [ 2 ] ) { case '-' : if ( match [ 3 ] > 12 || match [ 5 ] > 31 ) { return fail }
return new Date ( match [ 1 ] , parseInt ( match [ 3 ] , 10 ) - 1 , match [ 5 ] , match [ 6 ] || 0 , match [ 7 ] || 0 , match [ 8 ] || 0 , match [ 9 ] || 0 ) / 1000
case '.' : return fail
case '/' : if ( match [ 3 ] > 12 || match [ 5 ] > 31 ) { return fail }
return new Date ( match [ 1 ] , parseInt ( match [ 3 ] , 10 ) - 1 , match [ 5 ] , match [ 6 ] || 0 , match [ 7 ] || 0 , match [ 8 ] || 0 , match [ 9 ] || 0 ) / 1000 } } else if ( match [ 5 ] > 1901 ) { switch ( match [ 2 ] ) { case '-' : if ( match [ 3 ] > 12 || match [ 1 ] > 31 ) { return fail }
return new Date ( match [ 5 ] , parseInt ( match [ 3 ] , 10 ) - 1 , match [ 1 ] , match [ 6 ] || 0 , match [ 7 ] || 0 , match [ 8 ] || 0 , match [ 9 ] || 0 ) / 1000
case '.' : if ( match [ 3 ] > 12 || match [ 1 ] > 31 ) { return fail }
return new Date ( match [ 5 ] , parseInt ( match [ 3 ] , 10 ) - 1 , match [ 1 ] , match [ 6 ] || 0 , match [ 7 ] || 0 , match [ 8 ] || 0 , match [ 9 ] || 0 ) / 1000
case '/' : if ( match [ 1 ] > 12 || match [ 3 ] > 31 ) { return fail }
return new Date ( match [ 5 ] , parseInt ( match [ 1 ] , 10 ) - 1 , match [ 3 ] , match [ 6 ] || 0 , match [ 7 ] || 0 , match [ 8 ] || 0 , match [ 9 ] || 0 ) / 1000 } } else { switch ( match [ 2 ] ) { case '-' : if ( match [ 3 ] > 12 || match [ 5 ] > 31 || ( match [ 1 ] < 70 && match [ 1 ] > 38 ) ) { return fail }
year = match [ 1 ] >= 0 && match [ 1 ] <= 38 ? + match [ 1 ] + 2000 : match [ 1 ]
return new Date ( year , parseInt ( match [ 3 ] , 10 ) - 1 , match [ 5 ] , match [ 6 ] || 0 , match [ 7 ] || 0 , match [ 8 ] || 0 , match [ 9 ] || 0 ) / 1000
case '.' : if ( match [ 5 ] >= 70 ) { if ( match [ 3 ] > 12 || match [ 1 ] > 31 ) { return fail }
return new Date ( match [ 5 ] , parseInt ( match [ 3 ] , 10 ) - 1 , match [ 1 ] , match [ 6 ] || 0 , match [ 7 ] || 0 , match [ 8 ] || 0 , match [ 9 ] || 0 ) / 1000 }
if ( match [ 5 ] < 60 && ! match [ 6 ] ) { if ( match [ 1 ] > 23 || match [ 3 ] > 59 ) { return fail }
today = new Date ( )
return new Date ( today . getFullYear ( ) , today . getMonth ( ) , today . getDate ( ) , match [ 1 ] || 0 , match [ 3 ] || 0 , match [ 5 ] || 0 , match [ 9 ] || 0 ) / 1000 }
return fail
case '/' : if ( match [ 1 ] > 12 || match [ 3 ] > 31 || ( match [ 5 ] < 70 && match [ 5 ] > 38 ) ) { return fail }
year = match [ 5 ] >= 0 && match [ 5 ] <= 38 ? + match [ 5 ] + 2000 : match [ 5 ]
return new Date ( year , parseInt ( match [ 1 ] , 10 ) - 1 , match [ 3 ] , match [ 6 ] || 0 , match [ 7 ] || 0 , match [ 8 ] || 0 , match [ 9 ] || 0 ) / 1000
case ':' : if ( match [ 1 ] > 23 || match [ 3 ] > 59 || match [ 5 ] > 59 ) { return fail }
today = new Date ( )
return new Date ( today . getFullYear ( ) , today . getMonth ( ) , today . getDate ( ) , match [ 1 ] || 0 , match [ 3 ] || 0 , match [ 5 ] || 0 ) / 1000 } } }
if ( text === 'now' ) { return now === null || isNaN ( now ) ? new Date ( ) . getTime ( ) / 1000 | 0 : now | 0 }
if ( ! isNaN ( parsed = Date . parse ( text ) ) ) { return parsed / 1000 | 0 }
pattern = new RegExp ( [ '^([0-9]{4}-[0-9]{2}-[0-9]{2})' , '[ t]' , '([0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]+)?)' , '([\\+-][0-9]{2}(:[0-9]{2})?|z)' ] . join ( '' ) )
match = text . match ( pattern )
if ( match ) { if ( match [ 4 ] === 'z' ) { match [ 4 ] = 'Z' } else if ( match [ 4 ] . match ( /^([+-][0-9]{2})$/ ) ) { match [ 4 ] = match [ 4 ] + ':00' }
if ( ! isNaN ( parsed = Date . parse ( match [ 1 ] + 'T' + match [ 2 ] + match [ 4 ] ) ) ) { return parsed / 1000 | 0 } }
date = now ? new Date ( now * 1000 ) : new Date ( )
days = { 'sun' : 0 , 'mon' : 1 , 'tue' : 2 , 'wed' : 3 , 'thu' : 4 , 'fri' : 5 , 'sat' : 6 }
ranges = { 'yea' : 'FullYear' , 'mon' : 'Month' , 'day' : 'Date' , 'hou' : 'Hours' , 'min' : 'Minutes' , 'sec' : 'Seconds' }
function lastNext ( type , range , modifier ) { var diff
var day = days [ range ]
if ( typeof day !== 'undefined' ) { diff = day - date . getDay ( )
if ( diff === 0 ) { diff = 7 * modifier } else if ( diff > 0 && type === 'last' ) { diff -= 7 } else if ( diff < 0 && type === 'next' ) { diff += 7 }
date . setDate ( date . getDate ( ) + diff ) } }
function process ( val ) { var splt = val . split ( ' ' )
var type = splt [ 0 ]
var range = splt [ 1 ] . substring ( 0 , 3 )
var typeIsNumber = /\d+/ . test ( type )
var ago = splt [ 2 ] === 'ago'
var num = ( type === 'last' ? - 1 : 1 ) * ( ago ? - 1 : 1 )
if ( typeIsNumber ) { num *= parseInt ( type , 10 ) }
if ( ranges . hasOwnProperty ( range ) && ! splt [ 1 ] . match ( /^mon(day|\.)?$/i ) ) { return date [ 'set' + ranges [ range ] ] ( date [ 'get' + ranges [ range ] ] ( ) + num ) }
if ( range === 'wee' ) { return date . setDate ( date . getDate ( ) + ( num * 7 ) ) }
if ( type === 'next' || type === 'last' ) { lastNext ( type , range , num ) } else if ( ! typeIsNumber ) { return false }
return true }
times = '(years?|months?|weeks?|days?|hours?|minutes?|min|seconds?|sec' + '|sunday|sun\\.?|monday|mon\\.?|tuesday|tue\\.?|wednesday|wed\\.?' + '|thursday|thu\\.?|friday|fri\\.?|saturday|sat\\.?)'
regex = '([+-]?\\d+\\s' + times + '|' + '(last|next)\\s' + times + ')(\\sago)?'
match = text . match ( new RegExp ( regex , 'gi' ) )
if ( ! match ) { return fail }
for ( i = 0 , len = match . length ; i < len ; i ++ ) { if ( ! process ( match [ i ] ) ) { return fail } }
return ( date . getTime ( ) / 1000 ) }
2021-04-07 01:48:28 +12:00
return { format : format , strtotime : strtotime } } ( ) , true ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . set ( 'env' , function ( ) { return APP _ENV ; } , true ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . set ( 'form' , function ( ) { function cast ( value , to ) { if ( value && Array . isArray ( value ) && to !== 'array' ) { value = value . map ( element => cast ( element , to ) ) ; return value ; }
switch ( to ) { case 'int' : case 'integer' : value = parseInt ( value ) ; break ; case 'numeric' : value = Number ( value ) ; break ; case 'string' : value = value . toString ( ) ; break ; case 'json' : value = ( value ) ? JSON . parse ( value ) : [ ] ; break ; case 'array' : value = ( value && value . constructor && value . constructor === Array ) ? value : [ value ] ; break ; case 'array-empty' : value = [ ] ; break ; case 'bool' : case 'boolean' : value = ( value === 'false' ) ? false : value ; value = ! ! value ; break ; }
2019-05-13 06:15:19 +12:00
return value ; }
2021-04-07 04:12:32 +12:00
function toJson ( element , json ) { json = json || { } ; let name = element . getAttribute ( 'name' ) ; let type = element . getAttribute ( 'type' ) ; let castTo = element . getAttribute ( 'data-cast-to' ) ; let ref = json ; if ( name && 'FORM' !== element . tagName ) { if ( name . startsWith ( '[' ) ) { let splitName = name . split ( '.' ) ; if ( splitName . length > 1 && splitName [ 0 ] . endsWith ( ']' ) ) { name = splitName [ splitName . length - 1 ] ; } }
if ( 'FIELDSET' === element . tagName ) { if ( castTo === 'object' ) { if ( json [ name ] === undefined ) { json [ name ] = { } ; }
2019-05-13 06:15:19 +12:00
ref = json [ name ] ; }
else { if ( ! Array . isArray ( json [ name ] ) ) { json [ name ] = [ ] ; }
json [ name ] . push ( { } ) ; ref = json [ name ] [ json [ name ] . length - 1 ] ; } }
else if ( undefined !== element . value ) { if ( 'SELECT' === element . tagName && element . children > 0 ) { json [ name ] = element . children [ element . selectedIndex ] . value ; }
else if ( 'radio' === type ) { if ( element . checked ) { json [ name ] = element . value ; } }
else if ( 'checkbox' === type ) { if ( ! Array . isArray ( json [ name ] ) ) { json [ name ] = [ ] ; }
if ( element . checked ) { json [ name ] . push ( element . value ) ; } }
2019-08-24 17:00:40 +12:00
else if ( 'file' === type ) { json [ name ] = element . files [ 0 ] ; }
2019-05-13 06:15:19 +12:00
else if ( undefined !== element . value ) { if ( ( json [ name ] !== undefined ) && ( ! Array . isArray ( json [ name ] ) ) ) { json [ name ] = [ json [ name ] ] ; }
if ( Array . isArray ( json [ name ] ) ) { json [ name ] . push ( element . value ) ; }
else { json [ name ] = element . value ; } }
json [ name ] = cast ( json [ name ] , castTo ) ; } }
for ( let i = 0 ; i < element . children . length ; i ++ ) { if ( Array . isArray ( ref ) ) { ref . push ( { } ) ; toJson ( element . children [ i ] , ref [ ref . length ] ) ; }
else { toJson ( element . children [ i ] , ref ) ; } }
return json ; }
return { 'toJson' : toJson } } , true , false ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . set ( 'markdown' , function ( window ) { var md = window . markdownit ( ) ; function renderEm ( tokens , idx , opts , _ , slf ) { var token = tokens [ idx ] ; if ( token . markup === '__' ) { token . tag = 'u' ; }
2019-05-09 18:54:39 +12:00
return slf . renderToken ( tokens , idx , opts ) ; }
2020-05-01 04:35:22 +12:00
md . renderer . rules . strong _open = renderEm ; md . renderer . rules . strong _close = renderEm ; return md ; } , true ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . set ( 'rtl' , function ( ) { var rtlStock = "^ا ^ب^ت^ث^ج^ح^خ^د^ذ^ر^ز^س^ش^ص^ض^ط^ظ^ع^غ^ف^ق^ك^ل^م^ن^ه ^و^ي^א^ב^ג^ד^ה^ו ^ז^ח^ט ^י ^כ^ך^ל^מ^ם^נ^ן ^ס ^ע^פ^ף^צ^ץ^ק^ר^ש^ת^" ; var special = [ "\n" , " " , " " , "״" , '"' , "_" , "'" , "!" , "@" , "#" , "$" , "^" , "&" , "%" , "*" , "(" , ")" , "+" , "=" , "-" , "[" , "]" , "\\" , "/" , "{" , "}" , "|" , ":" , "<" , ">" , "?" , "," , "." , "0" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" ] ; var isRTL = function ( value ) { for ( var i = 0 ; i < value . length ; i ++ ) { if ( /\s/g . test ( value [ i ] ) ) { continue ; }
if ( - 1 === special . indexOf ( value [ i ] ) ) { var firstChar = value [ i ] ; break ; } }
if ( - 1 < rtlStock . indexOf ( "^" + firstChar + "^" ) ) { return true ; }
2020-08-18 17:26:28 +12:00
return false ; } ; return { isRTL : isRTL , } ; } , true ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . set ( 'sdk' , function ( window , router ) { var sdk = new window . Appwrite ( ) ; sdk . setEndpoint ( APP _ENV . API ) . setProject ( router . params . project || '' ) . setLocale ( APP _ENV . LOCALE ) . setMode ( 'admin' ) ; return sdk ; } , false ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . set ( 'search' , function ( window ) { return { params : { } , path : '' , pointer : '' , selected : '' , } ; } , true , true ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . set ( 'timezone' , function ( ) { return { convert : function ( unixTime ) { var timezoneMinutes = new Date ( ) . getTimezoneOffset ( ) ; timezoneMinutes = ( timezoneMinutes === 0 ) ? 0 : - timezoneMinutes ; return parseInt ( unixTime ) + ( timezoneMinutes * 60 ) ; } } ; } , true ) ; } ) ( window ) ; window . ls . router . add ( "/auth/signin" , { template : "/auth/signin?version=" + APP _ENV . CACHEBUSTER , scope : "home" } ) . add ( "/auth/signup" , { template : "/auth/signup?version=" + APP _ENV . CACHEBUSTER , scope : "home" } ) . add ( "/auth/recovery" , { template : "/auth/recovery?version=" + APP _ENV . CACHEBUSTER , scope : "home" } ) . add ( "/auth/recovery/reset" , { template : "/auth/recovery/reset?version=" + APP _ENV . CACHEBUSTER , scope : "home" } ) . add ( "/auth/confirm" , { template : "/auth/confirm?version=" + APP _ENV . CACHEBUSTER , scope : "home" } ) . add ( "/auth/join" , { template : "/auth/join?version=" + APP _ENV . CACHEBUSTER , scope : "home" } ) . add ( "/auth/oauth2/success" , { template : "/auth/oauth2/success?version=" + APP _ENV . CACHEBUSTER , scope : "home" } ) . add ( "/auth/oauth2/failure" , { template : "/auth/oauth2/failure?version=" + APP _ENV . CACHEBUSTER , scope : "home" } ) . add ( "/console" , { template : "/console?version=" + APP _ENV . CACHEBUSTER , scope : "console" } ) . add ( "/console/account" , { template : "/console/account?version=" + APP _ENV . CACHEBUSTER , scope : "console" } ) . add ( "/console/account/:tab" , { template : "/console/account?version=" + APP _ENV . CACHEBUSTER , scope : "console" } ) . add ( "/console/home" , { template : "/console/home?version=" + APP _ENV . CACHEBUSTER , scope : "console" , project : true } ) . add ( "/console/home/:tab" , { template : "/console/home?version=" + APP _ENV . CACHEBUSTER , scope : "console" , project : true } ) . add ( "/console/platforms/:platform" , { template : function ( window ) { return window . location . pathname + "?version=" + APP _ENV . CACHEBUSTER ; } , scope : "console" , project : true } ) . add ( "/console/notifications" , { template : "/console/notifications?version=" + APP _ENV . CACHEBUSTER , scope : "console" } ) . add ( "/console/settings" , { template : "/console/settings?version=" + APP _ENV . CACHEBUSTER , scope : "console" , project : true } ) . add ( "/console/settings/:tab" , { template : "/console/settings?version=" + APP _ENV . CACHEBUSTER , scope : "console" , project : true } ) . add ( "/console/webhooks" , { template : "/console/webhooks?version=" + APP _ENV . CACHEBUSTER , scope : "console" , project : true } ) . add ( "/console/webhooks/:tab" , { template : "/console/webhooks?version=" + APP _ENV . CACHEBUSTER , scope : "console" , project : true } ) . add ( "/console/keys" , { template : "/console/keys?version=" + APP _ENV . CACHEBUSTER , scope : "console" , project : true } ) . add ( "/console/keys/:tab" , { template : "/console/keys?version=" + APP _ENV . CACHEBUSTER , scope : "console" , project : true } ) . add ( "/console/tasks" , { template : "/console/tasks?version=" + APP _ENV . CACHEBUSTER , scope : "console" , project : true } ) . add ( "/console/tasks/:tab" , { template : "/console/tasks?version=" + APP _ENV . CACHEBUSTER , scope : "console" , project : true } ) . add ( "/console/database" , { template : "/console/database?version=" + APP _ENV . CACHEBUSTER , scope : "console" , project : true } ) . add ( "/console/database/collection" , { template : function ( window ) { return window . location . pathname + window . location . search + '&version=' + APP _ENV . CACHEBUSTER ; } , scope : "console" , project : true } ) . add ( "/console/database/collection/:tab" , { template : function ( window ) { return window . location . pathname + window . location . search + '&version=' + APP _ENV . CACHEBUSTER ; } , scope : "console" , project : true } ) . add ( "/console/database/document" , { template : function ( window ) { return window . location . pathname + window . location . search + '&version=' + APP _ENV . CACHEBUSTER ; } , scope : "console" , project : true } ) . add ( "/console/database/document/:tab" , { template : function ( window ) { return window . location . pathname + window . location . search + '&version=' + APP _ENV . CACHEBUSTER ; } , scope : "console" , project : true } ) . add ( "/console/storage" , { template : " / console / st
2020-06-11 20:58:53 +12:00
let size = element . dataset [ "size" ] || 80 ; let name = $value . name || $value || "" ; name = ( typeof name !== 'string' ) ? '--' : name ; return def = "/v1/avatars/initials?project=console" + "&name=" +
2020-06-10 09:31:15 +12:00
encodeURIComponent ( name ) + "&width=" +
size + "&height=" +
2020-07-18 18:16:34 +12:00
size ; } ) . add ( "selectedCollection" , function ( $value , router ) { return $value === router . params . collectionId ? "selected" : "" ; } ) . add ( "selectedDocument" , function ( $value , router ) { return $value === router . params . documentId ? "selected" : "" ; } ) . add ( "localeString" , function ( $value ) { $value = parseInt ( $value ) ; return ! Number . isNaN ( $value ) ? $value . toLocaleString ( ) : "" ; } ) . add ( "date" , function ( $value , date ) { return date . format ( "Y-m-d" , $value ) ; } ) . add ( "dateTime" , function ( $value , date ) { return date . format ( "Y-m-d H:i" , $value ) ; } ) . add ( "dateText" , function ( $value , date ) { return date . format ( "d M Y" , $value ) ; } ) . add ( "timeSince" , function ( $value ) { $value = $value * 1000 ; let seconds = Math . floor ( ( Date . now ( ) - $value ) / 1000 ) ; let unit = "second" ; let direction = "ago" ; if ( seconds < 0 ) { seconds = - seconds ; direction = "from now" ; }
let value = seconds ; if ( seconds >= 31536000 ) { value = Math . floor ( seconds / 31536000 ) ; unit = "year" ; }
else if ( seconds >= 86400 ) { value = Math . floor ( seconds / 86400 ) ; unit = "day" ; }
else if ( seconds >= 3600 ) { value = Math . floor ( seconds / 3600 ) ; unit = "hour" ; }
else if ( seconds >= 60 ) { value = Math . floor ( seconds / 60 ) ; unit = "minute" ; }
if ( value != 1 ) { unit = unit + "s" ; }
return value + " " + unit + " " + direction ; } ) . add ( "ms2hum" , function ( $value ) { let temp = $value ; const years = Math . floor ( temp / 31536000 ) , days = Math . floor ( ( temp %= 31536000 ) / 86400 ) , hours = Math . floor ( ( temp %= 86400 ) / 3600 ) , minutes = Math . floor ( ( temp %= 3600 ) / 60 ) , seconds = temp % 60 ; if ( days || hours || seconds || minutes ) { return ( ( years ? years + "y " : "" ) +
2019-05-09 18:54:39 +12:00
( days ? days + "d " : "" ) +
( hours ? hours + "h " : "" ) +
( minutes ? minutes + "m " : "" ) +
2019-09-13 22:47:48 +12:00
Number . parseFloat ( seconds ) . toFixed ( 0 ) + "s" ) ; }
2020-07-18 20:13:15 +12:00
return "< 1s" ; } ) . add ( "seconds2hum" , function ( $value ) { var seconds = ( $value ) . toFixed ( 3 ) ; var minutes = ( $value / ( 60 ) ) . toFixed ( 1 ) ; var hours = ( $value / ( 60 * 60 ) ) . toFixed ( 1 ) ; var days = ( $value / ( 60 * 60 * 24 ) ) . toFixed ( 1 ) ; if ( seconds < 60 ) { return seconds + "s" ; } else if ( minutes < 60 ) { return minutes + "m" ; } else if ( hours < 24 ) { return hours + "h" ; } else { return days + "d" } } ) . add ( "markdown" , function ( $value , markdown ) { return markdown . render ( $value ) ; } ) . add ( "pageCurrent" , function ( $value , env ) { return Math . ceil ( parseInt ( $value || 0 ) / env . PAGING _LIMIT ) + 1 ; } ) . add ( "pageTotal" , function ( $value , env ) { let total = Math . ceil ( parseInt ( $value || 0 ) / env . PAGING _LIMIT ) ; return total ? total : 1 ; } ) . add ( "humanFileSize" , function ( $value ) { if ( ! $value ) { return 0 ; }
2021-02-24 05:17:45 +13:00
let thresh = 1000 ; if ( Math . abs ( $value ) < thresh ) { return $value ; }
let units = [ "kB" , "MB" , "GB" , "TB" , "PB" , "EB" , "ZB" , "YB" ] ; let u = - 1 ; do { $value /= thresh ; ++ u ; } while ( Math . abs ( $value ) >= thresh && u < units . length - 1 ) ; return $value . toFixed ( 1 ) ; } ) . add ( "humanFileUnit" , function ( $value ) { if ( ! $value ) { return '' ; }
let thresh = 1000 ; if ( Math . abs ( $value ) < thresh ) { return 'B' ; }
let units = [ "kB" , "MB" , "GB" , "TB" , "PB" , "EB" , "ZB" , "YB" ] ; let u = - 1 ; do { $value /= thresh ; ++ u ; } while ( Math . abs ( $value ) >= thresh && u < units . length - 1 ) ; return units [ u ] ; } ) . add ( "statsTotal" , function ( $value ) { if ( ! $value ) { return 0 ; }
2020-05-30 00:02:53 +12:00
$value = abbreviate ( $value , 0 , false , false ) ; return $value === "0" ? "N/A" : $value ; } ) . add ( "isEmpty" , function ( $value ) { return ( ! ! $value ) ; } ) . add ( "isEmptyObject" , function ( $value ) { return ( ( Object . keys ( $value ) . length === 0 && $value . constructor === Object ) || $value . length === 0 ) } ) . add ( "activeDomainsCount" , function ( $value ) { let result = [ ] ; if ( Array . isArray ( $value ) ) { result = $value . filter ( function ( node ) { return ( node . verification && node . certificateId ) ; } ) ; }
2020-05-03 21:50:23 +12:00
return result . length ; } ) . add ( "documentAction" , function ( container ) { let collection = container . get ( 'project-collection' ) ; let document = container . get ( 'project-document' ) ; if ( collection && document && ! document . $id ) { return 'database.createDocument' ; }
2020-04-26 08:33:35 +12:00
return 'database.updateDocument' ; } ) . add ( "documentSuccess" , function ( container ) { let document = container . get ( 'project-document' ) ; if ( document && ! document . $id ) { return ',redirect' ; }
return '' ; } ) . add ( "firstElement" , function ( $value ) { if ( $value && $value [ 0 ] ) { return $value [ 0 ] ; }
2020-06-08 16:38:39 +12:00
return $value ; } ) . add ( "platformsLimit" , function ( $value ) { return $value ; } ) . add ( "limit" , function ( $value ) { let postfix = ( $value . length >= 50 ) ? '...' : '' ; return $value . substring ( 0 , 50 ) + postfix ; ; } ) . add ( "arraySentence" , function ( $value ) { if ( ! Array . isArray ( $value ) ) { return '' ; }
2021-04-21 23:02:54 +12:00
return $value . join ( ", " ) . replace ( /,\s([^,]+)$/ , ' and $1' ) ; } ) . add ( "envName" , function ( $value , env ) { if ( env && env . RUNTIMES && env . RUNTIMES [ $value ] ) { return env . RUNTIMES [ $value ] . name ; }
return '' ; } ) . add ( "envLogo" , function ( $value , env ) { if ( env && env . RUNTIMES && env . RUNTIMES [ $value ] ) { return env . RUNTIMES [ $value ] . logo ; }
return '' ; } ) . add ( "envVersion" , function ( $value , env ) { if ( env && env . RUNTIMES && env . RUNTIMES [ $value ] ) { return env . RUNTIMES [ $value ] . version ; }
2020-07-15 06:55:44 +12:00
return '' ; } ) ; function abbreviate ( number , maxPlaces , forcePlaces , forceLetter ) { number = Number ( number ) ; forceLetter = forceLetter || false ; if ( forceLetter !== false ) { return annotate ( number , maxPlaces , forcePlaces , forceLetter ) ; }
2019-09-13 22:47:48 +12:00
let abbr ; if ( number >= 1e12 ) { abbr = "T" ; } else if ( number >= 1e9 ) { abbr = "B" ; } else if ( number >= 1e6 ) { abbr = "M" ; } else if ( number >= 1e3 ) { abbr = "K" ; } else { abbr = "" ; }
2019-05-09 18:54:39 +12:00
return annotate ( number , maxPlaces , forcePlaces , abbr ) ; }
2019-09-13 22:47:48 +12:00
function annotate ( number , maxPlaces , forcePlaces , abbr ) { let rounded = 0 ; switch ( abbr ) { case "T" : rounded = number / 1e12 ; break ; case "B" : rounded = number / 1e9 ; break ; case "M" : rounded = number / 1e6 ; break ; case "K" : rounded = number / 1e3 ; break ; case "" : rounded = number ; break ; }
if ( maxPlaces !== false ) { let test = new RegExp ( "\\.\\d{" + ( maxPlaces + 1 ) + ",}$" ) ; if ( test . test ( "" + rounded ) ) { rounded = rounded . toFixed ( maxPlaces ) ; } }
if ( forcePlaces !== false ) { rounded = Number ( rounded ) . toFixed ( forcePlaces ) ; }
return rounded + abbr ; }
window . ls . container . get ( "view" ) . add ( { selector : "data-acl" , controller : function ( element , document , router , alerts ) { document . body . classList . remove ( "console" ) ; document . body . classList . remove ( "home" ) ; document . body . classList . add ( router . getCurrent ( ) . view . scope ) ; if ( ! router . getCurrent ( ) . view . project ) { document . body . classList . add ( "hide-nav" ) ; document . body . classList . remove ( "show-nav" ) ; } else { document . body . classList . add ( "show-nav" ) ; document . body . classList . remove ( "hide-nav" ) ; }
2020-05-11 16:39:00 +12:00
if ( "/console" === router . getCurrent ( ) . path ) { document . body . classList . add ( "index" ) ; } else { document . body . classList . remove ( "index" ) ; } } } ) . add ( { selector : "data-prism" , controller : function ( window , document , element , alerts ) { Prism . highlightElement ( element ) ; let copy = document . createElement ( "i" ) ; copy . className = "icon-docs copy" ; copy . title = "Copy to Clipboard" ; copy . textContent = "Click Here to Copy" ; copy . addEventListener ( "click" , function ( ) { window . getSelection ( ) . removeAllRanges ( ) ; let range = document . createRange ( ) ; range . selectNode ( element ) ; window . getSelection ( ) . addRange ( range ) ; try { document . execCommand ( "copy" ) ; alerts . add ( { text : "Copied to clipboard" , class : "" } , 3000 ) ; } catch ( err ) { alerts . add ( { text : "Failed to copy text " , class : "error" } , 3000 ) ; }
2020-05-13 08:15:36 +12:00
window . getSelection ( ) . removeAllRanges ( ) ; } ) ; element . parentNode . parentNode . appendChild ( copy ) ; } } ) ; ( function ( window ) { "use strict" ; window . ls . view . add ( { selector : "data-service" , controller : function ( element , view , container , form , alerts , expression , window ) { let action = element . dataset [ "service" ] ; let service = element . dataset [ "name" ] || null ; let event = expression . parse ( element . dataset [ "event" ] ) ; let confirm = element . dataset [ "confirm" ] || "" ; let loading = element . dataset [ "loading" ] || "" ; let loaderId = null ; let scope = element . dataset [ "scope" ] || "sdk" ; let success = element . dataset [ "success" ] || "" ; let failure = element . dataset [ "failure" ] || "" ; let running = false ; let callbacks = { hide : function ( ) { return function ( ) { return element . style . opacity = '0' ; } ; } , reset : function ( ) { return function ( ) { if ( "FORM" === element . tagName ) { return element . reset ( ) ; }
2019-10-11 06:32:41 +13:00
throw new Error ( "This callback is only valid for forms" ) ; } ; } , alert : function ( text , classname ) { return function ( alerts ) { alerts . add ( { text : text , class : classname || "success" } , 3000 ) ; } ; } , redirect : function ( url ) { return function ( router ) { window . location = url || "/" ; } ; } , reload : function ( ) { return function ( router ) { router . reload ( ) ; } ; } , state : function ( keys ) { let updateQueryString = function ( key , value , url ) { var re = new RegExp ( "([?&])" + key + "=.*?(&|#|$)(.*)" , "gi" ) , hash ; if ( re . test ( url ) ) { if ( typeof value !== "undefined" && value !== null ) { return url . replace ( re , "$1" + key + "=" + value + "$2$3" ) ; } else { hash = url . split ( "#" ) ; url = hash [ 0 ] . replace ( re , "$1$3" ) . replace ( /(&|\?)$/ , "" ) ; if ( typeof hash [ 1 ] !== "undefined" && hash [ 1 ] !== null ) { url += "#" + hash [ 1 ] ; }
2019-09-13 22:47:48 +12:00
return url ; } } else { if ( typeof value !== "undefined" && value !== null ) { var separator = url . indexOf ( "?" ) !== - 1 ? "&" : "?" ; hash = url . split ( "#" ) ; url = hash [ 0 ] + separator + key + "=" + value ; if ( typeof hash [ 1 ] !== "undefined" && hash [ 1 ] !== null ) { url += "#" + hash [ 1 ] ; }
return url ; } else { return url ; } } } ; keys = keys . split ( "," ) . map ( element => element . trim ( ) ) ; return function ( serviceForm , router , window ) { let url = window . location . href ; keys . map ( node => { node = node . split ( "=" ) ; let key = node [ 0 ] || "" ; let name = node [ 1 ] || key ; let value = getValue ( key , "param" , serviceForm ) ; url = updateQueryString ( name , value ? value : null , url ) ; } ) ; if ( url !== window . location . href ) { window . history . pushState ( { } , "" , url ) ; router . reset ( ) ; } } ; } , trigger : function ( events ) { return function ( document ) { events = events . trim ( ) . split ( "," ) ; for ( let i = 0 ; i < events . length ; i ++ ) { if ( "" === events [ i ] ) { continue ; }
2020-04-17 15:15:13 +12:00
document . dispatchEvent ( new CustomEvent ( events [ i ] ) ) ; } } ; } , setId : function name ( params ) { } , default : function ( ) { let collection = container . get ( 'project-collection' ) ; let document = container . get ( 'project-document' ) ; if ( collection && document && collection . $id === document . $id ) { for ( const [ key , value ] of Object . entries ( document ) ) { delete document [ key ] ; }
2020-04-26 08:33:35 +12:00
if ( collection . rules ) { for ( let index = 0 ; index < collection . rules . length ; index ++ ) { const element = collection . rules [ index ] ; switch ( element . type ) { case 'text' : case 'email' : case 'url' : case 'ip' : document [ element . key ] = element . default || '' ; break ; case 'numeric' : document [ element . key ] = element . default || '0' ; break ; case 'boolean' : document [ element . key ] = element . default || false ; break ; case 'document' : document [ element . key ] = element . default || { '$id' : '' , '$collection' : '' , '$permissions' : { } } ; break ; default : document [ element . key ] = null ; break ; }
2021-02-02 18:51:07 +13:00
if ( element . array ) { document [ element . key ] = [ ] ; } } } } } } ; let getParams = function getParams ( func ) { const REGEX _COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm ; const REGEX _FUNCTION _PARAMS = /(?:\s*(?:function\s*[^(]*)?\s*)((?:[^'"]|(?:(?:(['"])(?:(?:.*?[^\\]\2)|\2))))*?)\s*(?=(?:=>)|{)/m ; const REGEX _PARAMETERS _VALUES = /\s*([\w\\$]+)\s*(?:=\s*((?:(?:(['"])(?:\3|(?:.*?[^\\]\3)))((\s*\+\s*)(?:(?:(['"])(?:\6|(?:.*?[^\\]\6)))|(?:[\w$]*)))*)|.*?))?\s*(?:,|$)/gm ; let functionAsString = func . toString ( ) ; let params = [ ] ; let match ; functionAsString = functionAsString . replaceAll ( '={}' , "" ) ; functionAsString = functionAsString . replaceAll ( '=[]' , "" ) ; functionAsString = functionAsString . replace ( REGEX _COMMENTS , "" ) ; functionAsString = functionAsString . match ( REGEX _FUNCTION _PARAMS ) [ 1 ] ; if ( functionAsString . charAt ( 0 ) === "(" ) { functionAsString = functionAsString . slice ( 1 , - 1 ) ; }
2019-09-13 22:47:48 +12:00
while ( ( match = REGEX _PARAMETERS _VALUES . exec ( functionAsString ) ) ) { params . push ( match [ 1 ] ) ; }
return params ; } ; let getValue = function ( key , prefix , data ) { let result = null ; if ( ! key ) { return null ; }
let attrKey = prefix + key . charAt ( 0 ) . toUpperCase ( ) + key . slice ( 1 ) ; if ( element . dataset [ attrKey ] ) { result = expression . parse ( element . dataset [ attrKey ] ) ; if ( element . dataset [ attrKey + "CastTo" ] === "array" ) { result = result . split ( "," ) ; } }
2021-03-01 04:01:16 +13:00
if ( typeof data [ key ] !== 'undefined' ) { result = data [ key ] ; }
if ( typeof result === 'undefined' ) { result = "" ; }
2019-09-13 22:47:48 +12:00
return result ; } ; let resolve = function ( target , prefix = "param" , data = { } ) { if ( ! target ) { return function ( ) { } ; }
2020-04-18 10:19:02 +12:00
let args = getParams ( target ) ; return target . apply ( target , args . map ( function ( value ) { let result = getValue ( value , prefix , data ) ; return result ; } ) ) ; } ; let exec = function ( event ) { let parsedSuccess = expression . parse ( success ) ; let parsedFailure = expression . parse ( failure ) ; let parsedAction = expression . parse ( action ) ; parsedSuccess = parsedSuccess && parsedSuccess != "" ? parsedSuccess . split ( "," ) . map ( element => element . trim ( ) ) : [ ] ; parsedFailure = parsedFailure && parsedFailure != "" ? parsedFailure . split ( "," ) . map ( element => element . trim ( ) ) : [ ] ; element . $lsSkip = true ; element . classList . add ( "load-service-start" ) ; if ( ! document . body . contains ( element ) ) { element = undefined ; return false ; }
2019-05-09 18:54:39 +12:00
if ( event ) { event . preventDefault ( ) ; }
2020-04-02 10:41:29 +13:00
if ( running ) { return false ; }
2020-05-21 09:12:23 +12:00
running = true ; element . style . backgroud = 'red' ; if ( confirm ) { if ( window . confirm ( confirm ) !== true ) { element . classList . add ( "load-service-end" ) ; element . $lsSkip = false ; running = false ; return false ; } }
2019-09-13 22:47:48 +12:00
if ( loading ) { loaderId = alerts . add ( { text : loading , class : "" } , 0 ) ; }
2020-04-18 10:19:02 +12:00
let method = container . path ( scope + "." + parsedAction ) ; if ( ! method ) { throw new Error ( 'Method "' + scope + "." + parsedAction + '" not found' ) ; }
2019-09-13 22:47:48 +12:00
let formData = "FORM" === element . tagName ? form . toJson ( element ) : { } ; let result = resolve ( method , "param" , formData ) ; if ( ! result ) { return ; }
2020-03-15 17:54:55 +13:00
if ( Promise . resolve ( result ) != result ) { result = new Promise ( ( resolve , reject ) => { resolve ( result ) ; } ) ; }
2019-05-09 18:54:39 +12:00
result . then ( function ( data ) { if ( loaderId !== null ) { alerts . remove ( loaderId ) ; }
if ( ! element ) { return ; }
2020-04-18 10:19:02 +12:00
running = false ; element . style . backgroud = 'transparent' ; element . classList . add ( "load-service-end" ) ; if ( service ) { container . set ( service . replace ( "." , "-" ) , data , true , true ) ; }
container . set ( "serviceData" , data , true , true ) ; container . set ( "serviceForm" , formData , true , true ) ; for ( let i = 0 ; i < parsedSuccess . length ; i ++ ) { container . resolve ( resolve ( callbacks [ parsedSuccess [ i ] ] , "successParam" +
parsedSuccess [ i ] . charAt ( 0 ) . toUpperCase ( ) +
parsedSuccess [ i ] . slice ( 1 ) , { } ) ) ; }
2019-09-13 22:47:48 +12:00
container . set ( "serviceData" , null , true , true ) ; container . set ( "serviceForm" , null , true , true ) ; element . $lsSkip = false ; view . render ( element ) ; } , function ( exception ) { if ( loaderId !== null ) { alerts . remove ( loaderId ) ; }
2019-08-07 22:46:51 +12:00
if ( ! element ) { return ; }
2020-04-18 10:19:02 +12:00
running = false ; element . style . backgroud = 'transparent' ; element . classList . add ( "load-service-end" ) ; for ( let i = 0 ; i < parsedFailure . length ; i ++ ) { container . resolve ( resolve ( callbacks [ parsedFailure [ i ] ] , "failureParam" +
parsedFailure [ i ] . charAt ( 0 ) . toUpperCase ( ) +
parsedFailure [ i ] . slice ( 1 ) , { } ) ) ; }
2019-09-13 22:47:48 +12:00
element . $lsSkip = false ; view . render ( element ) ; } ) ; } ; let events = event . trim ( ) . split ( "," ) ; for ( let y = 0 ; y < events . length ; y ++ ) { if ( "" === events [ y ] ) { continue ; }
2021-01-18 23:29:05 +13:00
switch ( events [ y ] . trim ( ) ) { case "load" : exec ( ) ; break ; case "none" : break ; case "click" : case "change" : case "keypress" : case "keydown" : case "keyup" : case "input" : case "submit" : element . addEventListener ( events [ y ] , exec ) ; break ; default : document . addEventListener ( events [ y ] , exec ) ; } } } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-analytics" , controller : function ( element ) { let action = element . getAttribute ( "data-analytics-event" ) || "click" ; let doNotTrack = window . navigator . doNotTrack ; if ( doNotTrack == '1' ) { return ; }
element . addEventListener ( action , function ( ) { let category = element . getAttribute ( "data-analytics-category" ) || "undefined" ; let label = element . getAttribute ( "data-analytics-label" ) || "undefined" ; if ( ! ga ) { console . error ( "Google Analytics ga object is not available" ) ; }
2021-03-01 00:42:41 +13:00
ga ( "send" , { hitType : "event" , eventCategory : category , eventAction : action , eventLabel : label } ) ; } ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-analytics-activity" , controller : function ( window , element , appwrite , container ) { let action = element . getAttribute ( "data-analytics-event" ) || "click" ; let activity = element . getAttribute ( "data-analytics-label" ) || "None" ; let doNotTrack = window . navigator . doNotTrack ; if ( doNotTrack == '1' ) { return ; }
element . addEventListener ( action , function ( ) { let account = container . get ( 'account' ) ; let email = account ? . email || element ? . elements [ 'email' ] ? . value || '' ; appwrite . analytics . create ( email , 'console' , activity , window . location . href ) } ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-analytics-pageview" , controller : function ( window , router , env ) { if ( ! ga ) { console . error ( "Google Analytics ga object is not available" ) ; }
2021-01-18 23:29:05 +13:00
let doNotTrack = window . navigator . doNotTrack ; if ( doNotTrack == '1' ) { return ; }
let project = router . params [ "project" ] || 'None' ; ga ( "set" , "page" , window . location . pathname ) ; ga ( "set" , "dimension1" , project ) ; ga ( 'set' , 'dimension2' , env . VERSION ) ; ga ( 'set' , 'dimension3' , env . SETUP ) ; ga ( "send" , "pageview" ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-clone" , controller : function ( element , document , view ) { var template = element . innerHTML . toString ( ) ; var label = element . dataset [ "label" ] || "Add" ; var icon = element . dataset [ "icon" ] || null ; var target = element . dataset [ "target" ] || null ; var first = parseInt ( element . dataset [ "first" ] || 1 ) ; var button = document . createElement ( "button" ) ; button . type = "button" ; button . innerText = " " + label + " " ; button . classList . add ( "margin-end" ) ; button . classList . add ( "margin-bottom-small" ) ; button . classList . add ( "reverse" ) ; if ( icon ) { var iconElement = document . createElement ( "i" ) ; iconElement . className = icon ; button . insertBefore ( iconElement , button . firstChild ) ; }
2019-05-09 18:54:39 +12:00
if ( target ) { target = document . getElementById ( target ) ; }
2019-09-13 22:47:48 +12:00
button . addEventListener ( "click" , function ( ) { var clone = document . createElement ( element . tagName ) ; if ( element . name ) { clone . name = element . name ; }
clone . innerHTML = template ; clone . className = element . className ; view . render ( clone ) ; if ( target ) { target . appendChild ( clone ) ; } else { button . parentNode . insertBefore ( clone , button ) ; }
2020-07-24 02:59:44 +12:00
clone . querySelector ( "input" ) . focus ( ) ; Array . prototype . slice . call ( clone . querySelectorAll ( "[data-remove]" ) ) . map ( function ( obj ) { obj . addEventListener ( "click" , function ( ) { clone . parentNode . removeChild ( clone ) ; obj . scrollIntoView ( { behavior : "smooth" } ) ; } ) ; } ) ; Array . prototype . slice . call ( clone . querySelectorAll ( "[data-up]" ) ) . map ( function ( obj ) { obj . addEventListener ( "click" , function ( ) { if ( clone . previousElementSibling ) { clone . parentNode . insertBefore ( clone , clone . previousElementSibling ) ; obj . scrollIntoView ( { behavior : "smooth" } ) ; } } ) ; } ) ; Array . prototype . slice . call ( clone . querySelectorAll ( "[data-down]" ) ) . map ( function ( obj ) { obj . addEventListener ( "click" , function ( ) { if ( clone . nextElementSibling ) { clone . parentNode . insertBefore ( clone . nextElementSibling , clone ) ; obj . scrollIntoView ( { behavior : "smooth" } ) ; } } ) ; } ) ; } ) ; element . parentNode . insertBefore ( button , element . nextSibling ) ; element . parentNode . removeChild ( element ) ; if ( first ) { button . click ( ) ; } } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-add" , repeat : false , controller : function ( element , view , container , document ) { for ( var i = 0 ; i < element . children . length ; i ++ ) { let button = document . createElement ( "button" ) ; let template = element . children [ i ] . cloneNode ( true ) ; let as = element . getAttribute ( 'data-ls-as' ) ; let counter = 0 ; button . type = "button" ; button . innerText = "Add" ; button . classList . add ( "reverse" ) ; button . classList . add ( "margin-end-small" ) ; button . addEventListener ( 'click' , function ( ) { container . addNamespace ( as , 'new-' + counter ++ ) ; console . log ( container . namespaces , container . get ( as ) , as ) ; container . set ( as , null , true , true ) ; let child = template . cloneNode ( true ) ; view . render ( child ) ; element . appendChild ( child ) ; element . style . visibility = 'visible' ; let inputs = child . querySelectorAll ( 'input,textarea' ) ; for ( let index = 0 ; index < inputs . length ; ++ index ) { if ( inputs [ index ] . type !== 'hidden' ) { inputs [ index ] . focus ( ) ; break ; } } } ) ; element . after ( button ) ; } } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-chart" , controller : function ( element , container , date , document ) { let wrapper = document . createElement ( "div" ) ; let child = document . createElement ( "canvas" ) ; let sources = element . getAttribute ( 'data-forms-chart' ) ; let width = element . getAttribute ( 'data-width' ) || 500 ; let height = element . getAttribute ( 'data-height' ) || 175 ; let colors = ( element . getAttribute ( 'data-colors' ) || 'blue,green,orange,red' ) . split ( ',' ) ; let themes = { 'blue' : '#29b5d9' , 'green' : '#4eb55b' , 'orange' : '#fba233' , 'red' : '#dc3232' , } ; let range = { '24h' : 'H:i' , '7d' : 'd F Y' , '30d' : 'd F Y' , '90d' : 'd F Y' }
element . parentNode . insertBefore ( wrapper , element . nextSibling ) ; wrapper . classList . add ( 'content' ) ; child . width = width ; child . height = height ; sources = sources . split ( ',' ) ; wrapper . appendChild ( child ) ; let chart = null ; let check = function ( ) { let config = { type : "line" , data : { labels : [ ] , datasets : [ ] } , options : { responsive : true , title : { display : false , text : "Stats" } , legend : { display : false } , tooltips : { mode : "index" , intersect : false , caretPadding : 0 } , hover : { mode : "nearest" , intersect : true } , scales : { xAxes : [ { display : false } ] , yAxes : [ { display : false } ] } } } ; for ( let i = 0 ; i < sources . length ; i ++ ) { let label = sources [ i ] . substring ( 0 , sources [ i ] . indexOf ( '=' ) ) ; let path = sources [ i ] . substring ( sources [ i ] . indexOf ( '=' ) + 1 ) ; let data = container . path ( path ) ; let value = JSON . parse ( element . value ) ; config . data . labels [ i ] = label ; config . data . datasets [ i ] = { } ; config . data . datasets [ i ] . label = label ; config . data . datasets [ i ] . borderColor = themes [ colors [ i ] ] ; config . data . datasets [ i ] . backgroundColor = themes [ colors [ i ] ] + '36' ; config . data . datasets [ i ] . borderWidth = 2 ; config . data . datasets [ i ] . data = [ 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ; config . data . datasets [ i ] . fill = true ; if ( ! data ) { return ; }
let dateFormat = ( value . range && range [ value . range ] ) ? range [ value . range ] : 'd F Y' ; for ( let x = 0 ; x < data . length ; x ++ ) { config . data . datasets [ i ] . data [ x ] = data [ x ] . value ; config . data . labels [ x ] = date . format ( dateFormat , data [ x ] . date ) ; } }
if ( chart ) { chart . destroy ( ) ; }
else { }
chart = new Chart ( child . getContext ( "2d" ) , config ) ; wrapper . dataset [ "canvas" ] = true ; }
2021-02-06 01:56:36 +13:00
check ( ) ; element . addEventListener ( 'change' , check ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-code" , controller : function ( element , alerts ) { let lang = element . dataset [ "formsCode" ] || "json" ; let div = document . createElement ( "div" ) ; let pre = document . createElement ( "pre" ) ; let code = document . createElement ( "code" ) ; let copy = document . createElement ( "i" ) ; div . appendChild ( pre ) ; div . appendChild ( copy ) ; pre . appendChild ( code ) ; element . parentNode . appendChild ( div ) ; element . style . display = 'none' ; div . className = "ide" ; div . dataset [ 'langLabel' ] = element . dataset [ "langLabel" ] || 'JSON' ; div . dataset [ 'lang' ] = element . dataset [ "lang" ] || 'json' ; pre . className = "line-numbers" ; code . className = "prism language-" + lang ; copy . className = "icon-docs copy" ; copy . textContent = "Click Here to Copy" ; copy . title = "Copy to Clipboard" ; copy . addEventListener ( "click" , function ( ) { window . getSelection ( ) . removeAllRanges ( ) ; let range = document . createRange ( ) ; range . selectNode ( code ) ; window . getSelection ( ) . addRange ( range ) ; try { document . execCommand ( "copy" ) ; alerts . add ( { text : "Copied to clipboard" , class : "" } , 3000 ) ; } catch ( err ) { alerts . add ( { text : "Failed to copy text " , class : "error" } , 3000 ) ; }
2020-07-13 08:58:33 +12:00
window . getSelection ( ) . removeAllRanges ( ) ; } ) ; let check = function ( ) { if ( ! element . value ) { return ; }
2019-09-13 22:47:48 +12:00
let value = null ; try { value = JSON . stringify ( JSON . parse ( element . value ) , null , 4 ) ; } catch ( error ) { value = element . value ; }
code . innerHTML = value ; Prism . highlightElement ( code ) ; div . scrollTop = 0 ; } ; element . addEventListener ( "change" , check ) ; check ( ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-color" , controller : function ( element ) { var preview = document . createElement ( "div" ) ; var picker = document . createElement ( "input" ) ; picker . type = "color" ; preview . className = "color-preview" ; preview . appendChild ( picker ) ; picker . addEventListener ( "change" , syncA ) ; picker . addEventListener ( "input" , syncA ) ; element . addEventListener ( "input" , update ) ; element . addEventListener ( "change" , update ) ; function update ( ) { if ( element . validity . valid ) { preview . style . background = element . value ; syncB ( ) ; } }
2019-05-09 18:54:39 +12:00
function syncA ( ) { element . value = picker . value ; update ( ) ; }
function syncB ( ) { picker . value = element . value ; }
2020-03-13 20:21:33 +13:00
element . parentNode . insertBefore ( preview , element ) ; update ( ) ; syncB ( ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-copy" , controller : function ( element , alerts , document , window ) { var button = window . document . createElement ( "i" ) ; button . type = "button" ; button . className = "icon-docs note copy" ; button . style . cursor = "pointer" ; element . parentNode . insertBefore ( button , element . nextSibling ) ; var copy = function ( event ) { let disabled = element . disabled ; element . disabled = false ; element . focus ( ) ; element . select ( ) ; document . execCommand ( "Copy" ) ; if ( document . selection ) { document . selection . empty ( ) ; } else if ( window . getSelection ) { window . getSelection ( ) . removeAllRanges ( ) ; }
2021-01-31 10:05:52 +13:00
element . disabled = disabled ; element . blur ( ) ; alerts . add ( { text : "Copied to clipboard" , class : "" } , 3000 ) ; } ; button . addEventListener ( "click" , copy ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-document" , controller : function ( element , container , search ) { var formsDocument = ( element . dataset [ "formsDocument" ] || '' ) ; var searchButton = ( element . dataset [ "search" ] || 0 ) ; let path = container . scope ( searchButton ) ; element . addEventListener ( 'click' , function ( ) { search . selected = element . value ; search . path = path ; document . dispatchEvent ( new CustomEvent ( formsDocument , { bubbles : false , cancelable : true } ) ) ; } ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-document-preview" , controller : function ( element , container , search ) { element . addEventListener ( 'change' , function ( ) { console . log ( element . value ) ; } ) ; } } ) ; } ) ( window ) ; ( function ( window ) { window . ls . container . get ( "view" ) . add ( { selector : "data-forms-filter" , controller : function ( document , container , expression , element , form , di ) { let name = element . dataset [ "formsFilter" ] || "" ; let events = element . dataset [ "event" ] || "" ; let serialize = function ( obj , prefix ) { let str = [ ] , p ; for ( p in obj ) { if ( obj . hasOwnProperty ( p ) ) { let k = prefix ? prefix + "[" + p + "]" : p , v = obj [ p ] ; if ( v === "" ) { continue ; }
2019-09-13 22:47:48 +12:00
str . push ( v !== null && typeof v === "object" ? serialize ( v , k ) : encodeURIComponent ( k ) + "=" + encodeURIComponent ( v ) ) ; } }
return str . join ( "&" ) ; } ; let parse = function ( filter ) { if ( filter === "" ) { return null ; }
2019-05-09 18:54:39 +12:00
let operatorsMap = [ "!=" , ">=" , "<=" , "=" , ">" , "<" ] ; let operator = null ; for ( let key = 0 ; key < operatorsMap . length ; key ++ ) { if ( filter . indexOf ( operatorsMap [ key ] ) > - 1 ) { operator = operatorsMap [ key ] ; } }
if ( operator === null ) { throw new Error ( "Invalid operator" ) ; }
filter = filter . split ( operator ) ; if ( filter . length !== 2 ) { throw new Error ( "Invalid filter expression" ) ; }
2019-09-13 22:47:48 +12:00
return { key : filter [ 0 ] , value : filter [ 1 ] , operator : operator } ; } ; let flatten = function ( params ) { let list = { } ; for ( let key in params ) { if ( params . hasOwnProperty ( key ) ) { if ( key !== "filters" ) { list [ key ] = params [ key ] ; } else { for ( let i = 0 ; i < params [ key ] . length ; i ++ ) { let filter = parse ( params [ key ] [ i ] ) ; if ( null === filter ) { continue ; }
list [ "filters-" + filter . key ] = params [ key ] [ i ] ; } } } }
return list ; } ; let apply = function ( params ) { let cached = container . get ( name ) ; cached = cached ? cached . params : [ ] ; params = Object . assign ( cached , params ) ; container . set ( name , { name : name , params : params , query : serialize ( params ) , forward : parseInt ( params . offset ) + parseInt ( params . limit ) , backward : parseInt ( params . offset ) - parseInt ( params . limit ) , keys : flatten ( params ) } , true , name ) ; document . dispatchEvent ( new CustomEvent ( name + "-changed" , { bubbles : false , cancelable : true } ) ) ; } ; switch ( element . tagName ) { case "INPUT" : break ; case "TEXTAREA" : break ; case "BUTTON" : element . addEventListener ( "click" , function ( ) { apply ( JSON . parse ( expression . parse ( element . dataset [ "params" ] || "{}" ) ) ) ; } ) ; break ; case "FORM" : element . addEventListener ( "input" , function ( ) { apply ( form . toJson ( element ) ) ; } ) ; element . addEventListener ( "change" , function ( ) { apply ( form . toJson ( element ) ) ; } ) ; element . addEventListener ( "reset" , function ( ) { setTimeout ( function ( ) { apply ( form . toJson ( element ) ) ; } , 0 ) ; } ) ; events = events . trim ( ) . split ( "," ) ; for ( let y = 0 ; y < events . length ; y ++ ) { if ( events [ y ] === "init" ) { element . addEventListener ( "rendered" , function ( ) { apply ( form . toJson ( element ) ) ; } , { once : true } ) ; } else { }
element . setAttribute ( "data-event" , "none" ) ; }
2021-02-02 18:51:07 +13:00
break ; default : break ; } } } ) ; } ) ( window ) ; ( function ( window ) { window . ls . container . get ( "view" ) . add ( { selector : "data-forms-headers" , controller : function ( element ) { let key = document . createElement ( "input" ) ; let value = document . createElement ( "input" ) ; let wrap = document . createElement ( "div" ) ; let cell1 = document . createElement ( "div" ) ; let cell2 = document . createElement ( "div" ) ; key . type = "text" ; key . className = "margin-bottom-no" ; key . placeholder = "Key" ; value . type = "text" ; value . className = "margin-bottom-no" ; value . placeholder = "Value" ; wrap . className = "row thin margin-bottom-small" ; cell1 . className = "col span-6" ; cell2 . className = "col span-6" ; element . parentNode . insertBefore ( wrap , element ) ; cell1 . appendChild ( key ) ; cell2 . appendChild ( value ) ; wrap . appendChild ( cell1 ) ; wrap . appendChild ( cell2 ) ; key . addEventListener ( "input" , function ( ) { syncA ( ) ; } ) ; value . addEventListener ( "input" , function ( ) { syncA ( ) ; } ) ; element . addEventListener ( "change" , function ( ) { syncB ( ) ; } ) ; let syncA = function ( ) { element . value = key . value . toLowerCase ( ) + ":" + value . value . toLowerCase ( ) ; } ; let syncB = function ( ) { let split = element . value . toLowerCase ( ) . split ( ":" ) ; key . value = split [ 0 ] || "" ; value . value = split [ 1 ] || "" ; key . value = key . value . trim ( ) ; value . value = value . value . trim ( ) ; } ; syncB ( ) ; } } ) ; } ) ( window ) ; ( function ( window ) { window . ls . container . get ( "view" ) . add ( { selector : "data-forms-key-value" , controller : function ( element ) { let key = document . createElement ( "input" ) ; let value = document . createElement ( "input" ) ; let wrap = document . createElement ( "div" ) ; let cell1 = document . createElement ( "div" ) ; let cell2 = document . createElement ( "div" ) ; key . type = "text" ; key . className = "margin-bottom-no" ; key . placeholder = "Key" ; key . required = true ; value . type = "text" ; value . className = "margin-bottom-no" ; value . placeholder = "Value" ; value . required = true ; wrap . className = "row thin margin-bottom-small" ; cell1 . className = "col span-6" ; cell2 . className = "col span-6" ; element . parentNode . insertBefore ( wrap , element ) ; cell1 . appendChild ( key ) ; cell2 . appendChild ( value ) ; wrap . appendChild ( cell1 ) ; wrap . appendChild ( cell2 ) ; key . addEventListener ( "input" , function ( ) { syncA ( ) ; } ) ; value . addEventListener ( "input" , function ( ) { syncA ( ) ; } ) ; element . addEventListener ( "change" , function ( ) { syncB ( ) ; } ) ; let syncA = function ( ) { element . name = key . value ; element . value = value . value ; } ; let syncB = function ( ) { key . value = element . name || "" ; value . value = element . value || "" ; } ; syncB ( ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-move-down" , controller : function ( element ) { Array . prototype . slice . call ( element . querySelectorAll ( "[data-move-down]" ) ) . map ( function ( obj ) { obj . addEventListener ( "click" , function ( ) { if ( element . nextElementSibling ) { console . log ( 'down' , element . offsetHeight ) ; element . parentNode . insertBefore ( element . nextElementSibling , element ) ; element . scrollIntoView ( { block : 'center' } ) ; } } ) ; } ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-move-up" , controller : function ( element ) { Array . prototype . slice . call ( element . querySelectorAll ( "[data-move-up]" ) ) . map ( function ( obj ) { obj . addEventListener ( "click" , function ( ) { if ( element . previousElementSibling ) { console . log ( 'up' , element ) ; element . parentNode . insertBefore ( element , element . previousElementSibling ) ; element . scrollIntoView ( { block : 'center' } ) ; } } ) ; } ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-nav" , repeat : false , controller : function ( element , view , container , document ) { let titles = document . querySelectorAll ( '[data-forms-nav-anchor]' ) ; let links = element . querySelectorAll ( '[data-forms-nav-link]' ) ; let minLink = null ; let check = function ( ) { let minDistance = null ; let minElement = null ; for ( let i = 0 ; i < titles . length ; ++ i ) { let title = titles [ i ] ; let distance = title . getBoundingClientRect ( ) . top ; console . log ( i ) ; if ( ( minDistance === null || minDistance >= distance ) && ( distance >= 0 ) ) { if ( minLink ) { minLink . classList . remove ( 'selected' ) ; }
2020-05-30 00:02:53 +12:00
console . log ( 'old' , minLink ) ; minDistance = distance ; minElement = title ; minLink = links [ i ] ; minLink . classList . add ( 'selected' ) ; console . log ( 'new' , minLink ) ; } } } ; window . addEventListener ( 'scroll' , check ) ; check ( ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-oauth-apple" , controller : function ( element ) { let container = document . createElement ( "div" ) ; let row = document . createElement ( "div" ) ; let col1 = document . createElement ( "div" ) ; let col2 = document . createElement ( "div" ) ; let keyID = document . createElement ( "input" ) ; let keyLabel = document . createElement ( "label" ) ; let teamID = document . createElement ( "input" ) ; let teamLabel = document . createElement ( "label" ) ; let p8 = document . createElement ( "textarea" ) ; let p8Label = document . createElement ( "label" ) ; keyLabel . textContent = 'Key ID' ; teamLabel . textContent = 'Team ID' ; p8Label . textContent = 'P8 File' ; row . classList . add ( 'row' ) ; row . classList . add ( 'thin' ) ; container . appendChild ( row ) ; container . appendChild ( p8Label ) ; container . appendChild ( p8 ) ; row . appendChild ( col1 ) ; row . appendChild ( col2 ) ; col1 . classList . add ( 'col' ) ; col1 . classList . add ( 'span-6' ) ; col1 . appendChild ( keyLabel ) ; col1 . appendChild ( keyID ) ; col2 . classList . add ( 'col' ) ; col2 . classList . add ( 'span-6' ) ; col2 . appendChild ( teamLabel ) ; col2 . appendChild ( teamID ) ; keyID . type = 'text' ; keyID . placeholder = 'SHAB13ROFN' ; teamID . type = 'text' ; teamID . placeholder = 'ELA2CD3AED' ; p8 . accept = '.p8' ; p8 . classList . add ( 'margin-bottom-no' ) ; element . parentNode . insertBefore ( container , element . nextSibling ) ; element . addEventListener ( 'change' , sync ) ; keyID . addEventListener ( 'change' , update ) ; teamID . addEventListener ( 'change' , update ) ; p8 . addEventListener ( 'change' , update ) ; function update ( ) { let json = { } ; json . keyID = keyID . value ; json . teamID = teamID . value ; json . p8 = p8 . value ; element . value = JSON . stringify ( json ) ; }
2020-06-07 15:33:36 +12:00
function sync ( ) { if ( ! element . value ) { return ; }
2020-05-30 00:02:53 +12:00
let json = { } ; try { json = JSON . parse ( element . value ) ; } catch ( error ) { console . error ( 'Failed to parse secret key' ) ; }
teamID . value = json . teamID || '' ; keyID . value = json . keyID || '' ; p8 . value = json . p8 || '' ; }
sync ( ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-password-meter" , controller : function ( element , window ) { var calc = function ( password ) { var score = 0 ; if ( ! password ) return score ; var letters = new window . Object ( ) ; for ( var i = 0 ; i < password . length ; i ++ ) { letters [ password [ i ] ] = ( letters [ password [ i ] ] || 0 ) + 1 ; score += 5.0 / letters [ password [ i ] ] ; }
2019-09-13 22:47:48 +12:00
var variations = { digits : /\d/ . test ( password ) , lower : /[a-z]/ . test ( password ) , upper : /[A-Z]/ . test ( password ) , nonWords : /\W/ . test ( password ) } ; var variationCount = 0 ; for ( var check in variations ) { if ( variations . hasOwnProperty ( check ) ) { variationCount += variations [ check ] === true ? 1 : 0 ; } }
2020-05-01 04:35:22 +12:00
score += ( variationCount - 1 ) * 10 ; return parseInt ( score ) ; } ; var callback = function ( ) { var score = calc ( this . value ) ; if ( "" === this . value ) return ( meter . className = "password-meter" ) ; if ( score > 60 ) return ( meter . className = "password-meter strong" ) ; if ( score > 30 ) return ( meter . className = "password-meter medium" ) ; if ( score >= 0 ) return ( meter . className = "password-meter weak" ) ; } ; var meter = window . document . createElement ( "div" ) ; meter . className = "password-meter" ; element . parentNode . insertBefore ( meter , element . nextSibling ) ; element . addEventListener ( "change" , callback ) ; element . addEventListener ( "keypress" , callback ) ; element . addEventListener ( "keyup" , callback ) ; element . addEventListener ( "keydown" , callback ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-pell" , controller : function ( element , window , document , markdown , rtl ) { var div = document . createElement ( "div" ) ; element . className = "pell hide" ; div . className = "input pell" ; element . parentNode . insertBefore ( div , element ) ; element . tabIndex = - 1 ; var turndownService = new TurndownService ( ) ; turndownService . addRule ( "underline" , { filter : [ "u" ] , replacement : function ( content ) { return "__" + content + "__" ; } } ) ; var editor = window . pell . init ( { element : div , onChange : function onChange ( html ) { alignText ( ) ; element . value = turndownService . turndown ( html ) ; } , defaultParagraphSeparator : "p" , actions : [ { name : "bold" , icon : '<i class="icon-bold"></i>' } , { name : "underline" , icon : '<i class="icon-underline"></i>' } , { name : "italic" , icon : '<i class="icon-italic"></i>' } , { name : "olist" , icon : '<i class="icon-list-numbered"></i>' } , { name : "ulist" , icon : '<i class="icon-list-bullet"></i>' } , { name : "link" , icon : '<i class="icon-link"></i>' } ] } ) ; var clean = function ( e ) { e . stopPropagation ( ) ; e . preventDefault ( ) ; var clipboardData = e . clipboardData || window . clipboardData ; console . log ( clipboardData . getData ( "Text" ) ) ; window . pell . exec ( "insertText" , clipboardData . getData ( "Text" ) ) ; return true ; } ; var alignText = function ( ) { let paragraphs = editor . content . querySelectorAll ( 'p,li' ) ; let last = '' ; for ( let paragraph of paragraphs ) { var content = paragraph . textContent ; if ( content . trim ( ) === '' ) { content = last . textContent ; }
if ( rtl . isRTL ( content ) ) { paragraph . style . direction = 'rtl' ; paragraph . style . textAlign = 'right' ; }
else { paragraph . style . direction = 'ltr' ; paragraph . style . textAlign = 'left' ; }
2021-01-11 01:49:18 +13:00
last = paragraph ; } } ; var santize = function ( e ) { clean ( e ) ; alignText ( e ) ; } ; element . addEventListener ( "change" , function ( ) { editor . content . innerHTML = markdown . render ( element . value ) ; alignText ( ) ; } ) ; editor . content . setAttribute ( "placeholder" , element . placeholder ) ; editor . content . innerHTML = markdown . render ( element . value ) ; editor . content . tabIndex = 0 ; alignText ( ) ; editor . content . onkeydown = function preventTab ( event ) { if ( event . which === 9 ) { event . preventDefault ( ) ; if ( document . activeElement ) { var focussable = Array . prototype . filter . call ( document . querySelectorAll ( 'a:not([disabled]), button:not([disabled]), select:not([disabled]), input[type=text]:not([disabled]), input[type=checkbox]:not([disabled]), [tabindex]:not([disabled]):not([tabindex="-1"])' ) , function ( element ) { return ( element . offsetWidth > 0 || element . offsetHeight > 0 || element === document . activeElement ) ; } ) ; var index = focussable . indexOf ( document . activeElement ) ; if ( index > - 1 ) { if ( event . shiftKey ) { var prevElement = focussable [ index - 1 ] || focussable [ focussable . length - 1 ] ; prevElement . focus ( ) ; } else { var nextElement = focussable [ index + 1 ] || focussable [ 0 ] ; nextElement . focus ( ) ; } } } } } ; div . addEventListener ( "paste" , santize ) ; div . addEventListener ( "drop" , santize ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-remove" , controller : function ( element ) { Array . prototype . slice . call ( element . querySelectorAll ( "[data-remove]" ) ) . map ( function ( obj ) { obj . addEventListener ( "click" , function ( ) { element . parentNode . removeChild ( element ) ; } ) ; } ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-run" , repeat : false , controller : function ( element , expression , container ) { let action = expression . parse ( element . dataset [ "formsRun" ] || '' ) ; element . addEventListener ( 'click' , function ( ) { return container . path ( action ) ( ) ; } ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-select-all" , controller : function ( element ) { let select = document . createElement ( "button" ) ; let unselect = document . createElement ( "button" ) ; select . textContent = 'Select All' ; unselect . textContent = 'Unselect All' ; select . classList . add ( 'link' ) ; select . classList . add ( 'margin-top-tiny' ) ; select . classList . add ( 'margin-start-small' ) ; select . classList . add ( 'text-size-small' ) ; select . classList . add ( 'pull-end' ) ; unselect . classList . add ( 'link' ) ; unselect . classList . add ( 'margin-top-tiny' ) ; unselect . classList . add ( 'margin-start-small' ) ; unselect . classList . add ( 'text-size-small' ) ; unselect . classList . add ( 'pull-end' ) ; select . type = 'button' ; unselect . type = 'button' ; element . parentNode . insertBefore ( select , element ) ; element . parentNode . insertBefore ( unselect , element ) ; select . addEventListener ( 'click' , function ( ) { let checkboxes = element . querySelectorAll ( "input[type='checkbox']" ) ; for ( var i = 0 ; i < checkboxes . length ; i ++ ) { checkboxes [ i ] . checked = true ; checkboxes [ i ] . dispatchEvent ( new Event ( 'change' ) ) ; } } )
2021-03-01 04:01:16 +13:00
unselect . addEventListener ( 'click' , function ( ) { let checkboxes = element . querySelectorAll ( "input[type='checkbox']" ) ; for ( var i = 0 ; i < checkboxes . length ; i ++ ) { checkboxes [ i ] . checked = false ; checkboxes [ i ] . dispatchEvent ( new Event ( 'change' ) ) ; } } ) } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-show-secret" , controller : function ( element , document ) { let button = document . createElement ( 'span' ) ; button . className = "link pull-end text-size-small margin-top-negative icon-eye" ; button . innerHTML = ( element . type == 'password' ) ? 'Show Secret' : 'Hide Secret' ; button . style . visibility = ( element . value == '' ) ? 'hidden' : 'visible' ; element . insertAdjacentElement ( "beforebegin" , button ) ; button . addEventListener ( "click" , function ( event ) { switch ( element . type ) { case "password" : element . type = "text" ; button . innerHTML = 'Hide Secret' ; break ; case "text" : element . type = "password" ; button . innerHTML = 'Show Secret' ; break ; default : console . warn ( "data-forms-show-secret: element.type NOT text NOR password" ) ; } } ) ; let sync = function ( event ) { button . style . visibility = ( element . value == '' ) ? 'hidden' : 'visible' ; } ; element . addEventListener ( "keyup" , sync ) ; element . addEventListener ( "change" , sync ) ; } , } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-switch" , controller : function ( element ) { let input = window . document . createElement ( "input" ) ; input . type = "checkbox" ; input . className = "button switch " + element . className ; let syncA = function ( ) { let value = input . checked ? "true" : "false"
2020-05-26 17:10:13 +12:00
let old = element . value ; element . value = value ; if ( value !== old ) { element . dispatchEvent ( new Event ( 'change' ) ) ; } } ; let syncB = function ( ) { input . checked = ( element . value === "true" ) ; } ; input . addEventListener ( "input" , syncA ) ; input . addEventListener ( "change" , syncA ) ; element . addEventListener ( "input" , syncB ) ; element . addEventListener ( "change" , syncB ) ; syncA ( ) ; element . parentNode . insertBefore ( input , element ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-tags" , controller : function ( element ) { let array = [ ] ; let tags = window . document . createElement ( "div" ) ; let preview = window . document . createElement ( "ul" ) ; let add = window . document . createElement ( "input" ) ; let listen = function ( event ) { if ( ( event . key === "Enter" || event . key === " " || event . key === "Tab" ) && add . value . length > 0 ) { array . push ( add . value ) ; add . value = "" ; element . value = JSON . stringify ( array ) ; check ( ) ; if ( event . key !== "Tab" ) { event . preventDefault ( ) ; } }
2019-09-13 22:47:48 +12:00
if ( ( event . key === "Backspace" || event . key === "Delete" ) && add . value === "" ) { array . splice ( - 1 , 1 ) ; element . value = JSON . stringify ( array ) ; check ( ) ; }
2020-05-26 17:10:13 +12:00
return false ; } ; let check = function ( ) { try { array = JSON . parse ( element . value ) || [ ] ; } catch ( error ) { array = [ ] ; }
2019-08-22 22:44:55 +12:00
if ( ! Array . isArray ( array ) ) { array = [ ] ; }
2020-04-28 06:38:06 +12:00
preview . innerHTML = "" ; for ( let index = 0 ; index < array . length ; index ++ ) { let value = array [ index ] ; let tag = window . document . createElement ( "li" ) ; if ( ! value || value === ' ' ) { continue ; }
tag . className = "tag" ; tag . textContent = value ; tag . addEventListener ( "click" , function ( ) { array . splice ( index , 1 ) ; element . value = JSON . stringify ( array ) ; check ( ) ; } ) ; preview . appendChild ( tag ) ; }
2020-05-26 17:10:13 +12:00
if ( element . required && array . length === 0 ) { add . setCustomValidity ( "Please add permissions" ) ; } else { add . setCustomValidity ( "" ) ; } } ; tags . className = "tags" ; preview . className = "tags-list" ; add . type = "text" ; add . className = "add" ; add . placeholder = element . placeholder ; tags . addEventListener ( "click" , function ( ) { add . focus ( ) ; } ) ; add . addEventListener ( "keydown" , listen ) ; add . addEventListener ( "blur" , function ( event ) { if ( add . value !== '' ) { array . push ( add . value ) ; add . value = "" ; element . value = JSON . stringify ( array ) ; check ( ) ; } } ) ; tags . appendChild ( preview ) ; tags . appendChild ( add ) ; element . parentNode . insertBefore ( tags , element ) ; element . addEventListener ( "change" , check ) ; check ( ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-text-count" , controller : function ( element ) { var counter = document . createElement ( "div" ) ; counter . className = "counter" ; element . parentNode . insertBefore ( counter , element . nextSibling ) ; var count = function ( ) { if ( 0 <= element . maxLength ) { counter . innerText = ( element . maxLength - element . value . length ) . toString ( ) + " / " +
2020-05-01 04:35:22 +12:00
element . maxLength ; } else { var words = element . value !== "" ? element . value . trim ( ) . split ( " " ) . length : 0 ; counter . innerText = words + " words and " + element . value . length . toString ( ) + " chars" ; } } ; element . addEventListener ( "keyup" , count ) ; element . addEventListener ( "change" , count ) ; element . addEventListener ( "cut" , count ) ; element . addEventListener ( "paste" , count ) ; element . addEventListener ( "drop" , count ) ; count ( ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-text-direction" , controller : function ( element , rtl ) { var setDirection = function ( ) { var value = element . value [ 0 ] ? element . value : "" ; var direction = "ltr" ; var align = "left" ; if ( rtl . isRTL ( value ) ) { direction = "rtl" ; align = "right" ; }
2019-09-13 22:47:48 +12:00
element . style . direction = direction ; element . style . textAlign = align ; } ; element . addEventListener ( "keyup" , setDirection ) ; element . addEventListener ( "change" , setDirection ) ; element . addEventListener ( "cut" , setDirection ) ; element . addEventListener ( "paste" , setDirection ) ; element . addEventListener ( "drop" , setDirection ) ; setDirection ( ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-text-resize" , controller : function ( element , window ) { function resize ( ) { var scrollLeft = window . pageXOffset || ( window . document . documentElement || window . document . body . parentNode || window . document . body ) . scrollLeft ; var scrollTop = window . pageYOffset || ( window . document . documentElement || window . document . body . parentNode || window . document . body ) . scrollTop ; var offset = element . offsetHeight - element . clientHeight ; element . style . height = "auto" ; element . style . height = element . scrollHeight + offset + "px" ; window . scrollTo ( scrollLeft , scrollTop ) ; }
2020-06-13 23:13:53 +12:00
element . addEventListener ( "keyup" , resize ) ; element . addEventListener ( "change" , resize ) ; element . addEventListener ( "cut" , resize ) ; element . addEventListener ( "paste" , resize ) ; element . addEventListener ( "drop" , resize ) ; window . addEventListener ( "resize" , resize ) ; resize ( ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . container . get ( "view" ) . add ( { selector : "data-forms-upload" , controller : function ( element , container , alerts , expression , env , search ) { var scope = element . dataset [ "scope" ] ; var project = expression . parse ( element . dataset [ "project" ] || "console" ) ; var labelButton = element . dataset [ "labelButton" ] || "Upload" ; var labelLoading = element . dataset [ "labelLoading" ] || "Uploading..." ; var previewWidth = element . dataset [ "previewWidth" ] || 200 ; var previewHeight = element . dataset [ "previewHeight" ] || 200 ; var previewAlt = element . dataset [ "previewAlt" ] || 200 ; var accept = element . dataset [ "accept" ] || "" ; var searchButton = ( element . dataset [ "search" ] || 0 ) ; var required = element . dataset [ "required" ] || false ; var className = element . dataset [ "class" ] || "upload" ; var max = parseInt ( element . dataset [ "max" ] || 4 ) ; var sdk = scope === "sdk" ? container . get ( "sdk" ) : container . get ( "console" ) ; var output = element . value || null ; var wrapper = document . createElement ( "div" ) ; var input = document . createElement ( "input" ) ; var upload = document . createElement ( "div" ) ; var preview = document . createElement ( "ul" ) ; var progress = document . createElement ( "div" ) ; var count = document . createElement ( "div" ) ; wrapper . className = className ; input . type = "file" ; input . accept = accept ; input . required = required ; input . tabIndex = - 1 ; count . className = "count" ; upload . className = "button reverse margin-bottom-small" ; upload . innerHTML = '<i class="icon icon-upload"></i> ' + labelButton ; upload . tabIndex = 0 ; preview . className = "preview" ; progress . className = "progress" ; progress . style . width = "0%" ; progress . style . display = "none" ; var onComplete = function ( message ) { alerts . remove ( message ) ; input . disabled = false ; upload . classList . remove ( "disabled" ) ; progress . style . width = "0%" ; progress . style . display = "none" ; } ; var render = function ( result ) { preview . innerHTML = "" ; count . innerHTML = "0 / " + max ; if ( ! result ) { return ; }
2020-02-01 00:57:25 +13:00
var file = document . createElement ( "li" ) ; var image = document . createElement ( "img" ) ; image . src = image . src = env . API + "/storage/files/" +
result + "/preview?width=" +
2019-09-13 22:47:48 +12:00
previewWidth + "&height=" +
2020-06-21 02:01:53 +12:00
previewHeight + "&project=" + project + "&mode=admin" ; image . alt = previewAlt ; file . className = "file avatar" ; file . tabIndex = 0 ; file . appendChild ( image ) ; preview . appendChild ( file ) ; var remove = ( function ( result ) { return function ( event ) { render ( result . $id ) ; element . value = '' ; } ; } ) ( result ) ; file . addEventListener ( "click" , remove ) ; file . addEventListener ( "keypress" , remove ) ; element . value = result ; } ; input . addEventListener ( "change" , function ( ) { var message = alerts . add ( { text : labelLoading , class : "" } , 0 ) ; var files = input . files ; var read = JSON . parse ( expression . parse ( element . dataset [ "read" ] || "[]" ) ) ; var write = JSON . parse ( expression . parse ( element . dataset [ "write" ] || "[]" ) ) ; sdk . storage . createFile ( files [ 0 ] , read , write , 1 ) . then ( function ( response ) { onComplete ( message ) ; render ( response . $id ) ; } , function ( error ) { alerts . add ( { text : "An error occurred!" , class : "" } , 3000 ) ; onComplete ( message ) ; } ) ; input . disabled = true ; } ) ; element . addEventListener ( "change" , function ( ) { if ( ! element . value ) { return ; }
2020-07-25 18:26:25 +12:00
render ( element . value ) ; wrapper . scrollIntoView ( ) ; } ) ; upload . addEventListener ( "keypress" , function ( ) { input . click ( ) ; } ) ; element . parentNode . insertBefore ( wrapper , element ) ; wrapper . appendChild ( preview ) ; wrapper . appendChild ( progress ) ; wrapper . appendChild ( upload ) ; upload . appendChild ( input ) ; render ( output ) ; if ( searchButton ) { let searchOpen = document . createElement ( "button" ) ; searchOpen . type = 'button' ; searchOpen . innerHTML = '<i class="icon icon-search"></i> Search' ; searchOpen . classList . add ( 'reverse' ) ; let path = container . scope ( searchButton ) ; searchOpen . addEventListener ( 'click' , function ( ) { search . selected = element . value ; search . path = path ; document . dispatchEvent ( new CustomEvent ( "open-file-serach" , { bubbles : false , cancelable : true } ) ) ; } ) ; wrapper . appendChild ( searchOpen ) ; } } } ) ; } ) ( window ) ; ( function ( window ) { window . ls . container . get ( "view" ) . add ( { selector : "data-cookies" , controller : function ( element , alerts , cookie , env ) { if ( ! cookie . get ( "cookie-alert" ) ) { let text = element . dataset [ "cookies" ] || "" ; alerts . add ( { text : text , class : "cookie-alert" , link : env . HOME + "/policy/cookies" , label : 'Learn More' , callback : function ( ) { cookie . set ( "cookie-alert" , "true" , 365 * 10 ) ; } } , 0 ) ; } } } ) ; } ) ( window ) ; ( function ( window ) { window . ls . container . get ( "view" ) . add ( { selector : "data-page-title" , repeat : true , controller : function ( element , document , expression ) { document . title = expression . parse ( element . getAttribute ( "data-page-title" ) ) || document . title ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . view . add ( { selector : 'data-general-scroll-to' , repeat : false , controller : function ( element , window ) { let button = window . document . createElement ( 'button' ) ; button . className = 'scroll-to icon-up-dir' ; button . alt = 'Back To Top' ; button . title = 'Back To Top' ; button . addEventListener ( 'click' , function ( ) { element . scrollIntoView ( true , { behavior : 'smooth' } ) ; button . blur ( ) ; } , false ) ; element . appendChild ( button ) ; } } ) ; } ) ( window ) ; ( function ( window ) { "use strict" ; window . ls . view . add ( { selector : 'data-general-scroll-direction' , repeat : false , controller : function ( element , window ) { let position = 0 ; let check = function ( ) { let direction = window . document . documentElement . scrollTop ; if ( direction > position ) { element . classList . remove ( 'scroll-to-top' )
2020-01-27 20:34:08 +13:00
element . classList . add ( 'scroll-to-bottom' ) }
else { element . classList . remove ( 'scroll-to-bottom' )
element . classList . add ( 'scroll-to-top' ) }
2020-01-27 21:21:34 +13:00
position = direction ; let current = Math . ceil ( direction / window . innerHeight ) ; element . setAttribute ( 'data-views-total' , Math . ceil ( element . scrollHeight / window . innerHeight ) ) ; element . setAttribute ( 'data-views-current' , current ) ; if ( element . scrollHeight <= ( direction + element . offsetHeight + 300 ) && direction > 0 ) { element . classList . add ( 'scroll-end' ) }
2020-02-19 11:13:09 +13:00
else { element . classList . remove ( 'scroll-end' ) } } ; window . addEventListener ( 'scroll' , check , false ) ; window . addEventListener ( 'resize' , check , false ) ; check ( ) ; } } ) ; } ) ( window ) ; ( function ( window ) { window . ls . container . get ( "view" ) . add ( { selector : "data-setup" , controller : function ( element , console , form , alerts , router ) { element . addEventListener ( "submit" , function ( event ) { event . preventDefault ( ) ; let loaderId = alerts . add ( { text : 'Creating new project...' , class : "" } , 0 ) ; let formData = form . toJson ( element ) ; formData [ "name" ] = formData [ "name" ] || ( element . dataset [ "defaultName" ] || "" ) ; console . teams . create ( formData [ "name" ] || "" ) . then ( function ( data ) { let team = data [ "$id" ] ; formData = JSON . parse ( JSON . stringify ( formData ) . replace ( new RegExp ( "{{teamId}}" , "g" ) , team ) ) ; console . projects . create ( formData [ "name" ] , team ) . then ( function ( project ) { alerts . remove ( loaderId ) ; window . location . href = "/console/home?project=" + project [ "$id" ] ; } , function ( ) { throw new Error ( "Failed to setup project" ) ; } ) ; } , function ( ) { throw new Error ( "Setup failed creating project team" ) ; } ) ; } ) ; } } ) ; } ) ( window ) ; ( function ( window ) { window . ls . container . get ( "view" ) . add ( { selector : "data-switch" , controller : function ( element , router , document ) { let check = function ( c ) { if ( ! element . value ) { return ; }
2019-08-22 07:22:48 +12:00
if ( element . value === router . params . project ) { return ; }
2020-02-12 00:55:57 +13:00
return router . change ( "/console/home?project=" + element . value ) ; } ; element . addEventListener ( "change" , function ( ) { check ( ) ; } ) ; } } ) ; } ) ( window ) ; ( function ( window ) { window . ls . container . get ( "view" ) . add ( { selector : "data-general-theme" , controller : function ( element , router , document ) { let toggle = function ( c ) { if ( document . body . classList . contains ( 'theme-light' ) ) { document . body . classList . remove ( 'theme-light' ) ; document . body . classList . add ( 'theme-dark' ) ; window . localStorage . setItem ( 'user-theme' , 'theme-dark' ) }
2020-07-25 18:33:48 +12:00
else { document . body . classList . remove ( 'theme-dark' ) ; document . body . classList . add ( 'theme-light' ) ; window . localStorage . setItem ( 'user-theme' , 'theme-light' ) } } ; element . addEventListener ( "click" , function ( ) { toggle ( ) ; } ) ; } } ) ; } ) ( window ) ; ( function ( window ) { window . ls . container . get ( "view" ) . add ( { selector : "data-version" , controller : function ( alerts , env , cookie ) { let cookieName = "version-update-" + env . VERSION . replace ( /\./g , "_" ) ; if ( ! cookie . get ( cookieName ) ) { var xhr = new XMLHttpRequest ( ) ; xhr . open ( 'GET' , '/console/version' , true ) ; xhr . onload = function ( ) { if ( this . readyState == 4 && this . status == 200 ) { let data = JSON . parse ( this . responseText ) ; let text = 'Appwrite version ' + data . version + ' is avaliable, check the' ; if ( isNewerVersion ( env . VERSION , data . version ) ) { alerts . add ( { text : text , class : "success" , link : "https://github.com/appwrite/appwrite/releases" , label : 'release notes' , callback : function ( ) { cookie . set ( cookieName , "true" , 365 * 10 ) ; } } , 0 ) ; } } } ; xhr . send ( null ) ; function isNewerVersion ( oldVer , newVer ) { const oldParts = oldVer . split ( '.' )
2020-07-25 18:26:25 +12:00
const newParts = newVer . split ( '.' )
for ( var i = 0 ; i < newParts . length ; i ++ ) { const a = parseInt ( newParts [ i ] ) || 0
const b = parseInt ( oldParts [ i ] ) || 0
if ( a > b ) return true
if ( a < b ) return false }
2021-05-14 00:37:54 +12:00
return false } } } } ) ; } ) ( window ) ; ( function ( window ) { window . ls . container . get ( "view" ) . add ( { selector : "data-paging-back" , controller : function ( element , container , expression , env ) { let paths = [ ] ; let limit = env . PAGING _LIMIT ; let check = function ( ) { let offset = parseInt ( expression . parse ( element . dataset [ "offset" ] ) || "0" ) ; paths = paths . concat ( expression . getPaths ( ) ) ; if ( offset - limit < 0 ) { element . disabled = true ; } else { element . disabled = false ; element . value = offset - limit ; } } ; check ( ) ; for ( let i = 0 ; i < paths . length ; i ++ ) { let path = paths [ i ] . split ( "." ) ; while ( path . length ) { container . bind ( element , path . join ( "." ) , check ) ; path . pop ( ) ; } } } } ) ; } ) ( window ) ; ( function ( window ) { window . ls . container . get ( "view" ) . add ( { selector : "data-paging-next" , controller : function ( element , container , expression , env ) { let paths = [ ] ; let limit = env . PAGING _LIMIT ; let check = function ( ) { let offset = parseInt ( expression . parse ( element . dataset [ "offset" ] ) || "0" ) ; paths = paths . concat ( expression . getPaths ( ) ) ; let sum = parseInt ( expression . parse ( element . dataset [ "sum" ] ) || "0" ) ; paths = paths . concat ( expression . getPaths ( ) ) ; if ( offset + limit >= sum ) { element . disabled = true ; } else { element . disabled = false ; element . value = offset + limit ; } } ; check ( ) ; for ( let i = 0 ; i < paths . length ; i ++ ) { let path = paths [ i ] . split ( "." ) ; while ( path . length ) { container . bind ( element , path . join ( "." ) , check ) ; path . pop ( ) ; } } } } ) ; } ) ( window ) ; ( function ( window ) { window . ls . container . get ( "view" ) . add ( { selector : "data-ui-highlight" , controller : function ( element , expression , document ) { let check = function ( ) { let links = element . getElementsByTagName ( "a" ) ; let selected = null ; let list = [ ] ; for ( let i = 0 ; i < links . length ; i ++ ) { list . push ( links [ i ] ) ; }
2020-06-06 20:40:33 +12:00
list . sort ( function ( a , b ) { return a . pathname . length - b . pathname . length ; } ) ; if ( selected && list [ selected ] . dataset [ "selected" ] ) { let parent = element . querySelector ( "a[href='" + list [ selected ] . dataset [ "selected" ] + "']" ) ; if ( parent ) { parent . classList . remove ( "selected" ) ; } }
for ( let i = 0 ; i < list . length ; i ++ ) { let path = list [ i ] . pathname ; if ( path === window . location . pathname . substring ( 0 , path . length ) ) { list [ i ] . classList . add ( "selected" ) ; if ( selected !== null ) { list [ selected ] . classList . remove ( "selected" ) ; }
selected = i ; } else { list [ i ] . classList . remove ( "selected" ) ; } }
if ( selected && list [ selected ] . dataset [ "selected" ] ) { let parent = element . querySelector ( "a[href='" + list [ selected ] . dataset [ "selected" ] + "']" ) ; if ( parent ) { parent . classList . add ( "selected" ) ; } } } ; document . addEventListener ( "state-changed" , check ) ; check ( ) ; } , } ) ; } ) ( window ) ; ( function ( window ) { window . ls . container . get ( "view" ) . add ( { selector : "data-ls-ui-loader" , controller : function ( element , document ) { document . addEventListener ( 'account.get' , function ( ) { element . classList . add ( 'loaded' ) ; } ) ; } } ) ; } ) ( window ) ; ( function ( window ) { window . ls . container . get ( "view" ) . add ( { selector : "data-ui-modal" , controller : function ( document , element , expression ) { let name = expression . parse ( element . dataset [ "name" ] || '' ) ; let buttonText = expression . parse ( element . dataset [ "buttonText" ] || "" ) ; let buttonElement = expression . parse ( element . dataset [ "buttonElement" ] || "button" ) ; let buttonClass = expression . parse ( element . dataset [ "buttonClass" ] || "button-class" ) ; let buttonIcon = expression . parse ( element . dataset [ "buttonIcon" ] || '' ) ; let buttonEvent = expression . parse ( element . dataset [ "buttonEvent" ] || "" ) ; let buttonHide = expression . parse ( element . dataset [ "buttonHide" ] || "" ) ; let buttonAlias = expression . parse ( element . dataset [ "buttonAlias" ] || "" ) ; let buttonElements = ! buttonAlias ? [ document . createElement ( buttonElement ) ] : document . querySelectorAll ( buttonAlias ) ; let openEvent = expression . parse ( element . dataset [ "openEvent" ] || '' ) ; let closeEvent = expression . parse ( element . dataset [ "closeEvent" ] || 'submit' ) ; let background = document . getElementById ( "modal-bg" ) ; if ( ! background ) { background = document . createElement ( "div" ) ; background . id = "modal-bg" ; background . className = "modal-bg" ; document . body . appendChild ( background ) ; background . addEventListener ( "click" , function ( ) { document . dispatchEvent ( new CustomEvent ( "modal-close" , { bubbles : false , cancelable : true } ) ) ; } ) ; }
2020-02-28 20:37:09 +13:00
if ( ! buttonAlias ) { buttonElements . forEach ( button => { button . innerText = buttonText ; button . className = buttonClass ; button . type = buttonElement ; if ( buttonIcon ) { let iconElement = document . createElement ( "i" ) ; iconElement . className = buttonIcon ; button . insertBefore ( iconElement , button . firstChild ) ; } } ) ; }
2019-09-13 22:47:48 +12:00
if ( buttonEvent ) { buttonElements . forEach ( button => { button . addEventListener ( "click" , function ( ) { document . dispatchEvent ( new CustomEvent ( buttonEvent , { bubbles : false , cancelable : true } ) ) ; } ) ; } ) ; }
2020-04-21 06:47:26 +12:00
element . classList . add ( "modal" ) ; if ( ! buttonAlias && ! buttonHide ) { buttonElements . forEach ( button => { element . parentNode . insertBefore ( button , element ) ; } ) ; }
2020-04-21 20:13:45 +12:00
let open = function ( ) { document . documentElement . classList . add ( "modal-open" ) ; document . dispatchEvent ( new CustomEvent ( "modal-open" , { bubbles : false , cancelable : true } ) ) ; element . classList . add ( "open" ) ; element . classList . remove ( "close" ) ; let form = element . querySelector ( 'form' ) ; let elements = ( form && form . elements ) ? [ ... form . elements ] : [ ] ; for ( let index = 0 ; index < elements . length ; index ++ ) { let element = elements [ index ] ; if ( element . type !== 'hidden' && element . type !== 'button' && element . type !== 'submit' ) { element . focus ( ) ; break ; } } } ; let close = function ( event ) { document . documentElement . classList . remove ( "modal-open" ) ; element . classList . add ( "close" ) ; element . classList . remove ( "open" ) ; } ; if ( name ) { document . querySelectorAll ( "[data-ui-modal-ref='" + name + "']" ) . forEach ( function ( elem ) { elem . addEventListener ( "click" , open ) ; } ) ; }
2019-05-09 18:54:39 +12:00
if ( openEvent ) { document . addEventListener ( openEvent , open ) ; }
2019-09-13 22:47:48 +12:00
buttonElements . forEach ( button => { button . addEventListener ( "click" , open ) ; } ) ; document . addEventListener ( "keydown" , function ( event ) { if ( event . which === 27 ) { close ( ) ; } } ) ; element . addEventListener ( "blur" , close ) ; let closeButtons = element . querySelectorAll ( "[data-ui-modal-close]" ) ; for ( let i = 0 ; i < closeButtons . length ; i ++ ) { closeButtons [ i ] . addEventListener ( "click" , close ) ; }
2020-06-13 23:13:53 +12:00
document . addEventListener ( "modal-close" , close ) ; element . addEventListener ( closeEvent , close ) ; } } ) ; } ) ( window ) ; ( function ( window ) { window . ls . container . get ( "view" ) . add ( { selector : "data-ls-ui-open" , controller : function ( element , window ) { let def = element . classList . contains ( "open" ) ? "open" : "close" ; let buttonClass = element . dataset [ "buttonClass" ] || "ls-ui-open" ; let buttonText = element . dataset [ "buttonText" ] || "" ; let buttonIcon = element . dataset [ "buttonIcon" ] || "" ; let buttonAria = element . dataset [ "buttonAria" ] || "Open" ; let buttonSelector = element . dataset [ "buttonSelector" ] || "" ; let hover = element . hasAttribute ( "data-hover" ) ; let blur = element . hasAttribute ( "data-blur" ) ; let button = window . document . createElement ( "button" ) ; let isTouch = function ( ) { return ( "ontouchstart" in window || navigator . maxTouchPoints ) ; } ; button . innerText = buttonText ; button . className = buttonClass ; button . type = "button" ; if ( buttonIcon ) { let icon = window . document . createElement ( "i" ) ; icon . className = buttonIcon ; button . insertBefore ( icon , button . firstChild ) ; }
if ( buttonAria ) { button . setAttribute ( 'aria-label' , buttonAria ) ; }
2019-09-13 22:47:48 +12:00
if ( def === "close" ) { element . classList . add ( "close" ) ; element . classList . remove ( "open" ) ; } else { element . classList . add ( "open" ) ; element . classList . remove ( "close" ) ; }
button . addEventListener ( "click" , function ( ) { element . classList . toggle ( "open" ) ; element . classList . toggle ( "close" ) ; } ) ; if ( hover && ! isTouch ( ) ) { element . addEventListener ( "mouseover" , function ( ) { element . classList . add ( "open" ) ; element . classList . remove ( "close" ) ; } ) ; element . addEventListener ( "mouseout" , function ( ) { element . classList . add ( "close" ) ; element . classList . remove ( "open" ) ; } ) ; }
2020-05-01 18:49:23 +12:00
let close = function ( ) { element . classList . add ( "close" ) ; element . classList . remove ( "open" ) ; } ; let closeDelay = function ( ) { window . setTimeout ( function ( ) { close ( ) ; } , 400 ) ; } ; let findParent = function ( tagName , el ) { if ( ( el . nodeName || el . tagName ) . toLowerCase ( ) === tagName . toLowerCase ( ) ) { return el ; }
2019-09-13 22:47:48 +12:00
while ( ( el = el . parentNode ) ) { if ( ( el . nodeName || el . tagName ) . toLowerCase ( ) === tagName . toLowerCase ( ) ) { return el ; } }
return null ; } ; if ( blur ) { button . addEventListener ( "blur" , closeDelay ) ; }
if ( buttonSelector ) { let buttonElements = element . querySelectorAll ( buttonSelector ) ; buttonElements . forEach ( node => { node . addEventListener ( "click" , function ( ) { element . classList . toggle ( "open" ) ; element . classList . toggle ( "close" ) ; } ) ; if ( blur ) { node . addEventListener ( "blur" , closeDelay ) ; } } ) ; }
2020-04-04 08:26:52 +13:00
element . addEventListener ( 'click' , function ( event ) { let targetA = findParent ( 'a' , event . target ) ; let targetB = findParent ( 'button' , event . target ) ; if ( ! targetA && ! targetB ) { return false ; }
if ( targetA && ! targetA . href ) { return false ; }
if ( targetB && ! targetB . classList . contains ( 'link' ) ) { return false ; }
2020-07-16 08:32:02 +12:00
closeDelay ( ) ; } ) ; element . insertBefore ( button , element . firstChild ) ; } } ) ; } ) ( window ) ; ( function ( window ) { window . ls . container . get ( "view" ) . add ( { selector : "data-ui-phases" , controller : function ( element , window , document , expression , router ) { var tabs = document . createElement ( "ul" ) ; var container = document . createElement ( "div" ) ; var titles = Array . prototype . slice . call ( element . querySelectorAll ( "li > h1" ) ) ; var next = Array . prototype . slice . call ( element . querySelectorAll ( "[data-next]" ) ) ; var previous = Array . prototype . slice . call ( element . querySelectorAll ( "[data-previous]" ) ) ; var position = 0 ; var init = false ; if ( titles . length === 0 ) { titles = Array . prototype . slice . call ( element . querySelectorAll ( "li > h2" ) ) ; }
if ( titles . length === 0 ) { titles = Array . prototype . slice . call ( element . querySelectorAll ( "li > h3" ) ) ; }
if ( titles . length === 0 ) { titles = Array . prototype . slice . call ( element . querySelectorAll ( "li > h4" ) ) ; }
if ( titles . length === 0 ) { titles = Array . prototype . slice . call ( element . querySelectorAll ( "li > h5" ) ) ; }
if ( titles . length === 0 ) { titles = Array . prototype . slice . call ( element . querySelectorAll ( "li > h6" ) ) ; }
2020-07-15 18:13:18 +12:00
for ( var i = 0 ; i < element . children . length ; i ++ ) { var tabState = expression . parse ( element . children [ i ] . dataset [ "state" ] || "" ) ; if ( tabState && tabState === ( window . location . pathname + window . location . search ) . substring ( 0 , tabState . length ) ) { position = i ; } }
2019-09-13 22:47:48 +12:00
var setTab = function ( index ) { var tabState = expression . parse ( element . children [ index ] . dataset [ "state" ] || "" ) ; var url = "" ; if ( tabState !== "" && tabState !== window . location . pathname + window . location . search ) { var parser = document . createElement ( "a" ) ; parser . href = tabState ; url = ! init ? parser . pathname + window . location . search : tabState ; if ( position != index ) { window . history . pushState ( { } , "" , url ) ; router . reset ( ) ; } }
2020-04-28 06:38:06 +12:00
element . children [ position ] . classList . remove ( "selected" ) ; element . children [ index ] . classList . add ( "selected" ) ; tabs . children [ position ] . classList . remove ( "selected" ) ; tabs . children [ index ] . classList . add ( "selected" ) ; position = index ; document . dispatchEvent ( new CustomEvent ( "tab-changed" ) ) ; init = true ; } ; tabs . classList . add ( "tabs" ) ; container . classList . add ( "container" ) ; container . classList . add ( "close" ) ; container . dataset [ "lsUiOpen" ] = "" ; container . dataset [ "buttonClass" ] = "icon icon-down-dir" ; titles . map ( function ( obj , i ) { var title = document . createElement ( "li" ) ; title . innerHTML = obj . innerHTML ; title . className = obj . className ; title . tabIndex = 0 ; tabs . appendChild ( title ) ; title . addEventListener ( "click" , function ( ) { setTab ( i ) ; } ) ; title . addEventListener ( "keyup" , function ( ) { if ( event . which === 13 ) { setTab ( i ) ; } } ) ; } ) ; next . map ( function ( obj ) { obj . addEventListener ( "click" , function ( ) { setTab ( position + 1 ) ; } ) ; } ) ; previous . map ( function ( obj ) { obj . addEventListener ( "click" , function ( ) { setTab ( position - 1 ) ; } ) ; } ) ; setTab ( position ) ; container . appendChild ( tabs ) ; element . parentNode . insertBefore ( container , element ) ; } } ) ; } ) ( window ) ; ( function ( window ) { window . ls . container . get ( "view" ) . add ( { selector : "data-ls-ui-trigger" , controller : function ( element , document , expression ) { let trigger = expression . parse ( element . dataset [ "lsUiTrigger" ] || '' ) . trim ( ) . split ( ',' ) ; let event = expression . parse ( element . dataset [ "event" ] || 'click' ) ; let debug = element . getAttribute ( 'data-debug' ) || false ; for ( let index = 0 ; index < trigger . length ; index ++ ) { let name = trigger [ index ] ; element . addEventListener ( event , function ( ) { if ( debug ) { console . log ( 'Debug: event triggered: ' + name ) ; }
document . dispatchEvent ( new CustomEvent ( name ) ) ; } ) ; } } } ) ; } ) ( window ) ;