diff --git a/README.md b/README.md index 2073429..ee4623d 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ On linux systems you may need to set the environment variable before run \ ***export GODEBUG=madvdontneed=1*** #### macOS install / configure / uninstall script -Just run in Terminal: `curl -s https://raw.githubusercontent.com/YouROK/TorrServer/master/installTorrServerMac.sh | sudo bash` +Just run in Terminal: `curl -s https://raw.githubusercontent.com/YouROK/TorrServer/master/installTorrServerMac.sh -o installTorrserverMac.sh && chmod 755 installTorrServerMac.sh && sudo ./installTorrServerMac.sh` #### Linux on VPS install / configure / uninstall script Just run in console: `curl -s https://raw.githubusercontent.com/YouROK/TorrServer/master/installTorrServerLinux.sh | sudo bash` diff --git a/build-all.sh b/build-all.sh index fbc4d7e..020dbc2 100755 --- a/build-all.sh +++ b/build-all.sh @@ -90,7 +90,8 @@ declare -a COMPILERS=( "amd64:x86_64-linux-android21-clang" ) -export NDK_TOOLCHAIN=/Users/yourok/Library/Android/sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64 +export NDK_VERSION="23.1.7779620" # 25.1.8937393 +export NDK_TOOLCHAIN=${ANDROID_HOME}/ndk/${NDK_VERSION}/toolchains/llvm/prebuilt/darwin-x86_64 GOOS=android diff --git a/installTorrServerLinux.sh b/installTorrServerLinux.sh index c4451f8..670e22d 100644 --- a/installTorrServerLinux.sh +++ b/installTorrServerLinux.sh @@ -9,7 +9,7 @@ scriptname=$(basename "$(test -L "$0" && readlink "$0" || echo "$0")") ################################# function isRoot() { - if [ "$EUID" -ne 0 ]; then + if [ $EUID -ne 0 ]; then return 1 fi } @@ -297,16 +297,17 @@ EOF isAuth=0 fi } - if [[ "$isAuth" == 1 ]]; then + if [ $isAuth -eq 1 ]; then [[ ! -f "$dirInstall/accs.db" ]] && { [[ $lang == "en" ]] && read -p ' User: ' answer_user $dirInstall/accs.db } || { - [[ $lang == "en" ]] && echo " Use existing auth from ${dirInstall}/accs.db" || echo " Используйте реквизиты из ${dirInstall}/accs.db для входа" + auth=$(cat "$dirInstall/accs.db"|head -2|tail -1|tr -d '[:space:]'|tr -d '"') + [[ $lang == "en" ]] && echo " - Use existing auth from ${dirInstall}/accs.db - $auth" || echo " - Используйте реквизиты из ${dirInstall}/accs.db для авторизации - $auth" } cat << EOF > $dirInstall/$serviceName.config DAEMON_OPTIONS="--port $servicePort --path $dirInstall --httpauth" @@ -324,7 +325,7 @@ EOF isRdb=0 fi } - if [[ "$isRdb" == 1 ]]; then + if [ $isRdb -eq 1 ]; then [[ $lang == "en" ]] && { echo " Set database to read-only mode…" echo " To change remove --rdb option from $dirInstall/$serviceName.config" @@ -366,8 +367,8 @@ EOF echo " Теперь вы можете открыть браузер по адресу http://${serverIP}:${servicePort} для доступа к вебу TorrServer" echo "" } - if [[ "$isAuth" == 1 && $isAuthUser > 0 ]]; then - [[ $lang == "en" ]] && echo " Use user \"$isAuthUser\" with password \"$isAuthPass\" for authentication" || echo " Для авторизации введите пользователя $isAuthUser с паролем $isAuthPass" + if [[ $isAuth -eq 1 && $isAuthUser > 0 ]]; then + [[ $lang == "en" ]] && echo " Use user \"$isAuthUser\" with password \"$isAuthPass\" for authentication" || echo " Для авторизации используйте пользователя «$isAuthUser» с паролем «$isAuthPass»" echo "" fi } diff --git a/installTorrServerMac.sh b/installTorrServerMac.sh index 1e1b147..b211af6 100755 --- a/installTorrServerMac.sh +++ b/installTorrServerMac.sh @@ -12,6 +12,7 @@ function checkArch() { i386) architecture="386" ;; i686) architecture="386" ;; x86_64) architecture="amd64" ;; + arm64) architecture="arm64" ;; aarch64) architecture="arm64" ;; *) [[ $lang == "en" ]] && { echo ""; echo " Unsupported Arch. Can't continue."; exit 1; } || { echo ""; echo " Не поддерживаемая архитектура. Продолжение невозможно."; exit 1; } ;; esac diff --git a/server/rutor/mem_test.go b/server/rutor/mem_test.go new file mode 100644 index 0000000..273314f --- /dev/null +++ b/server/rutor/mem_test.go @@ -0,0 +1,76 @@ +package rutor + +import ( + "compress/flate" + "encoding/json" + "fmt" + "os" + "path/filepath" + "server/rutor/models" + "testing" +) + +func TestParseChannel(t *testing.T) { + var channel = make(chan *models.TorrentDetails, 0) + var ftors []*models.TorrentDetails + go func() { + for torr := range channel { + ftors = append(ftors, torr) + } + }() + + path, _ := os.Getwd() + ff, err := os.Open(filepath.Join(path, "rutor.ls")) + if err == nil { + defer ff.Close() + r := flate.NewReader(ff) + defer r.Close() + dec := json.NewDecoder(r) + + _, err := dec.Token() + if err != nil { + t.Error(err) + } + + for dec.More() { + var torr *models.TorrentDetails + err = dec.Decode(&torr) + if err != nil { + t.Error(err) + } + channel <- torr + } + close(channel) + } else { + t.Error(err) + } +} + +func TestParseArr(t *testing.T) { + var ftors []*models.TorrentDetails + path, _ := os.Getwd() + ff, err := os.Open(filepath.Join(path, "rutor.ls")) + if err == nil { + defer ff.Close() + r := flate.NewReader(ff) + defer r.Close() + dec := json.NewDecoder(r) + + _, err := dec.Token() + if err != nil { + t.Error(err) + } + + for dec.More() { + var torr *models.TorrentDetails + err = dec.Decode(&torr) + if err != nil { + t.Error(err) + } + ftors = append(ftors, torr) + fmt.Println(len(ftors)) + } + } else { + t.Error(err) + } +} diff --git a/server/rutor/rutor.go b/server/rutor/rutor.go index 70ff693..908d5ff 100644 --- a/server/rutor/rutor.go +++ b/server/rutor/rutor.go @@ -1,7 +1,6 @@ package rutor import ( - "bytes" "compress/flate" "encoding/json" "github.com/agnivade/levenshtein" @@ -100,24 +99,50 @@ func updateDB() { func loadDB() { log.TLogln("Load rutor db") - buf, err := os.ReadFile(filepath.Join(settings.Path, "rutor.ls")) + ff, err := os.Open(filepath.Join(settings.Path, "rutor.ls")) if err == nil { - r := flate.NewReader(bytes.NewReader(buf)) - buf, err = io.ReadAll(r) - r.Close() - if err == nil { - var ftors []*models.TorrentDetails - err = json.Unmarshal(buf, &ftors) + defer ff.Close() + r := flate.NewReader(ff) + defer r.Close() + var ftorrs []*models.TorrentDetails + dec := json.NewDecoder(r) + + _, err := dec.Token() + if err != nil { + log.TLogln("Error read token rutor db:", err) + return + } + + var channel = make(chan *models.TorrentDetails, 0) + go func() { + for torr := range channel { + ftorrs = append(ftorrs, torr) + } + torrs = ftorrs + }() + + for dec.More() { + var torr *models.TorrentDetails + err = dec.Decode(&torr) if err == nil { - torrs = ftors - log.TLogln("Index rutor db") - torrsearch.NewIndex(torrs) + channel <- torr } else { log.TLogln("Error read rutor db:", err) } - } else { - log.TLogln("Error read rutor db:", err) } + close(channel) + + log.TLogln("Index rutor db") + torrsearch.NewIndex(torrs) + + //err = dec.Decode(&ftorrs) + //if err == nil { + // torrs = ftorrs + // log.TLogln("Index rutor db") + // torrsearch.NewIndex(torrs) + //} else { + // log.TLogln("Error read rutor db:", err) + //} } else { log.TLogln("Error load rutor db:", err) } diff --git a/server/web/msx/assets/html5x.html.gz b/server/web/msx/assets/html5x.html.gz new file mode 100644 index 0000000..862e466 Binary files /dev/null and b/server/web/msx/assets/html5x.html.gz differ diff --git a/server/web/msx/assets/russian.json.gz b/server/web/msx/assets/russian.json.gz new file mode 100644 index 0000000..9445289 Binary files /dev/null and b/server/web/msx/assets/russian.json.gz differ diff --git a/server/web/msx/assets/tizen.html.gz b/server/web/msx/assets/tizen.html.gz new file mode 100644 index 0000000..d04564e Binary files /dev/null and b/server/web/msx/assets/tizen.html.gz differ diff --git a/server/web/msx/assets/torrents.html b/server/web/msx/assets/torrents.html new file mode 100644 index 0000000..226f445 --- /dev/null +++ b/server/web/msx/assets/torrents.html @@ -0,0 +1,234 @@ + + + + + TorrServer Interaction Plugin + + + + + + + + \ No newline at end of file diff --git a/server/web/msx/assets/torrents.min.html.gz b/server/web/msx/assets/torrents.min.html.gz new file mode 100644 index 0000000..04d0247 Binary files /dev/null and b/server/web/msx/assets/torrents.min.html.gz differ diff --git a/server/web/msx/assets/tvx.js.gz b/server/web/msx/assets/tvx.js.gz new file mode 100644 index 0000000..5b9ca7e Binary files /dev/null and b/server/web/msx/assets/tvx.js.gz differ diff --git a/server/web/msx/html.go b/server/web/msx/html.go deleted file mode 100644 index 8d241a7..0000000 --- a/server/web/msx/html.go +++ /dev/null @@ -1,12 +0,0 @@ -package msx - -import _ "embed" - -//go:embed pages/html5x.html -var Msxhtml5xhtml []byte - -//go:embed pages/tizen.html -var Msxtizenhtml []byte - -//go:embed pages/tvx-plugin.min.js -var Msxtvxpluginminjs []byte diff --git a/server/web/msx/msx.go b/server/web/msx/msx.go index 0dfdab8..4d411b0 100644 --- a/server/web/msx/msx.go +++ b/server/web/msx/msx.go @@ -1,262 +1,44 @@ package msx import ( - "fmt" - "net/url" - "path/filepath" - "strings" - - sets "server/settings" - "server/torr" - "server/torr/state" - "server/utils" + _ "embed" + "server/version" "github.com/gin-gonic/gin" ) -type msxMenu struct { - Logo string `json:"logo,omitempty"` - Reuse bool `json:"reuse"` - Cache bool `json:"cache"` - Restore bool `json:"restore"` - Reference string `json:"reference,omitempty"` - Menu []msxMenuItem `json:"menu"` +var ( + //go:embed assets/tvx.js.gz + tvx []byte + //go:embed assets/tizen.html.gz + tzn []byte + //go:embed assets/torrents.min.html.gz + trn []byte + //go:embed assets/html5x.html.gz + h5x []byte + //go:embed assets/russian.json.gz + rus []byte +) + +func ass(b []byte, t string) func(*gin.Context) { + return func(c *gin.Context) { + c.Header("Content-Encoding", "gzip") + c.Data(200, t+"; charset=UTF-8", b) + } } -type msxMenuItem struct { - Icon string `json:"icon,omitempty"` - Label string `json:"label,omitempty"` - Data msxData `json:"data,omitempty"` -} - -type msxTemplate struct { - Type string `json:"type,omitempty"` - Layout string `json:"layout,omitempty"` - Color string `json:"color,omitempty"` - Icon string `json:"icon,omitempty"` - IconSize string `json:"iconSize,omitempty"` - BadgeColor string `json:"badgeColor,omitempty"` - TagColor string `json:"tagColor,omitempty"` - Properties gin.H `json:"properties,omitempty"` -} - -type msxData struct { - Type string `json:"type,omitempty"` - Headline string `json:"headline,omitempty"` - Action string `json:"action,omitempty"` - Template msxTemplate `json:"template,omitempty"` - Items []msxItem `json:"items,omitempty"` - Pages []msxPage `json:"pages,omitempty"` -} - -type msxItem struct { - Title string `json:"title,omitempty"` - Label string `json:"label,omitempty"` - PlayerLabel string `json:"playerLabel,omitempty"` - Action string `json:"action,omitempty"` - Image string `json:"image,omitempty"` - Icon string `json:"icon,omitempty"` - Badge string `json:"badge,omitempty"` - Tag string `json:"tag,omitempty"` - Data gin.H `json:"data,omitempty"` -} - -type msxPage struct { - Items []gin.H `json:"items,omitempty"` -} - -const ICON_OPTIONS = "tune" - -func msxStart(c *gin.Context) { - c.JSON(200, gin.H{ - "name": "TorrServer", - "version": version.Version, - "parameter": "menu:{PREFIX}{SERVER}/msx/torrents", +func SetupRoute(r *gin.RouterGroup) { + r.GET("/msx/start.json", func(c *gin.Context) { + c.JSON(200, gin.H{ + "name": "TorrServer", + "version": version.Version, + "parameter": "content:request:interaction:init@{PREFIX}{SERVER}/msx/torrents", + }) }) -} - -// /msx/torrents -func msxTorrents(c *gin.Context) { - torrs := torr.ListTorrent() - - host := utils.GetScheme(c) + "://" + c.Request.Host - logo := host + "/apple-touch-icon.png" - list := make([]msxItem, len(torrs)) - - for i, tor := range torrs { - item := msxItem{ - Title: tor.Title, - Image: tor.Poster, - Action: "content:" + host + "/msx/playlist/" + url.PathEscape(tor.Title) + - "?hash=" + tor.TorrentSpec.InfoHash.HexString() + "&platform={PLATFORM}", - } - list[i] = item - } - - c.JSON(200, msxMenu{ - Logo: logo, - Cache: false, - Reuse: false, - Restore: false, - Reference: host + "/msx/torrents", - Menu: []msxMenuItem{ - // Main page - { - Icon: "list", - Label: "Torrents", - Data: msxData{ - Type: "pages", - Template: msxTemplate{ - Type: "separate", - Layout: "0,0,2,4", - Icon: "msx-white-soft:movie", - Color: "msx-glass", - }, - Items: list, - }, - // About - }, { - Icon: "info", - Label: "About", - Data: msxData{ - Pages: []msxPage{ - { - Items: []gin.H{ - { - "type": "default", - "headline": "TorrServer " + version.Version, - "text": "https://github.com/YouROK/TorrServer", - "image": logo, - "imageFiller": "height-left", - "imageWidth": 2, - "layout": "0,0,8,2", - "color": "msx-gray-soft", - }, - }, - }, - }, - }, - }, - }, - }) -} - -// /msx/playlist?hash=... -func msxPlaylist(c *gin.Context) { - hash, _ := c.GetQuery("hash") - if hash == "" { - c.JSON(200, msxData{ - Action: "error:Item not found", - }) - return - } - platform, _ := c.GetQuery("platform") - - tor := torr.GetTorrent(hash) - if tor == nil { - c.JSON(200, msxData{ - Action: "error:Item not found", - }) - return - } - - if tor.Stat == state.TorrentInDB { - tor = torr.LoadTorrent(tor) - if tor == nil { - c.JSON(200, msxData{ - Action: "error:Error while getting torrent info", - }) - return - } - } - - host := utils.GetScheme(c) + "://" + c.Request.Host - status := tor.Status() - viewed := sets.ListViewed(hash) - var list []msxItem - contentAction := "" - - for _, f := range status.FileStats { - mime := utils.GetMimeType(f.Path) - action := mime[0 : len(mime)-2] - - if action == "*" { - continue - } - name := filepath.Base(f.Path) - uri := host + "/stream/" + url.PathEscape(name) + "?link=" + hash + "&index=" + fmt.Sprint(f.Id) + "&play" - item := msxItem{ - Label: name, - PlayerLabel: strings.TrimSuffix(name, filepath.Ext(name)), - Action: action + ":" + uri, - } - - if platform == "android" || platform == "firetv" { - item.Action = "system:tvx:launch" - item.Data = gin.H{ - "id": hash + "-" + fmt.Sprint(f.Id), - "uri": uri, - "type": mime, - } - } else if platform == "tizen" { - contentAction = "content:request:interaction:init@" + host + "/msx/tizen.html" - } else if platform == "netcast" { - contentAction = "system:netcast:menu" - } else if platform == "ios" || platform == "mac" { - // TODO - for iOS and Mac the application must be defined in scheme but we don't know what user has installed - item.Action = "system:tvx:launch:vlc://" + uri - } else { - item.Action = "video:plugin:" + host + "/msx/html5x.html?url= " + url.QueryEscape(uri) - contentAction = "panel:request:player:options" - } - - if isViewed(viewed, f.Id) { - item.Tag = " " - } - if action == "audio" { - item.Icon = "msx-white-soft:music-note" - } - list = append(list, item) - } - - if len(list) == 0 { - c.JSON(200, msxData{ - Action: "error:No supported content found", - }) - return - } - - res := msxData{ - Headline: tor.Title, - Type: "list", - Template: msxTemplate{ - Type: "control", - Layout: "0,2,12,1", - Color: "msx-glass", - Icon: "msx-white-soft:movie", - IconSize: "medium", - BadgeColor: "msx-yellow", - TagColor: "msx-yellow", - }, - Items: list, - } - - if contentAction != "" { - res.Template.Properties = gin.H{ - "button:content:icon": ICON_OPTIONS, - "button:content:action": contentAction, - } - } - - c.JSON(200, res) -} - -func isViewed(viewed []*sets.Viewed, id int) bool { - for _, v := range viewed { - if v.FileIndex == id { - return true - } - } - return false + r.GET("/msx/russian.json", ass(rus, "application/json")) + r.GET("/msx/tvx.js", ass(tvx, "text/javascript")) + r.GET("/msx/torrents", ass(trn, "text/html")) + r.GET("/msx/tizen", ass(tzn, "text/html")) + r.GET("/msx/html5x", ass(h5x, "text/html")) } diff --git a/server/web/msx/pages/html5x.html b/server/web/msx/pages/html5x.html deleted file mode 100644 index 4478be4..0000000 --- a/server/web/msx/pages/html5x.html +++ /dev/null @@ -1,763 +0,0 @@ - - - - HTML5 Extended Video Plugin - - - - - - - - - - - - \ No newline at end of file diff --git a/server/web/msx/pages/tizen.html b/server/web/msx/pages/tizen.html deleted file mode 100644 index c686a19..0000000 --- a/server/web/msx/pages/tizen.html +++ /dev/null @@ -1,380 +0,0 @@ - - - - Tizen Interaction Plugin - - - - - - - - - - \ No newline at end of file diff --git a/server/web/msx/pages/tvx-plugin.min.js b/server/web/msx/pages/tvx-plugin.min.js deleted file mode 100644 index a500a03..0000000 --- a/server/web/msx/pages/tvx-plugin.min.js +++ /dev/null @@ -1,88 +0,0 @@ -/* - * TVX Plugin v0.0.54 - * (c) 2021 Benjamin Zachey - */ -(function(e,m){var k={NAME:"TVX Framework",SHORTCUT:"TVX",VERSION:"0.1.26",SUFFIX:null,DUMMY_DATE:null,TIME_OFFSET:0,TIME_ZONE_OFFSET:0,ANIMATION_DURATION:300,ANIMATION_EASE:"easeOutQuad",AFK_DELAY:8000,SCREEN_WIDTH:1280,SCREEN_HEIGHT:720,SCREEN_FACTOR:1,ZOOM_FACTOR:1,PLATFORM:null,ANIMATE:0,TRANSFORM:0,INPUT:0,REMOTE:0,LAYOUT:null,SCALE:null,ZOOM:null,CENTER:0,BACKGROUND:0,LEAVE:0,EXIT:0,BACK:0,VOLUME:0,BUSY:0,SPEED:0,PLAYBACK:0,FULLSCREEN:0,SUSPEND:0,SECURE:0,APP:null};var l={COMMON:{IMAGE:{DEFAULT:"img/default.png"},ICON:{DEFAULT:"blank"},TEXT:{DEFAULT:""},COLOR:{WHITE:"rgb(255,255,255)",WHITE_SOFT:"rgba(255,255,255,0.5)",BLACK:"rgb(0,0,0)",BLACK_SOFT:"rgba(0,0,0,0.5)",GRAY:"rgb(51,51,51)",GRAY_SOFT:"rgba(51,51,51,0.5)",RED:"rgb(201,48,44)",GREEN:"rgb(68,157,68)",YELLOW:"rgb(236,151,31)",BLUE:"rgb(49,176,213)",GLASS:"rgba(255,255,255,0.1)"},CSS:{CLASS_SELECTED:"selected",CLASS_TRIGGER:"trigger",CLASS_FOCUSED:"focused",CLASS_DISABLED:"disabled",CLASS_INVALIDATED:"invalidated",CLASS_HOVER:"hover",CLASS_ROOT:"tvx-root",CLASS_TOP_LAYER:"tvx-top-layer",CLASS_BOTTOM_LAYER:"tvx-bottom-layer",CLASS_FULLSCREEN:"tvx-fullscreen",CLASS_VIDEO:"tvx-video",CLASS_VIDEO_ON:"tvx-video-on",CLASS_CENTER_OFF:"tvx-center-off",CLASS_BACKGROUND_OFF:"tvx-background-off",CLASS_CLICK_THROUGH:"tvx-click-through",CLASS_CURSOR_OFF:"tvx-cursor-off",CLASS_FILLER:"tvx-filler",CLASS_FILLER_WIDTH_TOP:"tvx-filler-width-top",CLASS_FILLER_WIDTH_BOTTOM:"tvx-filler-width-bottom",CLASS_FILLER_WIDTH_CENTER:"tvx-filler-width-center",CLASS_FILLER_HEIGHT_LEFT:"tvx-filler-height-left",CLASS_FILLER_HEIGHT_RIGHT:"tvx-filler-height-right",CLASS_FILLER_HEIGHT_CENTER:"tvx-filler-height-center",CLASS_FILLER_FIT:"tvx-filler-fit",CLASS_FILLER_COVER:"tvx-filler-cover",CLASS_FILLER_SMART:"tvx-filler-smart",CLASS_ICON:"tvx-icon tvx-icon-{ICON}",CLASS_ICON_INLINE:"tvx-icon-inline tvx-icon-{ICON}",CLASS_TEXT:"tvx-text",CLASS_TEXT_INLINE:"tvx-text-inline"},HTML:{BREAK:"
",SPACE:" ",TAB:"   ",CANVAS:"",IFRAME:"",ICON:"",ICON_STYLED:"",TEXT:"{TEXT}",TEXT_STYLED:"{TEXT}",TEXT_START:"",TEXT_START_STYLED:"",TEXT_END:""}},LOGGER:{CSS:{CLASS_DEBUG:"tvx-debug",CLASS_INFO:"tvx-info",CLASS_WARN:"tvx-warn",CLASS_ERROR:"tvx-error"},HTML:{LINE:"{MESSAGE}"}},RENDERER:{CSS:{CLASS_TRANSFORM:"tvx-transform",CLASS_TRANSFORM_ZERO:"tvx-transform-zero",CLASS_TRANSFORM_3D:"tvx-transform-3d",CLASS_TRANSFORM_3D_ZERO:"tvx-transform-3d-zero"},STATE:{SHOW:{visible:true},HIDE:{visible:false},FADE_IN_FROM:{opacity:0},FADE_IN_TO:{opacity:1,visible:true},FADE_OUT_FROM:{opacity:1},FADE_OUT_TO:{opacity:0,visible:false}}},REMOTE:{CSS:{CLASS_BUTTON:"tvx-button",CLASS_SUBCONTROL_LEFT:"tvx-subcontrol-left",CLASS_SUBCONTROL_RIGHT:"tvx-subcontrol-right"}},APP:null}; -var a=new function(){var Q=/\\/g;var ad=/"/g;var S=/'/g;var ax=/\n/g;var av=/\r/g;var O=/\r\n/g;var at=/\t/g;var X=/\s/g;var aa=/-/g;var ab=/^[A-Za-z0-9._-]+$/;var al=/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/;var ar=/"(\\.|[^"\\])*"/g;var au=/^\s+|\s+$/g;var ae=/\s{0,}>\s{0,}/g;var ag=/\s{0,}\/>/g;var af=/\s{0,}<\s{0,}/g;var ai=ax;var ah=av;var ak=/\s{2,}/g;var K=/&/g;var W=ad;var P=S;var ac=//g;var ao=/"/g;var an=/'/g;var am=/</g;var aq=/>/g;var ap=/&/g;var L=/\+/g;var N=/\//g;var M=/=/g;var R=/[^A-Za-z0-9\+\/\=]/g;var T=aa;var aj=/_/g;var ay=/,/g;var Y=/\./g;var V="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var Z=e.location.protocol==="https:";var aw=function(az,aB){if(az&&aB){var aA=e.location.pathname;aA=aA.substring(0,aA.lastIndexOf("/"));return e.location.protocol+"//"+e.location.host+aA}else{if(az){return e.location.protocol+"//"+e.location.host}}return e.location.protocol+"//"};this.createVersion=function(aB){if(this.isFullStr(aB)){var aD=aB.split("."); -if(aD.length==3){var aA=this.strToNum(aD[0],-1);var az=this.strToNum(aD[1],-1);var aC=this.strToNum(aD[2],-1);if(aA>=0&&az>=0&&aC>=0){return{major:aA,minor:az,patch:aC}}}}return null};this.checkVersion=function(aC,aB){var aA=this.createVersion(aB);if(aA!=null){var az=this.createVersion(aC);if(az!=null){if(az.major==aA.major){if(az.minor==aA.minor){return az.patch>=aA.patch}return az.minor>aA.minor}return az.major>aA.major}return false}return true};this.createKey=function(aD,aB){if(aD==null){aD=4}if(aB==null){aB=10}var aA="";for(var aC=0;aC=0&&az<=9){aA+=""+az}if(az>=10&&az<=35){aA+=String.fromCharCode(az+55)}if(az>=36&&az<=61){aA+=String.fromCharCode(az+61)}}return aA};this.isFullStr=function(az){return az!=null&&typeof az=="string"&&az.length>0 -};this.isBool=function(az){if(az!=null&&typeof az=="boolean"){return true}return this.isFullStr(az)};this.isNum=function(az){if(az!=null&&typeof az=="number"){return true}return this.isFullStr(az)&&isFinite(az)};this.isArray=function(az){if(az!=null){return Array.isArray(az)}return false};this.isEmpty=function(aA){if(aA!=null){if(typeof aA=="string"){return aA.length==0}var az;for(az in aA){return false}}return true};this.isValid=function(aA,az){if(aA!=null){if(az===true){if(typeof aA=="string"){return aA.length>0}}return true}return false};this.isId=function(az){return this.isFullStr(az)&&ab.test(az)};this.isJson=function(az){return this.isFullStr(az)&&!al.test(az.replace(ar,""))};this.isHttpUrl=function(az){return this.isFullStr(az)&&(az.indexOf("http://")==0||az.indexOf("https://")==0)};this.strValue=function(az){if(az!=null){if(typeof az=="string"){return az}else{return""+az}}return null};this.strFullCheck=function(aA,az){return this.isFullStr(aA)?aA:az};this.strTrim=function(az){return this.isFullStr(az)?az.replace(au,""):"" -};this.strClear=function(az){return this.isFullStr(az)?az.replace(X,""):""};this.strTruncate=function(az,aA){return this.isFullStr(az)&&aA>0&&az.length>aA?az.substr(0,aA)+"...":az};this.strShuffle=function(az){return this.isFullStr(az)?az.split("").sort(function(){return 0.5-Math.random()}).join(""):""};this.strReplace=function(aA,aB,az){if(this.isFullStr(aA)&&this.isFullStr(aB)){return aA.replace(aB,function(){return az!=null?az:""})}return aA};this.strReplaceMap=function(aA,aB){if(this.isFullStr(aA)&&aB!=null){for(var az in aB){aA=this.strReplace(aA,az,aB[az])}}return aA};this.strToBool=function(aA,az){if(aA!=null&&typeof aA=="boolean"){return aA}return this.isFullStr(aA)?aA=="true":az};this.strToNum=function(aA,az){if(aA!=null&&typeof aA=="number"){return aA}return this.isFullStr(aA)&&isFinite(aA)?aA*1:az};this.strToAction=function(az){return this.isFullStr(az)?az.toUpperCase().replace(aa,"_"):""};this.strToJsonStr=function(az){return this.isFullStr(az)?az.replace(ad,'\\"'):""};this.strToUrlStr=function(az){return this.isFullStr(az)?encodeURIComponent(az):"" -};this.strContainsToken=function(aB,aC,az,aD){if(this.isFullStr(aB)&&this.isFullStr(aC)){var aA=aB.indexOf(aC);if(az==null){az=0}if(aD==null){aD=aB.length}return aA>=az&&aA=0){aB=aA}while(aB>=0&&aB=0){aB+=aD.length;if(aE==null||aB").replace(ag,"/>").replace(af,"<").replace(ai," ").replace(ah," ").replace(ak," ")):""};this.htmlEscape=function(az){return this.isFullStr(az)?az.replace(K,"&").replace(W,""").replace(P,"'").replace(ac,"<").replace(U,">"):""};this.htmlUnescape=function(az){return this.isFullStr(az)?az.replace(ao,'"').replace(an,"'").replace(am,"<").replace(aq,">").replace(ap,"&"):""};this.htmlAttrEscape=function(az){return this.isFullStr(az)?az.replace(W,""").replace(P,"'"):"" -};this.htmlAttrUnescape=function(az){return this.isFullStr(az)?az.replace(ao,'"').replace(an,"'"):""};this.htmlTextEscape=function(az){return this.isFullStr(az)?this.htmlEscape(az).replace(ax,l.COMMON.HTML.BREAK).replace(at,l.COMMON.HTML.TAB):""};this.base64Encode=function(aH){var aC="";if(this.isFullStr(aH)){var aI,aD,aF;var aB,aG,aA,aE;var az=0;aH=this.utf8Encode(aH);while(az>2;aG=((aI&3)<<4)|(aD>>4);aA=((aD&15)<<2)|(aF>>6);aE=aF&63;if(isNaN(aD)){aA=aE=64}else{if(isNaN(aF)){aE=64}}aC+=V.charAt(aB)+V.charAt(aG)+V.charAt(aA)+V.charAt(aE)}}return aC};this.base64EncodeUrl=function(az){return this.isFullStr(az)?this.base64Encode(az).replace(L,"-").replace(N,"_").replace(M,","):""};this.base64EncodeId=function(az){return this.isFullStr(az)?this.base64Encode(az).replace(L,"-").replace(N,"_").replace(M,"."):""};this.base64Decode=function(aH){var aC="";if(this.isFullStr(aH)){var aI,aD,aF;var aB,aG,aA,aE;var az=0; -aH=aH.replace(R,"");while(az>4);aD=((aG&15)<<4)|(aA>>2);aF=((aA&3)<<6)|aE;aC+=String.fromCharCode(aI);if(aA!=64){aC+=String.fromCharCode(aD)}if(aE!=64){aC+=String.fromCharCode(aF)}}}return this.utf8Decode(aC)};this.base64DecodeUrl=function(az){return this.isFullStr(az)?this.base64Decode(az.replace(T,"+").replace(aj,"/").replace(ay,"=")):""};this.base64DecodeId=function(az){return this.isFullStr(az)?this.base64Decode(az.replace(T,"+").replace(aj,"/").replace(Y,"=")):""};this.utf8Encode=function(aC){var aA="";if(this.isFullStr(aC)){aC=aC.replace(O,"\n");for(var az=0;az127)&&(aB<2048)){aA+=String.fromCharCode((aB>>6)|192);aA+=String.fromCharCode((aB&63)|128)}else{aA+=String.fromCharCode((aB>>12)|224);aA+=String.fromCharCode(((aB>>6)&63)|128);aA+=String.fromCharCode((aB&63)|128) -}}}}return aA};this.utf8Decode=function(aD){var aA="";if(this.isFullStr(aD)){var aE=0;var aB,aC,aF,az;aB=aC=aF=az=0;while(aE191)&&(aB<224)){aF=aD.charCodeAt(aE+1);aA+=String.fromCharCode(((aB&31)<<6)|(aF&63));aE+=2}else{aF=aD.charCodeAt(aE+1);az=aD.charCodeAt(aE+2);aA+=String.fromCharCode(((aB&15)<<12)|((aF&63)<<6)|(az&63));aE+=3}}}}return aA};this.createHash=function(aB,aA){var az=0;if(this.isFullStr(aB)){if(aA===true){for(var aC=aB.length;aC>=0;aC--){az=((az<<5)-az)+aB.charCodeAt(aC);az&=az}}else{for(var aC=0;aC0){aE+=","}aE+=aA;aC++}}aE+="]"}else{if(aB=="object"){aE="{"; -var aC=0;for(var aF in az){var aA=this.serialize(az[aF],aF);if(aA!=null){if(aC>0){aE+=","}aE+=aA;aC++}}aE+="}"}else{if(aB=="string"){aE='"'+az.replace(Q,"\\\\").replace(ad,'\\"').replace(ax,"\\n")+'"'}else{if(aB=="number"||aB=="boolean"){aE=""+az}}}}if(aE!=null){if(aD!=null){return'"'+aD+'":'+aE}else{return aE}}return null};this.deserialize=function(az){try{if(e.JSON!=null&&typeof JSON.parse=="function"){return this.isFullStr(az)?JSON.parse(az):null}else{return this.isJson(az)?new Function("return "+az)():null}}catch(aA){return null}};this.isSecureContext=function(){return Z};this.secureUrl=function(az){return this.isFullStr(az)?az.replace("http://","https://"):az};this.getPrefixUrl=function(az){return aw(false,false)+this.strFullCheck(az,"")};this.getHostUrl=function(az){return aw(true,false)+"/"+this.strFullCheck(az,"")};this.getPathUrl=function(az){return aw(true,true)+"/"+this.strFullCheck(az,"")};this.getAbsoluteUrl=function(az){if(this.isFullStr(az)&&!this.isHttpUrl(az)){if(az.indexOf("/")==0){return aw(true,false)+az -}else{return aw(true,true)+"/"+az}}return az};this.getRootPath=function(az,aD){if(this.isFullStr(az)){var aC=e.location.pathname;var aB=aC.indexOf(az);if(aB>0){var aA=aC.substr(0,aB);if(aD===true){if(aA.indexOf("/")==0){aA=aA.substr(1)}if(aA.lastIndexOf("/")==aA.length-1){aA=aA.substr(0,aA.length-1)}}else{if(aA.indexOf("/")!=0){aA="/"+aA}if(aA.lastIndexOf("/")!=aA.length-1){aA+="/"}}return aA}}return aD===true?"":"/"};this.exprEscape=function(aG,aF,aL,aM,aH,aK,aC){if(this.isFullStr(aG)&&typeof aM=="function"){if(this.isFullStr(aF)&&this.isFullStr(aL)&&typeof aH=="function"){if(aG.indexOf(aF)>=0&&aG.indexOf(aL)>=0){var az="";var aA=aF.length;var aE=aL.length;var aI=aG.length;var aJ=0;var aD=0;var aB=0;while(aD>=0){aD=aG.indexOf(aF,aJ);if(aD>=0){aB=aG.indexOf(aL,aD);if(aB>0){if(aJ=0&&ao<0){return ax.replace("DD",T[aj])}else{if(ah>=0&&ao<0){return ax.replace("D",ac[aj]) -}else{if(ag>=0&&ah<0){return ax.replace("MM",W[ak])}else{if(ao>=0&&ah<0){return ax.replace("M",ab[ak])}else{if(ah>=0&&ao>=0){var al=null;var av=null;var an=null;if(ap>=0){al=ax.substring(0,ap);av=T[aj];an=ax.substring(ap+2,ax.length)}else{if(ah>=0){al=ax.substring(0,ah);av=ac[aj];an=ax.substring(ah+1,ax.length)}}if(ah>ao){if(al.indexOf("MM")>=0){al=al.replace("MM",W[ak])}else{if(al.indexOf("M")>=0){al=al.replace("M",ab[ak])}}}else{if(an.indexOf("MM")>=0){an=an.replace("MM",W[ak])}else{if(an.indexOf("M")>=0){an=an.replace("M",ab[ak])}}}return al+av+an}}}}}return ax};this.getDayStr=function(ah,ag,af,ai){return this.getFormattedDateStr(ah,V,ag,af,ai)};this.getDayLongStr=function(ah,ag,af,ai){return this.getFormattedDateStr(ah,L,ag,af,ai)};this.getDayFullStr=function(ah,ag,af,ai){return this.getFormattedDateStr(ah,R,ag,af,ai)};this.getDateStr=function(ah,ag,af,ai){return this.getFormattedDateStr(ah,K,ag,af,ai)};this.getDateLongStr=function(ah,ag,af,ai){return this.getFormattedDateStr(ah,N,ag,af,ai) -};this.getFormattedTimeStr=function(ah,an,ao,ai,aj){var am=0;var ak=0;var af=0;if(ah==null){am=ao!=null?ao*1:0;ak=ai!=null?ai*1:0;af=aj!=null?aj*1:0}else{if(typeof ah=="number"){ah=new Date(ah)}am=ah.getHours();ak=ah.getMinutes();af=ah.getSeconds()}var al=null;var ag=an.indexOf("/ampm");if(ag>0){an=an.substr(0,ag);al=X;if(am>12){al=ad;am-=12}}return an.replace("hh",(am<10?"0":"")+am).replace("mm",(ak<10?"0":"")+ak).replace("ss",(af<10?"0":"")+af).replace("h",am).replace("m",ak).replace("s",af)+(al!=null?al:"")};this.getTimeStr=function(ah,ai,af,ag){return this.getFormattedTimeStr(ah,P,ai,af,ag)};this.getTimeLongStr=function(ah,ai,af,ag){return this.getFormattedTimeStr(ah,U,ai,af,ag)};this.getRecordingStr=function(af){if(typeof af=="number"){af=new Date(af)}return this.getDayLongStr(af)+M+this.getTimeStr(af)};this.getFormattedDurationStr=function(ag,aj){var af=Math.floor(ag/3600000);var ai=Math.floor((ag%3600000)/60000);var ah=Math.floor((ag%60000)/1000);aj=a.exprEscape(aj,"[","]",function(ak){return ak -},function(ak){if(ak.indexOf("h")==0||ak.indexOf("H")==0){return af>0?ak:""}else{if(ak.indexOf("m")==0||ak.indexOf("M")==0){return af>0||ai>0?ak:""}else{if(ak.indexOf("s")==0||ak.indexOf("S")==0){return af>0||ai>0||ah>0?ak:""}}}});return aj.replace("H","h").replace("M",(af>0?"mm":"m")).replace("S",(af>0||ai>0?"ss":"s")).replace("hh",(af<10?"0":"")+af).replace("mm",((ai<10)?"0":"")+ai).replace("ss",((ah<10)?"0":"")+ah).replace("h",af).replace("m",ai).replace("s",ah)};this.getDurationStr=function(ak,aw){if(aw==null){aw="dhms"}var av=aw.indexOf("D")!=-1;var an=aw.indexOf("H")!=-1;var ar=aw.indexOf("M")!=-1;var au=aw.indexOf("S")!=-1;aw=aw.toLowerCase();var aq=aw.indexOf("d")!=-1;var ai=aw.indexOf("h")!=-1;var af=aw.indexOf("m")!=-1;var ah=aw.indexOf("s")!=-1;if(aw.indexOf("~")==0){if(ak<60000){if(ah){aw="s"}}else{if(ak<3600000){if(af){aw="m"}else{if(ah){aw="s"}}}else{if(ak<86400000){if(ai){aw="h"}else{if(af){aw="m"}else{if(ah){aw="s"}}}}else{if(aq){aw="d"}else{if(ai){aw="h"}else{if(af){aw="m" -}else{if(ah){aw="s"}}}}}}}}if(aw=="d"){var ao=Math.round(ak/86400000);return ao==1?ao+Z:ao+Y}if(aw=="h"){return Math.round(ak/3600000)+S}if(aw=="m"){return Math.round(ak/60000)+Q}if(aw=="s"){return Math.round(ak/1000)+O}var aj=ak;var at=ai||af||ah;var ao=aq?(at?Math.floor(aj/86400000):Math.ceil(aj/86400000)):0;if(aq){aj=ak%86400000}at=af||ah;var ap=ai?(at?Math.floor(aj/3600000):Math.ceil(aj/3600000)):0;if(ai){aj=ak%3600000}at=ah;var al=af?(at?Math.floor(aj/60000):Math.ceil(aj/60000)):0;if(af){aj=ak%60000}var ag=ah?Math.floor(aj/1000):0;var am="";if(aq&&(ao>0||av)){am+=ao+(ao==1?Z:Y)}if(ai&&(ap>0||an)){if(am.length>0){am+=" "}am+=ap+S}if(af&&(al>0||ar)){if(am.length>0){am+=" "}am+=al+Q}if(ah&&(ag>0||au)){if(am.length>0){am+=" "}am+=ag+O}if(ah&&am.length==0){return ag+O}if(af&&am.length==0){return al+Q}if(ai&&am.length==0){return ap+S}return am};this.getVideoStr=function(ah,ai){if(ai==null){ai=3}var ag=ai>2?Math.floor(ah/3600000):0;var aj=ai>1?Math.floor((ah%3600000)/60000):0;var af=ai>0?Math.floor(ah%60000/1000):0; -if(ai>2){return(ag<10?"0":"")+ag+":"+(aj<10?"0":"")+aj+":"+(af<10?"0":"")+af}else{if(ai>1){return(aj<10?"0":"")+aj+":"+(af<10?"0":"")+af}else{if(ai>0){return(af<10?"0":"")+af}}}return""}};var H=new function(){this.toTimeStr=function(K){return g.getTimeStr(K)};this.toTimeLongStr=function(K){return g.getTimeLongStr(K)};this.toTimeDayStr=function(K){return g.getFormattedDateStr(K,"D")+g.getFormatSeparator()+g.getTimeStr(K)};this.toTimeDayLongStr=function(K){return g.getFormattedDateStr(K,"D")+g.getFormatSeparator()+g.getTimeLongStr(K)};this.toDayStr=function(K){return g.getDayStr(K)};this.toDayLongStr=function(K){return g.getDayLongStr(K)};this.toDayFullStr=function(K){return g.getDayFullStr(K)};this.toDateStr=function(K){return g.getDateStr(K)};this.toDateLongStr=function(K){return g.getDateLongStr(K)};this.toRecordingStr=function(K){return g.getRecordingStr(K)};this.toDayTimeStr=function(K){return g.getDayStr(K)+g.getFormatSeparator()+g.getTimeStr(K)};this.toDayTimeLongStr=function(K){return g.getDayLongStr(K)+g.getFormatSeparator()+g.getTimeStr(K) -};this.toDayTimeFullStr=function(K){return g.getDayFullStr(K)+g.getFormatSeparator()+g.getTimeStr(K)};this.toDateTimeStr=function(K){return g.getDateStr(K)+g.getFormatSeparator()+g.getTimeStr(K)};this.toDateTimeLongStr=function(K){return g.getDateLongStr(K)+g.getFormatSeparator()+g.getTimeStr(K)}};var F=new function(){this.foreach=function(P,L){if(P!=null&&P.properties!=null&&typeof L=="function"){var N=P.properties;if(Array.isArray(N)){for(var O=0;O0){if(L==decodeURIComponent(a.strTrim(M.substr(0,O)))){return decodeURIComponent(M.substr(O+1))}}}}return Q!=null?Q:null};this.getFullStr=function(L,M){return a.strFullCheck(this.get(L),M)};this.getNum=function(L,M){return a.strToNum(this.get(L),M)};this.getBool=function(L,M){return a.strToBool(this.get(L),M)};this.has=function(L,M){return a.isValid(this.get(L),M)};this.foreach=function(R){if(typeof R=="function"){var N=m.cookie.split(";");for(var P=0;P0){var Q=decodeURIComponent(a.strTrim(M.substr(0,L))); -var O=decodeURIComponent(M.substr(L+1));if(R(Q,O)===true){break}}}}};this.remove=function(L){if(a.isFullStr(L)){this.set(L,"",K)}};this.clear=function(){var L=this;this.foreach(function(M){L.set(M,"",K)})}}function d(){var M="exp:";var L=new J();var K=function(O,P){if(P!=null){P*=1;return P>=0&&P=0){localStorage.setItem(M+O,P)}else{localStorage.removeItem(M+O)}}else{L.set(O,R,Q) -}}};this.get=function(O,R){if(a.isFullStr(O)){if(e.localStorage!=null){var Q=false;var P=localStorage.getItem(M+O);if(P!=null){if(K(g.getTimestamp(),P)){Q=true;localStorage.removeItem(O);localStorage.removeItem(M+O)}}if(!Q){var S=localStorage.getItem(O);if(S!=null){return S}}}else{return L.get(O,R)}}return R!=null?R:null};this.getFullStr=function(O,P){return a.strFullCheck(this.get(O),P)};this.getNum=function(O,P){return a.strToNum(this.get(O),P)};this.getBool=function(O,P){return a.strToBool(this.get(O),P)};this.has=function(O,P){return a.isValid(this.get(O),P)};this.foreach=function(Q){if(typeof Q=="function"){if(e.localStorage!=null){N();for(var P=0;P=0){var O=Q.substr(T+1).split("&");for(var M=0;M0){var S=R.substr(0,N);var U=R.substr(N+1);P[decodeURIComponent(S)]=decodeURIComponent(U)}else{P[decodeURIComponent(R)]=""}}}}}return P}; -this.build=function(P,O){var Q=0;var M="";if(K!=null){for(var N in K){var R=a.strValue(K[N]);if(Q>0){M+=(O!=null?O:"&")}if(a.isFullStr(R)){M+=(P===false?N:encodeURIComponent(N))+"="+(P===false?R:encodeURIComponent(R))}else{M+=(P===false?N:encodeURIComponent(N))}Q++}}return M};if(L!=null){K=this.create(L)}else{K=this.create(m.URL)}}function C(K,L){this.getValue=function(M){if(a.isFullStr(M)){if(K!=null&&K[M]!=null){return K[M]}if(L!=null&&L[M]!=null){return L[M]}}return null};this.get=function(M){return a.strValue(this.getValue(M))};this.getFullStr=function(M){return a.strFullCheck(this.get(M),null)};this.getNum=function(M){return a.strToNum(this.getValue(M),0)};this.getBool=function(M){return a.strToBool(this.getValue(M),false)};this.has=function(M,N){return a.isValid(this.get(M),N)}}function h(){var K={};this.hasObserver=function(L){return a.isFullStr(L)&&K[L]!=null};this.hasObservers=function(){var L;for(L in K){return true}return false};this.addObserver=function(L,M){if(a.isFullStr(L)&&typeof M=="function"){K[L]=M -}};this.removeObserver=function(L){if(a.isFullStr(L)){delete K[L]}};this.onEvent=function(L,M){if(a.isFullStr(L)){if(typeof M=="function"){this.addObserver(L,M)}else{this.removeObserver(L)}}};this.notifyObserver=function(L,M){if(a.isFullStr(L)&&K[L]!=null){K[L](M)}};this.notifyObservers=function(M){for(var L in K){K[L](M)}};this.clear=function(){K={}}}function I(){var K={};this.hasObserver=function(M,L){return a.isFullStr(M)&&a.isFullStr(L)&&K[M]!=null&&K[M][L]!=null};this.hasObservers=function(M){if(a.isFullStr(M)&&K[M]!=null){var L;for(L in K[M]){return true}}return false};this.addObserver=function(M,L,N){if(a.isFullStr(M)&&a.isFullStr(L)&&typeof N=="function"){if(K[M]==null){K[M]={}}K[M][L]=N}};this.removeObserver=function(M,L){if(a.isFullStr(M)&&a.isFullStr(L)&&K[M]!=null){delete K[M][L];if(!this.hasObservers(M)){delete K[M]}}};this.onEvent=function(M,L,N){if(a.isFullStr(M)&&a.isFullStr(L)){if(typeof N=="function"){this.addObserver(M,L,N)}else{this.removeObserver(M,L)}}};this.notifyObserver=function(M,L,N){if(a.isFullStr(M)&&a.isFullStr(L)&&K[M]!=null&&K[M][L]!=null){K[M][L](N) -}};this.notifyObservers=function(M,N){if(a.isFullStr(M)&&K[M]!=null){for(var L in K[M]){K[M][L](N)}}};this.clear=function(L){if(a.isFullStr(L)){if(K[L]!=null){K[L]={}}}else{K={}}}}function x(){var L=null;var M=[];var K=null;var N=false;this.delegate=null;this.execute=function(){if(L!=null){clearTimeout(L);L=null}if(K!=null){if(typeof K.action=="function"){K.action()}else{if(this.delegate!=null&&typeof this.delegate.executeQueueAction=="function"){this.delegate.executeQueueAction(K.action)}}K=null;this.process()}};this.process=function(){if(K==null&&M.length>0){K=M.shift();if(K.action==="stop"&&K.delay==null){N=true;K=null}else{if(K.delay!=null&&K.delay>0){var O=this;L=setTimeout(function(){L=null;O.execute()},K.delay)}else{this.execute()}}}};this.reset=function(){M=[];K=null;N=false;if(L!=null){clearTimeout(L);L=null}};this.push=function(O,P){if(O!=null){if(O==="reset"&&P==null){this.reset()}else{if(O==="execute"&&P==null){this.execute()}else{if(O==="clear"&&P==null){M=[]}else{if(O==="continue"&&P==null){N=false -}else{M.push({action:O,delay:P})}}}}if(!N){this.process()}}};this.isBusy=function(){return L!=null}}function c(K,O){var M=null;var N=[];var L=0;this.size=K!=null?K:0;this.delay=O!=null?O:0;this.work=function(){if(M==null&&this.delay>0){var P=this;M=setTimeout(function(){M=null;L=0;P.process()},this.delay)}};this.process=function(){if(M==null&&N.length>0){if(L0){M=setTimeout(function(){P.finish()},this.delay)}else{P.finish()}};this.restart=function(){this.start(L)};this.stop=function(){if(M!=null){clearTimeout(M);M=null}};this.finish=function(){this.stop();if(!K){K=true; -if(typeof L=="function"){L()}}};this.isBusy=function(){return M!=null}}function E(){var M=300;var N=0;var K=0;var L=null;this.click=function(O){var P=g.getTimestamp();if(L===O&&N>0&&P-N<=M){K++}else{K=1}L=O;N=P;return K}}function j(){var K="application/json";var P="application/xml";var M="text/plain";var S="text/html";var R="application/x-www-form-urlencoded";var N=function(V){var U=null;try{U=new XMLHttpRequest()}catch(T){if(V!=null&&typeof V.error=="function"){V.error("Create XML HTTP request failed: "+T)}}return U};var Q=function(T){if(T!=null&&typeof T.destroy=="function"){T.destroy()}};var O=function(X,Y,V){var T=X.responseText;var W=true;if(T!=null){if(V==K){try{if(e.JSON!=null&&typeof JSON.parse=="function"){if(a.isFullStr(T)){T=JSON.parse(T)}else{W=false;if(Y!=null&&typeof Y.error=="function"){Y.error("Validate JSON failed")}}}else{if(a.isJson(T)){T=new Function("return "+T)()}else{W=false;if(Y!=null&&typeof Y.error=="function"){Y.error("Validate JSON failed")}}}}catch(U){W=false; -if(Y!=null&&typeof Y.error=="function"){Y.error("Create JSON failed: "+U)}}}else{if(V==P){T=X.responseXML}}}if(W&&Y!=null&&typeof Y.success=="function"){Y.success(T)}};var L=function(Z,W,Y,ag,T){if(e.TVXAjaxService!=null&&typeof TVXAjaxService.executeRequest=="function"&&TVXAjaxService.executeRequest(Z,W,Y,ag,T)===true){return}var ac=N(ag);if(ac!=null){var ad=K;var X=false;var ae=false;var U=true;var af=null;if(T!=null){X=T.isForm===true;ae=T.withCredentials===true;U=T.accurateHeaders!==false;af=T.headers;if(T.dataType!=null){if(T.dataType=="json"){ad=K}else{if(T.dataType=="xml"){ad=P}else{if(T.dataType=="text"){ad=M}else{if(T.dataType=="html"){ad=S}else{ad=null}}}}}}try{if(ae){ac.withCredentials=true}ac.open(Z,W,true)}catch(ab){Q(ac);ac=null;if(ag!=null&&typeof ag.error=="function"){ag.error("Open connection failed: "+ab)}}if(ac!=null){ac.onreadystatechange=function(){if(ac!=null){if(ac.readyState==4){if((ac.status>=200&&ac.status<300)||(ac.status==0&&a.isFullStr(ac.responseText))){O(ac,ag,ad) -}else{if(ag!=null&&typeof ag.error=="function"){var ah=a.strValue(ac.status);if(a.isFullStr(ac.statusText)){ah+=" "+ac.statusText}ag.error("Server responded with status: "+ah)}}Q(ac);ac=null}}};if(ad!=null){if(Y!=null){ac.setRequestHeader("Content-Type",!X&&U?ad:R)}if(U){ac.setRequestHeader("Accept",ad)}}if(af!=null){for(var aa in af){var V=af[aa];if(V!=null){ac.setRequestHeader(a.strValue(aa),a.strValue(V))}}}try{ac.send(Y)}catch(ab){Q(ac);ac=null;if(ag!=null&&typeof ag.error=="function"){ag.error("Send data failed: "+ab)}}}}};this.get=function(T,V,U){L("GET",T,null,V,U)};this.post=function(U,W,T,V){L("POST",U,W,T,V)};this.put=function(U,W,T,V){L("PUT",U,W,T,V)};this.del=function(T,V,U){L("DELETE",T,null,V,U)}}var s={OFF:0,ERROR:1,WARN:2,INFO:3,DEBUG:4};function v(){var Q=[];var M=null;this.level=s.DEBUG;this.maxLines=30;this.maxDebugLength=116;this.maxInfoLength=-1;this.maxWarnLength=-1;this.maxErrorLength=-1;var O=function(){var R=new Date();var Y=R.getHours();var X=R.getMinutes();var V=R.getSeconds(); -var U=R.getMilliseconds();var T=R.getDate();var W=R.getMonth()+1;var S=R.getFullYear();return S+"-"+((W<10)?"0":"")+W+"-"+((T<10)?"0":"")+T+" "+((Y<10)?"0":"")+Y+":"+((X<10)?"0":"")+X+":"+((V<10)?"0":"")+V+"."+((U<10)?"00":((U<100)?"0":""))+U};var N=function(S,R){var T="";switch(S){case s.DEBUG:T=l.LOGGER.CSS.CLASS_DEBUG;break;case s.INFO:T=l.LOGGER.CSS.CLASS_INFO;break;case s.WARN:T=l.LOGGER.CSS.CLASS_WARN;break;case s.ERROR:T=l.LOGGER.CSS.CLASS_ERROR;break}return a.strReplace(l.LOGGER.HTML.LINE.replace("{LEVEL}",T),"{MESSAGE}",a.htmlEscape(R))};var L=function(S,R){var T="";switch(S){case s.DEBUG:T="DEBUG";break;case s.INFO:T="INFO";break;case s.WARN:T="WARNING";break;case s.ERROR:T="ERROR";break}return O()+" "+T+": "+R};var K=function(T,S,U,R){if(U>0&&S.length>U){S=S.substr(0,U)+"..."}Q.push(N(T,S));if(R>0){while(Q.length>R){Q.shift()}}};var P=function(S,R){if(e.console!=null){switch(S){case s.DEBUG:console.log(R);break;case s.INFO:console.info(R);break;case s.WARN:console.warn(R);break; -case s.ERROR:console.error(R);break}}};this.registerControl=function(R,S){M=R;if(S!==false){this.print()}};this.unregisterControl=function(R){if(M==R){M=null}};this.print=function(){if(M!=null&&Q.length>0){var S="";for(var R=0;R0){return this.getValueForKey(U.substr(0,T),U.substr(T+1))}else{return this.getValueForKey(U,"")}}return""};this.getData=function(){return{name:N,version:Q,size:P,properties:S}}}function i(){var M=null;var N={};var L=null;var K=null;this.delay=0;this.now=g.getNow();this.format="time";this.isRunning=function(){return M!=null};this.hasHook=function(O){return a.isFullStr(O)&&N[O]!=null};this.hasHooks=function(){var O;for(O in N){return true}return false};this.hasControl=function(){return L!=null -};this.clearHooks=function(){N={}};this.addHook=function(O,P){if(a.isFullStr(O)&&typeof P=="function"){N[O]=P}};this.removeHook=function(O){if(a.isFullStr(O)){delete N[O]}};this.onTick=function(O,P){if(a.isFullStr(O)){if(typeof P=="function"){this.addHook(O,P)}else{this.removeHook(O)}}};this.registerControl=function(O){L=O};this.unregisterControl=function(O){if(L==O){L=null}};this.update=function(){if(L!=null){var O=null;switch(this.format){case"full":O=H.toDayTimeFullStr(this.now);break;case"date":O=H.toDayTimeLongStr(this.now);break;case"day":O=H.toTimeDayStr(this.now);break;case"time":O=H.toTimeStr(this.now);break;default:O="";break}if(L.clockText!=O){L.clockText=O;L.html(O)}}};this.validate=function(){this.now=g.getNow()};this.process=function(){if(M!=null){this.validate();this.delay=K!=null?this.now.getTime()-K.getTime():0;K=this.now;this.update();for(var O in N){N[O](this)}}};this.start=function(){if(M==null){var O=this;K=null;M=setInterval(function(){O.process()},1000)}};this.stop=function(){if(M!=null){clearInterval(M); -M=null;K=null}}}var A={logger:new v(),cookies:new J(),storage:new d(),urlParams:new B(),ajax:new j()};var u=new function(){var K={};this.load=function(M,L,O,N){if(a.isFullStr(M)){if(L!=null&&K[L]!=null&&K[L].url==M&&K[L].data!=null){if(O!=null&&typeof O.success=="function"){O.success(K[L].data,true)}}else{A.ajax.get(M,{success:function(P){if(L!=null){K[L]={url:M,data:P}}if(O!=null&&typeof O.success=="function"){O.success(P,false)}},error:function(P){if(L!=null){K[L]={url:M,data:null}}if(O!=null&&typeof O.error=="function"){O.error(P)}}},N)}}};this.clearCache=function(L){if(L!=null){K[L]=null}};this.clear=function(){K={}}};function D(){var W={};var P={};var T={};var Q={};var S=function(Y){if(Y!=null&&Y.response!=null){return a.strToNum(Y.response.status,0)}return 0};var X=function(Y){if(Y!=null&&Y.response!=null){return Y.response.data}return null};var N=function(Z){var Y="";if(Z!=null&&Z.response!=null){if(a.isNum(Z.response.status)){Y+=""+Z.response.status}if(a.isFullStr(Z.response.text)){if(Y.length>0){Y+=" " -}Y+=Z.response.text}if(a.isFullStr(Z.response.message)){if(Y.length>0){Y+=": "}Y+=Z.response.message}}return Y.length>0?Y:"Unknown error"};var V=function(Y,Z){T[Y]=Z;for(var aa in W){if(W[aa]!=null){Z(W[aa])}}};var K=function(Y){delete T[Y]};var M=function(Y){for(var Z in T){T[Z](Y)}};var O=function(Y,Z){if(Y!=null&&typeof Z=="function"){Q[Y]=Z;for(var aa in P){if(P[aa]!=null){Z(P[aa])}}}};var U=function(Y){if(Y!=null){delete Q[Y]}};var L=function(Y){for(var Z in Q){Q[Z](Y)}};var R=function(Y){return Y!=null&&Y.indexOf("temp:")!=0};this.onReady=function(Y,Z){if(a.isFullStr(Y)){if(typeof Z=="function"){V(Y,Z)}else{K(Y)}}};this.onError=function(Y,Z){if(a.isFullStr(Y)){if(typeof Z=="function"){O(Y,Z)}else{U(Y)}}};this.onCompleted=function(Y,Z){this.onReady(Y,Z);this.onError(Y,Z)};this.foreachEntry=function(Z){if(typeof Z=="function"){for(var Y in W){if(W[Y]!=null){if(Z(W[Y])===true){break}}}}};this.foreachError=function(Z){if(typeof Z=="function"){for(var Y in P){if(P[Y]!=null){if(Z(P[Y])===true){break -}}}}};this.getData=function(Y){return Y!=null&&W[Y]!=null?W[Y].data:null};this.getEntry=function(Y){return Y!=null?W[Y]:null};this.setEntry=function(Z,Y){if(Z!=null&&Y!=null){W[Z]=Y;P[Z]=null;M(Y)}};this.getError=function(Y){return Y!=null?P[Y]:null};this.setError=function(Y,Z){if(Y!=null&&Z!=null){W[Y]=null;P[Y]=Z;L(Z)}};this.shouldStoreData=function(Y){return R(Y)};this.createData=function(Y,Z){return Z};this.putData=function(Z,ab,Y,aa){if(Z!=null&&ab!=null){A.ajax.put(Z,ab,{success:function(ac){if(ac.response!=null&&ac.response.status==200){if(Y!=null&&typeof Y.success=="function"){Y.success(ac.response.data)}}else{if(Y!=null&&typeof Y.error=="function"){Y.error(N(ac),S(ac),X(ac))}}},error:function(ac){if(Y!=null&&typeof Y.error=="function"){Y.error(ac,0,null)}}},aa)}};this.postData=function(Z,ab,Y,aa){if(Z!=null&&ab!=null){A.ajax.post(Z,ab,{success:function(ac){if(ac.response!=null&&ac.response.status==200){if(Y!=null&&typeof Y.success=="function"){Y.success(ac.response.data)}}else{if(Y!=null&&typeof Y.error=="function"){Y.error(N(ac),S(ac),X(ac)) -}}},error:function(ac){if(Y!=null&&typeof Y.error=="function"){Y.error(ac,0,null)}}},aa)}};this.deleteData=function(Y,aa,Z){if(Y!=null){A.ajax.del(Y,{success:function(ab){if(ab.response!=null&&ab.response.status==200){if(aa!=null&&typeof aa.success=="function"){aa.success(ab.response.data)}}else{if(aa!=null&&typeof aa.error=="function"){aa.error(N(ab),S(ab),X(ab))}}},error:function(ab){if(aa!=null&&typeof aa.error=="function"){aa.error(ab,0,null)}}},Z)}};this.loadData=function(ab,Z,ac,aa){if(ab!=null){var Y=this;if(R(ab)){this.clearData(ab)}if(Z!=null){A.ajax.get(Z,{success:function(ag){var af=false;if(ag.response!=null&&ag.response.status==200&&ag.response.data!=null){af=true;ag=ag.response.data}if(!af&&ag.response!=null){var ad={id:ab,error:N(ag),status:S(ag),reason:X(ag)};var ae=true;if(ac!=null&&typeof ac.error=="function"){ae=ac.error(ad)}if(ae!==false&&R(ab)){Y.setError(ab,ad)}if(ac!=null&&typeof ac.completed=="function"){ac.completed(ad)}}else{var ad={id:ab,data:Y.createData(ab,ag)}; -var ae=true;if(ac!=null&&typeof ac.success=="function"){ae=ac.success(ad)}if(ae!==false&&R(ab)){Y.setEntry(ab,ad)}if(ac!=null&&typeof ac.completed=="function"){ac.completed(ad)}}},error:function(af){var ad={id:ab,error:af,status:0,reason:null};var ae=true;if(ac!=null&&typeof ac.error=="function"){ae=ac.error(ad)}if(ae!==false&&R(ab)){Y.setError(ab,ad)}if(ac!=null&&typeof ac.completed=="function"){ac.completed(ad)}}},aa)}}};this.clearData=function(Y){if(Y!=null){W[Y]=null;P[Y]=null}};this.clear=function(){W={};P={}}}function r(){var P={};var S={};var Z={};var L={};var K=function(ac){if(ac!=null){try{if(e.URL!=null&&typeof URL.createObjectURL=="function"){return URL.createObjectURL(ac)}else{if(e.webkitURL!=null&&typeof webkitURL.createObjectURL=="function"){return webkitURL.createObjectURL(ac)}}}catch(ab){A.logger.error("Create blob URL failed: "+ab)}}return null};var V=function(ab){if(ab!=null){try{if(e.URL!=null&&typeof URL.revokeObjectURL=="function"){URL.revokeObjectURL(ab)}else{if(e.webkitURL!=null&&typeof webkitURL.revokeObjectURL=="function"){webkitURL.revokeObjectURL(ab) -}}}catch(ac){A.logger.error("Dispose blob URL failed: "+ac)}}};var aa=function(ad){var ac=null;try{ac=new XMLHttpRequest()}catch(ab){if(ad!=null&&typeof ad.error=="function"){ad.error("Create XML HTTP request failed: "+ab)}}return ac};var R=function(ab){if(ab!=null&&typeof ab.destroy=="function"){ab.destroy()}};var U=function(ab,ac){if(ab.response!=null){if(ac!=null&&typeof ac.success=="function"){ac.success(ab.response)}}else{if(ac!=null&&typeof ac.error=="function"){ac.error("Load blob failed: Response is missing")}}};var M=function(af,ad,ae,al,ab){var ai=aa(al);if(ai!=null){var aj=false;var ak=null;if(ab!=null){aj=ab.withCredentials===true;ak=ab.headers}try{if(aj){ai.withCredentials=true}ai.responseType="blob";ai.open(af,ad,true)}catch(ah){R(ai);ai=null;if(al!=null&&typeof al.error=="function"){al.error("Open connection failed: "+ah)}}if(ai!=null){ai.onreadystatechange=function(){if(ai!=null){if(ai.readyState==4){if(ai.status>=200&&ai.status<300){U(ai,al)}else{if(al!=null&&typeof al.error=="function"){var am=a.strValue(ai.status); -if(a.isFullStr(ai.statusText)){am+=" "+ai.statusText}al.error("Server responded with status: "+am)}}R(ai);ai=null}}};if(ak!=null){for(var ag in ak){var ac=ak[ag];if(ac!=null){ai.setRequestHeader(a.strValue(ag),a.strValue(ac))}}}try{ai.send(ae)}catch(ah){R(ai);ai=null;if(al!=null&&typeof al.error=="function"){al.error("Send data failed: "+ah)}}}}};var O=function(ab,ac,ag,ae,ah,ad,af){if(ag!=null){ab.clearBlob(ag);if(ae!=null){M(ac,ae,ah,{success:function(aj){var ai={id:ag,blob:aj,url:K(aj)};if(ad!=null&&typeof ad.success=="function"){ad.success(ai)}ab.setEntry(ag,ai);if(ad!=null&&typeof ad.completed=="function"){ad.completed(ai)}},error:function(aj){var ai={id:ag,error:aj,status:0,reason:null};if(ad!=null&&typeof ad.error=="function"){ad.error(ai)}ab.setError(ag,ai);if(ad!=null&&typeof ad.completed=="function"){ad.completed(ai)}}},af)}}};var N=function(ab,ac){Z[ab]=ac;for(var ad in P){if(P[ad]!=null){ac(P[ad])}}};var Q=function(ab){delete Z[ab]};var T=function(ab){for(var ac in Z){Z[ac](ab) -}};var X=function(ab,ac){if(ab!=null&&typeof ac=="function"){L[ab]=ac;for(var ad in S){if(S[ad]!=null){ac(S[ad])}}}};var W=function(ab){if(ab!=null){delete L[ab]}};var Y=function(ab){for(var ac in L){L[ac](ab)}};this.onReady=function(ab,ac){if(a.isFullStr(ab)){if(typeof ac=="function"){N(ab,ac)}else{Q(ab)}}};this.onError=function(ab,ac){if(a.isFullStr(ab)){if(typeof ac=="function"){X(ab,ac)}else{W(ab)}}};this.onCompleted=function(ab,ac){this.onReady(ab,ac);this.onError(ab,ac)};this.foreachEntry=function(ac){if(typeof ac=="function"){for(var ab in P){if(P[ab]!=null){if(ac(P[ab])===true){break}}}}};this.foreachError=function(ac){if(typeof ac=="function"){for(var ab in S){if(S[ab]!=null){if(ac(S[ab])===true){break}}}}};this.getBlob=function(ab){return ab!=null&&P[ab]!=null?P[ab].blob:null};this.getUrl=function(ab){return ab!=null&&P[ab]!=null?P[ab].url:null};this.getEntry=function(ab){return ab!=null?P[ab]:null};this.setEntry=function(ac,ab){if(ac!=null&&ab!=null){V(P[ac]!=null?P[ac].url:null); -P[ac]=ab;S[ac]=null;T(ab)}};this.getError=function(ab){return ab!=null?S[ab]:null};this.setError=function(ab,ac){if(ab!=null&&ac!=null){V(P[ab]!=null?P[ab].url:null);P[ab]=null;S[ab]=ac;Y(ac)}};this.executeBlob=function(ae,ac,af,ab,ad){O(this,"POST",ae,ac,af,ab,ad)};this.loadBlob=function(ad,ab,ae,ac){O(this,"GET",ad,ab,null,ae,ac)};this.clearBlob=function(ab){if(ab!=null){V(P[ab]!=null?P[ab].url:null);P[ab]=null;S[ab]=null}};this.clear=function(){for(var ab in P){V(P[ab]!=null?P[ab].url:null)}P={};S={}}}function w(P){var M="srq";var L=0;var K={};var Q=0;this.timeout=P!=null?P:30000;var N=function(R,U){L++;Q++;var T=M+L+"_"+g.getTimestamp();var S={timeout:new o(R),callback:U};K[T]=S;S.timeout.start(function(){O(T,null,"Request timed out","timeout")});return T};var O=function(U,V,R,S){if(U!=null){var T=K[U];if(T!=null){Q--;T.timeout.stop();delete K[U];if(R!=null){if(T.callback!=null&&typeof T.callback.error=="function"){T.callback.error(R,S)}}else{if(T.callback!=null&&typeof T.callback.success=="function"){T.callback.success(V) -}}}}};this.startRequest=function(R){return N(this.timeout,R)};this.getRequestsCount=function(){return Q};this.isRequestPending=function(R){return R!=null&&K[R]!=null};this.handleData=function(R,S){O(R,S!=null?S:null,null)};this.handleError=function(S,T,R){O(S,null,T!=null?T:"Unknown error",R!=null?R:null)}}function b(){var N=0;var M=null;var L=function(){if(M!=null){var P=M;M=null;if(P.length>0){for(var O=0;O0};this.start=function(O){if(O===true){N=1}else{N++}};this.stop=function(O){if(N>0){if(O===true){N=0}else{if(N>0){N--}}if(N==0){L()}}};this.onReady=function(O){if(typeof O=="function"){if(N>0){K(O)}else{O()}}}}function p(U){var V=4;var S=256;var W=null;var T=null;var ad=function(an){return a.isFullStr(an)&&an.length>=V&&an.length0){while(ao<0){ao+=an}while(ao>=an){ao-=an}}return ao};var ab=function(ap,ao,an){ap+=3;return ap+ao>=an?0:ap};var O=function(an,ao){an++;return an>=ao?0:an};var ac=function(an,ao){return ao?-an:an};var aj=function(aq,ar,ap,an,ao){return af(ar+ac(an,ao)*ae(aq,ap),S)};var Q=function(au,an,at,av,ao,ar,ap){var aq=au!=null&&at!=null?au.indexOf(at):-1;return aq>=0?al(au,af(aq+ac(ar,ap)*(av+ae(an,ao)),au.length)):at};var P=function(ao,an){return an!=null?(ao!=null?ao+an:an):ao};var al=function(an,ao){return an!=null&&ao>=0&&ao=0&&ao0.5?av.indexOf(au):av.lastIndexOf(au);return ap>=0?Y(aj(an,ap,ao,1,aq).toString(16)):null}return null};var M=function(at,an,ar,ao,aq){var av=al(at,ar);var au=al(at,ar+1);var ap=av!=null&&au!=null?parseInt(av+au,16):-1;return ap>=0?aj(an,ap,ao,-1,aq):-1 -};var ak=function(au,ay,ao){var ax=null;if(a.isFullStr(au)&&au.length%2==0&&ad(ay)&&ad(ao)){var at=au.length;var av=ao.length;var ap=0;var ar=0;var aq=false;for(var an=0;an=0&&ad0){for(var W=0;W0}if(a2.duration==0){a2.duration=aY(a5.getDuration());a8=a2.duration>0}if(a2.position>0&&a2.duration>0){aV()}if(a8){U()}}catch(a9){ak("Start failed",a9);aV()}}else{aV()}};var aV=function(){ab=true;ac()};var a4=function(){ac();if(aP&&!ab&&a5!=null&&typeof a5.getPosition=="function"&&typeof a5.getDuration=="function"){aB=setInterval(O,aj)}};var ac=function(){if(aB!=null){clearInterval(aB); -aB=null}};var aZ=0;var aS={};var av=function(ba){aZ++;var a8=aD+aZ+"_"+g.getTimestamp();var a9={timeout:new o(P),callback:ba};aS[a8]=a9;a9.timeout.start(function(){ax(a8,{error:"Request timed out"})});return a8};var ax=function(a8,ba){if(a8!=null){var a9=aS[a8];if(a9!=null){a9.timeout.stop();delete aS[a8];Y(a9.callback,ba)}}};var Y=function(ba,a8){if(typeof ba=="function"){try{ba(a8)}catch(a9){ak("Callback error",a9)}}};var aW=new h();var X=new o(500);var ay=null;var aI=null;var ag=function(a8){if(a8!=null){if(t.isSameContentState(ay,a8)){if(!t.isSameContentState(aI,a8)){if(aI==null){a8.init=true}aI=t.createChangedContentState(aI,a8);aW.notifyObservers(aI)}}else{ay=a8}}ah()};var aN=function(){if(aP){ar("info:content",function(a8){ag(a8.info!=null&&a8.info.content!=null?a8.info.content.state:null)})}else{ah()}};var ah=function(a8){if(aW.hasObservers()){if(a.isFullStr(a8)&&aI!=null){aW.notifyObserver(a8,aI)}X.start(aN)}else{ay=null;aI=null;X.stop()}};var U=function(){Z(a2)};var aH=function(){a7.addHook(N,aC) -};var a0=function(){if(a2.state==z.STOPPED){a7.stop()}else{a7.start()}};var V=function(a8,a9){if(a.isFullStr(a8)){Z({action:a8,data:a9!=null?a9:null})}};var az=function(a9,a8){if(a.isFullStr(a9)){if(a8!==false){V("logger:debug:"+a9)}}};var aE=function(a9,a8,ba){if(a.isFullStr(a9)){if(a8!==false){V("logger:success:"+a9,{show:ba!==false})}else{if(ba!==false){V("success:"+a9)}}}};var a6=function(a9,a8,ba){if(a.isFullStr(a9)){if(a8!==false){V("logger:info:"+a9,{show:ba!==false})}else{if(ba!==false){V("info:"+a9)}}}};var al=function(a9,a8,ba){if(a.isFullStr(a9)){if(a8!==false){V("logger:warn:"+a9,{show:ba!==false})}else{if(ba!==false){V("warn:"+a9)}}}};var aw=function(a9,a8,ba){if(a.isFullStr(a9)){if(a8!==false){V("logger:error:"+a9,{show:ba!==false})}else{if(ba!==false){V("error:"+a9)}}}};var Q=function(a8,a9){if(a.isFullStr(a8)&&a9!=null){if(typeof a9=="object"){V(a8+":data",a9)}else{V(a8+":"+a9)}}};var aR=function(a8){Q("menu",a8)};var au=function(a8){Q("content",a8)};var at=function(a8){Q("panel",a8) -};var ar=function(a8,ba,a9){if(a.isFullStr(a8)){if(a9==null){a9={}}a9.requestId=av(ba);a9.dataId=a8;V("player:commit:"+a8,a9)}else{Y(ba,{error:"Data ID is invalid: '"+a8+"'"})}};var ak=function(a8,a9){if(a8!=null&&a9!=null){if(a9.name!=null&&a9.message!=null){aw("Plugin: "+a8+": "+a9.name+": "+a9.message)}else{aw("Plugin: "+a8+": "+a9)}}};var K=function(a8){if(a2.state!=z.PLAYING||a8===true){a2.state=z.PLAYING;if(aP&&a5!=null&&typeof a5.play=="function"){try{a5.play()}catch(a9){ak("Play failed",a9)}}}};var aQ=function(a8){if(a2.state!=z.PAUSED||a8===true){a2.state=z.PAUSED;if(aP&&a5!=null&&typeof a5.pause=="function"){try{a5.pause()}catch(a9){ak("Pause failed",a9)}}}};var a3=function(a8){if(a2.state!=z.STOPPED||a8===true){a2.state=z.STOPPED;if(aP&&a5!=null&&typeof a5.stop=="function"){try{a5.stop()}catch(a9){ak("Stop failed",a9)}}}};var aT=function(a8,a9){if(a8==z.PLAYING){K(a9)}else{if(a8==z.PAUSED){aQ(a9)}else{if(a8==z.STOPPED){a3(a9)}}}};var aC=function(){if(aP&&a5!=null&&!aa.isBusy()&&typeof a5.getUpdateData=="function"){try{var a9=a5.getUpdateData(); -if(a9!=null){var ba=false;if(a.isNum(a9.state)){ba=true;a2.state=a.strToNum(a9.state,a2.state)}if(a.isNum(a9.position)){ba=true;a2.position=a.strToNum(a9.position,a2.position);if(!isFinite(a2.position)){a2.position=0}}if(a.isNum(a9.duration)){ba=true;a2.duration=a.strToNum(a9.duration,a2.duration);if(!isFinite(a2.duration)){a2.duration=0}}if(a.isNum(a9.speed)){ba=true;a2.speed=a.strToNum(a9.speed,a2.speed)}if(a.isBool(a9.ended)){ba=true;a2.ended=a.strToBool(a9.ended,a2.ended)}if(a.isNum(a9.volume)){ba=true;a2.volume=a.strToNum(a9.volume,a2.volume)}if(a.isBool(a9.muted)){ba=true;a2.muted=a.strToBool(a9.muted,a2.muted)}if(ba){U();a0()}}}catch(a8){ak("Update failed",a8)}}};var aK=function(ba,a8){aX=false;if(a2.position!=ba||ba==0||a8===true){a2.position=ba;if(aP&&a5!=null&&typeof a5.setPosition=="function"){try{a5.setPosition(ba);if(!aX){aa.start()}}catch(a9){ak("Set position failed",a9)}}}};var aL=function(a8,ba){if(a2.volume!=a8||ba===true){a2.volume=a8;if(aP&&a5!=null&&typeof a5.setVolume=="function"){try{a5.setVolume(a8) -}catch(a9){ak("Set volume failed",a9)}}}};var S=function(a8,a9){if(a2.muted!=a8||a9===true){a2.muted=a8;if(aP&&a5!=null&&typeof a5.setMuted=="function"){try{a5.setMuted(a8)}catch(ba){ak("Set muted failed",ba)}}}};var a1=function(a8,a9){if(a2.speed!=a8||a9===true){a2.speed=a8;if(aP&&a5!=null&&typeof a5.setSpeed=="function"){try{a5.setSpeed(a8)}catch(ba){ak("Set speed failed",ba)}}}};var ap=function(a9,a8,ba){if(a2.width!=a9||a2.height!=a8||ba===true){a2.width=a9;a2.height=a8;if(aP&&a5!=null&&typeof a5.setSize=="function"){try{a5.setSize(a9,a8)}catch(bb){ak("Set size failed",bb)}}}};var aM=function(a8,a9){V("response:"+a8,a9)};var an=function(a8,a9){ax(a8,a9)};var L=function(a9,a8,bb){if(typeof a5.handleRequest=="function"){try{a5.handleRequest(a8,bb,function(bc){aM(a9,bc)})}catch(ba){ak("Handle request failed",ba);aM(a9)}}else{aM(a9)}};var W=function(a9){if(aP&&a9!=null&&a5!=null){if(typeof a5.handleEvent=="function"){try{a5.handleEvent(a9)}catch(a8){ak("Handle event failed",a8)}}}};var aA=function(bc){if(aP&&bc!=null&&a5!=null){if(a.isFullStr(bc.requestId)&&a.isFullStr(bc.dataId)){L(bc.requestId,bc.dataId,bc.data) -}else{if(bc.data!=null&&a.isFullStr(bc.data.requestId)&&a.isFullStr(bc.data.dataId)){var a9={};var bb=bc.data.dataId;var a8=bb.indexOf(":");if(a8>0){bb=bb.substr(0,a8)}a9[bb]=bc[bb]!=null?bc[bb]:null;a9.error=a.strFullCheck(bc.error,null);an(bc.data.requestId,a9)}else{if(typeof a5.handleData=="function"){try{a5.handleData(bc)}catch(ba){ak("Handle data failed",ba)}}}}}};var ai=function(a8){if(!ao||a8===true){ao=true;if(a5!=null&&typeof a5.init=="function"){try{a5.init()}catch(a9){ak("Call init failed",a9)}}}};var aU=function(a8){if(!aP||a8===true){aP=true;if(a5!=null&&typeof a5.ready=="function"){try{a5.ready()}catch(a9){ak("Call ready failed",a9)}}}};var aJ=function(){aP=false;e.addEventListener("message",function(a8){if(n.checkOrigin(a8.origin)){am(a8.data)}},false);V("plugin:init")};var am=function(a8){if(ao&&a8!=null&&a8.type===N){if(a8.init===1&&aP){return}if(a.isNum(a8.state)){aT(a.strToNum(a8.state,a2.state))}if(a.isNum(a8.position)){aK(a.strToNum(a8.position,a2.position))}if(a.isNum(a8.speed)){a1(a.strToNum(a8.speed,a2.speed)) -}if(a.isNum(a8.volume)){S(false);aL(a.strToNum(a8.volume,a2.volume))}if(a.isBool(a8.muted)){S(a.strToBool(a8.muted,a2.muted))}if(a.isNum(a8.width)&&a.isNum(a8.height)){ap(a.strToNum(a8.width,a2.width),a.strToNum(a8.height,a2.height))}if(a8.init===1){aU()}else{if(a8.data!=null){if(a.isFullStr(a8.data.event)){W(a8.data)}else{aA(a8.data)}}}}};var Z=function(a9){if(e.parent!=null&&a9!=null){a9.type=N;a9.sender="plugin";a9.target="app";try{e.parent.postMessage(a9,"*")}catch(a8){if(e.console!=null){console.error("Post message failed",a8)}}}};this.setupPlayer=function(a8){a5=a8;if(ao){ai(true)}if(aP){aU(true)}};this.setSeekDelay=function(a8){aa.delay=a.strToNum(a8,aa.delay)};this.getSeekDelay=function(){return aa.delay};this.setLoadingDelay=function(a8){aF.delay=a.strToNum(a8,aF.delay)};this.getLoadingDelay=function(){return aF.delay};this.setState=function(a8,a9){if(aP){a2.state=a.strToNum(a8,a2.state);if(a9===true){U()}a0()}};this.getState=function(){return a2.state};this.applyState=function(){if(aP){aT(a2.state,true) -}};this.setPosition=function(a9,a8){if(aP){aX=true;a2.position=a.strToNum(a9,a2.position);if(!isFinite(a2.position)){a2.position=0}aa.stop();if(a8===true){U();a0()}}};this.getPosition=function(){return a2.position};this.applyPosition=function(){if(aP){aK(a2.position,true)}};this.setDuration=function(a8,a9){if(aP){a2.duration=a.strToNum(a8,a2.duration);if(!isFinite(a2.duration)){a2.duration=0}if(a9===true){U();a0()}}};this.getDuration=function(){return a2.duration};this.setSpeed=function(a8,a9){if(aP){a2.speed=a.strToNum(a8,a2.speed);if(a9===true){U();a0()}}};this.getSpeed=function(){return a2.speed};this.applySpeed=function(){if(aP){a1(a2.speed,true)}};this.setEnded=function(a8,a9){if(aP){a2.ended=a.strToBool(a8,a2.ended);if(a9===true){U();a0()}}};this.hasEnded=function(){return a2.ended};this.setVolume=function(a9,a8){if(aP){a2.volume=a.strToNum(a9,a2.volume);if(a8===true){U();a0()}}};this.getVolume=function(){return a2.volume};this.setMuted=function(a8,a9){if(aP){a2.muted=a.strToBool(a8,a2.muted); -if(a9===true){U();a0()}}};this.isMuted=function(){return a2.muted};this.applyVolume=function(){if(aP){aL(a2.volume,true);S(a2.muted,true)}};this.getWidth=function(){return a2.width};this.getHeight=function(){return a2.height};this.applySize=function(){if(aP){ap(a2.width,a2.height,true)}};this.executeAction=function(a8,a9){if(aP){V(a8,a9)}};this.debug=function(a9,a8){if(aP){az(a9,a8)}};this.success=function(a9,a8,ba){if(aP){aE(a9,a8,ba)}};this.info=function(a9,a8,ba){if(aP){a6(a9,a8,ba)}};this.warn=function(a9,a8,ba){if(aP){al(a9,a8,ba)}};this.error=function(a9,a8,ba){if(aP){aw(a9,a8,ba)}};this.showMenu=function(a8){if(aP){aR(a8)}};this.showContent=function(a8){if(aP){au(a8)}};this.showPanel=function(a8){if(aP){at(a8)}};this.showPlayer=function(a8){if(aP){if(a.isFullStr(a8)){V("player:show:"+a8)}else{V("player:show")}}};this.showAction=function(){if(aP){V("player:action")}};this.hidePlayer=function(){if(aP){V("player:hide")}};this.setupContentLabel=function(a8){if(aP){V("player:label:content:"+a.strFullCheck(a8,"default")) -}};this.setupExtensionLabel=function(a8){if(aP){V("player:label:extension:"+a.strFullCheck(a8,"default"))}};this.setupPositionLabel=function(a8){if(aP){V("player:label:position:"+a.strFullCheck(a8,"default"))}};this.setupDurationLabel=function(a8){if(aP){V("player:label:duration:"+a.strFullCheck(a8,"default"))}};this.setupSpeedLabel=function(a8){if(aP){V("player:label:speed:"+a.strFullCheck(a8,"default"))}};this.setupInfoText=function(a8){if(aP){V("player:info:text:"+a.strFullCheck(a8,"default"))}};this.setupInfoImage=function(a8){if(aP){V("player:info:image:"+a.strFullCheck(a8,"default"))}};this.setupButton=function(a8,a9){if(aP&&a.isId(a8)){V("player:button:"+a8+":setup",a9)}};this.enableButton=function(a8){if(aP&&a.isId(a8)){V("player:button:"+a8+":enable")}};this.disableButton=function(a8){if(aP&&a.isId(a8)){V("player:button:"+a8+":disable")}};this.focusButton=function(a8){if(aP&&a.isId(a8)){V("player:button:"+a8+":focus")}};this.setupProgressColor=function(a8){if(aP){V("player:progress:color:"+a.strFullCheck(a8,"default")) -}};this.setupProgressType=function(a8){if(aP){V("player:progress:type:"+a.strFullCheck(a8,"default"))}};this.enableProgressMarker=function(){if(aP){V("player:progress:marker:enable")}};this.disableProgressMarker=function(){if(aP){V("player:progress:marker:disable")}};this.invalidateProgressMarker=function(){if(aP){V("player:progress:marker:invalidate")}};this.setupBackground=function(a8){if(aP){V("player:background:"+a.strFullCheck(a8,"default"))}};this.setupTrigger=function(a8,a9,ba){if(aP&&a.isFullStr(a8)&&a.isFullStr(a9)){if(ba===true){V("trigger:"+a8+":shot:"+a9)}else{V("trigger:"+a8+":"+a9)}}};this.clearTrigger=function(a8){if(aP&&a.isFullStr(a8)){V("trigger:"+a8+":none")}};this.refreshPlayer=function(){if(aP){V("player:refresh")}};this.resetPlayer=function(){if(aP){V("player:reset")}};this.cancelResume=function(){if(aP){V("resume:cancel")}};this.requestData=function(a8,ba,a9){if(aP){ar(a8,ba,a9)}else{Y(ba,{error:"Plugin not ready"})}};this.requestInteractionResponse=function(a8,ba,a9){if(a.isFullStr(a8)){this.requestData("response:request:interaction:"+a8,ba,a9!=null?{requestData:a9}:null) -}else{Y(ba,{error:"Data ID is invalid: '"+a8+"'"})}};this.validateSettings=function(a8){t.invalidateSettings();this.requestData("info",function(a9){t.validateSettings(a9);Y(a8,a9)})};this.onValidatedSettings=function(a8){if(!t.areSettingsValidated()&&!aO){aO=true;this.validateSettings(function(){aO=false})}t.onValidatedSettings(a8)};this.triggerEvent=function(a8,a9){if(aP&&a.isFullStr(a8)){V("event:"+a8,a9)}};this.setupSteam=function(a8){af(a8)};this.createSteam=function(a8){return aq(a8)};this.resolveToken=function(a8,a9){return M(a8,a9)};this.transformString=function(a8,a9){return aG(a8,a9)};this.normalizeString=function(a8,a9){return ad(a8,a9)};this.transformStringAsync=function(ba,bb,a9){var a8=aG(ba,bb);if(a.isFullStr(a8)){this.requestData("string:transform:"+a8,function(bc){Y(a9,{string:a.strFullCheck(bc.string,null)})})}else{Y(a9,{string:null})}};this.normalizeStringAsync=function(a9,ba,a8){if(a.isFullStr(a9)){this.requestData("string:normalize:"+a9,function(bb){Y(a8,{string:ad(bb.string,ba)}) -})}else{Y(a8,{string:null})}};this.createHashKey=function(a8,a9){return n.createHashKey(a8,a9)};this.clearDeviceId=function(){n.clearDeviceId()};this.getDeviceId=function(a8){return n.getDeviceId(a8)};this.requestDeviceId=function(a8){this.requestData("info:extended",function(a9){if(a9.error!=null){Y(a8,{error:a9.error})}else{Y(a8,{deviceId:n.getDeviceId(a9)})}})};this.hasContentObservers=function(){return aW.hasObservers()};this.addContentObserver=function(a8,a9){aW.addObserver(a8,a9);ah(a8)};this.removeContentObserver=function(a8){aW.removeObserver(a8);ah()};this.clearContentObservers=function(){aW.clear();ah()};this.init=function(){if(!ao){aJ();aH();ai()}};this.commit=function(){if(aP){U();a0()}};this.isInitialized=function(){return ao};this.isReady=function(){return aP};this.startPlayback=function(a8){if(aP){aT(z.PLAYING,true);U();a0();if(a8===true){a4()}}};this.stopPlayback=function(){if(aP){this.setEnded(true);U();ac()}};this.cancelPlayback=function(){if(aP){V("player:eject")}};this.startLoading=function(){if(aP){aF.start(function(){R=true; -V("player:busy:start:loading")})}};this.stopLoading=function(){if(aP){aF.stop();if(R){R=false;V("player:busy:stop:loading")}}}};var y=new function(){var N="interactionPlugin";var ar="irq";var ah=10;var aK=30000;var Z=new p("j3RZ!=Y$M5TZ#JPem'P1i(Tf?X3WcGlyCqNeXRbp02HL]I~r!IfO(pvxQ7At%9yq.5=)wm@0o?Js[sUbUH416uhd;_S/Qr,w7vW]jBgND;GazhCL+D%z~8ni+n-B_E-KK42tl[OAV@*E.Ya6$V,&kF)o&Mg98#'ucx/dk*SF");var S=null;var R=false;var au=new o(1000);var aC=false;var aj=false;var ad=null;var aB=false;var aG=null;var aa=function(aO){S=new p(aO)};var ak=function(aO){if(aC){if(aO=="local"){return S!=null?S.createSteam():null}return Z.createSteam()}return null};var L=function(aO,aP){if(aC){if(aP=="local"){return S!=null?S.resolveToken(aO):null}return Z.resolveToken(aO)}return null};var av=function(aO,aP){if(aC){if(aP=="local"){return S!=null?S.transformString(aO):null}else{if(aP=="global"){return Z.transformString(aO)}else{if(aP=="shared"){return n.transformString(S!=null?S.transformString(aO):aO)}}}return Z.transformString(S!=null?S.transformString(aO):aO) -}return null};var Y=function(aO,aP){if(aC){if(aP=="local"){return S!=null?S.normalizeString(aO):null}else{if(aP=="global"){return Z.normalizeString(aO)}else{if(aP=="shared"){return S!=null?S.normalizeString(n.normalizeString(aO)):n.normalizeString(aO)}}}return S!=null?S.normalizeString(Z.normalizeString(aO)):Z.normalizeString(aO)}return null};var aL=0;var aF={};var am=function(aQ){aL++;var aO=ar+aL+"_"+g.getTimestamp();var aP={timeout:new o(aK),callback:aQ};aF[aO]=aP;aP.timeout.start(function(){ao(aO,{error:"Request timed out"})});return aO};var ao=function(aO,aQ){if(aO!=null){var aP=aF[aO];if(aP!=null){aP.timeout.stop();delete aF[aO];V(aP.callback,aQ)}}};var V=function(aQ,aO){if(typeof aQ=="function"){try{aQ(aO)}catch(aP){af("Callback error",aP)}}};var aJ=new h();var ae=new o(500);var ap=null;var ax=null;var ab=function(aO){if(aO!=null){if(t.isSameContentState(ap,aO)){if(!t.isSameContentState(ax,aO)){if(ax==null){aO.init=true}ax=t.createChangedContentState(ax,aO);aJ.notifyObservers(ax) -}}else{ap=aO}}ac()};var aA=function(){if(aC){al("info:content",function(aO){ab(aO.info!=null&&aO.info.content!=null?aO.info.content.state:null)})}else{ac()}};var ac=function(aO){if(aJ.hasObservers()){if(a.isFullStr(aO)&&ax!=null){aJ.notifyObserver(aO,ax)}ae.start(aA)}else{ap=null;ax=null;ae.stop()}};var T=function(aO,aP){if(a.isFullStr(aO)){W({action:aO,data:aP!=null?aP:null})}};var aw=function(aP,aO){if(a.isFullStr(aP)){if(aO!==false){T("logger:debug:"+aP)}}};var at=function(aP,aO,aQ){if(a.isFullStr(aP)){if(aO!==false){T("logger:success:"+aP,{show:aQ!==false})}else{if(aQ!==false){T("success:"+aP)}}}};var aN=function(aP,aO,aQ){if(a.isFullStr(aP)){if(aO!==false){T("logger:info:"+aP,{show:aQ!==false})}else{if(aQ!==false){T("info:"+aP)}}}};var ag=function(aP,aO,aQ){if(a.isFullStr(aP)){if(aO!==false){T("logger:warn:"+aP,{show:aQ!==false})}else{if(aQ!==false){T("warn:"+aP)}}}};var an=function(aP,aO,aQ){if(a.isFullStr(aP)){if(aO!==false){T("logger:error:"+aP,{show:aQ!==false})}else{if(aQ!==false){T("error:"+aP) -}}}};var P=function(aO,aP){if(a.isFullStr(aO)&&aP!=null){if(typeof aP=="object"){T(aO+":data",aP)}else{T(aO+":"+aP)}}};var aE=function(aO){P("menu",aO)};var X=function(aO){P("content",aO)};var U=function(aO){P("panel",aO)};var al=function(aO,aQ,aP){if(a.isFullStr(aO)){if(aP==null){aP={}}aP.requestId=am(aQ);aP.dataId=aO;T("interaction:commit:"+aO,aP)}else{V(aQ,{error:"Data ID is invalid: '"+aO+"'"})}};var af=function(aO,aP){if(aO!=null&&aP!=null){if(aP.name!=null&&aP.message!=null){an("Interaction: "+aO+": "+aP.name+": "+aP.message)}else{an("Interaction: "+aO+": "+aP)}}};var az=function(aO,aP){T("response:"+aO,aP)};var ai=function(aO,aP){ao(aO,aP)};var K=function(aP,aO,aR){if(typeof ad.handleRequest=="function"){try{ad.handleRequest(aO,aR,function(aS){az(aP,aS)})}catch(aQ){af("Handle request failed",aQ);az(aP)}}else{az(aP)}};var aM=function(aP){if(aC&&aP!=null&&ad!=null){if(typeof ad.handleEvent=="function"){try{ad.handleEvent(aP)}catch(aO){af("Handle event failed",aO)}}}};var aq=function(aS){if(aC&&aS!=null&&ad!=null){if(a.isFullStr(aS.requestId)&&a.isFullStr(aS.dataId)){K(aS.requestId,aS.dataId,aS.data) -}else{if(aS.data!=null&&a.isFullStr(aS.data.requestId)&&a.isFullStr(aS.data.dataId)){var aP={};var aR=aS.data.dataId;var aO=aR.indexOf(":");if(aO>0){aR=aR.substr(0,aO)}aP[aR]=aS[aR]!=null?aS[aR]:null;aP.error=a.strFullCheck(aS.error,null);ai(aS.data.requestId,aP)}else{if(typeof ad.handleData=="function"){try{ad.handleData(aS)}catch(aQ){af("Handle data failed",aQ)}}}}}};var aH=function(aO){aG=aO!=null&&aO.length>0?aO:null};var Q=function(){if(aG!=null&&aG.length>0){for(var aO=0;aO=ah){aG.shift()}aG.push(aO)}};var O=function(aO){if(!aj||aO===true){aj=true;if(ad!=null&&typeof ad.init=="function"){try{ad.init()}catch(aP){af("Call init failed",aP)}}}};var aD=function(aO){if(!aC||aO===true){aC=true;if(ad!=null&&typeof ad.ready=="function"){try{ad.ready()}catch(aP){af("Call ready failed",aP)}}if(ad!=null){Q()}}};var ay=function(){aC=false;e.addEventListener("message",function(aO){if(n.checkOrigin(aO.origin)){M(aO.data) -}},false);T("interaction:init")};var M=function(aO){if(aj&&aO!=null&&aO.type===N){if(aO.init===1&&aC){return}if(aO.init===1){aH(aO.data);aD()}else{if(aO.data!=null){if(a.isFullStr(aO.data.event)){aM(aO.data)}else{if(ad!=null){aq(aO.data)}else{aI(aO.data)}}}}}};var W=function(aP){if(e.parent!=null&&aP!=null){aP.type=N;aP.sender="plugin";aP.target="app";try{e.parent.postMessage(aP,"*")}catch(aO){if(e.console!=null){console.error("Post message failed",aO)}}}};this.setupHandler=function(aO){ad=aO;if(aj){O(true)}if(aC){aD(true)}};this.setLoadingDelay=function(aO){au.delay=a.strToNum(aO,au.delay)};this.getLoadingDelay=function(){return au.delay};this.executeAction=function(aO,aP){if(aC){T(aO,aP)}};this.debug=function(aP,aO){if(aC){aw(aP,aO)}};this.success=function(aP,aO,aQ){if(aC){at(aP,aO,aQ)}};this.info=function(aP,aO,aQ){if(aC){aN(aP,aO,aQ)}};this.warn=function(aP,aO,aQ){if(aC){ag(aP,aO,aQ)}};this.error=function(aP,aO,aQ){if(aC){an(aP,aO,aQ)}};this.showMenu=function(aO){if(aC){aE(aO)}};this.showContent=function(aO){if(aC){X(aO) -}};this.showPanel=function(aO){if(aC){U(aO)}};this.requestData=function(aO,aQ,aP){if(aC){al(aO,aQ,aP)}else{V(aQ,{error:"Plugin not ready"})}};this.requestPlayerResponse=function(aO,aQ,aP){if(a.isFullStr(aO)){this.requestData("response:request:player:"+aO,aQ,aP!=null?{requestData:aP}:null)}else{V(aQ,{error:"Data ID is invalid: '"+aO+"'"})}};this.validateSettings=function(aO){t.invalidateSettings();this.requestData("info",function(aP){t.validateSettings(aP);V(aO,aP)})};this.onValidatedSettings=function(aO){if(!t.areSettingsValidated()&&!aB){aB=true;this.validateSettings(function(){aB=false})}t.onValidatedSettings(aO)};this.triggerEvent=function(aO,aP){if(aC&&a.isFullStr(aO)){T("event:"+aO,aP)}};this.setupSteam=function(aO){aa(aO)};this.createSteam=function(aO){return ak(aO)};this.resolveToken=function(aO,aP){return L(aO,aP)};this.transformString=function(aO,aP){return av(aO,aP)};this.normalizeString=function(aO,aP){return Y(aO,aP)};this.transformStringAsync=function(aQ,aR,aP){var aO=av(aQ,aR); -if(a.isFullStr(aO)){this.requestData("string:transform:"+aO,function(aS){V(aP,{string:a.strFullCheck(aS.string,null)})})}else{V(aP,{string:null})}};this.normalizeStringAsync=function(aP,aQ,aO){if(a.isFullStr(aP)){this.requestData("string:normalize:"+aP,function(aR){V(aO,{string:Y(aR.string,aQ)})})}else{V(aO,{string:null})}};this.createHashKey=function(aO,aP){return n.createHashKey(aO,aP)};this.clearDeviceId=function(){n.clearDeviceId()};this.getDeviceId=function(aO){return n.getDeviceId(aO)};this.requestDeviceId=function(aO){this.requestData("info:extended",function(aP){if(aP.error!=null){V(aO,{error:aP.error})}else{V(aO,{deviceId:n.getDeviceId(aP)})}})};this.hasContentObservers=function(){return aJ.hasObservers()};this.addContentObserver=function(aO,aP){aJ.addObserver(aO,aP);ac(aO)};this.removeContentObserver=function(aO){aJ.removeObserver(aO);ac()};this.clearContentObservers=function(){aJ.clear();ac()};this.init=function(){if(!aj){ay();O()}};this.isInitialized=function(){return aj};this.isReady=function(){return aC -};this.startLoading=function(){if(aC){au.start(function(){R=true;T("interaction:busy:start:loading")})}};this.stopLoading=function(){if(aC){au.stop();if(R){R=false;T("interaction:busy:stop:loading")}}}};e.TVXSettings=k;e.TVXStyles=l;e.TVXTools=a;e.TVXDateTools=g;e.TVXDateFormatter=H;e.TVXPropertyTools=F;e.TVXVideoState=z;e.TVXAction=f;e.TVXCookies=J;e.TVXStorage=d;e.TVXUrlParams=B;e.TVXOptions=C;e.TVXObservers=h;e.TVXEventObservers=I;e.TVXQueue=x;e.TVXWorker=c;e.TVXDelay=o;e.TVXClick=E;e.TVXAjax=j;e.TVXLogLevel=s;e.TVXLogger=v;e.TVXDictionary=q;e.TVXClock=i;e.TVXServices=A;e.TVXDataLoader=u;e.TVXDataService=D;e.TVXBlobService=r;e.TVXRequestService=w;e.TVXBusyService=b;e.TVXPluginTools=t;e.TVXVideoPlugin=G;e.TVXInteractionPlugin=y})(window,document); \ No newline at end of file diff --git a/server/web/msx/route.go b/server/web/msx/route.go deleted file mode 100644 index 97259e0..0000000 --- a/server/web/msx/route.go +++ /dev/null @@ -1,22 +0,0 @@ -package msx - -import "github.com/gin-gonic/gin" - -func SetupRoute(route *gin.RouterGroup) { - route.GET("/msx/start.json", msxStart) - route.GET("/msx/torrents", msxTorrents) - route.GET("/msx/playlist", msxPlaylist) - route.GET("/msx/playlist/*fname", msxPlaylist) - - route.GET("/msx/html5x.html", func(c *gin.Context) { - c.Data(200, "text/html; charset=utf-8", Msxhtml5xhtml) - }) - - route.GET("/msx/tizen.html", func(c *gin.Context) { - c.Data(200, "text/html; charset=utf-8", Msxtizenhtml) - }) - - route.GET("/msx/tvx-plugin.min.js", func(c *gin.Context) { - c.Data(200, "text/javascript; charset=utf-8", Msxtvxpluginminjs) - }) -} diff --git a/web/src/components/About/index.jsx b/web/src/components/About/index.jsx index 940b75b..be95cf0 100644 --- a/web/src/components/About/index.jsx +++ b/web/src/components/About/index.jsx @@ -80,7 +80,7 @@ export default function AboutDialog() { - + diff --git a/web/src/locales/en/translation.json b/web/src/locales/en/translation.json index f2afcac..7b6836f 100644 --- a/web/src/locales/en/translation.json +++ b/web/src/locales/en/translation.json @@ -74,7 +74,7 @@ "PiecesLength": "Pieces length", "Playlist": "Playlist", "Preload": "Preload", - "ProjectSource": "Project page", + "ProjectSource": "Project GitHub", "PWAGuide": { "Header": "Install application", "Description": "Install the app on your device to easily access it anytime. No app store. No download.", diff --git a/web/src/locales/ru/translation.json b/web/src/locales/ru/translation.json index fcd66c4..2609fac 100644 --- a/web/src/locales/ru/translation.json +++ b/web/src/locales/ru/translation.json @@ -4,7 +4,7 @@ "Add": "Добавить", "AddDialog": { "AddPosterLinkInput": "Ссылка на постер", - "AddTorrentSourceNotification": "Сначала добавьте torrent-источник", + "AddTorrentSourceNotification": "Сначала добавьте торрент", "AppendFile": { "Or": "ИЛИ", "ClickOrDrag": "НАЖМИТЕ / ПЕРЕТАЩИТЕ ФАЙЛ (.torrent)" @@ -16,7 +16,7 @@ "TitleBlank": "Название (пустое - ориг. название торрента)", "TorrentSourceLink": "Ссылка на источник торрента", "TorrentSourceOptions": "magnet-ссылка / хеш / ссылка на .torrent файл", - "WrongTorrentSource": "Неправильный torrent-источник" + "WrongTorrentSource": "Неправильный торрент" }, "AddFromLink": "Добавить", "AddNewTorrent": "Добавить новый торрент", @@ -74,11 +74,11 @@ "PiecesLength": "Размер блока", "Playlist": "Плейлист", "Preload": "Предзагр.", - "ProjectSource": "Сайт проекта", + "ProjectSource": "GitHub проекта", "PWAGuide": { "Header": "Установить приложение", "Description": "Установите приложение на ваше устройство для быстрого доступа в любой момент. Без AppStore. Без загрузки.", - "VLC": "VLC кнопка будет добавлена для мгновенного воспроизведения на телефоне", + "VLC": "Кнопка VLC будет добавлена для мгновенного воспроизведения на телефоне", "FirstStep": "Нажмите на", "SecondStep": { "Select": "Выбирите", @@ -137,7 +137,7 @@ "UseDiskDesc": "Рекомендуется использовать оперативную память или внешние носители на устройствах с flash-памятью", "Tabs": { "Main": "Основные", - "Additional": "Дополнительные", + "Additional": "Расширенные", "AdditionalDisabled": "(включите ПРО-режим)", "App": "Приложение" }, diff --git a/web/yarn.lock b/web/yarn.lock index 392b64a..1482050 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -4051,9 +4051,9 @@ cookie@0.5.0: integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== cookiejar@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" - integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== + version "2.1.4" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" + integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== copy-concurrently@^1.0.0: version "1.0.5"