|
Server : Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12 System : Windows NT SERVER-PC 10.0 build 26200 (Windows 11) AMD64 User : ServerPC ( 0) PHP Version : 8.2.12 Disable Function : NONE Directory : C:/Program Files (x86)/Steam/steamapps/common/wallpaper_engine/ui/dist/scripts/ |
Upload File : |
"use strict";window.keyPressSanitize=function(e){return"$"!==String.fromCharCode(e.which)||(e.preventDefault(),!1)},window.pasteSanitize=function(e){var t=e&&e.clipboardData&&e.clipboardData.getData("text");return!t||!t.includes("$")||(e.preventDefault(),!1)},angular.isUndefinedOrNull=function(e){return angular.isUndefined(e)||null===e},angular.offsetToAncestor=function(e,t){return{left:e.pageX-t.offset().left+t.scrollLeft(),top:e.pageY-t.offset().top+t.scrollTop()}},angular.frameTimeout=function(t,e,a){for(var i=function(e){return function(){t(e)}},n=i(a),o=1;o<e;++o)n=i(n);n()},angular.clearHashKeys=function(e){angular.isObject(e)&&delete e.$$hashKey,(angular.isObject(e)||angular.isArray(e))&&angular.forEach(e,function(e){angular.clearHashKeys(e)})},angular.hasNestedMember=function(e,t){if(angular.isObject(e)&&e.hasOwnProperty(t)&&angular.isDefined(e[t]))return!0;if(angular.isObject(e)||angular.isArray(e)){var a=!1;return angular.forEach(e,function(e){(angular.isObject(e)||angular.isArray(e))&&(a=a||angular.hasNestedMember(e,t))}),a}return!1},angular.getNestedMemberParents=function(e,t){if(angular.isObject(e)&&e.hasOwnProperty(t)&&angular.isDefined(e[t]))return[e];if(angular.isObject(e)||angular.isArray(e)){var a=[];return angular.forEach(e,function(e){!angular.isObject(e)&&!angular.isArray(e)||(e=angular.getNestedMemberParents(e,t))&&(a=a.concat(e))}),a}return[]},angular.sanitizeObject=function(e){return angular.fromJson(angular.toJson(e))},angular.isBoolean=function(e){return!0===e||!1===e},String.prototype.beginsWith=function(e){return 0===this.indexOf(e)},String.prototype.empty=function(){return 0===this.trim().length},Math.clamp=function(e,t,a){return Math.max(t,Math.min(e,a))},Math.easeInOutQuad=function(e){return e<.5?2*e*e:(4-2*e)*e-1},Math.easeInOutCubic=function(e){return e<.5?4*e*e*e:(e-1)*(2*e-2)*(2*e-2)+1},Array.prototype.findAndRemove=function(e){if(angular.isFunction(e))for(var t=0;t<this.length;++t)e(this[t])&&(this.splice(t,1),--t);else{var a=this.indexOf(e);0<=a&&this.splice(a,1)}return this},Array.prototype.findAndRemoveMultiple=function(e){return e.forEach(e=>{e=this.indexOf(e);0<=e&&this.splice(e,1)}),this},Array.prototype.findAndReplace=function(e,t){for(var a=0;a<this.length;++a)if(e(this[a]))return this.splice(a,1,t);return[]},Array.prototype.pushIfNew=function(e,t){angular.isFunction(t)?e&&this.findIndex(t)<0&&this.push(e):e&&!this.includes(e)&&this.push(e)},Array.prototype.unshiftIfNew=function(e){e&&!this.includes(e)&&this.unshift(e)},Array.prototype.sliceLimit=function(e,t){return e>this.length||t<0?[]:this.slice(Math.max(0,e),Math.min(this.length,t))},Array.prototype.shuffle=function(){for(var e,t,a=this,i=a.length-1;0<i;i--)e=Math.floor(Math.random()*(i+1)),t=a[i],a[i]=a[e],a[e]=t;return a},Array.prototype.first=function(){if(0<this.length)return this[0]},Array.prototype.last=function(){if(0<this.length)return this[this.length-1]},Array.prototype.move=function(e,t){this.splice(t,0,this.splice(e,1)[0])},Array.prototype.uniquify=function(){return Array.from(new Set(this))},Array.prototype.empty=function(){return 0===this.length},Object.clear=function(t){return angular.forEach(Object.keys(t),function(e){delete t[e]}),t},String.prototype.hashCode=function(){for(var e=0,t=this.length,a=0;a<t;a++)e=31*e+this.charCodeAt(a),e&=e;return e},String.prototype.capitalizeFirstLetter=function(){return this.charAt(0).toUpperCase()+this.slice(1)},String.prototype.splitOnFirst=function(e){e=this.indexOf(e);return e<0?[]:[this.substring(0,e),this.substring(e+1)]},String.prototype.splitTimes=function(e,t){for(var a,i=[],n=this;0<t--&&!((a=n.indexOf(e))<0);)i.push(n.substring(0,a)),n=n.substring(a+1);return i.push(n),i},JSON.validate=function(e,t){try{JSON.parse(e)}catch(e){return angular.isObject(t)&&(t.exception=e&&e.message),!1}return!0},JSON.clean=function(e){return angular.isObject(e)||angular.isArray(e)?angular.fromJson(angular.toJson(e)):angular.isString()?angular.toJson(angular.fromJson(e)):void 0},window.safeApply=function(e){var t=e.$root.$$phase;"$apply"!==t&&"$digest"!==t&&e.$apply()},window.cancelEventBubble=function(e){e.stopPropagation(),e.preventDefault()},window.cancelEventImmediately=function(e){e.stopImmediatePropagation(),e.preventDefault()},angular.module("wallpaperbrowserApp",["ngRoute","ui.bootstrap","ngAnimate","rzModule","angularSpectrumColorpicker","toastr","ngSanitize","ngTagsInput","pascalprecht.translate"]).config(["$routeProvider","$compileProvider","$locationProvider","$sceDelegateProvider","toastrConfig",function(e,t,a,i,n){e.when("/browsewallpapers",{templateUrl:"views/views/browsewallpapers.html",controller:"BrowseWallpapersCtrl",options:{caption:"ui_caption_browse",showMiniMode:!0,expectProviderConnection:!0}}).when("/settings",{templateUrl:"views/views/settings.html",controller:"SettingsCtrl",options:{caption:"ui_caption_settings"}}).when("/editor",{templateUrl:"views/views/editor.html",controller:"EditorCtrl",options:{caption:"ui_caption_editor",expectProviderConnection:!0}}).when("/welcome",{templateUrl:"views/views/welcome.html",controller:"WelcomeCtrl",options:{caption:" ",isDialog:!0,hideTitle:!1}}).when("/",{templateUrl:"views/views/empty.html",controller:"EmptyCtrl"}).otherwise({redirectTo:"/"}),a.hashPrefix(""),t.imgSrcSanitizationWhitelist(/^\s*(https?|file|data):/),t.aHrefSanitizationWhitelist(/^\s*((https?|mailto|file):\/\/)?(www\.|space\.)?((steamcommunity|artstation|youtube|paypal|bilibili|discord|twitch|ko-fi)\.com|(bilibili|twitch)\.tv|(youtu)\.be|(discord)\.gg)/i),t.debugInfoEnabled(!1),t.commentDirectivesEnabled(!1),t.cssClassDirectivesEnabled(!1),i.resourceUrlWhitelist(["self","https://www.youtube.com/**"]),angular.extend(n,{positionClass:"toast-bottom-right"})}]).config(["$translateProvider",function(e){e.preferredLanguage("en-us"),e.fallbackLanguage("en-us"),e.useLoader("localeLoader"),e.useSanitizeValueStrategy("sce")}]).factory("localeLoader",["$q","$http","localeLoaderSupport",function(n,e,o){var r={};return function(a){function t(e){var t=o.getTranslations(a.key);angular.isObject(t)&&(angular.extend(t,e),e=t),i.resolve(e)}var e,i=n.defer();return angular.isObject(r[a.key])?t(r[a.key]):(e=n.defer(),window.global._wpxLocale&&e.resolve(window.global._wpxLocale(a.key)),e.promise.then(function(e){e.success?(e=angular.fromJson(e.translations),"en-us"===a.key&&angular.extend(e,{"system_language_ar-sa":"اللغة العربية الفصحى","system_language_be-by":"Беларуская","system_language_bg-bg":"български","system_language_cs-cz":"čeština","system_language_da-dk":"Dansk","system_language_de-de":"Deutsch","system_language_el-gr":"Eλληνικά","system_language_en-us":"English","system_language_es-es":"Español","system_language_eu-es":"Euskara","system_language_fa-ir":"فارسی","system_language_fi-fi":"Suomi","system_language_fr-fr":"Français","system_language_he-il":"עברית","system_language_hu-hu":"Magyar","system_language_id-id":"Bahasa Indonesia","system_language_it-it":"Italiano","system_language_ja-jp":"日本語","system_language_ko-kr":"한국어","system_language_lt-lt":"Lietuvių kalba","system_language_nl-nl":"Nederlands","system_language_nb-no":"Norsk","system_language_pl-pl":"Polski","system_language_pt-br":"Português-Brasil","system_language_pt-pt":"Português","system_language_ro-ro":"Română","system_language_ru-ru":"Русский язык","system_language_sk-sk":"Slovenčina","system_language_sl-si":"Slovenščina","system_language_sv-se":"Svenska","system_language_th-th":"ภาษาไทย","system_language_tr-tr":"Türkçe","system_language_uk-ua":"Українська","system_language_vi-vn":"tiếng việt","system_language_zh-chs":"简体中文","system_language_zh-cht":"繁體中文"}),r[a.key]=e,t(e)):t({})})),i.promise}}]).run(["$rootScope","$location","$route","$timeout","skin","utils",function(e,t,a,i,n,o){window.rootScope=e,window.utilsService=o,window.skinService=n;var r=new URL(window.location.href),s=r.searchParams.get("provider"),l=r.searchParams.get("lang");o.setProvider(s),"wegame"===s?o.setLanguage("zh-chs"):l&&o.setLanguage(l);function c(){return!!(p.needsInit&&window&&window.global&&angular.isFunction(window.global.jsInit))&&(p.needsInit=!1,null!==l&&a.current&&a.current.options&&a.current.options.expectProviderConnection&&n.onOSProviderConnectionChanged(!0),window.global.jsInit(),!0)}function d(){i(function(){c()||p.needsInit&&d()})}var p={needsInit:!0},u=e.$on("$routeChangeSuccess",function(){angular.isFunction(u)&&(u(),u=void 0,i(c,100))});angular.element(function(){i(function(){d()},3e3)})}]).filter("filename",function(){return function(e){return e&&e.replace(/^.*[\\\/]/,"")}}).filter("usershortcut",function(){return function(e){e=e.splitTimes(":",2);return 3===e.length?e[2]:""}}),window.wpxGlobalData={},window.wpxGlobalData.lutFilterOptionFiles=["k23_b","lutx32_adventure","lutx32_coloration","simple_film","lutx32_bluenavy","80s_post-apocalyptic_action","desert_4","desperado","lutx32_dusk","lutx32_honeyb","lutx32_sandyskyd","lutx32_slate","lutx32_westernf","setting_sun","tower","lutx32_amber","aliens_2","lutx32_daisy","lutx32_emeraldd","lutx32_ferne","lutx32_backsea","lutx32_beach","lutx32_studio","sharp_wasteland","gamebob_2"],angular.module("wallpaperbrowserApp").controller("MainCtrl",function(){this.awesomeThings=["HTML5 Boilerplate","AngularJS","Karma"]}),angular.module("wallpaperbrowserApp").directive("titlebar",["$rootScope","$route","skin",function(e,t,n){return{templateUrl:"views/templates/titlebar.html",restrict:"E",link:function(a){function i(e){angular.isObject(e)&&angular.isObject(e.options)&&(a.caption=e.options.caption,a.isDialog=e.options.isDialog,a.hideTitle=e.options.hideTitle,a.showMiniMode=e.options.showMiniMode)}a.isMaximized=n.isMaximized(),a.isDialog=!1,a.maximizeEnabled=!0,a.caption="404",a.captionValues={},a.closeWindow=function(){n.runCloseCallbacks().then(function(){window.ui.close()})},a.sendToggleMiniMode=function(){e.$broadcast("sendToggleMiniMode")},a.$on("onMiniModeChanged",function(e,t){a.isMiniMode=t}),a.$on("onMaximizedChanged",function(e,t){a.isMaximized=t,window.safeApply(a)}),a.$on("onMaximizeEnabledChanged",function(e,t){a.maximizeEnabled=t,window.safeApply(a)}),a.$on("$routeChangeSuccess",function(e,t){i(t)}),e.$on("onVersionSubmitted",function(e,t){a.captionValues.version=t}),i(t.current)}}}]),angular.module("wallpaperbrowserApp").service("skin",["$rootScope","$q","$document","$timeout","utils","modals",function(t,a,e,i,n,o){var r,s=!1,l=0,c=0,d=32,p=[],u=!1;this.setWindowsVersion=function(e,t,a){l=e,d=a,22e3<=(c=t)&&document.documentElement.classList.add("windows11Node"),n.registerWindowsVersion(e)},this.getWindowsVersion=function(){return l},this.getWindowsBuild=function(){return c},this.isWindows64Bit=function(){return 64===d},this.isMaximized=function(){return s},this.setAvailableSkins=function(e){0},this.refreshSkin=function(){window.ui.refreshSkin()},this.setMaximized=function(e){s=e,t.$broadcast("onMaximizedChanged",e)},this.setMaximizeEnabled=function(e){t.$broadcast("onMaximizeEnabledChanged",e)},this.flashWindow=function(){e[0].body.className=e[0].body.className.replace(" captionFlashAnim",""),i(function(){e[0].body.className+=" captionFlashAnim"}),i(function(){e[0].body.className=e[0].body.className.replace(" captionFlashAnim","")},1e3)},this.onOSModalChanged=function(e){t.osModalActive=e,t.$apply()},this.onOSProviderConnectionChanged=function(e){e&&n.showOSProviderConnectionOverlay()?r=r||i(function(){t.osProviderIsConnecting=!0,t.$apply()},2e3):(i.cancel(r),r=void 0,t.osProviderIsConnecting=!1,t.$apply())},this.addCloseCallback=function(e){p.push(e)},this.removeCloseCallback=function(e){p.findAndRemove(e)},this.runCloseCallbacks=function(){var t=a.when();return angular.forEach(p,function(e){t=t.then(e)}),t},this.applyDWMColorSettings=function(e){var t=a.defer();if(!0===e.adjustdwmcolorwarning)t.resolve();else{if(!1!==e.adjustdwmcolor&&l<10||"disabled"!==e.adjustdwmcolormode&&10<=l)return o.open("genericConfirm",{data:{title:"ui_settings_adjust_windows_color_warning_header",message:"ui_settings_adjust_windows_color_warning_body",cancelVisible:!0,okVisible:!0}},{backdropClass:"modal-backdrop-danger"}).then(function(){e.adjustdwmcolorwarning=!0}).catch(function(){e.adjustdwmcolor=!1,e.adjustdwmcolormode="disabled"});t.resolve()}return t.promise},this.isDarkTheme=function(){return["dark","halloween","moss","rust","obsidian","space","winter"].includes(angular.element("#mainStyle").attr("skin-key"))},this.isDebugMode=function(){return u},t.$on("onCppInit",function(e,t){u=t})}]),angular.module("wallpaperbrowserApp").controller("BrowseWallpapersCtrl",["$templateRequest","$document","$compile","$sanitize","$filter","$translate","$parse","$timeout","$q","$rootScope","$scope","$location","contextMenu","utils","modals","host","skin","dragdrop","localeLoaderSupport",function(e,c,d,a,i,I,t,v,R,n,D,o,W,B,F,j,h,r,s){var b,V,l=["76561197975619619","76561198008830389","76561198447701318"],L=["76561197975619619","76561197980238112","76561199522126595"],p=angular.element("#PlaylistContainer"),u=angular.element("#PlaylistContainerRow"),g=angular.element("#WallpaperBrowseInner1"),f={},m=!1,_={},y=!1,w=[],k=1,x=!0,S=!1,C=0,E=[],P={normal:650,backup:1e3},M={},A={},T={},O={},z=[],$=[],H=[],U={current:1,count:1,pages:[],visible:!0},G={current:1,count:1,pages:[],visible:!1},q=angular.copy(U),N=!1;const Q="trend_year";function K(t){return function(e){return e.id===t}}var Y={name:function(e,t){return angular.isString(e.title)&&angular.isString(t.title)?e.title.localeCompare(t.title):0},rating:function(e,t){return e.rating===t.rating?Y.name(e,t):t.rating-e.rating},subscriptiondate:function(e,t){return e.subscriptiondate===t.subscriptiondate&&0===e.subscriptiondate?Y.name(e,t):e.subscriptiondate>t.subscriptiondate?-1:1},updatedate:function(e,t){return e.updatedate===t.updatedate&&0===e.updatedate?Y.name(e,t):e.updatedate>t.updatedate?-1:1},favorite:function(e,t){return e.favorite!==t.favorite?e.favorite?-1:1:Y.name(e,t)},filesize:function(e,t){return e.filesize===t.filesize&&0===e.filesize?Y.name(e,t):e.filesize>t.filesize?-1:1}},X={name:function(e,t){return angular.isString(e.title)&&angular.isString(t.title)?t.title.localeCompare(e.title):0},rating:function(e,t){return e.rating===t.rating?X.name(e,t):e.rating-t.rating},subscriptiondate:function(e,t){return e.subscriptiondate===t.subscriptiondate&&0===e.subscriptiondate?X.name(e,t):t.subscriptiondate>e.subscriptiondate?-1:1},updatedate:function(e,t){return e.updatedate===t.updatedate&&0===e.updatedate?X.name(e,t):t.updatedate>e.updatedate?-1:1},favorite:function(e,t){return e.favorite!==t.favorite?t.favorite?-1:1:X.name(e,t)},filesize:function(e,t){return e.filesize===t.filesize&&0===e.filesize?X.name(e,t):t.filesize>e.filesize?-1:1}};function J(){return{delay:60,order:"random",mode:"timer",transition:"0",transitiontime:1500,videosequence:!1,updateonpause:!1}}function Z(){var e=B.getResolutionTags(),t={};return angular.forEach(e,function(e){t[e]=!0}),t}function ee(){return{filterFavoritesOnly:!1,filterMobileCompatibleOnly:!1}}function te(e){var t=B.getAvailableTags(),a={};return angular.forEach(t,function(e){a[e]=!0}),e||(a.Unspecified=!1),a}function ae(e){return!1===e.Anime?["Anime","MMD","Girls","Guys","Music"]:[]}function ie(e){var t=[];return!0===e.recommendedresolution&&(t=angular.copy(E)),!1===e.showotherresolution&&t.push("Other resolution"),t}function ne(e){return"workshop"===e?{type:"",categorytags:{Wallpaper:!0,Preset:!0},typetags:{Scene:!0,Web:!0,Application:!1,Video:!0},sourcetags:{Official:!0,Workshop:!0,Local:!0},ratingtags:{Mature:!1,Questionable:!1,Everyone:!0},resolutiontags:Z(),tags:te(),utilitytags:{},sort:Q,descending:!1,text:"",filterTitle:!0}:{type:"",categorytags:{Wallpaper:!0,Preset:!0},typetags:{Scene:!0,Web:!0,Application:!0,Video:!0},sourcetags:{Official:!0,Workshop:!0,Local:!0},ratingtags:{Mature:!0,Questionable:!0,Everyone:!0},resolutiontags:Z(),tags:te(!0),utilitytags:{},sort:z[0].value,descending:!1,text:""}}function oe(t,e){angular.isObject(t.resolutiontags)&&angular.forEach(ie(e),function(e){t.resolutiontags[e]=!1})}function re(){m=!0,v(function(){m=!1})}function se(){return!angular.isObject(D.steamWorkshopStatus)||!D.steamWorkshopStatus.error}function le(e){return 3.5<e.w/e.h||3.5<e.h/e.w}D.filterStatus={};var ce,de,pe,ue,ge=["76561198828455240"];function fe(i){angular.isArray(i)||(i=[i]);var t=[],a=[],e=R.defer(),n=i.filter(function(e){return"Video"===e.type&&e.localAndExternal&&e.file&&!e.filesize}).map(function(e){return e.file}),o=R.when();return(o=0<n.length?j.callDeferred("browseWallpaperObject","getLocalFileSizes",n).then(function(e){angular.forEach(e,function(t,a){angular.forEach(i,function(e){e.file===a&&(e.filesize=t)})})}):o).then(function(){angular.forEach(i,function(e){(e.filesize&&4194304e3<e.filesize?a:t).push(e)}),0<a.length?F.open("genericConfirm",{data:{title:"ui_browse_mobile_upload_size_warning_title",message:"ui_browse_mobile_upload_size_warning_message",okVisible:!0}}).then(function(){e.resolve(t)}):e.resolve(t)}),e.promise}function me(e){if(angular.isArray(e)||(e=[e]),!B.requiresMobileApproval())return R.when(e);var a=[],i=[];angular.forEach(e,function(e){var t=D.allowAllMobileUploads||e.allowmobileupload||e.local||e.official||ge.includes(e.authorsteamid);t&&i.push(e),t||a.push(e)});var t=R.defer();return 0<a.length?F.open("browseMobilePermissionsMissing",{data:{title:"ui_browse_mobile_modal_author_permission_missing_title",message:"ui_browse_mobile_modal_author_permission_missing_message",okVisible:!0,leftClass:"btn-info",textinput:B.getWorkshopAgreementHelpURL(),listWallpapers:a,openWorkshop:function(e){D.openSteamWorkshopPage(e)},leftCallback:function(){D.openSteamWorkshopPage(a[0])},leftVisible:1===a.length,leftText:"ui_browse_mobile_modal_author_permission_missing_open_workshop"}}).catch(function(){}).then(function(){0<i.length?t.resolve(i):t.reject()}):t.resolve(i),t.promise}function ve(e){D.isUsingBackup=e,D.searchTextInputModelOptions={debounce:e?P.backup:P.normal}}function he(){D.sourceIsExplore?(angular.forEach(D.sortedExploreQueries,function(e){angular.isArray(e.wallpapers)&&(e.wallpapers=e.wallpapers.slice())}),D.sortedFolders=[]):D.sourceIsWorkshop&&(D.sortedFolders=[]),D.sortedWallpapers=D.sortedWallpapers.slice()}function be(e){var a;"Scene"!==e.type&&"Video"!==e.type||(a=B.getSharedDefaultProperties(),angular.forEach(e.defaultproperties,function(e,t){angular.isDefined(a[t])&&(e.value=a[t])}))}function _e(){if(D.sourceIsInstalled)return D.sortedFoldersPrePagination.concat(D.sortedWallpapersPrePagination);if(D.sourceIsWorkshop)return D.queryWallpapers;if(D.sourceIsExplore){if(D.isExploreHomepage()){var t=[];return angular.forEach(D.sortedExploreQueries,function(e){angular.isArray(e.wallpapers)&&(t=t.concat(e.wallpapers))}),t}return D.sortedWallpapers}}function ye(){if(!D.sourceIsInstalled)return D.sortedWallpapersPrePagination=[],D.sortedFoldersPrePagination=[],void he();var a,e,t,i,n,o=D.currentFolder&&D.currentFolder.items,r=D.currentFolder&&D.currentFolder.subfolders||D.folders||[],s=[],l=D.wallpapers,s=(l=(angular.isObject(o)?angular.forEach(l,function(e){o[e.workshopid||e.file]&&s.push(e)}):angular.forEach(l,function(e){D.folderRootExclusion[e.workshopid||e.file]||s.push(e)}),s),[]),c=(l=B.requiresFullAsyncWorkshop()?l.filter(function(e){return"downloadable"!==e.status}):l).length,d=[],p=[];D.filterTemp.filterFavoritesOnly&&(l=l.filter(function(e){return e.favorite})),D.filterTemp.filterMobileCompatibleOnly&&(l=l.filter(function(e){return e.allowmobileupload||e.local||e.official}),p.push("Application"),p.push("Web")),angular.forEach(D.filter.categorytags,function(e,t){e||p.push(t)}),angular.forEach(D.filter.typetags,function(e,t){e||p.push(t)}),"screensaver"===D.wallpaperConfigGroup&&p.push("Application"),angular.forEach(D.filter.sourcetags,function(e,t){e||p.push(t)}),angular.forEach(D.filter.resolutiontags,function(e,t){e||p.push(t)}),angular.forEach(D.filter.ratingtags,function(e,t){e||p.push(t)}),angular.forEach(D.filter.tags,function(e,t){e||p.push(t)}),angular.forEach(D.filter.utilitytags,function(e,t){1===e?d.push(t):2===e&&p.push(t)}),0<d.length&&(angular.forEach(l,function(t){var a=!0;angular.forEach(d,function(e){angular.isString(t.tags)&&t.tags.indexOf(e)<0&&(a=!1)}),a&&s.push(t)}),l=s,s=[]),0<p.length&&(angular.forEach(l,function(t){var a=!1;angular.forEach(p,function(e){angular.isString(t.tags)&&0<=t.tags.indexOf(e)&&(a=!0)}),a||s.push(t)}),l=s,s=[]),angular.isString(D.filter.text)&&0<D.filter.text.length?(a=D.filter.text.toLowerCase().replace(/[\?\.\!]/g,""),e=[],i=/\b3d\b/gi,n=/\b(puppet|puppet warp|puppetwarp)\b/gi,0<=a.search(t=/\bhdr\b/gi)&&(a=a.replace(t,""),e.push("HDR")),0<=a.search(i)&&(a=a.replace(i,""),e.push("3D")),0<=a.search(n)&&(a=a.replace(n,""),e.push("Puppet Warp")),0<e.length&&(angular.forEach(l,function(t){var a=!0;angular.forEach(e,function(e){angular.isString(t.tags)&&t.tags.indexOf(e)<0&&(a=!1)}),a&&s.push(t)}),l=s,s=[]),0<a.length?angular.forEach(l,function(e){var t=e.title.toLowerCase().replace(/[\?\.\!]/g,"");(t.includes(a)||B.damerauLevenshteinDistance(t,a)<3)&&s.push(e)}):s=l.slice()):s=l.slice(),D.filter.descending?s.sort(X[D.filter.sort]):s.sort(Y[D.filter.sort]);l=(D.sortedWallpapers=s).length;D.showFilter.counts=D.showFilter.base&&l!==c,D.filteredCount=l,D.unfilteredCount=c,r=r.slice(),D.filter.descending?r.sort(X.name):r.sort(Y.name),D.sortedFolders=r,D.sortedWallpapersPrePagination=D.sortedWallpapers.slice(),D.sortedFoldersPrePagination=D.sortedFolders.slice();c=D.browserSettings&&D.browserSettings.resultsperpage||100,r=D.sortedFolders.length,l+=r;U.visible=c<l,U.visible&&(l=Math.floor(l/c)+(l%c?1:0),B.updatePagination(U,U.current,l),l=c*(U.current-1),c=c*U.current,D.sortedFolders=D.sortedFolders.sliceLimit(l,c),D.sortedWallpapers=D.sortedWallpapers.sliceLimit(l-r,c-r)),angular.forEach(D.sortedWallpapers,function(e){e.localAndExternal&&!e.requestedThumbnail&&(e.requestedThumbnail=!0,D.requestThumbnailPath(e))})}function we(e,t,a){for(var i=0;i<w.length;++i)if(w[i].file===e)return w[i];var n,o,r=a||e,s="ui_workshop_tags_local",l="images/preview_local.jpg",c=["Everyone","Local"];B.isURL(e)?(s="ui_workshop_tags_local_url",l="images/preview_url.jpg",c.push(n="Web")):(o=e,ce?de.wallpaperFiles.push(o):(de={wallpaperFiles:[o]},ce=v(function(){ce=void 0,j.callDeferred("browseWallpaperObject","updateLocalWallpaperProjectInfo",de.wallpaperFiles).then(function(e){angular.forEach(e,function(t){angular.forEach(w,function(e){e.file===t.file&&angular.merge(e,t)})}),ye()})})),B.isExtension(e,"video")?(s="ui_workshop_tags_local_video",c.push("Video"),n="Video"):B.isExtension(e,"application")?(s="ui_workshop_tags_local_application",c.push("Application"),n="Application"):B.isExtension(e,"web")?(s="ui_workshop_tags_local_web",c.push("Web"),n="Web"):B.isExtension(e,"scene")?(s="ui_workshop_tags_local_scene",c.push("Scene"),n="Scene"):B.isExtension(e,"static")&&(s="ui_workshop_tags_local_image",c.push("Scene"),n="Image"),r=a||B.getFilename(e));s={file:e,title:r,preview:l,previewsmall:l,tags:c.join(","),local:!0,localAndExternal:!0,status:"installed",type:n,typelabel:s,filesize:0,subscriptiondate:0,favorite:!1,rating:0};return angular.isDefined(t)&&(s.overridetype=t),w.push(s),D.wallpapers.push(s),s}function ke(e){if(angular.isArray(e))return angular.forEach(e,ke);for(var t=0;t<w.length;++t)w[t].file===e&&w.splice(t,1);for(t=0;t<D.wallpapers.length;++t)D.wallpapers[t].file===e&&D.wallpapers.splice(t,1)}function xe(t){var a;return angular.forEach(D.monitors,function(e){e.location===t&&(a=e)}),angular.forEach(D.monitorSplits,function(e){e.left&&e.left.location===t?a=e.left:e.right&&e.right.location===t&&(a=e.right)}),a||D.monitorGroups[t]}function Se(){var t=D.monitors.slice();return angular.forEach(D.monitorSplits,function(e){e.left&&t.push(e.left),e.right&&t.push(e.right)}),angular.forEach(D.monitorGroups,function(e){t.push(e)}),t}function Ce(t){var a;return angular.forEach(D.wallpapers,function(e){e.file===t&&(a=e)}),a}function Ee(t){var a;return t=""+t,angular.forEach(D.wallpapers,function(e){e.workshopid===t&&(a=e)}),a}function Pe(e){if(angular.isObject(e))return(e.localAndExternal?we:Ce)(e.file)}function Me(){var e=angular.element("#PlaylistContainerTimeline");0===e.length?(pe&&pe.remove(),pe=void 0):(pe&&!e.has(pe)&&(pe.remove(),pe=void 0),pe||((pe=angular.element(document.createElement("div"))).addClass("currentTimeIndicator"),e.append(pe))),ue=v(Me,1e4),pe&&(e=(60*(e=new Date).getHours()+e.getMinutes())/1440*100,pe.css({left:e+"%"}))}function Ae(e){for(var t=0,a=0,i=0;i<e.length;++i){var n=e[i],o=void 0;if(angular.isNumber(n.daytimeend)?o=n.daytimeend:i===e.length-1&&(o=1),angular.isNumber(o)){if(0<(r=i-t+1))for(var r=1/r*(o-a),s=t;s<=i;++s)e[s].flex=r;t=i+1,a=o}}ue&&v.cancel(ue),ue=v(Me)}function Te(e){return{settings:angular.copy(e.settings),name:e.name||"",items:e.items.map(function(e){if(angular.isNumber(e.daytimeend)||angular.isString(e.preset)){var t={file:e.wallpaper.file};return angular.isNumber(e.daytimeend)&&(t.daytimeend=e.daytimeend),angular.isString(e.preset)&&(t.preset=e.preset),t}return e.wallpaper.file})}}function Oe(e){for(var t={settings:angular.copy(e.settings),name:e.name,items:[]},a=0;a<e.items.length;++a){var i,n=e.items[a];angular.isString(n)?(i=Ce(n),angular.isObject(i)&&(i={wallpaper:i})):angular.isObject(n)&&angular.isString(n.file)&&(i=Ce(n.file),angular.isObject(i)&&(i={wallpaper:i,daytimeend:n.daytimeend,preset:n.preset})),angular.isObject(i)&&t.items.push(i)}return Ae(t.items),t}function Ie(t){var a;(t=!angular.isObject(t)?D.selectedMonitor:t).playlistFlags={},0<t.playlist.items.length&&(delete t.playlist.items[t.playlist.items.length-1].daytimeend,a=0,angular.forEach(t.playlist.items,function(e){angular.isObject(e.wallpaper)&&angular.isString(e.wallpaper.file)&&(t.playlistFlags[e.wallpaper.file]=!0),angular.isNumber(e.daytimeend)&&(e.daytimeend<a||"daytime"!==t.playlist.settings.mode?delete e.daytimeend:a=e.daytimeend)})),j.callDeferred("browseWallpaperObject","selectPlaylist",Te(t.playlist),t.location),Ae(t.playlist.items)}function Re(e){var t=xe(e);angular.isDefined(t)&&(t.wallpaper=void 0,D.selectedMonitor===t&&(D.currentSelection=void 0),t.playlistFlags={},t.playlist.items=[]),D.wallpaperConfig.selectedwallpapers[e]={},j.callDeferred("browseWallpaperObject","removeWallpaper",{location:e,playlist:!0})}function De(a,e){e&&D.currentSelection===a&&(D.currentSelection=void 0);e=Se();angular.forEach(e,function(e){delete e.playlistFlags[a.file];var t=e.playlist.items.findIndex(function(e){return e.wallpaper===a});0<=t?(e.playlist.items.splice(t,1),Ie(e)):e.wallpaper===a&&(e.wallpaper=void 0,j.callDeferred("browseWallpaperObject","removeWallpaper",{location:e.location,playlist:!1}))})}function We(e,t){var a;t=t||D.selectedMonitor&&D.selectedMonitor.location,!angular.isUndefined(t)&&angular.isObject(e)&&((a=D.wallpaperConfig.selectedwallpapers[t]||{}).file=e.file,D.wallpaperConfig.selectedwallpapers[t]=a,D.selectedMonitor&&D.selectedMonitor.location===t?(D.currentSelection=e,D.selectedMonitor.wallpaper=e):(a=xe(t),angular.isObject(a)&&(a.wallpaper=e)),j.callDeferred("browseWallpaperObject","selectWallpaper",e.file,t,e.overridetype))}function Be(o,e){if(!angular.isArray(o)){if(!angular.isObject(o))return;o=[o]}var t,a,i,r=[],s=[],l=[],n={};function c(){var e,t=D.sortedWallpapers&&D.sortedWallpapers.indexOf(D.currentSelection),a=t+r.length,i=0<=t&&t<D.sortedWallpapers.length&&D.sortedWallpapers[a],n=0<t&&t<=D.sortedWallpapers.length&&D.sortedWallpapers[t-1];0<r.length&&j.callDeferred("ui","unsubscribeWorkshopItem",r.map(function(e){return e.workshopid})),0<s.length&&(ke(e=s.map(function(e){return e.file})),j.callDeferred("browseWallpaperObject","removeLocalWallpaperFromHistory",e)),0<l.length&&(ke(e=l.map(function(e){return e.file})),j.callDeferred("browseWallpaperObject","removeOfficialWallpaper",e)),ye(),o.includes(D.currentSelection)&&(De(D.currentSelection,D.sourceIsInstalled),D.sourceIsInstalled&&D.isMiniMode&&(a<D.sortedWallpapers.length?(i=Ce(i.file))&&D.callbackWallpaperSelected(i):0<t&&(n=Ce(n.file))&&D.callbackWallpaperSelected(n)))}function d(e){for(var t="",a=Math.min(3,e.length),i=0;i<a;++i)t+=e[i].title,i+1<a&&(t+=", ");return a<e.length&&(t+=", ... ("+e.length+")"),t}angular.forEach(o,function(e){e.official?l.push(e):e.localAndExternal?s.push(e):angular.isString(e.workshopid)&&(r.push(e),n[e.workshopid]=!0)}),0<r.length&&0===s.length&&0===l.length&&!se()?B.showSteamError():0!==(t=r.concat(s).concat(l)).length&&(a=[],angular.forEach(D.wallpapers,function(e){angular.isString(e.dependency)&&n[e.dependency]&&!r.includes(e)&&a.push(e)}),r=r.concat(a),e?(i=d(t),e=d(a),I(["ui_browse_modal_unsubscribe_body","ui_browse_modal_remove_local_body","ui_browse_modal_remove_preset_info","ui_browse_modal_unsubscribe_wallpapers_header"],{title:i,presets:e,count:t.length}).then(function(e){return F.open("genericConfirm",{data:{title:0<r.length?"ui_browse_modal_unsubscribe_header":"ui_browse_modal_remove_local_header",message:(0<r.length?e.ui_browse_modal_unsubscribe_body:e.ui_browse_modal_remove_local_body)+(0<a.length?e.ui_browse_modal_remove_preset_info:""),okVisible:!0,cancelVisible:!0}})}).then(c)):c())}function Fe(n,o){if(angular.isString(n)&&angular.isArray(D.browserSettings.applicationwhitelist)&&D.browserSettings.applicationwhitelist.includes(n))return R.when();var r=3;return I(["ui_browse_modal_application_warning_body","ui_browse_modal_application_warning_timer"],{filepath:n,time:r}).then(function(t){var a={title:"ui_browse_modal_application_warning_header",message:t.ui_browse_modal_application_warning_body+t.ui_browse_modal_application_warning_timer,leftIcon:"images/warning.png",okClass:"btn-danger",okText:"ui_browse_modal_proceed",okVisible:!0,okDisabled:!0,cancelVisible:!0,leftVisible:angular.isObject(o),leftClass:"btn-danger",leftText:"ui_browse_details_btn_unsubscribe",leftAction:"unsubscribe",checkboxCenterVisible:!0,checkboxChecked:!1,checkboxTitle:"ui_browse_modal_application_warning_disable_checkbox"},i=function(){I("ui_browse_modal_application_warning_timer",{time:--r}).then(function(e){a.message=t.ui_browse_modal_application_warning_body+e,0<r?v(i,1e3):a.okDisabled=!1})};return v(i,1e3),F.open("genericConfirm",{data:a},{backdropClass:"modal-backdrop-danger"}).then(function(e){return"unsubscribe"===e?(Be(o),R.reject()):(a.checkboxChecked&&(angular.isArray(D.browserSettings.applicationwhitelist)?D.browserSettings.applicationwhitelist.push(n):D.browserSettings.applicationwhitelist=[n]),e)})})}function je(){var t=[];return angular.forEach(D.monitors,function(e){!e.isInGroup&&angular.isObject(D.monitorSplits[e.location])||t.push(e)}),angular.forEach(D.monitorSplits,function(e){e.left&&!e.left.isInGroup&&angular.isUndefined(D.monitorSplits[e.left.location])&&t.push(e.left),e.right&&!e.right.isInGroup&&angular.isUndefined(D.monitorSplits[e.right.location])&&t.push(e.right)}),angular.forEach(D.monitorGroups,function(e){t.push(e)}),t}function Ve(){var e=je();D.showMonitorRow="screensaver"===D.wallpaperConfigGroup||1<e.length||0<e.length&&e[0].isGroup||1===D.monitors.length&&le(D.monitors[0]),D.showMonitorIndex=1<D.monitors.length,D.showMonitorAutoShowToggle=1<D.monitors.length}function Le(e){var a=[];return angular.forEach(e,function(e){"folder"===e.type?(angular.forEach(e.items,function(e,t){t=Ee(t)||Ce(t);t&&a.push(t)}),a=a.concat(Le(e.subfolders))):a.push(e)}),a}function ze(e,t,a){var i;if(0===D.multiSelection.length&&t)return i=[t],i=e?Le(i):i;i=D.multiSelection.slice(),D.currentSelection&&i.unshiftIfNew(D.currentSelection),t&&i.unshiftIfNew(t),e&&(i=Le(i));var n=Le(n=_e()),o=[];return angular.forEach(i,function(e){!n.includes(e)||(a?e.status!==a:"downloadable"===e.status)&&"any"!==a||o.push(e)}),o}function $e(i){function n(e){D.sourceIsExplore||(e=angular.element(e))&&e[0]&&e[0].scrollIntoView&&e[0].scrollIntoView({behavior:"smooth",inline:"nearest",block:"nearest"})}v(function(){var e,t,a;angular.isObject(D.wallpaperConfig)&&angular.isObject(D.selectedMonitor)&&angular.isObject(D.wallpaperConfig.selectedwallpapers)&&(t=i||D.currentSelection,!angular.isObject(t)&&D.wallpaperConfig.selectedwallpapers.hasOwnProperty(D.selectedMonitor.location)&&(e=D.wallpaperConfig.selectedwallpapers[D.selectedMonitor.location],t=D.currentSelection=Pe(e)),angular.isObject(t)&&(window.safeApply(D),a=0,angular.forEach(D.sortedWallpapers,function(e){t===e&&n("#wpimg"+a),++a}),a=0,angular.forEach(D.sortedFolders,function(e){t===e&&n("#wpfolder"+a),++a})))})}function He(e){angular.isObject(e)&&(D.browserSettings.lastselectedmonitor=e.location,D.selectedMonitor=e,e=D.wallpaperConfig.selectedwallpapers[e.location],D.currentSelection=angular.isObject(e)?Pe(e):void 0,$e())}function Ue(e){return e&&e.playlist&&1<e.playlist.items.length}function Ge(e){e.playlistFlags={},e.playlist={items:[],settings:J()}}function qe(e){var t={};return Ue(e)?(t.playlistFlags=angular.copy(e.playlistFlags),t.playlist=angular.copy(e.playlist),angular.isArray(e.playlist.items)&&(t.playlist.items=e.playlist.items.slice())):Ge(t),t}function Ne(e,t){t=t||D.selectedMonitor,Ue(e)?(t.playlistFlags=angular.copy(e.playlistFlags),t.playlist=angular.copy(e.playlist),angular.isArray(e.playlist.items)&&(t.playlist.items=e.playlist.items.slice())):Ge(t),Ie()}function Qe(e,t){Ue(e)?(t.playlistFlags=angular.copy(e.playlistFlags),t.playlist=angular.copy(e.playlist),angular.isArray(e.playlist.items)&&(t.playlist.items=e.playlist.items.slice())):Ge(t)}function Ke(){var a;angular.isArray(D.monitors)&&angular.isObject(D.wallpaperConfig)&&angular.isObject(D.wallpaperConfig.selectedwallpapers)&&(angular.forEach(D.wallpaperConfig.selectedwallpapers,function(e,t){var a=xe(t);if(angular.isObject(a)){if(angular.isArray(a.missingPlaylistItems)||(angular.isObject(e.playlist)?(a.playlist=Oe(e.playlist),a.playlist.items=[],a.missingPlaylistItems=angular.isArray(e.playlist&&e.playlist.items)?e.playlist.items:[],a.missingPlaylistItems=a.missingPlaylistItems.map(function(e){return{name:e.file||e,daytimeend:e.daytimeend,preset:e.preset}})):(Ge(a),a.missingPlaylistItems=[])),angular.isArray(a.missingPlaylistItems))for(var i=0;i<a.missingPlaylistItems.length;++i){var n,o=a.missingPlaylistItems[i],r=Ce(o.name);angular.isObject(r)?(a.missingPlaylistItems.splice(i,1),--i,n=a.playlist.items.indexOf(o.stub),angular.isObject(o.stub)&&0<=n?a.playlist.items.splice(n,1,{wallpaper:r,daytimeend:o.daytimeend,preset:o.preset}):a.playlist.items.push({wallpaper:r,daytimeend:o.daytimeend,preset:o.preset}),a.playlistFlags[o.name]=!0):angular.isObject(o.stub)||(o.stub={wallpaper:{file:o.name,preview:"images/nopreview.jpg",status:"error"},daytimeend:o.daytimeend,preset:o.preset,isStub:!0},a.playlist.items.push(o.stub))}a.playlist&&a.playlist.items&&Ae(a.playlist.items)}}),y||(a=!0,angular.forEach(D.wallpaperConfig.selectedwallpapers,function(e,t){e=Pe(e),t=xe(t);a=angular.isDefined(e),angular.isObject(e)&&angular.isObject(t)&&(t.wallpaper=e)}),y=a))}function Ye(e,t){return t&&((e=angular.copy(e)).refresh=!0),j.callDeferred("browseWallpaperObject","updateProfile",e)}function Xe(){if(angular.isArray(D.queryWallpapers)&&angular.isArray(D.wallpapers))for(var e=0;e<D.queryWallpapers.length;++e){var t=D.queryWallpapers[e];if(angular.isString(t.workshopid))for(var a=0;a<D.wallpapers.length;++a){var i=D.wallpapers[a];if(t.workshopid===i.workshopid&&t!==i){D.queryWallpapers.splice(e,1,i),D.currentSelection===t&&D.callbackWallpaperSelected(i);break}}}}function Je(e,t){e=D.browserSettingsExtensions.authorblocklist.includes(e.authorsteamid);return e===D.browserSettingsExtensions.authorblocklist.includes(t.authorsteamid)?0:e?1:-1}function Ze(e){angular.isObject(_)&&angular.forEach(e,function(e){var t=_[e.file];angular.isObject(t)&&(angular.isObject(e.properties)||(e.properties={}),angular.merge(e.properties,t.properties),e.defaultproperties=t.defaultproperties,e.propertyPresets=t.presets,e.cancreatepresets=t.cancreatepresets,e.aspect=t.aspect,be(e))})}function et(e){if(angular.isArray(e))return angular.forEach(e,et);D.multiSelection.includes(e)||D.multiSelection.push(e)}function tt(e){if(angular.isArray(e))return angular.forEach(e,tt);e===D.currentSelection&&(D.currentSelection=void 0),D.multiSelection.findAndRemove(e)}function at(e){if(D.canUseMultiselect())return angular.isArray(e)?angular.forEach(e,at):void(D.multiSelection.includes(e)||D.currentSelection===e?tt:et)(e)}function it(){D.multiSelection=[]}function nt(e,t){return(e&&e.title||"").localeCompare(t&&t.title||"")}function ot(e){angular.isArray(e)||(e=[e]),angular.forEach(e,function(e){"folder"===e.type&&D.folders.findAndRemove(e)}),function e(a,t){angular.forEach(t,function(t){angular.forEach(a,function(e){"folder"===e.type?t.subfolders.findAndRemove(e):delete t.items[e.workshopid||e.file]}),e(a,t.subfolders)})}(e,D.folders)}function rt(e,t){(e=!angular.isArray(e)?[e]:e).findAndRemove(function(e){return e===t}),ot(e),t?angular.forEach(e,function(e){"folder"===e.type?t.subfolders.push(e):t.items[e.workshopid||e.file]=1}):angular.forEach(e,function(e){"folder"===e.type&&D.folders.pushIfNew(e)})}function st(e,t){rt(ze(!1,e),t),it()}function lt(e){Be(ze(!0,e),!0)}function ct(e){for(var t=0;t<e.length;++t){var a=e[t];angular.isString(a.title)&&0!==a.title.length?(a.approved=0<=a.tags.indexOf("Approved"),a.portrait=0<=a.tags.indexOf("Portrait")):(e.splice(t,1),--t)}}D.sortWallpapers=ye,D.updateWallpapers=function(e,t){try{var a,i=angular.isDefined(D.currentSelection),n=function(e,t){for(var a={newWallpapers:[],shouldSort:!1},i={},n=0;n<D.wallpapers.length;++n){var o=D.wallpapers[n];o.ispreset&&(angular.isArray(i[o.dependency])||(i[o.dependency]=[]),i[o.dependency].push(o))}for(var r=[],n=0;n<e.length;++n){var s,l=e[n],c=!1,d="unsubscribed"===l.status;if(angular.isDefined(l.workshopid))for(s=0;s<t.length;++s){var p,u=t[s];angular.isDefined(u.workshopid)&&u.workshopid===l.workshopid&&(c=!0,d?(p=D.currentSelection===u,D.sourceIsInstalled?(p&&(D.currentSelection=void 0),a.shouldSort=!0):(angular.merge(u,l),u.status="downloadable"),De(u,D.sourceIsInstalled),t.splice(s,1),--s):(p=!1,u.status!==l.status&&"installed"===l.status?(angular.isArray(i[l.workshopid])&&(r=r.concat(i[l.workshopid])),D.currentSelection===u&&(p=!(D.currentSelection=void 0))):D.currentSelection===u&&"installed"===l.status&&l.ispreset&&(p=!(D.currentSelection=void 0)),angular.merge(u,l),p&&D.callbackWallpaperSelected(u)))}if(l.local)for(s=0;s<t.length;++s)(u=t[s]).local&&u.file===l.file&&(angular.merge(u,l),a.shouldSort=c=!0);l.approved=angular.isString(l.tags)&&0<=l.tags.indexOf("Approved"),l.portrait=angular.isString(l.tags)&&0<=l.tags.indexOf("Portrait"),c||d||a.newWallpapers.push(l)}for(n=0;n<a.newWallpapers.length;++n){var g=a.newWallpapers[n];angular.isArray(i[g.workshopid])&&(r=r.concat(i[g.workshopid]))}return 0<r.length&&(r=r.map(function(e){return e.workshopid}),j.callDeferred("browseWallpaperObject","queryWorkshopIds",r)),a}(e,D.wallpapers);Ze(n.newWallpapers),Array.prototype.push.apply(D.wallpapers,n.newWallpapers),0<n.newWallpapers.length||n.shouldSort?(a=function(a){return function(t){var e=a.findAndReplace(function(e){return e.workshopid&&e.workshopid===t.workshopid},t);0<e.length&&e[0]===D.currentSelection&&D.callbackWallpaperSelected(t)}},D.sourceIsExplore?(angular.forEach(D.sortedExploreQueries,function(e){angular.isArray(e.wallpapers)&&angular.forEach(n.newWallpapers,a(e.wallpapers))}),angular.forEach(n.newWallpapers,a(D.sortedWallpapers))):D.sourceIsWorkshop&&angular.forEach(n.newWallpapers,a(D.sortedWallpapers)),ye()):he(),Ke(),!angular.isUndefined(t)&&!angular.isUndefined(D.currentSelection)||"installed"!==D.source||i||$e(),Xe(),D.hideYoutubeControls&&D.currentSelection&&delete D.currentSelection.youtube}catch(e){console.error(e)}},D.updateLocalThumbnail=function(t){var e=D.wallpapers.find(function(e){return e.preview===t.preview});e&&(e.previewsmall=t.previewsmall,he())},D.selectWallpaperByProjectOrId=function(e){var t=e.file&&Ce(e.file)||Ee(e.workshopid);angular.isObject(t)||!e.workshopid||!se()||D.steamWorkshopStatus.complete?angular.isObject(t)&&(e.reload&&j.callDeferred("browseWallpaperObject","removeWallpaper",{location:D.selectedMonitor.location,playlist:!1}),We(t)):v(function(){D.selectWallpaperByProjectOrId(e)},500)},D.registerSteamUser=function(e){var t=D.steamUserInfos[e.id]||{};t.name=e.name,t.avatar=e.avatar,D.steamUserInfos[e.id]=t,angular.isFunction(V)&&V(e)};var dt={},pt={};D.onTotalCountReceived=function(e){pt[e.preset]&&(pt[e.preset].resolve(e.count),delete pt[e.preset]),dt[e.preset]=e.count},D.getNumberOfWorkshopPresets=function(e){e=e.dependency||e.workshopid;return angular.isNumber(dt[e])?dt[e]:(angular.isUndefined(dt[e])&&(dt[e]="?",j.callDeferred("browseWallpaperObject","queryWorkshop",{preset:e,callback:"onTotalCountReceived",totalOnly:!0})),"?")};var ut={},gt={};D.onTotalCountByAuthorReceived=function(e){gt[e.authorsteamid]&&(gt[e.authorsteamid].resolve(e.count),delete gt[e.authorsteamid]),ut[e.authorsteamid]=e.count},D.callbackWallpaperAllMouse=function(e,o,t){var a,i,n;if(t.stopPropagation(),o&&"highlightItem"===o.type)"left"===e&&D.pushExplorePage(o);else switch(e){case"left":t.ctrlKey&&D.canUseMultiselect()?at(o):t.shiftKey&&D.canUseMultiselect()?(it(),et(o),n=!1,angular.forEach(_e(),function(e){(n=e===o||D.currentSelection===e?!n:n)&&et(e)})):(D.callbackWallpaperSelected(o),(y=angular.element(t.target).closest(".browseWallpaperImage")[0])&&y.scrollIntoView&&y.scrollIntoView({behavior:"smooth",inline:"nearest",block:"nearest"}));break;case"right":var r,s,l,c,d,p,u,g,f,m,v,h,b,_,y,w,k,x,S,C,E=W.builder(),P=function(e){e.button("ui_browse_context_menu_manage_blocklist","fas fa-users-slash",function(){F.open("browseCollections",{data:{type:"blocklist",canCloseOnly:!0,collection:D.browserSettings.authorblocklistnames}}).catch(function(){return R.when()}).then(function(){D.browserSettingsExtensions.authorblocklist=D.browserSettings.authorblocklistnames.map(function(e){return e.value}),D.sortedWallpapers=D.sortedWallpapers.slice(),D.sortedWallpapers.sort(Je)})})};angular.isObject(o)&&(r={author:o.authorsteamid&&D.steamUserInfos[o.authorsteamid]&&D.steamUserInfos[o.authorsteamid].name,count:"?"},s=[],!r.author&&o.authorsteamid&&(j.callDeferred("ui","pollSteamUserInfo",o.authorsteamid,"browseWallpapersCtrl"),V=function(e){e.id===o.authorsteamid&&(r.author=e.name,angular.forEach(s,function(e){e()}),V=void 0)},r.author="?"),"downloadable"!==o.status&&(E.button("ui_browse_context_menu_add_to_playlist","fas fa-plus",function(){D.callbackToggleAllWallpapersInCurrentMonitorPlaylist(o,!1,!0)}),D.selectedMonitor&&D.selectedMonitor.playlistFlags[o.file]&&E.button("ui_browse_context_menu_remove_from_playlist","fas fa-minus",function(){D.callbackToggleAllWallpapersInCurrentMonitorPlaylist(o)})),o.localAndExternal&&E.button("ui_browse_context_menu_rename","fas fa-file-signature",function(){var e={title:"ui_browse_modal_rename_title",message:"",cancelVisible:!0,okVisible:!0,textinputVisible:!0,textinput:o.title};F.open("genericConfirm",{data:e}).then(function(){e.textinput=e.textinput.trim(),0<e.textinput.length&&(o.title=e.textinput,ye(),j.callDeferred("browseWallpaperObject","addLocalWallpaperToHistory",[{file:o.file,name:o.title}]))})}),"downloadable"!==o.status&&0<D.folders.length&&(1<D.folders.length||D.folders[0]!==o)&&(w=W.builder(),angular.isObject(D.currentFolder)&&w.button("ui_browse_navigation_top",function(){st(o)}),function t(e,a,i,n,o){angular.forEach(e.sort(nt),function(e){e!==a&&(e!==D.currentFolder&&n.button(i+e.title,"",function(){o(e)}),t(e.subfolders,a,i+e.title+" / ",n,o))})}(D.folders,o,"",w,function(e){st(o,e)}),E.subMenu("ui_browse_context_menu_move_to",w)),A="folder"!==o.type,o.workshopid?("downloadable"===o.status?E.button("ui_browse_context_menu_subscribe","fas fa-download",function(){var e;0===D.multiSelection.length?D.subscribeWorkshopItem(o):(e=ze(!0,e=o,"downloadable"),D.subscribeWorkshopItem(e))}):E.button("ui_browse_context_menu_unsubscribe","fas fa-times",function(){0===D.multiSelection.length?Be(o,!0):lt(o)}),l=ze(!0,o,"any"),c=(l=l.filter(function(e){return e.workshopid})).map(function(e){return e.workshopid}),o.favorite?E.button("ui_browse_context_menu_remove_favorite","far fa-heart",function(){j.callDeferred("ui","setFavorited",c,!1),angular.forEach(l,function(e){e.favorite=!1}),D.sortedWallpapers=D.sortedWallpapers.slice()}):E.button("ui_browse_context_menu_add_favorite","fas fa-heart",function(){j.callDeferred("ui","setFavorited",c,!0),angular.forEach(l,function(e){e.favorite=!0}),D.sortedWallpapers=D.sortedWallpapers.slice()}),D.browserRuntime&&L.includes(D.browserRuntime.usersteamid)&&B.canUseAdminMenu()&&(d=W.builder(),p=W.builder(),u=W.builder(),g=function(){D.sourceIsExplore?angular.forEach(D.sortedExploreQueries,function(e){e.wallpapers&&(e.wallpapers=e.wallpapers.slice())}):D.sortedWallpapers=D.sortedWallpapers.slice()},f=function(t){var e=ze(!0,o),a=e.map(function(e){return e.workshopid});j.sendRequestWithSteamAuth(D.steamAuth,j.wpxAPIBackendUrl+"/api/updateApproval",{ids:a,approve:t}).then(function(){angular.forEach(e,function(e){angular.isString(e.tags)&&(t?(e.tags=e.tags.split(","),e.tags.push("Approved")):(e.tags=e.tags.split(","),e.tags.findAndRemove("Approved")),e.tags=e.tags.join(","))}),ct(e),g()}).catch(function(e){console.error("updating approval failed with",angular.toJson(e))})},d.button("Approve","fas fa-trophy",function(){f(!0)}),d.button("Approve & Like","fas fa-trophy",function(){f(!0),ze(!0,o).map(function(e){D.setUserVote(e.workshopid,"up")})}),d.button("Unapprove","fas fa-times",function(){f(!1)}),d.divider(),m=function(t){D.lastAdminGenre.findAndRemove(t),D.lastAdminGenre.splice(0,0,t);var a=D.filterAllTags.map(function(e){return e.value}).findAndRemove(t),e=ze(!0,o,"any"),i=e.map(function(e){return e.workshopid});j.sendRequestWithSteamAuth(D.steamAuth,j.wpxAPIBackendUrl+"/api/updateGenre",{ids:i,genre:t}).then(function(){angular.forEach(e,function(e){angular.isString(e.tags)&&(e.tags=e.tags.split(","),e.tags.findAndRemoveMultiple(a).push(t),e.tags=e.tags.join(","))}),ct(e),g()}).catch(function(e){console.error("updating genre failed with",angular.toJson(e))})},angular.isArray(D.lastAdminGenre)||(D.lastAdminGenre=["Anime","Girls","Unspecified"]),D.lastAdminGenre.forEach(e=>{d.button("Change Genre to "+e,function(){m(e)})}),angular.forEach(D.filterAllTags,function(e){p.button(e.value,function(){m(e.value)})}),angular.forEach(B.getWallpaperRatingTags(),function(n){u.button(n.value,function(){var t,a,e,i;t=n.value,a=B.getWallpaperRatingTags().map(function(e){return e.value}).findAndRemove(t),e=ze(!0,o,"any"),i=e.map(function(e){return e.workshopid}),j.sendRequestWithSteamAuth(D.steamAuth,j.wpxAPIBackendUrl+"/api/updateRating",{ids:i,rating:t}).then(function(){angular.forEach(e,function(e){angular.isString(e.tags)&&(e.tags=e.tags.split(","),e.tags.findAndRemoveMultiple(a).push(t),e.tags=e.tags.join(","))}),ct(e),g()}).catch(function(e){console.error("updating rating failed with",angular.toJson(e))})})}),d.subMenu("Change Genre",p),d.subMenu("Change Rating",u),E.subMenu("Admin",d)),v=W.builder(),B.useDynamicWorkshopAuthor()&&(h=function(){return I.instant("ui_browse_context_menu_browse_by_author",r)},s.push(function(){v.updateLabel("authorbrowse",h())}),v.button(h(),"fas fa-user",function(){D.callbackBrowseAuthor(o.authorsteamid)}).id("authorbrowse"),function(e){if(angular.isNumber(ut[e.authorsteamid]))return R.when(ut[e.authorsteamid]);j.callDeferred("browseWallpaperObject","queryWorkshop",{itemid:e.authorsteamid,sort:"published_desc",callback:"onTotalCountByAuthorReceived",totalOnly:!0});var t=R.defer();return(gt[e.authorsteamid]=t).promise}(o).then(function(e){r.count=e,v.updateLabel("authorbrowse",h())})),"Web"!==o.type&&"Scene"!==o.type||(b=o.ispreset?Ee(o.dependency)||{title:o.dependency,workshopid:o.dependency}:o,v.button(I.instant("ui_browse_details_properties_preset_browse_workshop",{count:"?"}),B.getProviderIcon(),function(){D.callbackBrowsePresets(b)}).id("presetbrowse"),function(e){if(angular.isNumber(dt[e.workshopid]))return R.when(dt[e.workshopid]);j.callDeferred("browseWallpaperObject","queryWorkshop",{preset:e.workshopid,callback:"onTotalCountReceived",totalOnly:!0});var t=R.defer();return(pt[e.workshopid]=t).promise}(b).then(function(e){return I("ui_browse_details_properties_preset_browse_workshop",{count:e})}).then(function(e){v.updateLabel("presetbrowse",e)})),_=D.sourceIsWorkshop&&"folder"!==o.type&&o.authorsteamid,y=D.canSendReports&&!D.isUsingBackup,w=_||y,!D.canOpenWallpaperDetailsOnPlatform&&v.empty()&&!w||E.empty()||E.divider(),D.canOpenWallpaperDetailsOnPlatform&&E.button("ui_browse_context_menu_workshop",B.getProviderIcon(),function(){D.openSteamWorkshopPage(o)}),v.empty()||E.subMenu("ui_browse_context_menu_related_wallpapers",v),(y||_||A)&&(k=W.builder(),y&&k.button("ui_browse_context_menu_report","fas fa-exclamation-triangle",function(){se()?D.openReportDialog(o):B.showSteamError()},void 0,"browserReportButton"),_&&(x=function(){return I.instant("ui_browse_context_menu_block_author",r)},S=function(){return I.instant("ui_browse_context_menu_unblock_author",r)},s.push(function(){k.updateLabel("authoraddblacklist",x()),k.updateLabel("authorremoveblacklist",S())}),D.browserSettingsExtensions.authorblocklist.includes(o.authorsteamid)?k.button(S(),"fas fa-user-check",function(){D.browserSettingsExtensions.authorblocklist.findAndRemove(o.authorsteamid),D.browserSettings.authorblocklistnames.findAndRemove(function(e){return e.value===o.authorsteamid}),D.sortedWallpapers=D.sortedWallpapers.slice(),D.sortedWallpapers.sort(Je)}).id("authorremoveblacklist"):k.button(x(),"fas fa-user-slash",function(){D.browserSettingsExtensions.authorblocklist.push(o.authorsteamid),D.browserSettings.authorblocklistnames.push({name:r.author&&"?"!==r.author?r.author:o.authorsteamid,value:o.authorsteamid}),D.sortedWallpapers=D.sortedWallpapers.slice(),D.sortedWallpapers.sort(Je)},void 0,"browserReportButton").id("authoraddblacklist")),A&&P(k),E.subMenu("ui_browse_context_menu_report_and_block",void 0,k,"browserReportButton"))):(o.localAndExternal||o.official)&&E.button("ui_browse_context_menu_remove","fas fa-times",function(){0===D.multiSelection.length?Be(o,!0):lt(o)}),"folder"!==o.type&&(D.sourceIsInstalled||o.workshopid||"installed"===o.status)&&(E.divider(),!D.sourceIsInstalled&&"installed"!==o.status||(a=o,angular.forEach(D.sharedSettings&&D.sharedSettings.hotkeys,function(e){e.value===a.file&&e.location===D.selectedMonitor.location&&"wallpaper"===e.action&&(i=e)}),(C=i)?E.button("ui_browse_context_menu_remove_hotkey","fas fa-times",function(){D.sharedSettings.hotkeys.findAndRemove(C)}):E.button("ui_browse_context_menu_assign_hotkey","far fa-keyboard",function(){F.open("browseAssignHotkey",{data:{hotkeys:D.sharedSettings.hotkeys,name:o.title}}).then(function(e){D.sharedSettings.hotkeys.push({action:"wallpaper",keys:e,location:D.selectedMonitor.location,value:o.file,title:o.title})})})),"installed"===o.status&&"URL"!==o.type&&(E.button("ui_editor_filemenu_open_in_explorer","fas fa-folder-open",function(){j.callDeferred("browseWallpaperObject","openInExplorer",o.project||o.file)}),(T=W.builder()).button("ui_browse_context_menu_fullhd_preview","fas fa-computer",function(){D.promptWallpaperDependencySubscription(o).then(function(e){"pending"!==e&&"downloading"!==e&&j.callDeferred("browseWallpaperObject","playInWindow",{file:o.file,location:"Wallpaper Pop-out",propertylocation:D.selectedMonitor.location})})}).button("ui_browse_context_menu_phone_preview","fas fa-mobile",function(){D.promptWallpaperDependencySubscription(o).then(function(e){"pending"!==e&&"downloading"!==e&&j.callDeferred("browseWallpaperObject","playInWindow",{file:o.file,location:"Wallpaper Pop-out",width:607,height:1080,propertylocation:D.selectedMonitor.location})})}).divider().button("ui_browse_context_menu_maximized_preview","fas fa-window-maximize",function(){D.promptWallpaperDependencySubscription(o).then(function(e){"pending"!==e&&"downloading"!==e&&j.callDeferred("browseWallpaperObject","playInWindow",{file:o.file,location:"Wallpaper Pop-out",maximized:!0,propertylocation:D.selectedMonitor.location})})}),E.subMenu("ui_browse_context_menu_play_in_window",T))));var M,A,T,O=ze(!0,o);D.isMobileTranscoderAvailable()&&o&&("installed"===o.status||"folder"===o.type)&&D.canUploadWallpaperToMobileDevice(O,!0)&&(E.requestDivider(),O=D.filterWallpapersForMobileDevice(O),M=W.builder(),O.empty()?M.button("ui_browse_context_menu_mobile_type_not_supported","fas fa-times",void 0,void 0,"ctxBtnDisabled"):(angular.forEach(D.mobileManagerState.connectedDevices,function(e){M.button(I.instant("ui_browse_context_menu_send_to",{name:e.name}),"far fa-mobile-android",function(){D.sendToMobileDevice(O,e)})}),M.empty()||M.divider(),M.button("ui_browse_context_menu_export_pkg","fas fa-file-download",function(){fe(O).then(me).then(function(e){0<e.length&&F.open("browseMobileUpload",{data:{device:{name:"export"},location:D.selectedMonitor&&D.selectedMonitor.location,isExporting:!0,wallpapers:e}})})}),M.button("ui_browse_context_menu_connect_new_device","fas fa-wifi",function(){D.mobileDeviceManagementActive=!0})),E.subMenu("ui_browse_context_menu_send_to_device",M)),E.requestDivider(),D.sourceIsInstalled&&(E.button("ui_browse_context_menu_create_folder","fas fa-folder-plus",function(){var a={title:"ui_browse_modal_folder_create_title",cancelVisible:!0,okVisible:!0,textinputVisible:!0};I("ui_browse_context_menu_new_folder_name").then(function(e){return a.textinput=a.textinputDefault=e,F.open("genericConfirm",{data:a})}).then(function(){var e=D.currentFolder&&D.currentFolder.subfolders||D.folders,t={type:"folder",title:(0===a.textinput.length?a.textinputDefault:a.textinput).toString(),subfolders:[],items:{}};e.push(t),ye(),$e(t)})}),o&&"folder"===o.type&&(E.button("ui_browse_context_menu_remove_folder","fas fa-times",function(){var t={message:"ui_browse_modal_folder_remove_body",checkboxTitle:"ui_browse_modal_folder_remove_unsubscribe_and_remove_items",checkboxVisible:!0,okVisible:!0,cancelVisible:!0};I("ui_browse_modal_folder_remove_title",{title:o.title}).then(function(e){return t.title=e,F.open("genericConfirm",{data:t})}).then(function(){t.checkboxChecked&&Be(Le([o])),ot(o)})}),A=function(e){e?angular.isObject(e)?(o.folderIconOpen=e.open,o.folderIcon=e.close):(delete o.folderIconOpen,o.folderIcon=e):(delete o.folderIconOpen,delete o.folderIcon)},(T=W.builder()).grid(5),T.gridItem("","fas fa-folder browseFolderIconEnlarge",A),T.gridItem("","fas fa-star browseFolderIconEnlarge",A,"fas fa-star"),T.gridItem("","fas fa-heart browseFolderIconEnlarge",A,"fas fa-heart"),T.gridItem("","fas fa-gem browseFolderIconEnlarge",A,"fas fa-gem"),T.gridItem("","fas fa-car browseFolderIconEnlarge",A,{close:"fas fa-car",open:"fas fa-car-burst"}),T.gridItem("","fas fa-rocket browseFolderIconEnlarge",A,{close:"fas fa-rocket",open:"fas fa-rocket-launch"}),T.gridItem("","far fa-snowflake browseFolderIconEnlarge",A,"fas fa-snowflake"),T.gridItem("","fas fa-thumbs-up browseFolderIconEnlarge",A,"fas fa-thumbs-up"),T.gridItem("","fas fa-gamepad-modern browseFolderIconEnlarge",A,"fas fa-gamepad-modern"),T.gridItem("","fas fa-gift browseFolderIconEnlarge",A,"fas fa-gift"),T.gridItem("","fas fa-music browseFolderIconEnlarge",A,"fas fa-music"),T.gridItem("","fas fa-trash browseFolderIconEnlarge",A,"fas fa-trash"),T.gridItem("","fas fa-bug browseFolderIconEnlarge",A,"fas fa-bug"),T.gridItem("","fas fa-magic browseFolderIconEnlarge",A,{close:"fas fa-magic",open:"fas fa-wand-magic-sparkles"}),T.gridItem("","fas fa-banana browseFolderIconEnlarge",A,"fas fa-banana"),T.gridItem("","fas fa-alien browseFolderIconEnlarge",A,"fas fa-alien"),T.gridItem("","fas fa-alien-8bit browseFolderIconEnlarge",A,"fas fa-alien-8bit"),T.gridItem("","fas fa-bat browseFolderIconEnlarge",A,"fas fa-bat"),T.gridItem("","fas fa-bomb browseFolderIconEnlarge",A,{close:"fas fa-bomb",open:"fas fa-explosion"}),T.gridItem("","fas fa-boombox browseFolderIconEnlarge",A,"fas fa-boombox"),T.gridItem("","fas fa-candle-holder browseFolderIconEnlarge",A,"fas fa-candle-holder"),T.gridItem("","fas fa-dragon browseFolderIconEnlarge",A,"fas fa-dragon"),T.gridItem("","fas fa-fire browseFolderIconEnlarge",A,"fas fa-fire"),T.gridItem("","fas fa-meteor browseFolderIconEnlarge",A,"fas fa-meteor"),T.gridItem("","fas fa-tree-palm browseFolderIconEnlarge",A,"fas fa-tree-palm"),T.gridItem("","fas fa-skull-crossbones browseFolderIconEnlarge",A,"fas fa-skull-crossbones"),T.gridItem("","fas fa-tree-christmas browseFolderIconEnlarge",A,"fas fa-tree-christmas"),T.gridItem("","fas fa-tv-retro browseFolderIconEnlarge",A,"fas fa-tv-retro"),T.gridItem("","fas fa-balloons browseFolderIconEnlarge",A,{close:"fas fa-balloons",open:"far fa-burst"}),T.gridItem("","fas fa-bone browseFolderIconEnlarge",A,"fas fa-bone"),E.subMenu("ui_browse_context_menu_change_icon",T),(A=W.builder()).button("ui_browse_context_menu_default","",T=function(e){e?o.folderColor=e:delete o.folderColor},{},"ctxMenuNoIcon"),A.grid(5),A.gridItem("","fas fa-square browseFolderColorBrightBlue",T,"browseFolderColorBrightBlue"),A.gridItem("","fas fa-square browseFolderColorBlue",T,"browseFolderColorBlue"),A.gridItem("","fas fa-square browseFolderColorPurple",T,"browseFolderColorPurple"),A.gridItem("","fas fa-square browseFolderColorMagenta",T,"browseFolderColorMagenta"),A.gridItem("","fas fa-square browseFolderColorRed",T,"browseFolderColorRed"),A.gridItem("","fas fa-square browseFolderColorYellow",T,"browseFolderColorYellow"),A.gridItem("","fas fa-square browseFolderColorBrightYellow",T,"browseFolderColorBrightYellow"),A.gridItem("","fas fa-square browseFolderColorGreen",T,"browseFolderColorGreen"),A.gridItem("","fas fa-square browseFolderColorDarkGreen",T,"browseFolderColorDarkGreen"),E.subMenu("ui_browse_context_menu_change_color",A),E.divider())),o||P(E);P=W.builder().button("ui_browse_context_menu_icon_small","small"===D.browserSettings.viewiconsize?"fas fa-check":"",function(){D.browserSettings.viewiconsize="small"}).button("ui_browse_context_menu_icon_medium","medium"===D.browserSettings.viewiconsize?"fas fa-check":"",function(){D.browserSettings.viewiconsize="medium"}).button("ui_browse_context_menu_icon_large","large"===D.browserSettings.viewiconsize?"fas fa-check":"",function(){D.browserSettings.viewiconsize="large"});D.sourceIsInstalled&&P.divider().button("ui_browse_context_menu_results_per_page_50",50===D.browserSettings.resultsperpage?"fas fa-check":"",function(){D.browserSettings.resultsperpage=50,ye()}).button("ui_browse_context_menu_results_per_page_100",100===D.browserSettings.resultsperpage?"fas fa-check":"",function(){D.browserSettings.resultsperpage=100,ye()}).button("ui_browse_context_menu_results_per_page_200",200===D.browserSettings.resultsperpage?"fas fa-check":"",function(){D.browserSettings.resultsperpage=200,ye()}),E.subMenu("ui_browse_context_menu_view",P).open(D,t);break;case"dbl":if(o&&"folder"===o.type)return;D.callbackOk(!0)}},D.callbackWallpaperSelectionRectangle=function(e,t){t.ctrlKey?at(e):(t.shiftKey||(D.currentSelection=void 0,it()),et(e))};var ft=0;D.callbackWallpaperSelected=function(e){var t,a;"folder"!==e.type?D.currentSelection!==e&&0===ft&&(angular.isObject(D.currentSelection)&&angular.isObject(e)&&(D.currentSelection.title!==e.title||D.currentSelection.workshopid!==e.workshopid)&&(D.preview.play=!1),t=R.when(),"application"!==e.type.toLowerCase()||"installed"!==e.status||!angular.isDefined(e.workshopid)||(a=e,0<=l.indexOf(a.authorsteamid)||0<=a.tags.indexOf("Approved"))||e.local||(ft=e.workshopid,t=Fe(e.file,e)),"downloadable"!==e.status&&(t=t.then(function(){return D.promptWallpaperWindowsCompatibility(e)})),(t="installed"===e.status?t.then(function(){return D.promptWallpaperDependencySubscription(e)}):t).then(function(){"installed"===(D.currentSelection=e).status&&We(e)}).catch(function(){N=!0,v(function(){N=!1},1500)}).finally(function(){ft=0})):D.navigateFolder(e)},D.callbackRemoveWallpaperAndPlaylistFromMonitor=function(e){Re(e)};var mt=[],vt=[],ht=!1;function bt(){return D.sourceIsInstalled?{source:"installed",next:D.currentFolder,page:D.pagination.current}:D.sourceIsExplore?{source:"explore",stack:D.exploreNavigation.slice(),page:D.pagination.current}:D.sourceIsWorkshop?{source:"workshop",page:D.pagination.current}:void 0}function _t(e,t){if(!t)return!0;var a=!1;return angular.forEach(e,function(e){a=a||e===t,e.subfolders&&(a=a||_t(e.subfolders,t))}),a}function yt(e){D.exploreNavigation.length=e.stack.length;for(var t=0;t<e.stack.length;++t)D.exploreNavigation[t]=e.stack[t];D.navigateCurrentExplorePage(),1<D.exploreNavigation.length&&D.callbackChangePage(e.page)}function wt(t){return t&&t.isGroup?t:(t&&t.isInGroup&&D.monitorGroups&&angular.forEach(D.monitorGroups,function(e){0<=e.monitors.indexOf(t.location)&&(a=e)}),a);var a}function kt(){var e=D.monitorProfile.splits||{},t=D.monitorProfile.groups||{},a=angular.copy(e),u={};D.monitorGroups={},D.monitorSplits={},angular.forEach(D.monitors,function(e){e.isInGroup=!1,e.isClone=!1,delete e.group,delete e.isCloneMaster});function g(e,t){e&&e[t.location]&&e[t.location].flip?t.isFlipped=!0:t.isFlipped=!1}var f,i;0===D.wallpaperConfig.layout?(angular.forEach(e,function(e,t){angular.isObject(e)&&(e=xe(t),!angular.isObject(e)||e.isInGroup||e.isGroup||function e(t,a,i,n,o){o=o||{splitIndex:1,rootLocation:i,deviceName:n.name+" Split "},a.left=a.left||{},a.right=a.right||{},a.left.index=n.index,a.right.index=n.index,a.location=i,a.left.location=i+"/L",a.right.location=i+"/R",a.left.rootLocation=o.rootLocation,a.right.rootLocation=o.rootLocation,a.left.isSplit=!0,a.right.isSplit=!0,a.w=n.w,a.h=n.h,Ge(a.left),Ge(a.right),0===a.direction?(a.left.h=n.h,a.right.h=n.h,a.left.w=a.position*n.w,a.right.w=n.w-a.position*n.w,a.left.x=n.x,a.right.x=n.x+a.position*n.w,a.left.y=n.y,a.right.y=n.y):(a.left.w=n.w,a.right.w=n.w,a.left.h=a.position*n.h,a.right.h=n.h-a.position*n.h,a.left.x=n.x,a.right.x=n.x,a.left.y=n.y,a.right.y=n.y+a.position*n.h),angular.isObject(t[a.left.location])?e(t,t[a.left.location],a.left.location,a.left,o):(a.left.splitIndex=o.splitIndex++,a.left.name=o.deviceName+a.left.splitIndex),angular.isObject(t[a.right.location])?e(t,t[a.right.location],a.right.location,a.right,o):(a.right.splitIndex=o.splitIndex++,a.right.name=o.deviceName+a.right.splitIndex)}(a,a[t],t,e))}),D.monitorSplits=a,f=0,angular.forEach(t,function(t,e){var a,i,n,o,r,s,l,c,d,p;angular.isObject(t)&&(i=t.monitors,n=e,o=a={},c=l=-(s=r=99999),d=[],p=[],angular.forEach(i,function(e){e=xe(e);angular.isObject(e)&&(r=Math.min(e.x,r),s=Math.min(e.y,s),l=Math.max(e.x+e.w,l),c=Math.max(e.y+e.h,c),d.push(e.name),p.push(e.location))}),!d.empty()&&(o.x=r,o.y=s,o.w=l-r,o.h=c-s,o.location=n,o.monitors=p,o.name="Group ("+d.join(", ")+")",o.isGroup=!0,Ge(o),1)&&(a.index=f++,a.layout=t.layout,a.source=t.source,a.monitorconfig=t.monitorconfig,u[e]=a,angular.forEach(t.monitors,function(e){e=xe(e);angular.isObject(e)&&(e.isInGroup=!0,e.isClone=2===t.layout,e.group=a,e.isClone&&e.location===a.source&&(e.isCloneMaster=!0),g(a.monitorconfig,e))})))})):2===D.wallpaperConfig.layout&&(i=D.monitors.find(function(e){return 0===e.index}),angular.forEach(D.monitors,function(e){e.isClone=0!==e.index,e.isClone?e.group=i:e.group=void 0,e.location===D.monitorProfile.source&&(e.isCloneMaster=!0),g(D.monitorProfile.monitorconfig,e)})),D.monitorGroups=u,Ve()}function xt(a){angular.forEach(angular.copy(D.monitorProfile.splits),function(e,t){t.startsWith(a)&&t.substr(a.length).match(/^[\/LR]*$/)&&(Re(t+"/L"),Re(t+"/R"),delete D.monitorProfile.splits[t])})}function St(e,t){var a=D.monitorProfile.splits[e],i=D.monitorProfile.splits[e+"/R"];return angular.isObject(i)&&i.direction===a.direction&&(e=a.position+(1-a.position)*i.position,i.position=(e-=t)/(1-t)),angular.isObject(a)&&(a.position=t,1)}D.pushNavigationHistory=function(e,t){ht||(t||!vt.empty()&&vt[vt.length-1].source===e.source&&angular.equals(vt[vt.length-1].next,e.current)&&angular.equals(vt[vt.length-1].stack,e.stack)&&angular.equals(vt[vt.length-1].page,e.page)?vt.pop():vt=[],mt.push(e),30<mt.length&&mt.shift())},D.pushNavigationHistoryPagination=function(){D.pushNavigationHistory(bt())},D.navigateFolder=function(e){D.pushNavigationHistory({source:"installed",next:D.currentFolder,current:e}),D.currentFolder=e,U.current=1,ye(),D.folderNavigation=function a(e,i){var n;return angular.forEach(e,function(e){var t;e===i?n=[e]:(t=a(e.subfolders,i))&&(n=[e].concat(t))}),n}(D.folders,e),it()},D.navigateFolderUp=function(){!angular.isArray(D.folderNavigation)||D.folderNavigation.length<2?D.navigateFolder():D.navigateFolder(D.folderNavigation[D.folderNavigation.length-2])},D.navigateFolderBackwards=function(){var e;mt.empty()||(vt.push(bt()),e=mt.pop(),D.setListSource(e.source),D.sourceIsInstalled?_t(D.folders,e.next)?(ht=!0,D.navigateFolder(e.next),ht=!1,D.callbackChangePage(e.page)):(mt=[],D.navigateFolder()):D.sourceIsExplore?yt(e):D.sourceIsWorkshop&&D.callbackChangePage(e.page))},D.navigateFolderForwards=function(){var e;vt.empty()||(e=vt[vt.length-1],D.pushNavigationHistory(bt(),!0),D.setListSource(e.source),D.sourceIsInstalled?_t(D.folders,e.next)?(ht=!0,D.navigateFolder(e.next),ht=!1,D.callbackChangePage(e.page)):vt=[]:D.sourceIsExplore?yt(e):D.sourceIsWorkshop&&D.callbackChangePage(e.page))},D.callbackSplitSelectedMonitor=function(i){F.open("browseSplitMonitor",{data:{config:{direction:0,position:.5},name:i.name,bounds:[{max:i.w},{max:i.h}]}}).then(function(e){var t=i.wallpaper,a=qe(i);D.monitorProfile.splits=D.monitorProfile.splits||{},D.monitorProfile.splits[i.location]=e.config,kt(),Ye(D.monitorProfile).then(function(){D.callbackSelectMonitor(D.monitorSplits[i.location].left),t&&(We(t),Ne(a))})})},D.callbackRemoveSplit=function(e){var t=e.location.slice(0,-2);xt(t),kt(),Ye(D.monitorProfile),angular.forEach(D.monitors,function(e){e.location===t&&D.callbackSelectMonitor(e)});var a="L"===t[t.length-1],i=t.slice(0,-2);angular.forEach(D.monitorSplits,function(e,t){t===i&&D.callbackSelectMonitor(a?e.left:e.right)})},D.callbackSplitMoved=function(e,t){St(e,t)&&(t=D.selectedMonitor&&D.selectedMonitor.location,kt(),Ye(D.monitorProfile),(t=t&&xe(t))&&D.callbackSelectMonitor(t))},D.callbackSplitDblClick=function(t){var e=xe(t),a=D.monitorProfile.splits[t];angular.isObject(a)&&angular.isObject(e)&&F.open("browseSplitMonitor",{data:{config:angular.copy(a),name:e.name,bounds:[{max:e.w},{max:e.h}]}}).then(function(e){a.direction===e.config.direction?St(t,e.config.position):a=angular.merge(a,e.config),kt(),Ye(D.monitorProfile)})},D.callbackCreateGroup=function(e){var t,a,i=D.monitorSelectionState.createGroup;if(D.monitorSelectionState.createGroup=0,!(e.length<2)){2!==i&&angular.forEach(e,function(e){e.isGroup||xt(e.location)});var n=e.find(function(e){return e.isGroup?e:e.isInGroup?wt(e):void 0});if(angular.isObject(n)){var o=n.location,r=D.monitorProfile.groups[n.location];angular.isObject(r)&&(r.layout=i,angular.forEach(e,function(e){var t;e.isGroup?(t=D.monitorProfile.groups[e.location],angular.forEach(t&&t.monitors,function(e){-1===r.monitors.indexOf(e)&&r.monitors.push(e)})):-1===r.monitors.indexOf(e.location)&&r.monitors.push(e.location)})),angular.forEach(e,function(e){e!==n&&e.isGroup&&delete D.monitorProfile.groups[e.location]})}else{D.monitorProfile.groups=D.monitorProfile.groups||{};var s="";for(angular.forEach(e,function(e){s+=e.location}),o="group_"+s.hashCode();angular.isDefined(D.monitorProfile.groups[o]);)o="group_"+Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,6);i={monitors:e.map(function(e){return e.location}),layout:i};D.monitorProfile.groups[o]=i,n=xe(o),D.selectedMonitor&&(t=D.selectedMonitor.wallpaper,a=qe(D.selectedMonitor))}kt(),Ye(D.monitorProfile).then(function(){n=xe(o),angular.isObject(n)&&(D.callbackSelectMonitor(n),angular.isDefined(t)&&We(t),angular.isDefined(a)&&Ne(a))})}},D.callbackRemoveGroup=function(a){var i,t;if(D.monitorProfile.groups&&(a.isGroup?i={location:a.location,monitors:D.monitorProfile.groups&&D.monitorProfile.groups[a.location]&&D.monitorProfile.groups[a.location].monitors}:angular.forEach(D.monitorProfile.groups,function(e,t){e.monitors.includes(a.location)&&(i={location:t,monitors:e.monitors})}),angular.isObject(i))){for(Re(i.location),delete D.monitorProfile.groups[i.location],kt(),Ye(D.monitorProfile),angular.forEach(i.monitors,function(e){t=t||xe(e)});t&&angular.isDefined(D.monitorSplits&&D.monitorSplits[t.location]);)t=D.monitorSplits[t.location].left;t?D.callbackSelectMonitor(t):D.selectedMonitor=void 0}};var Ct,Et,Pt,Mt=!(D.callbackCancelMonitorGrouping=function(e){0!==D.monitorSelectionState.createGroup&&(D.monitorSelectionState.createGroup=0,e.stopPropagation(),e.preventDefault())});function At(t,a,e){t.location===a.source&&delete a.source,angular.isObject(a.monitorconfig)||(a.monitorconfig={}),a.monitorconfig[t.location]&&a.monitorconfig[t.location].flip?delete a.monitorconfig[t.location].flip:(a.monitorconfig[t.location]=a.monitorconfig[t.location]||{},a.monitorconfig[t.location].flip=!0);var i=0;angular.forEach(e,function(e){a.monitorconfig[e]&&a.monitorconfig[e].flip||++i}),0===i&&(Mt||(Mt=!0,F.open("genericConfirm",{data:{title:"ui_browse_monitors_clone_flip_limitation_title",message:"ui_browse_monitors_clone_flip_limitation_message",okVisible:!0}})),angular.forEach(e,function(e){0===i&&e!==t.location&&(delete a.monitorconfig[e].flip,++i)}))}function Tt(e,i,n){n=n||[],angular.forEach(e,function(e,t){var a={};a[t]=e.properties,e.properties=a,angular.isObject(_[e.file])||(_[e.file]={}),angular.merge(_[e.file],e);a=Ce(e.file);a&&n.push(a),i[t]={file:e.file,playlist:angular.copy(e.playlist)}})}function Ot(){var e,l,i;b&&D.syncStatus.subscriptionLoadAttempted&&(D.syncStatus.fileLoaded||D.syncStatus.fileError)&&(D.syncStatus.fileError||(D.$watch("syncFile",function(e,t){angular.isObject(e)&&!angular.equals(e,t)&&j.callDeferred("browseWallpaperObject","writeSyncFile",angular.toJson(e))},!0),e=function(e){angular.isNumber(e.syncid)&&(D.syncFile.nextId=Math.max(D.syncFile.nextId,e.syncid+1))},angular.forEach(D.syncFile.playlists,e),angular.forEach(D.syncFile.folders,e),angular.forEach(D.playlists,e),angular.forEach(D.folders,e),i=[],angular.forEach(D.playlists,function(e){var t;if(!e.syncDisabled&&angular.isNumber(e.syncid)){var r=D.syncFile.playlists.find((t=e.syncid,function(e){return e.syncid===t}));if(angular.isObject(r)&&angular.isArray(r.items)){var s=[];for(l=-1,angular.forEach(e.items,function(e){var t,a,i,n=angular.isObject(e)?e.file:e,o=Ce(n);angular.isObject(o)&&angular.isString(o.workshopid)?++l<r.items.length&&(t=r.items[l],(i=(a=angular.isObject(t))?t.file:t)===o.workshopid?a?((t=angular.copy(t)).file=n,s.push(t)):s.push(n):(i=Ee(i),angular.isObject(i)&&s.push(i.file))):s.push(e)}),++l;l<r.items.length;++l){var a=Ee(r.items[l]);angular.isObject(a)&&s.push(a.file)}e.name=r.name||e.name,angular.equals(e.settings,r.settings)||(e.settings=r.settings||e.settings),angular.equals(e.items,s)||(e.items=s)}else i.push(e)}}),angular.forEach(i,function(e){D.playlists.findAndRemove(e)}),D.$watch("playlists",function(e,t){var a;angular.isDefined(t)&&angular.isArray(e)&&(console.log("sync playlists with cloud save"),a=[],angular.forEach(D.playlists,function(e){var i;e.syncDisabled||(angular.isNumber(e.syncid)||(e.syncid=D.syncFile.nextId++),i={syncid:e.syncid,name:e.name,settings:e.settings,items:[]},angular.forEach(e.items,function(e){var t=angular.isObject(e),a=Ce(t?e.file:e);angular.isObject(a)&&angular.isString(a.workshopid)&&(t?((e=angular.copy(e)).file=a.workshopid,i.items.push(e)):i.items.push(a.workshopid))}),a.push(i))}),angular.equals(D.syncFile.playlists,a)||(D.syncFile.playlists=a))},!0)))}function It(){D.hideWallpaperSelection=D.sourceIsInstalled&&"screensaver"===D.wallpaperConfigGroup&&D.wallpaperConfigScreensaver.sameaswallpaper}function Rt(e){delete e.utilitytags.Customizable,delete e.utilitytags.Approved,delete e.utilitytags["Audio responsive"]}function Dt(){var t={x0:0,y0:0,x1:0,y1:0},e=Pt.innerWidth(),a=Pt.innerHeight();angular.forEach(Et,function(e){t.x0=Math.min(t.x0,e.x0),t.y0=Math.min(t.y0,e.y0),t.x1=Math.max(t.x1,e.x1),t.y1=Math.max(t.y1,e.y1)});var i=t.x1-t.x0,n=t.y1-t.y0,a=Math.min(e/i,a/n);D.monitorScale=a,D.monitorSelectionBoxStyle="width:"+i*a+"px;height:"+n*a+"px;position:absolute;",window.safeApply(D)}function Wt(){Ct&&(Ct.disconnect(),Ct=void 0)}D.callbackMonitorRightClick=function(e,r,t){var a,i,n=W.builder(),o=je(),s=1<o.length;if(2===D.wallpaperConfig.layout)return r.location===D.monitorProfile.source?n.button("ui_browse_monitors_clone_remove_source","fas fa-lock-open-alt",function(){delete D.monitorProfile.source,kt(),Ye(D.monitorProfile,!0)}):n.button("ui_browse_monitors_clone_set_source","fas fa-lock-alt",function(){D.monitorProfile.source=r.location,angular.isObject(D.monitorProfile.monitorconfig&&D.monitorProfile.monitorconfig[r.location])&&delete D.monitorProfile.monitorconfig[r.location].flip,kt(),Ye(D.monitorProfile,!0)}),s&&n.button("ui_browse_monitors_clone_flip","fas fa-reflect-horizontal",function(){At(r,D.monitorProfile,o.map(function(e){return e.location})),kt(),Ye(D.monitorProfile,!0)}),void(n.empty()||n.open(D,e));0===D.wallpaperConfig.layout&&(1<o.length&&angular.isObject(r.wallpaper)&&(a=W.builder(),i=W.builder(),angular.forEach(o,function(o){r.location===o.location||o.isInGroup||(a.button(o.name,function(){angular.isObject(r.wallpaper)&&j.callDeferred("browseWallpaperObject","transferWallpaperProperties",{file:r.wallpaper.file,source:r.location,destination:o.location}),We(r.wallpaper,o.location),Qe(r,o),Ie(),Ue(o)&&j.callDeferred("browseWallpaperObject","transferWallpaperProperties",{file:Object.keys(o.playlistFlags),source:r.location,destination:o.location})}),i.button(o.name,function(){var e=angular.isObject(r.wallpaper)&&r.wallpaper.file,t=angular.isObject(o.wallpaper)&&o.wallpaper.file,a=[],i=[];Ue(r)&&(a=Object.keys(r.playlistFlags)),Ue(o)&&(i=Object.keys(o.playlistFlags)),e&&a.push(e),t&&i.push(t);var a=a.uniquify(),i=i.uniquify(),n=a.filter(e=>i.includes(e));a=a.filter(e=>!n.includes(e)),i=i.filter(e=>!n.includes(e)),n.empty()||j.callDeferred("browseWallpaperObject","transferWallpaperProperties",{file:n,source:r.location,destination:o.location,swap:!0}),a.empty()||j.callDeferred("browseWallpaperObject","transferWallpaperProperties",{file:a,source:r.location,destination:o.location}),i.empty()||j.callDeferred("browseWallpaperObject","transferWallpaperProperties",{file:i,source:o.location,destination:r.location});a=o.wallpaper;angular.isObject(r.wallpaper)?We(r.wallpaper,o.location):D.callbackRemoveWallpaperAndPlaylistFromMonitor(o.location),angular.isObject(a)?We(a,r.location):D.callbackRemoveWallpaperAndPlaylistFromMonitor(r.location);a=angular.copy(o);Qe(r,o),Qe(a,r),Ie()}))}),n.subMenu("ui_browse_monitors_copy_to",a),n.subMenu("ui_browse_monitors_swap_with",i)),D.monitorController.audioIsEnabledForMonitor(r)?n.button("ui_browse_monitors_mute","fas fa-volume-mute",function(){D.monitorController.audioSetEnabledForMonitor(r,!1)}):n.button("ui_browse_monitors_unmute","fas fa-volume-up",function(){D.monitorController.audioSetEnabledForMonitor(r,!0)}),!s&&!r.isGroup||n.empty()||n.divider(),s&&(r.isSplit||r.isGroup&&2===r.layout||n.button("ui_browse_monitors_add_stretch_group","fas fa-object-group",function(){D.callbackSelectMonitor(r),D.monitorSelectionState.createGroup=1}),n.button("ui_browse_monitors_add_clone_group","fas fa-clone",function(){D.callbackSelectMonitor(r),D.monitorSelectionState.createGroup=2})),r.isGroup&&(2===r.layout&&(r.source===t.location?n.button("ui_browse_monitors_clone_remove_source","fas fa-lock-open-alt",function(){delete D.monitorProfile.groups[r.location].source,kt(),Ye(D.monitorProfile,!0),D.callbackSelectMonitor(xe(r.location))}):n.button("ui_browse_monitors_clone_set_source","fas fa-lock-alt",function(){var e=D.monitorProfile.groups[r.location];e.source=t.location,angular.isObject(e.monitorconfig&&e.monitorconfig[t.location])&&delete e.monitorconfig[t.location].flip,kt(),Ye(D.monitorProfile,!0),D.callbackSelectMonitor(xe(r.location))}),n.button("ui_browse_monitors_clone_flip","fas fa-reflect-horizontal",function(){var e=D.monitorProfile.groups[r.location];At(t,e,e.monitors),kt(),Ye(D.monitorProfile,!0),D.callbackSelectMonitor(xe(r.location))})),n.button("ui_browse_monitors_remove_group","fas fa-object-ungroup",function(){D.callbackRemoveGroup(r)})),r.isGroup||r.isInGroup||(n.button("ui_browse_monitors_add_split","fas fa-cut",function(){D.callbackSplitSelectedMonitor(r)}),le(r)&&!r.isSplit?n.button("ui_browse_monitors_auto_split","fas fa-magic",function(){j.callDeferred("browseWallpaperObject","readSurroundDisplayInfo").then(function(e){angular.isString(e.error)?F.open("genericConfirm",{data:{title:"ui_browse_monitors_auto_split_error_header",message:e.error,okVisible:!0}}):angular.isObject(e.splits)&&(xt(r.location),angular.merge(D.monitorProfile.splits,e.splits),kt(),Ye(D.monitorProfile),D.callbackSelectMonitor(D.monitorSplits[r.location].left))})}):r.isSplit&&n.button("ui_browse_monitors_remove_all_splits","fas fa-times",function(){xt(r.rootLocation),kt(),Ye(D.monitorProfile),D.callbackSelectMonitor(xe(r.rootLocation))})),n.empty()||n.open(D,e))},D.callbackSplitRightClick=function(e,t){var a=W.builder();a.button("ui_browse_monitors_edit_split","fas fa-edit",function(){D.callbackSplitDblClick(t)}).button("ui_browse_monitors_remove_split","fas fa-times",function(){D.callbackRemoveSplit(xe(t+"/L"))}),a.open(D,e)},D.syncFile={nextId:1},D.syncStatus={fileError:!1,fileLoaded:!1,subscriptionLoadAttempted:!1},D.setSyncInfo=function(e){console.log("setSyncInfo",e),angular.merge(D.syncFile,e),angular.isArray(D.syncFile.playlists)||(D.syncFile.playlists=[]),angular.isArray(D.syncFile.folders)||(D.syncFile.folders=[]),D.syncStatus.fileLoaded=!0,Ot()},D.setSyncPaused=function(){console.log("setSyncPaused"),D.syncStatus.fileError=!0,Ot()},D.$on("onSteamStatusFinished",function(){D.syncStatus.subscriptionLoadAttempted=!0,Ot()}),D.initializeMonitorsFromMonitorCfg=function(e){var t;t=e,Wt(),Et=t,t=document.getElementById("MonitorSelectionBox"),Pt=angular.element(t),t&&((Ct=new ResizeObserver(Dt)).observe(t),D.monitorController.rebuild&&D.monitorController.rebuild()),Dt();var a=[];angular.forEach(e,function(e){var t={};t.x=e.x0,t.y=e.y0,t.w=e.x1-e.x0,t.h=e.y1-e.y0,t.index=e.index,t.location=e.location,t.name=e.name,0===e.index&&(t.selected=!0),Ge(t),a.push(t)}),a.sort(function(e,t){return e.index<t.index?-1:e.index>t.index?1:0}),D.monitors=a},D.getFirstActiveMonitor=function(e){if(angular.isDefined(e&&D.monitorSplits[e.location]))for(;angular.isDefined(D.monitorSplits[e.location]);)e=D.monitorSplits[e.location].left;return e=e.isInGroup?wt(e)||e:e},D.applyMonitorConfigurationAndWallpaperConfig=function(e,a,t,i){D.initializeMonitorsFromMonitorCfg(e),E=t;e=a.wallpaperconfig||{},t=a.wallpaperconfigscreensaver||{};e.selectedwallpapers=e.selectedwallpapers||{},t.selectedwallpapers=t.selectedwallpapers||{},D.wallpaperConfig=e,D.wallpaperConfigRoot=e,D.wallpaperConfigScreensaver=t,D.wallpaperConfigGroup="wallpaper";function n(e){var t=D.selectedMonitor.location;angular.forEach(D.monitors,function(e){Ie(e),angular.isObject(D.wallpaperConfig.selectedwallpapers[e.location])&&(0<e.playlist.items.length?D.wallpaperConfig.selectedwallpapers[e.location].playlist=Te(e.playlist):delete D.wallpaperConfig.selectedwallpapers[e.location].playlist),delete e.wallpaper}),D.wallpaperConfig="screensaver"===e?D.wallpaperConfigScreensaver:D.wallpaperConfigRoot,j.callDeferred("browseWallpaperObject","changeConfigGroup",{group:D.wallpaperConfigScreensaver.sameaswallpaper?"wallpaper":e}),D.monitorProfile=D.wallpaperConfig&&D.wallpaperConfig.profile||{},It(),kt(),t=xe(t),He(D.getFirstActiveMonitor(t||0<D.monitors.length&&D.monitors[0])),angular.forEach(D.monitors,function(e){delete e.missingPlaylistItems,Ge(e)}),y=!1,Ke(),$e(),ye(),j.callDeferred("browseWallpaperObject","clearWorkerWindow")}var o,r=!1;D.startWatchingScreensaverSettings=function(){var e;r||"screensaver"===D.wallpaperConfigGroup&&(e=function(){j.callDeferred("browseWallpaperObject","checkScreensaverSelected").then(function(){D.showScreensaverWindowsSettingsWarning=!1}).catch(function(){D.showScreensaverWindowsSettingsWarning=r}),D.showScreensaverApplicationWallpaperWarning=D.currentSelection&&"Application"===D.currentSelection.type,"screensaver"===D.wallpaperConfigGroup?(v.cancel(o),o=v(e,3e3)):(v.cancel(o),r=!1,D.showScreensaverWindowsSettingsWarning=!1,D.showScreensaverApplicationWallpaperWarning=!1)},r=!0,e())},D.$watch("wallpaperConfigGroup",function(e,t){e!==t&&("screensaver"!==e||a.screensaverisavailable?n(e):F.open("genericConfirm",{data:{title:"ui_browse_modal_screensaver_install_header",message:"ui_browse_modal_screensaver_install_body",alert:"ui_browse_modal_screensaver_install_hint",leftIcon:"images/uac_small.png",okVisible:!0,cancelVisible:!0}}).then(function(){return j.callDeferred("browseWallpaperObject","installScreensaver").catch(function(){return F.open("genericConfirm",{data:{title:"ui_browse_modal_screensaver_install_error_header",message:"ui_browse_modal_screensaver_install_error_body",leftIcon:"images/warning.png",okVisible:!0}}),R.reject()})}).then(function(){a.screensaverisavailable=!0,n(e)}).catch(function(){D.wallpaperConfigGroup="wallpaper"}),Ve())}),D.$watch("wallpaperConfigScreensaver.sameaswallpaper",function(e,t){e!==t&&(j.callDeferred("browseWallpaperObject","changeConfigGroupOptions",{group:"screensaver",options:{sameaswallpaper:e}}),n(e?"wallpaper":D.wallpaperConfigGroup))}),D.monitorProfile=a.wallpaperconfig&&a.wallpaperconfig.profile||{},kt(),0<D.monitors.length&&He(D.getFirstActiveMonitor(D.monitors[0])),angular.merge(D.browserSettings,{advertiseexplore:!0,advertiseworkshop:!0,advertiseworkshoppopup:B.canUseFilterSettings(),advertisesendtomobile:!0}),angular.isObject(a.browser)&&(angular.isArray(a.browser.authorblacklist)&&(a.browser.authorblocklistnames=a.browser.authorblacklist.map(function(e){return{name:e||"?",value:e}}),delete a.browser.authorblacklist),angular.isArray(a.browser.authorblocklistnames)&&(D.browserSettingsExtensions.authorblocklist=a.browser.authorblocklistnames.map(function(e){return e.value})),angular.merge(D.browserSettings,a.browser),angular.merge(M,a.browser.filterinfo&&a.browser.filterinfo.installed||{}),angular.merge(A,a.browser.filterinfo&&a.browser.filterinfo.workshop||{}),Rt(M),Rt(A),D.filterProxy.ratingtags=angular.copy(M.ratingtags),!D.browserSettings.advertiseworkshoppopup&&angular.isUndefined(D.browserSettings.defaultfilterconfig.Anime)&&(s=A.tags&&!0===A.tags.Anime,D.browserSettings.defaultfilterconfig={Anime:s})),D.folders=D.browserSettings.folders,v(function(){D.$broadcast("rzSliderForceRender")});var s={};Tt(a.wproperties||a.wallpaperproperties,s),Ze(D.wallpapers),e.selectedwallpapers=s,angular.isArray(a.localfiles)&&(a.localfiles.map(function(e){angular.isObject(e)?we(e.file,void 0,e.name):we(e)}),ye()),Ke(),$e(),D.showMonitorRow?(D.browserSettings.showmonitorselectiononstart&&D.showMonitorSelection(),!D.changeMonitorActive&&angular.isString(D.browserSettings.lastselectedmonitor)&&(s=xe(D.browserSettings.lastselectedmonitor),angular.isObject(s)&&He(s))):D.canAdvertiseWorkshop=x;var l,c,d,p,u,g,f,m=[];angular.forEach(D.monitors,function(e){angular.isObject(e.wallpaper)&&m.push(e.wallpaper)}),Ze(m),D.playlists=a.playlists||[],D.profiles=a.profiles||[],D.sharedSettings=a.shared||{},D.generalUserSettings=a.general||{},D.userMonitorSettings=D.generalUserSettings.usermonitors||{},D.browserRuntime=i,B.validateSharedSettings(D.sharedSettings),v(function(){b=!0,D.requestTrialWarning&&D.showTrialWarning(),Ot()}),a.browseroptions&&((l=B.getActiveEvent())&&D.browserSettings[l.key]&&(l=void 0),a.browseroptions.safemodewarning?(d=function(){c.checkboxChecked||j.callDeferred("browseWallpaperObject","disableSafeMode")},F.open("genericConfirm",{data:c={title:"ui_browse_modal_safe_mode_header",message:"ui_browse_modal_safe_mode_body",okVisible:!0,cancelVisible:!0,checkboxLowVisible:!0,checkboxChecked:!0,checkboxTitle:"ui_browse_use_safe_mode"}}).then(function(){j.callDeferred("browseWallpaperObject","reloadWallpaperConfig"),d()}).catch(function(){d()})):a.browseroptions.showslideshowwarning&&!1!==D.sharedSettings.slideshowwarningenabled?(p={title:"ui_win32_slideshow_compat_modal_title",message:"ui_win32_slideshow_compat_modal_body",okVisible:!0,okText:"ui_close",checkboxLowVisible:a.browseroptions.candisableslideshowwarning,checkboxChecked:!1,checkboxTitle:"ui_win32_slideshow_compat_modal_check_ignore"},F.open("genericConfirm",{data:p}).then(function(){p.checkboxChecked&&(D.sharedSettings.slideshowwarningenabled=!1)})):l?F.open("genericConfirm",{data:{title:l.title,message:l.message,okVisible:!0,cancelVisible:!1,leftVisible:!0,leftClass:"btn-info",leftAction:"browseEvent",leftText:"ui_browse_modal_seasonal_info_browse_collection"}}).then(function(e){"browseEvent"===e&&(D.setListSource("explore"),v(function(){D.pushExplorePage(l.query)}))}):a.browseroptions.seasonaldialogoptions&&(u=a.browseroptions.seasonaldialogoptions,g={title:u.header,message:"ui_browse_modal_seasonal_info_body",okVisible:!0,cancelVisible:!1,checkboxVisible:!0,checkboxChecked:!1,checkboxTitle:"ui_browse_modal_seasonal_info_never_show_again",leftVisible:!0,leftClass:"btn-default",leftAction:"browseCollection",leftText:"ui_browse_modal_seasonal_info_browse_collection",left2Visible:!0,left2Class:"btn-default",left2Action:"revertTheme",left2Text:"ui_browse_modal_seasonal_info_disable_theming"},F.open("genericConfirm",{data:g}).then(function(e){D.browserSettings.seasonaldialogtimestamp=u.timestamp,g.checkboxChecked&&(D.browserSettings.seasonaldialogdisabled=!0),"browseCollection"===e?D.setListSource("explore"):"revertTheme"===e&&j.callDeferred("browseWallpaperObject","disableUiSeasonalTheming")})),a.browseroptions.showworkshop&&D.setListSource(B.getDefaultWorkshopTab()),a.browseroptions.showscreensavers&&v(function(){D.showScreensaverSettings()}),D.browserOptions=a.browseroptions),19536<=h.getWindowsBuild()&&h.getWindowsBuild()<19564&&!D.browserSettings.buildversionerror19536newdisabled&&(f={title:"Broken Windows Insider Build (19536 - 19564)",message:"Your current Windows Insider build "+h.getWindowsBuild()+" does not allow for Wallpaper Engine to work.<br/><br/>Please update to Insider build <b>19564</b> or later to make Wallpaper Engine work again.",leftIcon:"images/warning.png",okText:"ui_ok",okVisible:!0,checkboxLowVisible:!0,checkboxChecked:!1,checkboxTitle:"ui_browse_modal_steam_redownload_never_show_again"},F.open("genericConfirm",{data:f},{backdropClass:"modal-backdrop-danger"}).then(function(){f.checkboxChecked&&(D.browserSettings.buildversionerror19536newdisabled=!0)}))},D.updateGeneralSettings=function(e){angular.merge(D.generalUserSettings,e)},D.updateConfigWallpaperProperties=function(a,e){var t;e&&(t=D.selectedMonitor.location,D.initializeMonitorsFromMonitorCfg(e),kt(),t=xe(t),He(D.getFirstActiveMonitor(t||0<D.monitors.length&&D.monitors[0])),angular.forEach(D.monitors,function(e){delete e.missingPlaylistItems,Ge(e)}),y=!1,Ke()),D.wallpaperConfig&&D.wallpaperConfig.selectedwallpapers&&(Tt(a,D.wallpaperConfig.selectedwallpapers,t=[]),angular.forEach(D.wallpaperConfig.selectedwallpapers,function(e,t){a.hasOwnProperty(t)||(delete D.wallpaperConfig.selectedwallpapers[t],(t=xe(t))&&delete t.wallpaper)}),Ze(t),y=!1,Ke(),D.selectedMonitor&&D.selectedMonitor.wallpaper?We(D.selectedMonitor.wallpaper):D.currentSelection=void 0)},D.applyUserVote=function(t,a){angular.forEach(D.wallpapers.concat(_e()),function(e){e.workshopid===t&&(e.uservote=a)}),window.safeApply(D)};var Bt,Ft=[];function jt(){R.all([e("views/includes/browseruserproperties.html"),e("views/includes/browseruserpropertiesgroup.html")]).then(function(e){var a=e[0],o=e[1],r=angular.element(c.find("#BrowserUserPropertiesParent")[0]);if(r.empty(),angular.forEach(Ft,function(e){e.pending=!1,e.scope.$destroy(),e.groupScope&&e.groupScope.$destroy()}),Ft=[],D.currentSelection&&angular.isObject(D.currentSelection.properties)&&angular.isString(D.selectedMonitor&&D.selectedMonitor.location)&&angular.isObject(D.currentSelection.properties[D.selectedMonitor.location])){var e=D.currentSelection.properties[D.selectedMonitor.location],i=[];angular.forEach(e,function(e,t){e.key=t,i.push(e)}),i.sort(function(e,t){return e.order-t.order});var t=[],n={properties:[]};t.push(n);for(var s=0;s<i.length;++s){var l=i[s];angular.isString(l.condition)?l.condition=l.condition.replace("$",""):delete l.condition,"group"===l.type?t.push(n={properties:[],property:l}):n.properties.push(l)}angular.forEach(t,function(e){var t=D.$new();t.properties=e.properties;var n={scope:t,pending:!0};Ft.push(n);d(a)(t,function(i){n.pending&&(n.pending=!1,e.property?(n.groupScope=D.$new(),n.groupScope.groupProperty=e.property,n.groupScope.open=!1,n.propertiesElement=i,d(o)(n.groupScope,function(e){function t(){var e=n.propertiesElement[0].cloneNode(!0);angular.element(e).css({position:"absolute",width:"100px",left:"-10000px",visibility:"hidden"}),c.find("body").append(e);var t=e.offsetHeight;e.remove(),n.groupParent.css("max-height",t),n.groupParent.css("overflow","hidden")}n.groupScope.toggleGroupVisibility=function(){v.cancel(Bt),n.groupScope.open?(n.groupScope.open=!1,n.propertiesElement&&t()):(n.groupScope.open=!0,Bt=v(function(){n.groupParent.css("max-height","none"),n.groupParent.css("overflow","visible")},300))};var a=e.find("#GroupFoldParent");(n.groupParent=a).append(i),r.append(e),v(t)})):r.append(i))})})}})}var Vt,Lt=!(D.setWallpaperProperties=function(t){function e(e){angular.isObject(e)&&e.file===t.file&&(e.properties=e.properties||{},e.properties[t.location]=t.properties,e.defaultproperties=t.defaultproperties,e.propertyPresets=t.presets,e.cancreatepresets=t.cancreatepresets,e.aspect=t.aspect,be(e))}angular.forEach(D.wallpapers,e),e(D.currentSelection),re(),D.currentSelection&&t.file===D.currentSelection.file&&jt()});function zt(){D.browserSettings.paireddevices.sort(function(e,t){e=D.mobileManagerState.connectedDevices.find(K(e.id))?1:0;return(D.mobileManagerState.connectedDevices.find(K(t.id))?1:0)-e})}D.updateWorkshopStatus=function(e){var t;(D.steamWorkshopStatus=e).complete&&v(function(){D.steamWorkshopStatus.hidden=!0},5e3),(e.complete||e.error)&&(e.isWrongPlatform&&B.setWrongProviderFound(),n.$broadcast("onSteamStatusFinished",e),B.canUseMotd()&&j.wpxAPIGet("/api/motd/v1").then(function(e){e=e&&e.data&&e.data.response,angular.isObject(e)&&angular.isString(e.message)&&e.status&&(D.motdMessage=a(e.message),D.showMotdMessage=!0)})),se()?!e.redownload||Lt||D.browserSettings.steamredownloaddialogdisabled||(t={title:"ui_browse_modal_steam_redownload_error_header",message:"ui_browse_modal_steam_redownload_error_body",okVisible:Lt=!0,checkboxVisible:!0,checkboxChecked:!1,checkboxTitle:"ui_browse_modal_steam_redownload_never_show_again"},F.open("genericConfirm",{data:t}).then(function(){t.checkboxChecked&&(D.browserSettings.steamredownloaddialogdisabled=!0)})):(x=!1,D.canAdvertiseWorkshop=!1)},D.showInstallationWarning=function(e,t){B.showInstallationWarning(e,t).then(function(e){"disable"===e?j.callDeferred("browseWallpaperObject","removeAutoStartCompletely"):"fix"===e&&j.callDeferred("browseWallpaperObject","fixAutoStart")})},D.callOpenStorePage=function(){j.callDeferred("browseWallpaperObject","openStorePage")},D.showTrialWarning=function(){S=!0,b?D.browserSettings.hasshowntrialwarning||(D.browserSettings.hasshowntrialwarning=!0,I("ui_modal_trial_version_start_body",{hrs:2}).then(function(e){return F.open("genericConfirm",{data:{title:"ui_modal_trial_version_start_title",message:e,okVisible:!0,leftVisible:!0,leftClass:"btn-info",leftAction:"openStore",leftText:"ui_modal_trial_version_start_open_store_page"}}).then(function(e){"openStore"===e&&D.callOpenStorePage()})})):D.requestTrialWarning=!0},D.showWindowsInsiderWarning=function(){D.showMotdMessage||(D.motdMessage="ui_windows_insider_warning",D.showMotdMessage=!0)},D.showMonitorMismatch=function(){F.open("genericConfirm",{data:{title:"ui_browse_modal_monitor_mismatch_title",message:"ui_browse_modal_monitor_mismatch_body",okVisible:!0}})},D.openSteamUserPage=function(e){B.openUrl("var_url_userpage",{id:e})},D.openSteamWorkshopPage=function(e){B.openUrl(e.workshopurl,{},B.usePlatformBrowser())},D.openScreensaverFaq=function(){B.openUrl("var_url_faqscreensaver")},D.getWorkshopUrl=j.getWorkshopUrl,D.copyWorkshopUrl=j.copyWorkshopUrl,D.openSteamConnectFaq=function(){B.openUrl("var_url_faqsteam")},D.openReportDialog=function(e){F.open("browseReport",{data:{wallpaper:e,backendUrl:j.wpxAPIBackendUrl,steamAuth:D.steamAuth}})},D.canSendReports=B.canSendReports(),D.canUseFilterSettings=B.canUseFilterSettings,D.canUseMultiselect=function(){return D.sourceIsInstalled||!S},D.promptWallpaperWindowsCompatibility=function(t){var e=R.defer();return t&&angular.isString(t.tags)&&t.tags.toLowerCase().includes("video texture")&&h.getWindowsVersion()<10?(I(["ui_browse_modal_windows_10_warning_message"],{title:t.title}).then(function(e){return F.open("genericConfirm",{data:{title:"ui_browse_modal_windows_10_warning_title",message:e.ui_browse_modal_windows_10_warning_message,okVisible:!1,cancelVisible:!0,cancelText:"ui_close",leftVisible:angular.isObject(t),leftClass:"btn-danger",leftText:"ui_browse_details_btn_unsubscribe",leftAction:"unsubscribe"}},{}).then(function(e){"unsubscribe"===e&&Be(t)})}),e.reject()):e.resolve(),e.promise},D.promptWallpaperDependencySubscription=function(e){angular.isArray(e)||(e=[e]);var i=R.when(),n=[];return angular.forEach(e,function(t){var a;angular.isString(t.dependency)&&(a=!0,angular.forEach(D.wallpapers,function(e){e.workshopid===t.dependency&&"unsubscribed"!==e.status&&(a=!1,e.status)}),a&&(n.push(t.dependency),1===n.length&&(i=I("ui_browse_modal_subscribe_preset_body",{title:t.title}).then(function(e){return F.open("genericConfirm",{data:{title:"ui_browse_modal_subscribe_preset_header",message:e,okVisible:!0,cancelVisible:!0}}).then(function(){return j.callDeferred("ui","subscribeWorkshopItem",n).then(function(){return"pending"})})}))))}),i},D.subscribeWorkshopItem=function(e){angular.isArray(e)||(e=[e]),D.promptWallpaperDependencySubscription(e).then(function(){return B.canShowTrialWarning()&&S&&(++C,D.showTrialAdvertiseAlert=5<=C,2===C)?F.open("genericConfirm",{data:{title:"",message:"ui_browse_modal_trial_reminder_body",cancelVisible:!0,cancelText:"ui_browse_alert_trial_reminder_button_cancel",okVisible:!0,okText:"ui_browse_alert_trial_reminder_button"}}).then(function(){j.callDeferred("browseWallpaperObject","openStorePage")}):void j.callDeferred("ui","subscribeWorkshopItem",e.map(function(e){return e.workshopid}))})},D.openFromFile=function(e){j.callDeferred("browseWallpaperObject","openFromFile",e).then(D.dropFile)},D.openFromUrl=function(){F.open("openFromUrl",{data:{hotkeys:D.sharedSettings.hotkeys}}).then(function(e){var t;angular.isString(e.url)&&0<e.url.length&&(rt(t=we(e.url,"Web",e.name),D.currentFolder),ye(),We(t),$e(),j.callDeferred("browseWallpaperObject","addLocalWallpaperToHistory",[{file:t.file,name:e.name}]))})},D.getUserVote=function(e){j.callDeferred("ui","getUserVote","browseWallpapersCtrl",e.workshopid)},D.setUserVote=function(e,t){se()?j.callDeferred("ui","setUserVote","browseWallpapersCtrl",e,t):B.showSteamError()},D.setFavorited=function(e,t){se()?j.callDeferred("ui","setFavorited",e,t):B.showSteamError()},D.makeLabelEditable=function(e,t){var a=angular.element(e.currentTarget.parentElement),i=angular.element(a.children(".inputElement")[0]);function n(e){i.off("blur.edit"),i.off("keydown.edit"),a.removeClass("editSliderLabel"),!0!==e&&(t.value=i.val(),angular.isNumber(t.min)&&(t.value=Math.max(t.min,t.value)),angular.isNumber(t.max)&&(t.value=Math.min(t.max,t.value)),window.safeApply(D))}a.addClass("editSliderLabel"),i.focus(),i.val(t.value),i.select(),i.off("blur.edit"),i.off("keydown.edit"),i.on("blur.edit",n),i.on("keydown.edit",function(e){13===e.which?n():27===e.which&&n(!0)})},D.showMonitorSelection=function(){D.changeMonitorActive=!0},D.toggleMonitorSelection=function(){D.changeMonitorActive?D.changeMonitorActive=!1:D.showMonitorSelection(),D.changeMonitorActive||(D.monitorSelectionState.createGroup=0),D.changeMonitorActive||!D.browserSettings.advertiseworkshop&&!D.browserSettings.advertiseexplore||(D.canAdvertiseWorkshop=x)},D.toggleMonitorSelectionBackground=function(e){e.currentTarget===e.target&&D.toggleMonitorSelection()},D.stopEvt=function(e){e.stopPropagation(),e.preventDefault()},D.changeConfigGroup=function(e){"screensaver"===(D.wallpaperConfigGroup=e)?D.startWatchingScreensaverSettings():D.showScreensaverWindowsSettingsWarning=!1},D.toggleManageMobileDevices=function(){D.isMobileTranscoderAvailable()?(D.mobileDeviceManagementActive&&D.mobileManagerState.disableFirewallCheck&&D.mobileManagerState.disableFirewallCheck(),D.mobileDeviceManagementActive=!D.mobileDeviceManagementActive):F.open("genericConfirm",{data:{title:"ui_browse_mobile_upload_unavailable_title",message:"ui_browse_mobile_upload_unavailable_body",okVisible:!0}})},D.toggleManageMobileDevicesBackground=function(e){e.currentTarget===e.target&&D.toggleManageMobileDevices()},D.onMobileDeviceConnected=function(e){B.showSuccess(I.instant("ui_browse_mobile_devices_success_toast",e)),"connect"===D.mobileManagerState.page&&(D.mobileDeviceManagementActive=!1,D.mobileManagerState.page="");var t=D.browserSettings.paireddevices.find(K(e.id));t?(angular.merge(t,e),e.alias||delete t.alias):D.browserSettings.paireddevices.push(e),D.mobileManagerState.connectedDevices.findAndRemove(K(e.id)),D.mobileManagerState.connectedDevices.push(e),zt()},D.onMobileDeviceDisconnected=function(t){D.mobileManagerState.connectedDevices.findAndRemove(function(e){return e.id===t}),zt()},D.canUploadWallpaperToMobileDevice=function(e,t){var a=!1;return angular.isArray(e)||(e=[e]),angular.forEach(e,function(e){a=a||"downloadable"!==e.status&&("Scene"===e.type||"Video"===e.type||t)&&(!e.localAndExternal||e.file.toLowerCase().endsWith(".mp4")||e.file.toLowerCase().endsWith(".webm"))}),a},D.filterWallpapersForMobileDevice=function(e){return(e=!angular.isArray(e)?[e]:e).filter(D.canUploadWallpaperToMobileDevice)},D.sendToMobileDevice=function(e,a){fe(e=!angular.isArray(e)?[e]:e).then(me).then(function(e){var t;e=D.filterWallpapersForMobileDevice(angular.copy(e)),D.canOpenWallpaperDetailsOnWeb&&angular.forEach(e,function(e){var t=D.getWorkshopUrl(e);t?e.sharelink=t:delete e.sharelink}),0<e.length&&(t=D.browserSettings.paireddevices.find(K(a.id)),a=t||a,D.browserSettings.advertisesendtomobile=!1,F.open("browseMobileUpload",{data:{device:a,location:D.selectedMonitor.location,wallpapers:e}}))})},D.cancelMobileUploads=function(){F.open("genericConfirm",{data:{title:"ui_browse_mobile_upload_cancel_title",message:"ui_browse_mobile_upload_cancel_body",okVisible:!0,cancelVisible:!0}}).then(function(){return j.callDeferred("browseWallpaperObject","cancelMobileUploads")})},D.mobileUploadState={visible:!1,progress:0,title:"<title>",device:"<device>",status:"<status>",count:""};var $t=!(D.onMobileDeviceUploadProgress=function(t){v.cancel(Vt),D.mobileUploadState.visible&&!t.visible&&(Vt=v(function(){D.mobileUploadState.visible=!1},3e3)),t.visible=D.mobileUploadState.visible||t.visible,angular.merge(D.mobileUploadState,t),D.mobileUploadState.status=I.instant(D.mobileUploadState.status),t.device?(angular.forEach(D.mobileManagerState.connectedDevices,function(e){t.device===e.id&&(D.mobileUploadState.device=e.name)}),D.mobileUploadState.token="ui_browse_mobile_transcoder_progress_title"):D.mobileUploadState.token="ui_browse_mobile_transcoder_progress_title_export"});function Ht(){return angular.isString(D.selectedMonitor&&D.selectedMonitor.location)&&angular.isObject(D.currentSelection)}function Ut(e){var a={};return angular.forEach(e,function(e,t){a[t]=e.value}),a}function Gt(a){var e,i,t={file:D.currentSelection.file,location:D.selectedMonitor.location,properties:(e=D.currentSelection.defaultproperties,t=a,i=angular.copy(e||{}),angular.forEach(t,function(e,t){i[t]=i[t]||{},i[t].value=e}),i)};j.callDeferred("browseWallpaperObject","applySingleProperty",angular.toJson(t));var t=D.currentSelection.properties[D.selectedMonitor.location];angular.forEach(t,function(e,t){angular.isDefined(a[t])&&(e.value=a[t])})}function qt(t){function e(){j.callDeferred("browseWallpaperObject","saveWallpaperPresets",{file:t.file,presets:JSON.clean(t.propertyPresets)})}var a=R.when();return(a=!angular.isArray(t.propertyPresets)?j.callDeferred("browseWallpaperObject","getWallpaperPresets",{file:t.file}).then(function(e){t.propertyPresets=e.presets}):a).then(function(){return F.open("browseCollections",{data:{type:"presets",isSaving:!1,collection:t.propertyPresets,onDeleted:e}})})}D.isMobileTranscoderAvailable=function(){return $t},D.onMobileTranscoderAvailable=function(){$t=!0},D.promptAcceptNewAgreement=function(e){D.showWorkshopAgreementUpdate=e},D.openWorkshopAgreementURL=function(){window.ui.shellexecute(B.getWorkshopAgreementURL())},D.hideWorkshopAgreementPrompt=function(){D.showWorkshopAgreementUpdate=!1},D.callbackOk=function(e){e?"downloadable"===D.currentSelection.status?D.subscribeWorkshopItem(D.currentSelection):"installed"===D.currentSelection.status&&(N||j.callDeferred("browseWallpaperObject","acceptAndClose")):j.callDeferred("browseWallpaperObject","acceptAndClose")},D.callbackClose=function(){j.callDeferred("browseWallpaperObject","cancelAndClose")},D.callbackSelectMonitor=function(e,t){0===D.wallpaperConfig.layout&&He(e),t&&D.toggleMonitorSelection()},D.callbackPropertyLabelClicked=function(e){"bool"===e.type&&(e.value=!e.value,D.callbackWallpaperPropertyChanged(e.key,e))},D.callbackWallpaperPropertyChangedSlider=function(e,t){f[e]!==t.value&&(f[e]=t.value,D.callbackWallpaperPropertyChanged(e,t))},D.callbackWallpaperPropertyChanged=function(e,t){var a;m||angular.isString(D.selectedMonitor.location)&&(a=angular.copy(t),(t={file:D.currentSelection.file,location:D.selectedMonitor.location,properties:{}}).properties[e]=a,j.callDeferred("browseWallpaperObject","applySingleProperty",angular.toJson(t)))},D.isPropertyLabelVisible=function(e){return e&&"volume"!==e.type||D.isVolumeEnabled(D.selectedMonitor.location)},D.isVolumeEnabled=function(e){return D.generalUserSettings&&D.userMonitorSettings&&D.generalUserSettings.videoaudiooutput&&(!angular.isObject(D.userMonitorSettings[e])||D.userMonitorSettings[e].videoaudiooutput)},D.getVolumeDisabledText=function(e){return D.userMonitorSettings&&angular.isObject(D.userMonitorSettings[e])&&!D.userMonitorSettings[e].videoaudiooutput?"ui_browse_properties_volume_disabled_monitor":"ui_browse_properties_volume_disabled"},D.openMuteHelper=function(e){D.userMonitorSettings&&angular.isObject(D.userMonitorSettings[e])&&!D.userMonitorSettings[e].videoaudiooutput?D.toggleMonitorSelection():D.callbackShowSettings()},D.callbackResetCurrentWallpaperProperties=function(){Ht()&&F.open("genericConfirm",{data:{title:"ui_browse_details_properties_reset_prompt_header",message:"ui_browse_details_properties_reset_prompt_body",okVisible:!0,cancelVisible:!0}}).then(function(){D.currentSelection.properties[D.selectedMonitor.location]=angular.copy(D.currentSelection.defaultproperties),angular.forEach(D.currentSelection.properties[D.selectedMonitor.location],function(e,t){D.callbackWallpaperPropertyChanged(t,e)}),j.callDeferred("browseWallpaperObject","resetWallpaperLocalStorage",D.currentSelection.file),jt()})},D.callbackSaveWallpaperProperties=function(){Ht()&&F.open("browseCollections",{data:{isSaving:!0,type:"presets",collection:D.currentSelection.propertyPresets||[]}}).then(function(t){D.currentSelection.propertyPresets=D.currentSelection.propertyPresets||[];var e=D.currentSelection.propertyPresets.find(function(e){return e.name===t.name});angular.isObject(e)?angular.merge(e.properties,Ut(D.currentSelection.properties[D.selectedMonitor.location])):(e={name:t.name,properties:Ut(D.currentSelection.properties[D.selectedMonitor.location])},D.currentSelection.propertyPresets.push(e)),j.callDeferred("browseWallpaperObject","saveWallpaperPresets",{file:D.currentSelection.file,presets:JSON.clean(D.currentSelection.propertyPresets)})})},D.callbackLoadWallpaperProperties=function(){Ht()&&qt(D.currentSelection).then(function(e){Gt(e.properties)})},D.callbackShareWallpaperProperties=function(){var t;Ht()&&(t=Ut(D.currentSelection.properties[D.selectedMonitor.location]),F.open("browseWallpaperSharePreset",{data:{preset:t}}).then(function(e){angular.isObject(e)&&!angular.equals(t,e)&&Gt(e)}))},D.callbackSavePropertiesAsDefaults=function(e){var a=ze(!0);F.open("browseSetDefaults",{data:{properties:e,selectionCount:a.length}}).then(function(e){var t={properties:{},mode:e.mode,wallpapers:a.map(function(e){return e.file}),monitors:D.monitors.map(function(e){return e.location})};angular.forEach(e.options,function(e){e.enabled&&(t.properties[e.key]=e.value)}),j.callDeferred("browseWallpaperObject","setPropertyDefaults",t)})},D.callbackShowSettings=function(){j.callDeferred("browseWallpaperObject","showSettingsDialog")},D.callbackShowEditor=function(){j.callDeferred("browseWallpaperObject","showEditorDialog")},D.callbackUnsubscribeOrRemove=function(e){Be(e,!0)},D.callbackOpenInEditor=function(e){j.callDeferred("browseWallpaperObject","openInEditor",e.file)},D.isPropertyFileValueSet=function(e,t){return e.value&&(!t||e.value!==t.value)},D.callbackSelectFileForProperty=function(t,e){"usershortcut"===e?F.open("browseAssignUserShortcut",{data:{name:I.instant(t.text).toString(),value:t.value}}).then(function(e){t.value=e,D.callbackWallpaperPropertyChanged(t.key,t)}):j.callDeferred("browseWallpaperObject","selectFileForProperty",e,t.fileType||"").then(function(e){e&&(t.value=e,D.callbackWallpaperPropertyChanged(t.key,t))})},D.callbackRemoveFileForProperty=function(e,t){t&&angular.isString(t.value)&&t.value?e.value=t.value:e.value="",D.callbackWallpaperPropertyChanged(e.key,e)},D.callbackOpenDirectory=function(e){angular.isString(e)&&j.callDeferred("browseWallpaperObject","openDirectory",e)};var Nt=n.$new(!0);Nt.checkPositionVisibility=function(){var e=D.selectedMonitor&&D.selectedMonitor.location&&D.currentSelection.properties[D.selectedMonitor.location];return e&&e.alignment&&e.alignment.value<2&&(D.selectedMonitor.isGroup||!D.currentSelection.aspect||.001<Math.abs(D.currentSelection.aspect-D.selectedMonitor.w/D.selectedMonitor.h))};var Qt={$eval:Nt.$eval,checkPositionVisibility:Nt.checkPositionVisibility};D.evalCondition=function(e){return D.selectedMonitor&&D.selectedMonitor.location&&D.currentSelection&&D.currentSelection.properties&&Qt.$eval(e,D.currentSelection.properties[D.selectedMonitor.location])},D.callbackClickSteamStatus=function(){angular.isObject(D.steamWorkshopStatus)&&D.steamWorkshopStatus.error&&B.showSteamError()},D.callbackResetFilter=function(){var t,e;D.sourceIsExplore||(angular.merge(D.filterTemp,ee()),D.filter=ne(D.source),D.filterProxy.ratingtags=angular.copy(D.filter.ratingtags),D.sourceIsWorkshop?(t=D.filter,e=D.browserSettings.defaultfilterconfig,angular.isObject(t.tags)&&B.canUseFilterSettings()&&angular.forEach(ae(e),function(e){t.tags[e]=!1}),oe(D.filter,D.browserSettings.defaultfilterconfig),A=D.filter):D.sourceIsInstalled&&(M=D.filter))},D.canUseAgeRatingTags=B.canUseAgeRatingTags,D.callbackToggleResolutionFilter=function(e,t,a){var i,n;switch(e.preventDefault(),e.stopPropagation(),t){case 0:i=0,n=6;break;case 1:i=6,n=9;break;case 2:i=9,n=13;break;case 3:i=13,n=18;break;case 4:i=18,n=23}for(var o=i;o<n;++o){var r=D.filterResolutionTags[o];D.filter.resolutiontags[r.value]=a}},D.callbackToggleGenreFilter=function(e,t){e.preventDefault(),e.stopPropagation(),angular.forEach(D.filterAllTags,function(e){"Unspecified"===e.value&&D.sourceIsWorkshop?D.filter.tags[e.value]=!1:D.filter.tags[e.value]=t})};var Kt={},Yt={},Xt={},Jt={},Zt={},ea={},ta=R.when(),aa=!0,ia=!0,na={};function oa(){return angular.isString(D.exploreNavigation[0].key)?Yt[D.exploreNavigation[0].key]:[]}function ra(e){return D.browserSettings.explore&&D.browserSettings.explore.disliked.includes(e.name)}function sa(e){return D.browserSettings.explore&&D.browserSettings.explore.liked.includes(e.name)}function la(){var t=0;angular.forEach(D.sortedExploreQueries,function(e){(e.loading||e.showError)&&++t});var e=D.exploreNavigation[0].key;e&&0===t&&(Zt[e]<=0&&(Zt[e]=5),D.refreshExplore())}function ca(t){I(["ui_browse_no_service_body","ui_browse_no_service_body_use_backup"]).then(function(e){F.open("genericConfirm",{data:{title:"ui_browse_no_service_header",message:t?e.ui_browse_no_service_body+e.ui_browse_no_service_body_use_backup:e.ui_browse_no_service_body,okVisible:!0}})})}D.isExploreHomepage=function(){return D.sourceIsExplore&&angular.isString(D.exploreNavigation[0].key)},D.getExploreQueryFromSelection=function(){var t;return angular.forEach(D.sortedExploreQueries,function(e){0<=(e.wallpapers&&e.wallpapers.indexOf(D.currentSelection))&&(t=e)}),t};var da,pa,ua,ga=0;function fa(e){var t=oa();t.findAndRemove(e);var a=D.exploreNavigation[0].key;if(a)if(0===t.length)Yt[a]=Jt[a],Jt[a]=[];else for(;25<D.sortedExploreQueries.length;){for(var i,n=!1,o=0;o<D.sortedExploreQueries.length;++o){if(delete D.sortedExploreQueries[o].class,!D.sortedExploreQueries[o].sticky){Jt[a].push(D.sortedExploreQueries[o]),D.sortedExploreQueries.splice(o,1),n=!0,i.class="exploreStickyQuery";break}i=D.sortedExploreQueries[o]}if(!n)break}D.sortedExploreQueries.push(e),D.performExploreQuery(e)}function ma(e,t){if(Kt[t].push(e),Xt[t].empty())Yt[t].push(e);else{for(var a=!1,i=0;i<Xt[t].length;++i)if((Xt[t][i].priority||0)<(e.priority||0)){Xt[t].splice(i,0,e),D.performExploreQuery(e),a=!0;break}a||Yt[t].push(e)}}function va(e){return(e=!angular.isArray(e)?[e]:e).filter(function(e){return e}).map(function(e){switch(e.tags=e.tags||["None"],e.querytypes=e.querytypes||[],e.includetags=e.includetags||[],e.excludetags=e.excludetags||[],angular.isNumber(e.weight)?e.weight=Math.floor(e.weight):e.weight=1,ra(e)?e.currentPriority=0:e.currentPriority=e.priority||0,B.updateQueryName(e),e.category){case"genre":e.title=e.title||("trend_year"===e.querytype||"top_rated"===e.querytype?"ui_browse_explore_category_genre_popular":"trend_month"===e.querytype?"ui_browse_explore_category_genre_recent_month":"trend_week"===e.querytype?"ui_browse_explore_category_genre_recent":"subscriptions"===e.querytype?"ui_browse_explore_category_genre_most_subscribed":"ui_browse_explore_category_genre_new");break;case"creator":angular.isArray(e.includetags)&&0<e.includetags.length?e.title="published_desc"===e.querytype?"ui_browse_explore_category_creator_genre_recent":"ui_browse_explore_category_creator_genre_popular":e.title="published_desc"===e.querytype?"ui_browse_explore_category_creator_recent":"ui_browse_explore_category_creator_popular";break;case"collection":e.title=e.title||"ui_browse_explore_category_collection";break;case"keyword":e.title="trend_year"===e.querytype||"top_rated"===e.querytype?"ui_browse_explore_category_keyword_popular":"trend_week"===e.querytype?"ui_browse_explore_category_keyword_recent":"subscriptions"===e.querytype?"ui_browse_explore_category_keyword_most_subscribed":"ui_browse_explore_category_keyword_new"}return e}),e}function ha(){var o,e;D.sourceIsExplore&&(ta=R.when(),Kt={home:va(B.getStaticExploreQueries()),favorites:[],disliked:[],highlights:[]},Yt={home:angular.copy(Kt.home),favorites:[],disliked:[]},Xt={home:[],favorites:[],disliked:[]},Jt={home:[],favorites:[],disliked:[]},na={},G.visible=!1,G.current=1,Zt={home:5,favorites:5,disliked:5},D.exploreNavigation=[{title:"",key:"home"}],D.sortedWallpapers=[],D.sortedFolders=[],D.sortedExploreQueries=Xt.home,o=B.getSeasonalCollections(),angular.forEach(o,function(e){Kt.home.push(e)}),D.browserSettings.explore&&(va(e=angular.copy(D.browserSettings.explore.custom).map(function(e){return e.custom=!0,e})),Kt.favorites=Yt.favorites.concat(e),Yt.favorites=Kt.favorites.slice()),B.canUseDiscover()?(da=v(la,5e3),j.wpxAPIGet("/api/explore/v1").then(function(e){v.cancel(da);var i,t,a,n,e=e&&e.data&&e.data.response&&e.data.response.items;angular.isArray(e)&&(i=[],t={name:"app_highlights_creators",querytype:"most_recent",category:"highlight",tags:["Approved"],includetags:["Approved"],excludetags:[],items:[],summaryItems:[],emoji:"✨",title:"ui_browse_explore_category_highlighted_creators",priority:.8,isBackendQuery:!0,wtTag:"homeHighlights",sticky:!0},a={name:"app_highlights_collections",querytype:"most_recent",category:"highlight",tags:["Approved"],includetags:["Approved"],excludetags:[],items:[],summaryItems:[],emoji:"✨",title:"ui_browse_explore_category_highlighted_collections",priority:.25,isBackendQuery:!0,wtTag:"homeHighlights",sticky:!0},n=function(e){e.sticky?ma(e,"home"):angular.isDefined(e.coversubmission)&&(B.updateQueryName(e),("collection"===e.category?a:t).items.push(e))},angular.forEach(e,function(a){angular.isObject(a)&&angular.isString(a.category)&&(angular.isObject(a.platforms)&&!a.platforms[B.getProvider()]||(a.isBackendQuery=!0,"creator"===a.category?angular.forEach(a.querytypes,function(e){var t=angular.copy(a);delete t.querytypes,t.querytype=e,n(t)}):"collection"===a.category?n(a):angular.forEach(a.querytypes,function(e){var t=angular.copy(a);delete t.querytypes,t.querytype=e,i.push(t)})))}),0<a.items.length&&(Kt.home.findAndRemoveMultiple(o),D.sortedExploreQueries.findAndRemoveMultiple(o),angular.forEach(o,function(e){e.sticky?ma(e,"home"):a.items.push(e)}),a.items=a.items.concat(B.getBestOfYearQueries(!0))),(e=function(e){0<e.items.length&&(e.items.shuffle(),va(e.items),e.summaryItems=e.items.slice(0,20),ma(e,"home"),Kt.highlights=Kt.highlights.concat(e.items))})(t),e(a),va(i),angular.forEach(i,function(e){angular.isObject(e)&&(Kt.home.push(e),Yt.home.push(e))})),la()}).catch(function(){v.cancel(da),la()})):D.refreshExplore())}function ba(){D.sortedWallpapers=[],G.visible=!1,G.current=1}D.performExploreQuery=function(i,t){if(D.sourceIsExplore){if("collection"===i.category&&!B.canUseCollectionsInDiscover())return i.wallpapers=[],i.loading=!1,i.showError=!1,D.sortedExploreQueries.findAndRemove(i),void D.refreshExplore();"creator"===i.category&&angular.isUndefined(D.steamUserInfos[i.itemid])&&j.callDeferred("ui","pollSteamUserInfo",i.itemid,"browseWallpapersCtrl");var s={sort:i.querytype,category:i.category,text:i.keyword,requiredTags:angular.isArray(i.includetags)&&i.includetags.concat(["Wallpaper","Everyone"]),excludedTags:i.excludetags,requiredTagGroups:i.requiredtaggroups,limit:t?0:20,page:G.current,token:++k,fullQueryToken:++ga,isusingbackup:D.isUsingBackup};switch(i.exact&&(s.text='"'+s.text+'"'),i.category){case"creator":case"collection":s.itemid=i.itemid,s.randomize=!t;break;case"keyword":s.searchText=i.keyword;break;case"misc":delete s.text;break;case"highlight":s.items=t?i.items:i.summaryItems;break;case"top_year":s.timestampstart=i.timestampstart,s.timestampend=i.timestampend}t?(D.sortedWallpapers=[],D.queryActive=!0,D.showErrorInBackground=!1,G.query=i):(i.wallpapers=[],i.loading=!0,i.showError=!1,s.page=1);var n=function(e){i.loading=!1,D.sourceIsExplore&&e.token===s.token&&(t&&k!==s.token||(angular.isObject(e.collection)&&(i.collection=e.collection),D.queryWallpapers=e.wallpapers,Xe(),"highlight"!==i.category&&ct(D.queryWallpapers),0!==e.wallpapers.length||i.custom||D.sortedExploreQueries.findAndRemove(i),ve(e.isbackup),t?(D.queryActive=!1,D.sortedWallpapers=D.queryWallpapers,B.updatePagination(G,s.page,e.pagecount),G.visible=1<e.pagecount):(D.queryWallpapers.shuffle(),i.wallpapers=D.queryWallpapers,D.refreshExplore())))},e=ta.then(function(){var t,a,e="highlight"!==s.category?j.callDeferred("browseWallpaperObject","queryWorkshop",s):(t=[],a=[],angular.forEach(s.items,function(e){"creator"===e.category&&angular.isUndefined(D.steamUserInfos[e.itemid])&&t.push(e.itemid),angular.isString(e.coversubmission)&&a.push(e.coversubmission),"collection"===e.category&&a.push(e.itemid)}),s.itemids=a,s.disablesanitize=!0,s.limit=0,t.empty()||j.callDeferred("ui","pollSteamUserInfo",t,"browseWallpapersCtrl"),j.callDeferred("browseWallpaperObject","queryWorkshop",s).then(function(e){var n=[],o={};e.wallpapers&&e.wallpapers.forEach(e=>{o[e.workshopid]=e});var r=I.use();return s.items.forEach(function(e){var t=e.translation&&e.translation[r]||"",a=o[e.coversubmission];if(angular.isObject(a)){var i={querytype:e.querytype,name:e.name,emoji:e.emoji,category:e.category,excludetags:e.excludetags,includetags:e.includetags,year:e.year,timestampstart:e.timestampstart,timestampend:e.timestampend,preview:a.previewsmall,previewsmall:a.previewsmall,status:"downloadable",updatedate:0,title:t&&0<t.length?t:e.title,itemid:e.itemid,type:"highlightItem",translation:e.translation};switch(e.category){case"collection":i.queryTitle=o[e.itemid]&&o[e.itemid].title;break;case"creator":i.titleoverride="ui_browse_explore_category_creator_short"}n.push(i)}}),{isbackup:e.isbackup,pagecount:1,token:e.token,wallpapers:n}}));return e.then(n).catch(function(){D.hasShownSteamServiceError||ca(D.hasShownSteamServiceError=!0),j.setCallErrorSuppressed("queryWorkshop",!0),i.isBackendQuery?(D.sortedExploreQueries.findAndRemove(i),i.loading=!1,i.wallpapers=[],D.refreshExplore()):D.queryBackup(s).then(n).catch(function(){i.loading=!1,i.showError=!0})})});t||(ta=e)}},D.exploreScrollSentinelChanged=function(e){(aa=e)&&la()},D.refreshExplore=function(){if(D.sourceIsExplore&&ia){var e=D.exploreNavigation[0].key,t=e?Zt[e]:0;if(e&&aa&&t<1&&(t=Zt[e]=1),e&&0<t){var a,i=oa();if("home"===e)va(i),0!==i.length&&(function(){ea={tagCounts:{},categoryCounts:{},maxTagCount:{},categoryMaxCounts:{}},angular.forEach(Xt.home,function(e){angular.forEach(e.tags,function(e){angular.isNumber(ea.tagCounts[e])?++ea.tagCounts[e]:ea.tagCounts[e]=1}),angular.isNumber(ea.categoryCounts[e.category])?++ea.categoryCounts[e.category]:ea.categoryCounts[e.category]=1}),angular.forEach(Kt.home,function(e){angular.forEach(e.tags,function(e){angular.isNumber(ea.maxTagCount[e])?++ea.maxTagCount[e]:ea.maxTagCount[e]=1}),angular.isNumber(ea.categoryMaxCounts[e.category])?++ea.categoryMaxCounts[e.category]:ea.categoryMaxCounts[e.category]=1}),angular.forEach(Kt.home,function(e){var t=sa(e),a=ra(e),i=t?1:a?-1:0;0!=i&&angular.forEach(e.tags,function(e){angular.isNumber(ea[e])?ea[e]+=i:ea[e]=i})});var t=0,a=0;angular.forEach(ea,function(e){e<0&&(t=Math.min(t,e)),0<e&&(a=Math.max(a,e))}),t=Math.min(-1,t),a=Math.max(1,a),ea.mins=t,ea.maxs=a}(),i.shuffle(),angular.forEach(i,function(a){var t,e,i,n,o=(e=a,angular.isNumber(ea.categoryCounts[e.category])?.9*(1-ea.categoryCounts[e.category]/ea.categoryMaxCounts[e.category])+.1:1),r=(t=1,angular.forEach(a.tags,function(e){angular.isNumber(ea.tagCounts[e])&&(e=1-ea.tagCounts[e]/ea.maxTagCount[e],t=Math.min(e,t))}),.9*t+.1),e=(e=a,i=1,angular.forEach(e.tags,function(e){angular.isNumber(ea[e])&&(i+=ea[e])}),i=(i-ea.mins)/(ea.maxs-ea.mins),ra(e)&&(i=0),Math.easeInOutQuad(i)*(sa(e)?1.9:2));a.currentWeight=Math.log(1+e*(r+o)),ra(a)||(angular.isNumber(a.priority)?a.currentWeight+=a.priority:(n=!1,angular.forEach(a.tags,function(e){var t;angular.isNumber(na[e])&&(t=Math.pow(Math.clamp(na[e]-3,0,4)/4,2),Math.random()<t&&(a.currentWeight=999,na[e]=0,n=!0))}),n&&angular.forEach(angular.copy(na),function(e,t){na[t]=.21*e})))}),i.sort(function(e,t){return e.currentPriority!==t.currentPriority?t.currentPriority-e.currentPriority:t.currentWeight-e.currentWeight}),a=i[0],t=B.getAvailableTags(),angular.forEach(t,function(e){a.tags.includes(e)?na[e]=0:(!angular.isNumber(ea[e])||0<=ea[e])&&(angular.isNumber(na[e])?++na[e]:na[e]=1)}),fa(a),--Zt[e]);else if(D.browserSettings.explore){for(var n="favorites"===e?D.browserSettings.explore.favorites:D.browserSettings.explore.disliked,o=n.length-1;0<=o;--o){var r,s=n[o],l=function(e){return e.name===s};Kt[e].find(l)||(r=Kt.home.find(l),(r=!angular.isObject(r)?Kt.highlights.find(l):r)&&(Kt[e].push(r),i.push(r)))}va(i),0!==i.length&&(i.sort(function(e,t){return e.currentPriority!==t.currentPriority?t.currentPriority-e.currentPriority:t.currentWeight-e.currentWeight}),fa(i[0]),--Zt[e])}}}},D.navigateCurrentExplorePage=function(){ba();var e=D.exploreNavigation[0];if(1===D.exploreNavigation.length)e.key?(D.sortedExploreQueries=Xt[e.key],D.sortedExploreQueries.length<5&&(Zt[e.key]=5)):D.sortedExploreQueries=[],angular.frameTimeout(v,2,D.refreshExplore);else if(e.key){if("wallpaperfavorites"===e.key)return delete e.key,D.sortedExploreQueries=[],void D.performExploreQuery(e,!0);D.sortedExploreQueries=[],Xt[e.key]=[],Yt[e.key]=Kt[e.key].slice(),Yt[e.key].push({category:"misc",querytype:"followers_created",title:"ui_browse_explore_category_followed",tags:["Misc"],priority:99}),angular.frameTimeout(v,2,la)}else D.sortedExploreQueries=[],D.performExploreQuery(e,!0)},D.pushExplorePage=function(e){D.pushNavigationHistory({source:"explore",stack:D.exploreNavigation.slice()});var t=D.exploreNavigation[0].key;t&&(Xt[t]=D.sortedExploreQueries);var a=!1;switch(e.key){case"favorites":e.title="ui_browse_explore_followed_content";break;case"wallpaperfavorites":e.title="ui_browse_explore_favorites",e.querytype="my_favorites",e.category="misc",a=e.noicons=!0;break;case"followers_created":e.title="ui_browse_explore_followed_users",e.querytype="followers_created",e.category="misc",a=e.noicons=!0;break;case"voted_up":e.title="ui_browse_explore_category_user_up_voted",e.querytype="voted_up",e.category="misc",a=e.noicons=!0;break;case"created_by_user":e.title="ui_browse_explore_category_user_created",e.querytype="created_by_user",e.category="misc",a=e.noicons=!0;break;case"friends_created":e.title="ui_browse_explore_category_friends_created",e.querytype="friends_created",e.category="misc",a=e.noicons=!0;break;case"friends_favorites":e.title="ui_browse_explore_category_friends_favorites",e.querytype="friends_favorites",e.category="misc",a=e.noicons=!0}if(ba(),D.exploreNavigation.unshift(e),e.key){if(a)return delete e.key,D.sortedExploreQueries=[],void D.performExploreQuery(e,!0);D.sortedExploreQueries=[],Xt[e.key]=[],Yt[e.key]=Kt[e.key].slice(),Yt[e.key].push({category:"misc",querytype:"followers_created",title:"ui_browse_explore_category_followed",tags:["Misc"],priority:99}),angular.frameTimeout(v,2,la)}else D.sortedExploreQueries=[],D.performExploreQuery(e,!0)},D.popExplorePage=function(){D.pushNavigationHistory({source:"explore",stack:D.exploreNavigation.slice()}),1<D.exploreNavigation.length&&(D.exploreNavigation.shift(),D.navigateCurrentExplorePage())},D.addExploreCustomFavoriteQuery=function(){F.open("browseExploreCreateQuery",{data:{isEditing:!1,query:{category:"keyword"}}}).then(function(e){console.log("create query",e),D.browserSettings.explore.custom.push(angular.copy(e)),e.custom=!0,va(e),Kt.favorites.push(e),D.sortedExploreQueries.unshift(e),D.performExploreQuery(e)})},D.exploreCustomRemoveCallback=function(t){D.browserSettings.explore.custom=D.browserSettings.explore.custom.filter(function(e){if(e.category!==t.category||e.querytype!==t.querytype||"keyword"===e.category&&e.keyword!==t.keyword||"creator"===e.category&&e.itemid!==t.itemid||"collection"===e.category&&e.itemid!==t.itemid)return!0}),D.sortedExploreQueries.findAndRemove(t),Kt.favorites.findAndRemove(t),Xt.favorites.findAndRemove(t),t===D.exploreNavigation[0]&&D.popExplorePage()},D.exploreLikedCallback=function(e,t,a){angular.isDefined(e)?(e?(D.browserSettings.explore.liked.includes(a.name)?D.browserSettings.explore.liked.findAndRemove(a.name):D.browserSettings.explore.liked.push(a.name),D.browserSettings.explore.disliked.findAndRemove(a.name)):(D.browserSettings.explore.liked.findAndRemove(a.name),D.browserSettings.explore.disliked.includes(a.name)?D.browserSettings.explore.disliked.findAndRemove(a.name):D.browserSettings.explore.disliked.push(a.name)),D.browserSettings.explore.hasLikedAny=!0):angular.isDefined(t)&&(t?D.browserSettings.explore.favorites.push(a.name):D.browserSettings.explore.favorites.findAndRemove(a.name))},D.openExplorePersonalizedContentDropdown=function(e,t){if(!t){if(ua=!1,pa&&W.getCurrentContextMenu()===pa)return;ua=!0}ua&&(pa=W.builder().button("ui_browse_explore_followed_content",function(){D.pushExplorePage({key:"favorites"})}).button("ui_browse_explore_favorites",function(){D.pushExplorePage({key:"wallpaperfavorites"})}).button("ui_browse_explore_your_upvotes",function(){D.pushExplorePage({key:"voted_up"})}).button("ui_browse_explore_your_wallpapers",function(){D.pushExplorePage({key:"created_by_user"})}).divider().button("ui_browse_explore_friends_favorites",function(){D.pushExplorePage({key:"friends_favorites"})}).button("ui_browse_explore_friends_created",function(){D.pushExplorePage({key:"friends_created"})}).open(D,e,{placement:{target:e.currentTarget}}))};var _a=R.when(),ya={};D.queryBackup=function(t){if(!B.canUseBackup())return R.reject();if("relevance"===(t=angular.copy(t)).sort&&(t.sort="top_rated"),!["most_recent","most_up_votes","subscriptions","top_rated","trend_year","trend_month","trend_week","trend_day","relevance"].includes(t.sort))return R.when({action:"queryMostPopular",wallpapers:[],token:t.token,pagecount:1,isbackup:!0});var a={};angular.forEach(t,function(e,t){(angular.isString(e)&&0<e.length||angular.isArray(e)&&0<e.length||angular.isNumber(e))&&(a[t]=e)}),delete a.token;var i="";angular.forEach(a,function(e,t){if(0!==i.length&&(!angular.isArray(e)||0<e.length)&&(i+="&"),angular.isArray(e))for(var a=0;a<e.length;++a)i+=t+"["+a+"]"+"="+e[a],a+1<e.length&&(i+="&");else i+=t+"="+e});function e(e){if(angular.isArray(e&&e.data&&e.data.response&&e.data.response.items))return ya[i]=e,D.backupDate=e.data.response.date,_a=_a.then(function(){return j.callDeferred("browseWallpaperObject","convertWorkshopBackup",t,e.data.response.items,e.data.response.totalpagecount||1)});ve(!1),R.reject()}return ya[i]?e(ya[i]):j.wpxAPIGet("/api/backupquery/v1?"+i).then(e)},D.searchHasSpaces=function(){return angular.isString(D.filter.text)&&0<D.filter.text.length&&D.filter.text.trim().includes(" ")};var wa={},ka=3;function xa(t){var e,i,n,a,o,r,s;D.sourceIsWorkshop&&(e=angular.isString(D.filterPreset.workshopid),o=angular.isString(D.filterAuthor.authorSteamId),a=D.filter.text,D.filter.exactMatch&&angular.isString(a)&&0<a.length&&!a.trim().includes('"')&&(a='"'+a+'"'),i={requiredTags:[],excludedTags:[],sort:(o?D.filterAuthor:D.filter).sort,text:a,preset:D.filterPreset.workshopid,itemid:D.filterAuthor.authorSteamId,page:q.current,filterTitle:D.filter.filterTitle,token:++k,isusingbackup:D.isUsingBackup},o=function(e,t){var a=i.excludedTags.length-n;e<=a&&(i.excludedTags.splice(i.excludedTags.length-a,a),angular.isString(t)&&i.excludedTags.push(t))},(a=function(){n=i.excludedTags.length})(),angular.forEach(D.filter.tags,function(e,t){e||i.excludedTags.push(t)}),o(D.filterAllTags.length,"Unspecified"),angular.forEach(D.filter.utilitytags,function(e,t){1===e?i.requiredTags.push(t):2===e&&i.excludedTags.push(t)}),e||(a(),angular.forEach(D.filter.categorytags,function(e,t){e||i.excludedTags.push(t)}),o(D.filterCategoryTags.length),a(),angular.forEach(D.filter.typetags,function(e,t){e||i.excludedTags.push(t)}),o(D.filterTypeTags.length),a(),angular.forEach(D.filter.resolutiontags,function(e,t){e||i.excludedTags.push(t)}),o(D.filterResolutionTags.length)),a(),angular.forEach(D.filter.ratingtags,function(e,t){e||i.excludedTags.push(t)}),o(D.filterRatingTags.length),t&&t.forceAllowQuestionable&&i.excludedTags.findAndRemove("Questionable"),D.filterTemp.filterMobileCompatibleOnly&&(angular.forEach(["Application","Web"],function(e){i.excludedTags.includes(e)||i.excludedTags.push(e)}),i.kvs={app_workshop_eula_version:"3"}),D.queryActive=!0,D.showErrorInBackground=!1,D.sortedWallpapers=[],D.sortedFolders=[],D.sortedExploreQueries=[],r=function(e){D.queryActive=!1,D.sourceIsWorkshop&&(e.token===i.token?(ve(e.isbackup),e.isbackup||j.setCallErrorSuppressed("queryWorkshop",!1),D.queryWallpapers=e.wallpapers,Xe(),D.sortedWallpapers=D.queryWallpapers,D.sortedWallpapers.sort(Je),ct(D.queryWallpapers),B.updatePagination(q,i.page,e.pagecount),"queryMostPopular"===e.action&&(D.filter.sort=Q),1<q.current&&q.current>e.pagecount?(q.current=e.pagecount,xa()):e.wallpapers&&!e.wallpapers.empty()||!i.excludedTags.includes("Everyone")||!i.excludedTags.includes("Questionable")||t&&t.forceAllowQuestionable||xa({forceAllowQuestionable:!0})):xa())},wa.cancel=!0,wa={queryFailureCount:0},(s=function(){if(!wa.cancel)return j.setCallErrorSuppressed("queryWorkshop",!0),j.callDeferred("browseWallpaperObject","queryWorkshop",i).then(r).catch(function(e){wa.queryFailureCount<ka?(++wa.queryFailureCount,s(),wa.queryFailureCount!==ka||D.hasShownSteamServiceError||j.setCallErrorSuppressed("queryWorkshop",!1)):(!angular.isNumber(e)||1===e)&&1<q.current&&!D.isUsingBackup?(q.current=1,xa()):(D.hasShownSteamServiceError||ca(D.hasShownSteamServiceError=!0),D.queryBackup(i).then(r).catch(function(){D.queryActive=!1,D.showErrorInBackground=!0}))})})())}var Sa,Ca={category:"preset",publishedItems:[],isSteamAvailable:se};function Ea(e,t){return angular.isNumber(t)||(t=1),!(e.settings&&"dayofweek"===e.settings.mode&&angular.isArray(e.items)&&7<e.items.length+t)}function Pa(){return F.open("genericConfirm",{data:{title:"ui_browse_playlist_modal_settings_day_of_week_warning_title",message:"ui_browse_playlist_modal_settings_day_of_week_warning_message",okVisible:!0}})}D.onReceivePresets=function(e){Ca.publishedItems=Ca.publishedItems.concat(e)},D.callbackPublishPreset=function(){if(!se())return B.showSteamError();var e=D.currentSelection.dependency&&Ee(D.currentSelection.dependency)||D.currentSelection,t={dependency:e.workshopid};Ca.dependentProject={tags:D.currentSelection.tags.split(",")},Ca.publishedItems=[];var a={};angular.forEach(D.currentSelection.properties[D.selectedMonitor.location],function(e,t){a[t]={value:e.value,type:e.type}}),D.isMiniMode&&n.$broadcast("sendToggleMiniMode"),j.callDeferred("browseWallpaperObject","preparePublishPreset",e.file,{properties:a,dependency:e.workshopid}).then(function(){return F.open("editorSteamPublish",{projectData:t,editorSettings:Ca})})},D.callbackBrowsePresets=function(e){if(!se())return B.showSteamError();e.ispreset&&(e=Ee(e.dependency)),D.setListSource("workshop"),D.filterPreset.title=e.title,D.filterPreset.workshopid=e.workshopid,D.pagination.current=1,xa()},D.callbackClearPresetFilter=function(){delete D.filterPreset.workshopid,xa()},D.callbackBrowseAuthor=function(e){if(!se())return B.showSteamError();D.setListSource("workshop"),D.filterAuthor.sortOptions=H,D.filterAuthor.sort=H[0].value,D.filterAuthor.authorSteamId=e,D.pagination.current=1,xa()},D.callbackClearAuthorFilter=function(){delete D.filterAuthor.authorSteamId,xa()},D.callbackShowPresetHint=function(){F.open("genericConfirm",{data:{title:"ui_browse_details_properties_preset_hint_header",message:"ui_browse_details_properties_preset_hint_body",okVisible:!0}})},D.showPresetPublishOptions=function(e){return e.workshopid&&!D.steamWorkshopStatus.error&&("Scene"===e.type&&e.cancreatepresets||"Web"===e.type)&&angular.isObject(D.selectedMonitor&&e.properties&&e.properties[D.selectedMonitor.location])&&1<Object.keys(e.properties[D.selectedMonitor.location]).length},D.onFileSubscriptionError=function(){ca()},D.showWorkshopAdvertiseModal=function(e,t){t&&t.stopPropagation(),F.open("browseWallpaperWorkshopInfo",{data:{filterConfig:D.browserSettings.defaultfilterconfig,canCancel:e}}).then(D.callbackResetFilter)},D.showResolutionSettingsModal=function(e){e&&e.stopPropagation(),F.open("browseResolutionSettings",{data:{filterConfig:D.browserSettings.defaultfilterconfig}}).then(function(){angular.forEach(angular.copy(D.filter.resolutiontags),function(e,t){D.filter.resolutiontags[t]=!0}),oe(D.filter,D.browserSettings.defaultfilterconfig),A=D.filter})},D.setListSourceInstalled=function(){"installed"===D.source&&"screensaver"===D.wallpaperConfigGroup&&D.changeConfigGroup("wallpaper"),D.setListSourceRecorded("installed")},D.setListSourceRecorded=function(e){D.pushNavigationHistory(bt()),D.setListSource(e)},D.setListSource=function(e){if(D.source!==e){if(("workshop"===e||"explore"===e)&&!se())return B.showSteamError();"workshop"===e&&se()&&(D.browserSettings.advertiseworkshop=!1,D.browserSettings.advertiseworkshoppopup&&(D.browserSettings.advertiseworkshoppopup=!1,D.showFilter.visible=!0,D.showWorkshopAdvertiseModal())),"explore"===e&&se()&&(D.browserSettings.advertiseexplore=!1,D.browserRuntime&&angular.isUndefined(D.steamUserInfos[D.browserRuntime.usersteamid])&&j.callDeferred("ui","pollSteamUserInfo",D.browserRuntime.usersteamid,"browseWallpapersCtrl")),D.clearCurrentThumbnailQueue(),D.canAdvertiseAny=!1,D.queryActive=!1,D.source=e,D.sourceIsWorkshop="workshop"===e,D.sourceIsExplore="explore"===e,D.sourceIsInstalled=!D.sourceIsWorkshop&&!D.sourceIsExplore,It(),D.sourceIsWorkshop?(D.pagination=q,D.filter=A,D.filterTemp=T,D.sortOptions=$):D.sourceIsExplore?(D.pagination=G,D.filter={},D.filterTemp=ee(),D.sortOptions=[]):D.sourceIsInstalled&&(D.pagination=U,D.filter=M,D.filterTemp=O,D.sortOptions=z),D.filterProxy.ratingtags=angular.copy(D.filter.ratingtags),D.showFilter.base=!1,D.showFilter.counts=!1,D.sortedWallpapers=[],it(),D.sourceIsExplore&&ha(),D.skipNextFilterDebounce()}},D.getDisplayTags=function(e){e=e.split(",");var t=[],a=["Wallpaper","Preset","Web","Video","Scene","Application","Approved","Multi-monitor optimized","Workshop","Official","Local"];return angular.forEach(e,function(e){a.indexOf(e)<0&&t.push(e)}),B.createTranslatedTagList(t)},D.getDisplayType=B.translateTagInstant,D.callbackChangePage=function(e,t,a){var i;"…"!==e?(i=e,angular.isString(i)&&(i=D.pagination.current,"next"===e?++i:--i),(i=Math.clamp(i,1,D.pagination.count))===D.pagination.current&&!a||(D.clearCurrentThumbnailQueue(),!a&&t&&D.pushNavigationHistoryPagination(),B.updatePagination(D.pagination,i,D.pagination.count),v.cancel(Sa),D.sourceIsExplore?D.isUsingBackup?Sa=v(function(){D.performExploreQuery(G.query,!0)},1e3):D.performExploreQuery(G.query,!0):D.sourceIsWorkshop?D.isUsingBackup?Sa=v(xa,1e3):xa():(ye(),g.scrollTop(0)))):B.showPaginationPageNumberPrompt(e).then(D.callbackChangePage)},D.callbackCancelEvent=window.cancelEventBubble,D.callbackToggleAllWallpapersInCurrentMonitorPlaylist=function(t,e,a){var i=D.selectedMonitor.playlist.items.findIndex(function(e){return e.wallpaper===t})<0||a,e=e?[t]:ze(!0,t),n=!1;angular.forEach(e,function(t){function e(e){return e.wallpaper===t&&!a}(D.selectedMonitor.playlistFlags[t.file]=i)?Ea(D.selectedMonitor.playlist)?D.selectedMonitor.playlist.items.pushIfNew({wallpaper:t},e):n=!0:D.selectedMonitor.playlist.items.findAndRemove(e)}),n&&Pa(),Ie()},D.callbackToggleEntryInCurrentMonitorPlaylist=function(a,e){var t=a.wallpaper,i=D.selectedMonitor.playlist.items.findIndex(function(e){return e===a}),n=D.selectedMonitor.playlist.items.filter(function(e){return e.wallpaper===t}).length,o=i<0,e=e?[t]:ze(!0,t),r=!1;angular.forEach(e,function(e){D.selectedMonitor.playlistFlags[e.file]=o||1<n;function t(e){return e===a}o?Ea(D.selectedMonitor.playlist)?D.selectedMonitor.playlist.items.pushIfNew({wallpaper:e},t):r=!0:D.selectedMonitor.playlist.items.findAndRemove(t)}),r&&Pa(),Ie()};var Ma,Aa,Ta,Oa,Ia,Ra={},Da=["ui_browse_playlist_day_monday","ui_browse_playlist_day_tuesday","ui_browse_playlist_day_wednesday","ui_browse_playlist_day_thursday","ui_browse_playlist_day_friday","ui_browse_playlist_day_saturday","ui_browse_playlist_day_sunday"];function Wa(){Ma&&(Ma.cancel(),Ma=void 0)}function Ba(e){e=angular.element(e.target).closest(".browseWallpaperPlaylistImage")[0];return{target:angular.element(e),scope:e&&e.attachedScope}}function Fa(e){if(50<D.selectedMonitor.playlist.items.length)return e;e=Math.clamp(e,0,1);return 5*Math.floor(1440*e/5)/1440}D.getDayOfWeekLabel=function(e,t){for(var a=Math.min(7,angular.isArray(e.items)&&e.items.length||1),i=1,n=0,o=7,r=0;r<a;++r){n=7-o;if(o-=i=r<a-1?Math.floor(o/(a-r)):o,r===t)break}e=D.browserOptions.dayofweekoffset||0;if(Ra[n=(n+e)%7]=Ra[n]||I.instant(Da[n%7]).toString(),1<i){e=(n+i-1)%7;return Ra[e]=Ra[e]||I.instant(Da[e%7]).toString(),Ra[n]+" - "+Ra[e]}return Ra[n]},D.callbackShowProfiles=function(i){var t=angular.copy(D.wallpaperConfig);t.selectedwallpapers=t.selectedwallpapers||{},t.profile=angular.copy(D.monitorProfile),angular.forEach(Se(),function(e){angular.isObject(e.playlist)&&1<e.playlist.items.length&&angular.isObject(t.selectedwallpapers[e.location])?t.selectedwallpapers[e.location].playlist=Te(e.playlist):angular.isObject(t.selectedwallpapers[e.location])&&delete t.selectedwallpapers[e.location].playlist});var e={isSaving:i,collectionItem:t,collection:D.profiles,hotkeys:D.sharedSettings.hotkeys,type:"profiles"};F.open("browseCollections",{data:e}).then(function(e){var t,a;i?(t=e,a=D.profiles.find(function(e){return e.name===t.name}),angular.isObject(a)?angular.merge(a,t):D.profiles.push(t),D.wallpaperConfig.name=t.name):(a=e,e=Se(),angular.forEach(e,function(e){Re(e.location),delete e.missingPlaylistItems}),D.wallpaperConfig=angular.copy(a),D.monitorProfile=a.profile||{},kt(),Ye(D.monitorProfile),y=!1,Ke(),angular.forEach(angular.copy(D.wallpaperConfig.selectedwallpapers),function(e,t){angular.isString(e.file)&&We(Ce(e.file),t)}),angular.forEach(e,Ie),He(e[0]))})},D.callbackShowPlaylists=function(t){var e={isSaving:t,collectionItem:D.selectedMonitor.playlist,collection:D.playlists,hotkeys:D.sharedSettings.hotkeys,location:D.selectedMonitor.location,type:"playlists"};F.open("browseCollections",{data:e}).then(function(e){t?function(t){t=Te(t);var e=D.playlists.find(function(e){return e.name===t.name});angular.isObject(e)?(angular.merge(e,t),e.items=t.items):D.playlists.push(t)}(e):(e=Oe(e=e),D.selectedMonitor.playlist=e,D.selectedMonitor.playlistFlags={},angular.forEach(e.items,function(e){D.selectedMonitor.playlistFlags[e.wallpaper.file]=!0}),Ie())})},D.callbackShowPlaylistSettings=function(){F.open("browsePlaylistSettings",{data:{settings:D.selectedMonitor.playlist.settings,items:D.selectedMonitor.playlist.items,defaultSettings:J(),fnPreviewTransition:function(e){j.callDeferred("ui","previewPlaylistTransition",angular.toJson({location:D.selectedMonitor.location,settings:e}))}}}).then(function(e){Object.clear(D.selectedMonitor.playlist.settings),angular.merge(D.selectedMonitor.playlist.settings,e),"dayofweek"===D.selectedMonitor.playlist.settings.mode&&angular.isArray(D.selectedMonitor.playlist.items)&&7<D.selectedMonitor.playlist.items.length&&(D.selectedMonitor.playlist.items.length=7),Ie()})},D.callbackClearPlaylist=function(){D.selectedMonitor.playlistFlags={},D.selectedMonitor.playlist.items=[],Ie()},D.getPreviewUrl=B.getPreviewUrl,c.on("mousedown.daytimedrag",function(e){var t;angular.element(e.target).hasClass("daytimeDragBorder")&&(t=Ba(e),angular.isObject(t.scope)&&angular.isObject(t.scope.entry)&&(window.cancelEventImmediately(e),e=angular.offsetToAncestor(e,u),Aa={active:!1,entry:t.scope.entry,lastX:e.left}))}),c.on("mousemove.daytimedrag",function(e){var t,a;angular.isDefined(Aa)&&(a=angular.offsetToAncestor(e,u),Aa.active||2<Math.abs(a.left-Aa.lastX)&&(Aa.active=!0,Aa.indicator=angular.element(document.createElement("div")),Aa.indicator.addClass("daytimeIndicator"),Aa.indicator.css({left:a.left}),p.append(Aa.indicator),t=angular.element(document.createElement("div")),e=angular.element(document.createElement("div")),t.addClass("timeHint"),e.addClass("timeHintWrapper"),e.append(t),Aa.indicator.append(e),t.text(i("date")(0,D.getTimelineFormat(),"+0000")),Aa.timeHint=t),Aa.active&&(Aa.indicator.css({left:a.left}),a=Fa(a=a.left/u.innerWidth())+1e-4,Aa.timeHint.text(i("date")(24*a*60*60*1e3,D.getTimelineFormat(),"+0000"))))}),c.on("mouseup.daytimedrag",function(e){var t;angular.isObject(Aa)&&Aa.active&&(t=angular.offsetToAncestor(e,u),Aa.indicator.remove(),t=t.left/u.innerWidth(),Aa.entry.daytimeend=Fa(t),Ie()),Aa=void 0,window.safeApply(D),window.cancelEventBubble(e)}),c.on("contextmenu.daytimedrag",function(e){var t=angular.element(e.target),a=Ba(e);t.hasClass("daytimeDragBorder")?angular.isObject(a.scope)&&angular.isObject(a.scope.entry)&&angular.isNumber(a.scope.entry.daytimeend)&&W.builder().button("ui_browse_context_menu_remove","fas fa-times",function(){delete a.scope.entry.daytimeend,Ie(),window.safeApply(D)}).open(D,e):t.hasClass("browseWallpaperPlaylistImageChild")&&angular.isObject(a.scope)&&angular.isObject(a.scope.entry)&&angular.isObject(a.scope.entry.wallpaper)&&!a.scope.entry.wallpaper.isStub&&(t=W.builder(),a.scope.entry.wallpaper!==D.currentSelection&&t.button("ui_browse_context_menu_replace_with_selection","fas fa-sync",function(){a.scope.entry.wallpaper=D.currentSelection,Ie(),window.safeApply(D)}),t.button("ui_browse_context_menu_choose_preset","fas fa-folder-open",function(){qt(a.scope.entry.wallpaper).then(function(e){a.scope.entry.preset=e.name,Ie()})}),angular.isString(a.scope.entry.preset)&&t.button("ui_browse_context_menu_remove_preset","fas fa-times",function(){delete a.scope.entry.preset,Ie()}),t.open(D,e))}),D.$on("onMiniModeChanged",function(e,t){(D.isMiniMode=t)?D.canAdvertiseAny=!1:angular.element("#WallpaperBrowseInner2").scrollTop(Ta)}),angular.element("#WallpaperBrowseInner2").scroll(function(e){400<window.innerWidth&&(Ta=e.target.scrollTop)}),D.getTimelineFormat=function(){return D.browserOptions.timeformat12hr?"hh:mm a":"HH:mm"},D.openSystemWallpaperDialog=function(){j.callDeferred("browseWallpaperObject","openSystemWallpaperDialog")},D.showScreensaverSettings=function(){D.changeMonitorActive||D.toggleMonitorSelection(),D.wallpaperConfigGroup="screensaver"},D.openConfigGroup=function(){D.status.isopengroup=!0,c.off("mousemove.tmp.configgroup"),v.cancel(Oa),Oa=void 0;var a=angular.element(c.find("#configGroupSelector")[0]);c.on("mousemove.tmp.configgroup",function(e){var t=document.elementFromPoint(e.pageX,e.pageY-4);0===a.has(e.target).length&&0===a.has(t).length?void 0===Oa&&(Oa=v(function(){D.status.isopengroup=!1,c.off("mousemove.tmp.configgroup")},250),window.safeApply(D)):(v.cancel(Oa),Oa=void 0)})};var ja,Va,La,za,$a,Ha,Ua,Ga,qa=[];function Na(e,t){if(angular.isObject(e)&&e!==t&&!D.sourceIsExplore){var a=La!==D.sourceIsWorkshop;if(La=D.sourceIsWorkshop,a||(D.pagination.current=1),function(){D.filterStatus.type=D.filter.typetags&&(!D.filter.typetags.Scene||!D.filter.typetags.Video||!D.filter.typetags.Web)||D.filter.categorytags&&(!D.filter.categorytags.Wallpaper||!D.filter.categorytags.Preset),D.filterStatus.rating=D.filter.ratingtags&&!D.filter.ratingtags.Everyone,D.filterStatus.source=D.filter.sourcetags&&(!D.filter.sourcetags.Workshop||!D.filter.sourcetags.Official||!D.filter.sourcetags.Local);var a=D.sourceIsWorkshop?ie(D.browserSettings.defaultfilterconfig):[];D.filterStatus.resolution=!1,angular.forEach(D.filter.resolutiontags,function(e,t){!1!==e||a.includes(t)||(D.filterStatus.resolution=!0)}),D.filterStatus.utility=!1,angular.forEach(D.filter.utilitytags,function(e){0!==e&&(D.filterStatus.utility=!0)}),D.filterStatus.tags=!1,a=D.sourceIsWorkshop?ae(D.browserSettings.defaultfilterconfig):[],angular.forEach(D.filter.tags,function(e,t){!1!==e||"Unspecified"===t||a.includes(t)||(D.filterStatus.tags=!0)}),D.filterStatus.text=angular.isString(D.filter.text)&&0<D.filter.text.trim().length}(),D.showFilter.base=D.filterStatus.type||D.filterStatus.rating||D.filterStatus.source||D.filterStatus.resolution||D.filterStatus.tags||D.filterStatus.utility||D.filterStatus.text,D.sourceIsWorkshop){if(D.showFilter.counts=D.showFilter.base,(!angular.isString(t.text)||0===t.text.length)&&angular.isString(e.text)&&0<e.text.length){if(za=void 0,"top_rated"!==A.sort)return za=A.sort,void(D.filter.sort="top_rated")}else if((!angular.isString(e.text)||0===e.text.length)&&angular.isString(t.text)&&0<t.text.length){if(za&&"top_rated"===A.sort&&za!==A.sort)return A.sort=za,void(za=void 0);za=void 0}xa()}else ye();v.cancel(Va),b&&(Va=v(function(){D.browserSettings.filterinfo={installed:angular.copy(M),workshop:angular.copy(A)},delete D.browserSettings.filterinfo.installed.text,delete D.browserSettings.filterinfo.workshop.text,delete D.browserSettings.filterinfo.installed.exactMatch,delete D.browserSettings.filterinfo.workshop.exactMatch},1e3))}}function Qa(){var e,t=arguments;0<D.searchTextInputModelOptions.debounce?(angular.isUndefined(Ha)&&(Ha=arguments[1]),e=Ua?0:D.searchTextInputModelOptions.debounce,v.cancel($a),$a=v(function(){Na.apply(null,[t[0],Ha]),Ha=void 0,Ua=!1},e)):(Ua=!1,Na.apply(null,t))}function Ka(e){angular.forEach(e.items,function(e,t){D.folderRootExclusion[t]=!0}),angular.forEach(e.subfolders,Ka)}function Ya(){angular.forEach(D.filterUtilityTags,function(t){B.translateTag(t.value).then(function(e){t.label=e})}),angular.forEach(D.filterAllTags,function(t){B.translateTag(t.value).then(function(e){t.label=e})}),angular.forEach(D.filterResolutionTags,function(t){B.translateTag(t.value).then(function(e){t.label=e})}),function(){D.lutFilterOptions=[{label:"ui_browse_properties_image_filter_none",value:""}];var t=1;angular.forEach(window.wpxGlobalData.lutFilterOptionFiles,function(e){D.lutFilterOptions.push({value:e,label:t+" "+I.instant("ui_browse_lut_filter_"+e)}),++t})}(),Ra={}}function Xa(){Ga||(Ga=!0,j.callDeferred("browseWallpaperObject","toggleMiniMode",!!D.generalUserSettings.minimodeminimizewindows).then(function(e){v(function(){Ga=!1},250),e?(document.body.classList.add("browseWallpaperMiniMode"),D.changeMonitorActive=!1,D.mobileDeviceManagementActive=!1):document.body.classList.remove("browseWallpaperMiniMode"),n.$broadcast("onMiniModeChanged",e)}).catch(function(){Ga=!1}))}D.requestThumbnailPath=function(e){e&&e.file&&(Ia?qa.push(e.file):(Ia=e.file,j.callDeferred("browseWallpaperObject","getThumbnail",Ia)))},D.clearCurrentThumbnailQueue=function(){angular.forEach(qa,function(e){delete e.requestedThumbnail}),qa=[]},D.onThumbnailReceived=function(t){t&&t.file!==Ia||(Ia=void 0),0<qa.length&&(Ia=qa.shift(),j.callDeferred("browseWallpaperObject","getThumbnail",Ia)),t&&angular.isString(t.preview)&&(angular.forEach(w,function(e){e.file===t.file&&(e.preview=t.preview,e.previewsmall=t.preview)}),ja=ja||v(function(){D.sortedWallpapers=D.sortedWallpapers.slice(),ja=void 0},250))},D.setSteamAuthTicket=function(e){D.steamAuth.ticket=e.ticket;e=D.steamAuth.listeners;D.steamAuth.listeners=[],angular.forEach(e,function(e){e()})},D.steamAuth={listeners:[]},D.resetSearchFilter=function(){D.filter.text="",angular.element("#browseSearchFilterText").focus()},D.openAccountPreferences=function(){B.openUrl(B.getAccountPreferencesUrl())},(window.browseWallpapersCtrl=D).folders=[],D.folderRootExclusion={},D.currentFolder=void 0,D.sortedExploreQueries=[],D.sortedWallpapers=[],D.sourceIsInstalled=!0,D.steamUserInfos={},D.wallpapers=[],D.colorPickerOptions=B.getColorPickerDefaults(),D.source="installed",D.pagination=U,D.multiSelection=[],D.preview={play:!1},D.monitorSelectionState={createGroup:0},D.filterProxy={},D.filter={},D.filterTemp={},D.filterPreset={},D.filterAuthor={},D.showFilter={visible:!1,counts:!1},D.searchTextInputModelOptions={debounce:P.normal},D.canAdvertiseAny=!0,D.canOpenWallpaperDetailsOnPlatform=B.canOpenWallpaperDetailsOnPlatform(),D.canOpenWallpaperDetailsOnWeb=B.canOpenWallpaperDetailsOnWeb(),D.monitorController={},D.browserSettings={viewiconsize:"medium",showmonitorselectiononstart:!0,paireddevices:[],resultsperpage:100,explore:{favorites:[],liked:[],disliked:[],custom:[]},folders:[],authorblocklistnames:[],defaultfilterconfig:{recommendedresolution:!1,showotherresolution:!0}},D.browserSettingsExtensions={authorblocklist:[]},D.mobileManagerState={page:"",connectedDevices:[]},z=[{value:"name",label:"ui_browse_sort_name"},{value:"rating",label:"ui_browse_sort_rating"},{value:"favorite",label:"ui_browse_sort_favorite"},{value:"filesize",label:"ui_browse_sort_filesize"},{value:"subscriptiondate",label:"ui_browse_sort_subscription_date"},{value:"updatedate",label:"ui_browse_sort_last_updated"}],$=B.canShowSpecializedBrowseLists()?[{value:"top_rated",label:"ui_browse_query_sort_by_votes"},{value:"trend_year",label:"ui_browse_query_sort_by_trend_year"},{value:"trend_month",label:"ui_browse_query_sort_by_trend_last_month"},{value:"trend_week",label:"ui_browse_query_sort_by_trend_last_week"},{value:"trend_today",label:"ui_browse_query_sort_by_trend_today"},{value:"most_recent",label:"ui_browse_query_sort_by_date"},{value:"most_up_votes",label:"ui_browse_query_sort_most_up_votes"},{value:"subscriptions",label:"ui_browse_query_sort_most_subscriptions"},{type:"divider"},{value:"my_favorites",label:"ui_browse_query_sort_my_favorites"},{value:"voted_up",label:"ui_browse_query_sort_voted_up"},{value:"friends_favorites",label:"ui_browse_query_sort_friends_favorites"},{value:"friends_created",label:"ui_browse_query_sort_friends_created"},{value:"followers_created",label:"ui_browse_query_sort_by_followed_users"}]:[{value:"top_rated",label:"ui_browse_query_sort_by_votes"},{value:"most_recent",label:"ui_browse_query_sort_by_date"},{value:"subscriptions",label:"ui_browse_query_sort_most_subscriptions"}],H=[{value:"published_desc",label:"ui_browse_query_sort_by_date"},{value:"published_votes",label:"ui_browse_query_sort_by_votes"},{value:"last_updated",label:"ui_browse_query_sort_last_updated"}],D.layouts=[{label:"ui_browse_monitors_layout_per_monitor",value:0},{label:"ui_browse_monitors_layout_fit",value:1},{label:"ui_browse_monitors_layout_clone_wallpaper",value:2}],D.layoutsScreensaver=[{label:"ui_browse_monitors_layout_screensaver_per_monitor",value:0},{label:"ui_browse_monitors_layout_screensaver_fit",value:1},{label:"ui_browse_monitors_layout_screensaver_clone_wallpaper",value:2}],D.$watch("currentSelection",function(e,t){f={},re(),angular.isDefined(e)&&(angular.isString(e.authorsteamid)&&angular.isUndefined(D.steamUserInfos[e.authorsteamid])&&j.callDeferred("ui","pollSteamUserInfo",e.authorsteamid,"browseWallpapersCtrl"),!angular.isDefined(e.workshopid)||angular.isDefined(t&&t.workshopid)&&e.workshopid===t.workshopid||(B.requiresFullAsyncWorkshop()&&j.callDeferred("ui","updateWorkshopItemMetaData",e.workshopid),D.getUserVote(e))),angular.isObject(e&&e.localization)&&(s.insertTranslations(e.localization),I.refresh()),e&&it(),jt()}),D.$watch("selectedMonitor",jt),D.$watch("wallpaperConfig.layout",function(e,t){if(angular.isNumber(e)&&b&&e!==t)switch(j.callDeferred("browseWallpaperObject","changeLayout",e),kt(),D.wallpaperConfig.layout){case 0:var a=D.monitors.find(function(e){return 0===e.index});He(a.group||a);break;case 1:He(D.monitors[0]);break;case 2:He(D.monitors.find(function(e){return 0===e.index}))}}),D.$on("onInternalDropStart",function(){D.isDragDropActive=!0}),D.$on("onInternalDropStop",function(){D.isDragDropActive=!1}),D.skipNextFilterDebounce=function(){Ua=!0},D.$watch("browserSettings",function(e){angular.isObject(e)&&b&&j.callDeferred("browseWallpaperObject","persistBrowserSettings",angular.toJson(e))},!0),D.$watch("sharedSettings",function(e){angular.isObject(e)&&b&&j.callDeferred("browseWallpaperObject","persistSharedSettings",angular.toJson(e))},!0),D.$watch("userMonitorSettings",function(e){angular.isObject(e)&&b&&j.callDeferred("browseWallpaperObject","persistUserMonitorSettings",angular.toJson(e))},!0),D.$watch("filter",Qa,!0),D.$watch("filterAuthor",Qa,!0),D.$watch("filterProxy.ratingtags",function(e){!D.sourceIsWorkshop||!angular.isObject(e)||!e.Questionable&&!e.Mature||D.browserSettings.agegateconfirmed?D.filter.ratingtags=angular.copy(e):F.open("ageGate").then(function(){D.filter.ratingtags=angular.copy(e),D.browserSettings.agegateconfirmed=!0}).catch(function(){D.filterProxy.ratingtags={Everyone:!0,Questionable:!1,Mature:!1}})},!0),D.$watch("folders",function(e,t){e!==t&&(D.folderRootExclusion={},angular.forEach(e,Ka),ye())},!0),D.$watch("playlists",function(e,t){angular.isArray(e)&&e!==t&&b&&j.callDeferred("browseWallpaperObject","playlistsChanged",angular.toJson(e))},!0),D.$watch("profiles",function(e,t){angular.isArray(e)&&e!==t&&b&&j.callDeferred("browseWallpaperObject","profilesChanged",angular.toJson(e))},!0),D.$on("onCppInit",function(e,t){D.providerIcon=B.getProviderIcon(),D.showDiscover=B.canUseDiscover(),D.showExactMath=B.canUseExactMatch(),D.showApprovedTag=B.canUseApprovedTag(),D.filterAllTags=B.getAvailableTags(),D.filterUtilityTags=B.getAvailableTags(!0),D.filterSourceTags=B.getWallpaperSourceTags(),D.filterTypeTags=B.getWallpaperTypeTags(),D.filterCategoryTags=B.getWallpaperCategoryTags(),D.filterRatingTags=B.getWallpaperRatingTags(),D.filterResolutionTags=B.getResolutionTags();var a=D.filterAllTags[0];D.filterAllTags.splice(0,1),D.filterAllTags.push(a),D.filterAllTags=D.filterAllTags.map(function(e){return{label:e,value:e}}),D.filterUtilityTags=D.filterUtilityTags.map(function(e){return{label:e,value:e}}),D.filterResolutionTags=D.filterResolutionTags.map(function(e){return{label:e.replace(/Standard Definition/g,"SD"),value:e}}),M=ne(),A=ne("workshop"),D.sortOptions=z,D.filter=M,D.filterTemp=O,Ya(),D.tempFilterChanged=function(){D.sourceIsWorkshop?xa():D.sourceIsInstalled&&D.sortWallpapers()},t&&(D.allowAllMobileUploads=!0)}),n.$on("$translateChangeEnd",Ya),D.$on("sendToggleMiniMode",Xa),D.navigateWallpapers=function(e){if(D.isExploreHomepage()){var t,a="left"===e?-1:"right"===e?1:0,i=D.getExploreQueryFromSelection();!i||0<=(t=i.wallpapers.indexOf(D.currentSelection))&&(o=(t+a)%i.wallpapers.length,D.callbackWallpaperSelected(i.wallpapers[o]))}else{var n=D.sortedWallpapers.indexOf(D.currentSelection),i=g,o=angular.element("#wpimg0"),i=i.width(),o=o.width(),r=Math.floor(i/o);switch(e){case"left":--n;break;case"up":n-=r;break;case"right":n+=1;break;case"down":n+=r}angular.isNumber(n)&&0<=n&&n<D.sortedWallpapers.length&&!D.changeMonitorActive&&D.callbackWallpaperSelected(D.sortedWallpapers[n])}},c.on("keydown.wpe.wallpaperbrowser",function(e){switch(e.keyCode){case 121:return window.cancelEventBubble(e),void Xa();case 122:window.cancelEventBubble(e),j.callDeferred("browseWallpaperObject","toggleMaximize")}var t=angular.element(":focus");if(!(0<t.length||F.isAnyModalVisible())){if(37<=e.keyCode&&e.keyCode<=40)switch(e.keyCode){case 37:window.cancelEventBubble(e),D.navigateWallpapers("left");break;case 38:window.cancelEventBubble(e),D.navigateWallpapers("up");break;case 39:window.cancelEventBubble(e),D.navigateWallpapers("right");break;case 40:window.cancelEventBubble(e),D.navigateWallpapers("down")}else 46===e.keyCode?(window.cancelEventBubble(e),lt()):e.ctrlKey&&65===e.keyCode&&(window.cancelEventBubble(e),D.sourceIsInstalled?(et(D.sortedWallpapersPrePagination),et(D.sortedFoldersPrePagination)):D.sourceIsWorkshop?et(D.sortedWallpapers):D.sourceIsExplore&&(D.isExploreHomepage()?(t=D.getExploreQueryFromSelection())&&et(t.wallpapers):et(D.sortedWallpapers)));window.safeApply(D)}});var Ja={findElement:function(e){var t=Ba(e);if(angular.isObject(t.scope)){e=t.scope.entry&&t.scope.entry.wallpaper;return angular.isObject(e)?{element:t.target,data:t.scope.entry}:void 0}}};r.registerInitiator(Ja),D.dropFile=function(e){var t="";angular.forEach(e,function(e){!t&&e.toLowerCase().includes(".exe")&&(t=e)});var a=R.when(e);(a=t?Fe(t).then(function(){return e}):a).then(function(e){var t=[];angular.forEach(e,function(e){t.push(we(e))}),0<t.length&&(e=t[0],rt(t,D.currentFolder),ye(),We(e),$e(e),j.callDeferred("browseWallpaperObject","addLocalWallpaperToHistory",t.map(function(e){return e.file})))})},D.dropFileEditor=function(e){j.callDeferred("browseWallpaperObject","createInEditor",e[0])},D.dropConfigEditor={label:"ui_browse_footer_btn_open_wallpaper_in_editor",icon:"fas fa-pencil-ruler",class:"browseWallpaperDropElements",fnCondition:function(e){return D.dropConfigEditor.disabled=1<e.length,!0}},D.dropConfigBrowser={fnCondition:function(e){var t=!1;return angular.forEach(e,function(e){B.isExtension(e,"static")&&(t=!0)}),D.dropConfigBrowser.label=t?"ui_browse_footer_btn_open_wallpaper_in_gallery_static":"ui_browse_footer_btn_open_wallpaper_in_gallery",D.dropConfigBrowser.icon=t?"fas fa-image":"fas fa-film",!0},class:"browseWallpaperDropElements"};function Za(){return ia=!1,R.when()}var ei;function ti(){ei&&(ei.remove(),ei=void 0)}function ai(e,t){for(var a=angular.element(u.children()[0]).children(),i=e.pageX-u[0].getBoundingClientRect().left,n=0,o=0;o<a.length;++o){var r=angular.element(a[o]).outerWidth(!0);if(i<n+.5*r)return t?n:o;n+=r}return t?n:a.length}h.addCloseCallback(Za),D.$on("$destroy",function(){Wt(),Nt.$destroy(),h.removeCloseCallback(Za),c.off("keydown.wpe.wallpaperbrowser"),c.off("mousedown.daytimedrag"),c.off("mousemove.daytimedrag"),c.off("mouseup.daytimedrag"),c.off("contextmenu.daytimedrag"),r.unregisterInitiator(Ja),r.unregisterContainer(p),r.unregisterContainer(g)}),r.registerContainer(p,{onMouseEnter:function(){(ei=angular.element(document.createElement("div"))).addClass("browseWallpaperPlaylistHoverIndicator"),p.append(ei),Wa(),Ma=r.beginAutoScroll("playlistScroll",p,!0)},onMouseLeave:function(){ti(),Wa()},onMouseMove:function(e){e=e,ei&&(e=ai(e,!0),ei.css({left:e}))},onElementDropped:function(e,t){ti(),Wa(),delete t.daytimeend;var a,i=ai(e,!1),n=D.selectedMonitor.playlist.items.indexOf(t);-1===n?(e=ze(!0,t),a=!1,angular.forEach(e,function(e){Ea(D.selectedMonitor.playlist)?(D.selectedMonitor.playlistFlags[e.file]=!0,D.selectedMonitor.playlist.items.splice(i,0,{wallpaper:e})):a=!0}),a&&Pa()):i!==n&&(i<n?(D.selectedMonitor.playlist.items.splice(n,1),D.selectedMonitor.playlist.items.splice(i,0,t)):(D.selectedMonitor.playlist.items.splice(i,0,t),D.selectedMonitor.playlist.items.splice(n,1))),D.$apply(),Ie()}}),r.registerContainer(g,{onMouseEnter:function(){},onMouseLeave:function(){},onMouseMove:function(){},onElementDropped:function(e,t){e=(e=angular.element(e.target).closest(".browseWallpaperImage")[0])&&e.ctx&&e.ctx.wallpaper;angular.isObject(e)&&"folder"===e.type&&st(t,e)}})}]).directive("validationRemoveQuotes",function(){return{require:"ngModel",link:function(e,t,a,i){i.$parsers.push(function(e){var t=e.replace(/["]/g,"'");return t!==e&&(i.$setViewValue(t),i.$render()),t})}}}).directive("attachScope",function(){return{link:function(e,t){t[0].attachedScope=e}}}),window.youtubeLoaded=function(e){var t;e.contentDocument.getElementById("player")&&(t=angular.element("<style>.html5-video-container {width: 100% !important;height: 100% !important; }video {width: 100% !important;height: 100% !important;top: 0px !important;left: 0px !important;object-fit: cover;} </style>"),angular.element(e.contentDocument).find("html > head").append(t))},angular.module("wallpaperbrowserApp").controller("SettingsCtrl",["$q","$timeout","$translate","$document","$scope","skin","modals","host","utils","toastr",function(i,n,o,r,s,l,c,d,a,p){var u,g=!1,f={},m={38:"konamiUp",40:"konamiDown",37:"konamiLeft",39:"konamiRight",66:"konamiPunch",65:"konamiPunch",13:"konamiSpin"},v=[38,38,40,40,37,39,37,39,66,65,13],h=0;window.settingsCtrl=s;var t=a.getQualityPreset("low"),b=a.getQualityPreset("medium"),_=a.getQualityPreset("high"),y=a.getQualityPreset("ultra");function e(e){g=e}function w(e){window.settingsObject.applyGeneral(angular.toJson(e))}function k(e,t,a){var i=[{label:"ui_settings_playback_keep_running",value:"run"}];return t&&i.push({label:"ui_settings_playback_mute",value:"mute"}),e?(i.push({label:"ui_settings_playback_pause_per_monitor",value:"pause"}),i.push({label:"ui_settings_playback_pause_all",value:"pauseall"})):i.push({label:"ui_settings_playback_pause",value:"pause"}),a&&i.push({label:"ui_settings_playback_stop",value:"stop"}),i}function x(e){d.callDeferred("ui","previewPlaylistTransition",angular.toJson({settings:e}))}function S(e){s.plugins=[],angular.isObject(s.generalSettings.plugins)||(s.generalSettings.plugins={}),s.pluginsInitialState={},angular.forEach(e,function(e){var t=e.key;"ledextensions"===t&&(t="iCUE & Chroma SDK");var a=s.generalSettings.plugins[e.key]||{};s.generalSettings.plugins[e.key]=a,angular.isUndefined(a.enabled)&&(a.enabled=!0);e=angular.copy(e);e.state=a,e.name=t,s.plugins.push(e),s.pluginsInitialState[t]=a.enabled})}function C(e){angular.isObject(s.browser)||(s.browser={}),e.profiles&&(s.browser.profiles=e.profiles),e.playlists&&(s.browser.playlists=e.playlists),e.localfiles&&(s.browser.localfiles=e.localfiles)}s.antiAliasingOptions=[{label:"ui_settings_antialiasing_none",value:"none"},{label:"MSAA x2",value:"x2"},{label:"MSAA x4",value:"x4"},{label:"MSAA x8",value:"x8"}],s.textureResolutionOptions=[{label:"ui_settings_texture_resolution_high_quality",value:"full"},{label:"ui_settings_texture_resolution_high_performance",value:"half"},{label:"ui_settings_texture_resolution_automatic",value:"auto"}],s.postProcessingOptions=[{label:"ui_settings_gfx_disabled",value:"disabled"},{label:"ui_settings_gfx_enabled",value:"enabled"},{label:"ui_settings_gfx_ultra",value:"ultra"},{label:"ui_settings_gfx_ultra_display_hdr",value:"displayhdr"}],s.lightingOptions=[{label:"ui_settings_gfx_disabled",value:"disabled"},{label:"ui_settings_gfx_preset_low",value:"low"},{label:"ui_settings_gfx_preset_medium",value:"medium"},{label:"ui_settings_gfx_preset_high",value:"high"},{label:"ui_settings_gfx_ultra",value:"ultra"}],s.monitorDetectionOptions=[{label:"ui_settings_advanced_monitor_identification_option_managed",value:"managed"},{label:"ui_settings_advanced_monitor_identification_option_device_path",value:"devicepath"},{label:"ui_settings_advanced_monitor_identification_option_layout",value:"layout"},{label:"ui_settings_advanced_monitor_identification_option_shell_api",value:"shellapi"},{label:"ui_settings_advanced_monitor_identification_option_gdi",value:"gdi"},{label:"ui_settings_advanced_monitor_identification_option_deprecated",value:"deprecated"}],s.videoFrameworkOptions=[{label:"ui_settings_video_framework_prefer_media_foundation",value:"mf"},{label:"ui_settings_video_framework_prefer_directshow_lav",value:"dshow.lav.vmr9"}],s.videoReadOptions=[{label:"ui_settings_read_from_disk",value:"fromdisk"},{label:"ui_settings_read_from_memory",value:"frommemory"}],s.videoLoopOptions=[{label:"ui_settings_loop_default",value:"default"},{label:"ui_settings_loop_sync_clock",value:"syncclock"},{label:"ui_settings_loop_sync_topo",value:"synctopo"}],s.webmFrameworkOptions=[{label:"ui_settings_video_framework_prefer_chromium",value:"cef"},{label:"ui_settings_video_framework_prefer_native",value:"native"}],s.logLevelOptions=[{label:"ui_settings_log_none",value:"none"},{label:"ui_settings_log_errors",value:"error"},{label:"ui_settings_log_verbose",value:"verbose"}],s.uiSkins=[{label:"ui_settings_skin_white",value:"white"},{label:"ui_settings_skin_dark",value:"dark"},{label:"ui_settings_skin_halloween",value:"halloween"},{label:"ui_settings_skin_winter",value:"winter"}],s.adjustDWMColorModes=[{label:"ui_settings_adjust_windows_color_disabled",value:"disabled"},{label:"ui_settings_adjust_windows_color_accent",value:"accent"},{label:"ui_settings_adjust_windows_color_everything",value:"everything"}],s.priorityOptions=[{label:"ui_settings_process_priority_normal",value:"normal"},{label:"ui_settings_process_priority_below_normal",value:"belownormal"}],s.uiPerformanceModes=[{label:"ui_settings_ui_performance_high",value:"high"},{label:"ui_settings_ui_performance_medium",value:"medium"},{label:"ui_settings_ui_performance_low",value:"low"}],s.uiPerformanceModesSoftware=[{label:"ui_settings_ui_performance_medium",value:"medium"},{label:"ui_settings_ui_performance_low",value:"low"}],s.graphicsApiOptions=[{label:"DirectX 11",value:"dxgi"},{label:"OpenGL",value:"opengl"}],s.tabInfo={activeIndex:0},s.fpsSlider={hideLimitLabels:!0,floor:10,ceil:50,onStart:function(){e(!1)},onEnd:function(){e(!0),w(s.generalSettings)}},s.iconOpacitySlider={hideLimitLabels:!0,floor:0,ceil:100},s.audioSlider={hideLimitLabels:!0,floor:0,ceil:200,onStart:function(){e(!1)},onEnd:function(){e(!0),w(s.generalSettings)}},s.audioThresholdSlider={hideLimitLabels:!0,floor:0,ceil:10,step:.1,precision:2,onStart:function(){e(!1)},onEnd:function(){e(!0),w(s.generalSettings)}},s.colorPickerOptions=a.getColorPickerDefaults(),s.transitionOptions=a.getTransitionOptions(),s.transitionOptionsButtons=a.getTransitionButtons(),s.transitionTimeSlider=a.configureTransitionSlider(),s.transitionSelectAll=function(e){a.transitionPoolSelectAll(s.generalSettings.browsetransition,e)},s.transitionToggleSingle=function(e){a.transitionPoolToggle(s.generalSettings.browsetransition,function(e){x(e)},e)},s.refreshSlider=function(){n(function(){s.$broadcast("rzSliderForceRender")},50)},s.applyPreset=function(e){switch(e){case 0:angular.merge(s.generalSettings,t);break;case 1:angular.merge(s.generalSettings,b);break;case 2:angular.merge(s.generalSettings,_);break;case 3:angular.merge(s.generalSettings,y)}},s.callbackOk=function(){var e;e=i.defer(),s.generalState.isRestartRequired?c.open("genericConfirm",{data:{title:"ui_settings_advanced_restart_setting_modal_header",message:"ui_settings_advanced_restart_setting_modal_body",cancelVisible:!0,okVisible:!0}}).then(function(){d.callDeferred("settingsObject","restartApp")}):e.resolve(),e.promise.then(function(){window.settingsObject.close(!0)})},s.callbackCancel=function(){window.settingsObject.close(!1)},s.applySettings=function(e){var t=e.runtime.multimonitor;s.playbackOptionsFocus=k(t,!0,!1),s.playbackOptionsMaximized=k(t,!0,!0),s.playbackOptionsFullscreen=k(t,!0,!0),s.playbackOptionsSleep=k(!1,!1,!0),s.playbackOptionsBattery=k(!1,!1,!0),s.playbackOptionsAudio=k(!1,!0,!1),s.generalSettings=e.user||{},s.dwmColorSettings={adjustdwmcolor:s.generalSettings.adjustdwmcolor,adjustdwmcolormode:s.generalSettings.adjustdwmcolormode,adjustdwmcolorwarning:s.generalSettings.adjustdwmcolorwarning},s.overrideWallpaperSettings={overridewallpaper:s.generalSettings.overridewallpaper,overridelockscreen:s.generalSettings.overridelockscreen,overrideimagewarning:s.generalSettings.overrideimagewarning},s.vDesktopSettings={enabled:s.generalSettings.vdesktopenabled},s.shouldShowVDesktopSupport=s.generalSettings.vdesktopenabled||l.getWindowsVersion()<11,s.monitorMap=e.monitormap,angular.isNumber(s.generalSettings.plugindelay)||(s.generalSettings.plugindelay=0),l.setAvailableSkins(e.runtime.skins),angular.isObject(s.generalSettings.browsetransition)||(s.generalSettings.browsetransition={}),s.generalSettings.browsetransition=angular.merge({transition:"none",transitiontime:1500},s.generalSettings.browsetransition),s.uiSkinsFull=[],angular.forEach(e.runtime.skins,function(e){s.uiSkinsFull.push({label:e.label,value:e.key})}),0===s.uiSkinsFull.length&&(s.uiSkinsFull=s.uiSkins.slice()),s.runtime=e.runtime,s.sharedSettings=e.shared,s.fpsSlider.ceil=e.runtime.frequencymax,a.validateSharedSettings(s.sharedSettings),S(e.discoveredplugins),C(e),s.runtime.displayhdrsupport||s.postProcessingOptions.splice(s.postProcessingOptions.length-1,1),n(function(){f=angular.copy(s.generalSettings),g=!0,s.refreshSlider(),s.runtime.displayhdrsupport||"displayhdr"!==s.generalSettings.postprocessing||(s.generalSettings.postprocessing="ultra")})},s.updateSettings=function(e){S(e.discoveredplugins),C(e)},s.setBuildVersion=function(e){s.buildVersion=e},s.toggleAutoStartRegistry=function(t){d.callDeferred("settingsObject","toggleAutoStartRegistry",!1,t).then(function(e){e&&(s.generalSettings.autostart=t)})},s.toggleAutoStartScheduler=function(t){c.showHighPriorityWarning(t,s.generalSettings).then(function(){d.callDeferred("settingsObject","toggleAutoStartHighPriority",t,!t).then(function(e){e&&(s.generalSettings.autostartscheduler=t)})})},s.showChangelog=function(){c.open("changelog")},s.resetConfig=function(){c.open("genericConfirm",{data:{title:"ui_settings_advanced_reset_config_modal_header",message:"ui_settings_advanced_reset_config_modal_body",leftIcon:"images/warning.png",cancelVisible:!0,okVisible:!0}},{backdropClass:"modal-backdrop-danger"}).then(function(){d.callDeferred("settingsObject","resetConfig")})},s.editPerApplicationSettings=function(){s.generalSettings.apprules=s.generalSettings.apprules||[],c.open("settingsPerApplication",{data:{rules:s.generalSettings.apprules,runtime:s.runtime,browser:s.browser}})},s.editHotkeys=function(){a.validateSharedSettings(s.sharedSettings),c.open("settingsHotkeys",{data:{hotkeys:s.sharedSettings.hotkeys,runtime:s.runtime}})},s.editMediaIntegrationBlocklist=function(){s.generalSettings.mediablocklist=s.generalSettings.mediablocklist||[],c.open("settingsMediaBlocklist",{data:{blocklist:s.generalSettings.mediablocklist}})},s.editManagedMonitors=function(){c.open("settingsManageMonitors",{data:{monitorMap:s.monitorMap}})},s.editPluginSettings=function(t){s.generalSettings.plugins=s.generalSettings.plugins||{},angular.isObject(s.generalSettings.plugins[t.key])||(s.generalSettings.plugins[t.key]={}),angular.forEach(t.options,function(e){angular.isDefined(s.generalSettings.plugins[t.key][e.name])||(s.generalSettings.plugins[t.key][e.name]=e.default)}),c.open("settingsPlugin",{data:{plugin:t,pluginSettings:s.generalSettings.plugins}})},s.openFaq=function(){a.openUrl("var_url_faq")},s.openTranslationHelp=function(){a.openUrl("var_url_translations")},s.sendSupportMail=function(){a.openUrl("var_url_sendsupportmail")},s.showGenericHelp=function(e,t,a){e.stopPropagation(),e.preventDefault(),c.open("genericConfirm",{data:{title:t,message:a,okVisible:!0}})},s.showVDesktopHelp=function(e,a){return e&&(e.stopPropagation(),e.preventDefault()),o(["ui_settings_enable_vdesktop_support_hint","ui_settings_enable_vdesktop_support_hint_win11","ui_settings_enable_vdesktop_support_hint_transition","ui_settings_enable_vdesktop_support_hint_crash"]).then(function(e){var t={title:"ui_settings_enable_vdesktop_support",message:e.ui_settings_enable_vdesktop_support_hint+e.ui_settings_enable_vdesktop_support_hint_transition+e.ui_settings_enable_vdesktop_support_hint_crash,okVisible:!0,cancelVisible:!0===a};return 11===l.getWindowsVersion()&&(t.message=e.ui_settings_enable_vdesktop_support_hint+e.ui_settings_enable_vdesktop_support_hint_win11+e.ui_settings_enable_vdesktop_support_hint_transition),(10===l.getWindowsVersion()&&l.getWindowsBuild()<19044||11===l.getWindowsVersion()&&l.getWindowsBuild()<22e3)&&(t.okDisabled=!0,t.cancelVisible=!0,t.alert=o.instant("ui_settings_enable_vdesktop_support_hint_build_error",{version:l.getWindowsBuild(),windows:l.getWindowsVersion(),buildneeded:10===l.getWindowsVersion()?19044:22e3})),c.open("genericConfirm",{data:t})})},s.canUseSeasonalTheming=a.canUseSeasonalTheming,s.$watch("generalSettings",function(e){g&&w(e)},!0),s.$watch("dwmColorSettings",function(){g&&l.applyDWMColorSettings(s.dwmColorSettings).then(function(){angular.merge(s.generalSettings,s.dwmColorSettings)})},!0),s.$watch("overrideWallpaperSettings",function(e){g&&!function(e){var t=i.when();!s.generalSettings.overridewallpaper&&e.overridewallpaper&&(t=d.callDeferred("settingsObject","toggleWallpaperOverride",!0)),!s.generalSettings.overridelockscreen&&e.overridelockscreen&&(t=t.then(function(){return d.callDeferred("settingsObject","toggleLockscreenOverride",!0)}));var a=i.defer();return t.then(function(){if(!0===e.overrideimagewarning)s.generalSettings.overridewallpaper&&!e.overridewallpaper?c.open("genericConfirm",{data:{title:"ui_settings_restore_override_wallpaper_title",message:"ui_settings_restore_override_wallpaper_message",cancelVisible:!0,okVisible:!0}}).catch(function(){a.resolve()}).then(function(){return d.callDeferred("settingsObject","toggleWallpaperOverride",!1)}).then(function(){a.resolve()}):s.generalSettings.overridelockscreen&&!e.overridelockscreen?c.open("genericConfirm",{data:{title:"ui_settings_restore_override_lockscreen_title",message:"ui_settings_restore_override_lockscreen_message",cancelVisible:!0,okVisible:!0}}).catch(function(){a.resolve()}).then(function(){return d.callDeferred("settingsObject","toggleLockscreenOverride",!1)}).then(function(){a.resolve()}):a.resolve();else{if(e.overridewallpaper||e.overridelockscreen)return c.open("genericConfirm",{data:{title:"ui_settings_enable_override_system_image_info_title",message:"ui_settings_enable_override_system_image_info_message",cancelVisible:!0,okVisible:!0}},{backdropClass:"modal-backdrop-danger"}).then(function(){e.overrideimagewarning=!0}).catch(function(){e.overridewallpaper=!1,e.overridelockscreen=!1});a.resolve()}}),a.promise}(e).then(function(){angular.merge(s.generalSettings,e)})},!0),s.$watch("vDesktopSettings",function(e){g&&(e.enabled?s.showVDesktopHelp(null,!0).then(function(){s.generalSettings.vdesktopenabled=!0,s.generalSettings.safemode=!0}).catch(function(){s.vDesktopSettings.enabled=!1}):s.generalSettings.vdesktopenabled=!1)},!0),s.generalSettings=angular.copy(t),s.generalState={isRestartRequired:!1},angular.merge(s.generalSettings,{playbackfocus:"run",playbackmaximized:"pause",playbackfullscreen:"pause",language:"en-us"}),s.$watchGroup(["generalSettings.uiskin","generalSettings.uiskinseasonal"],function(){g&&l.refreshSkin()}),s.$watch("generalSettings.language",function(e,t){angular.isString(e)&&angular.isString(t)&&e!==t&&(a.setLanguage(e),d.callDeferred("settingsObject","languageChanged",e))});var E=["monitordetection","trayicon","uihardwareacceleration","uiquality","anticrash","vdesktopenabled","videomfstutterhack"];s.$watchGroup(E.map(function(e){return"generalSettings."+e}),function(){var t;g&&(t=!1,angular.forEach(E,function(e){t=t||f[e]!==s.generalSettings[e]}),s.generalState.isRestartRequired=t)}),s.$watch("plugins",function(e){g&&angular.forEach(e,function(e){e.state.enabled!==s.pluginsInitialState[e.name]&&(s.generalState.isRestartRequired=!0)})},!0),s.$watch("generalSettings.extremesleephack",function(e){g&&!0===e&&(s.generalSettings.autostartscheduler?c.open("genericConfirm",{data:{title:"ui_settings_advanced_sleep_hack_enable_warning_header",message:"ui_settings_advanced_sleep_hack_enable_warning_body",cancelVisible:!0,okVisible:!0}}).catch(function(){s.generalSettings.extremesleephack=!1}):(s.generalSettings.extremesleephack=!1,c.open("genericConfirm",{data:{title:"ui_settings_advanced_sleep_hack_error_auto_start_header",message:"ui_settings_advanced_sleep_hack_error_auto_start_body",okVisible:!0}})))}),s.$watch("generalSettings.anticrash",function(e){g&&!0===e&&c.open("genericConfirm",{data:{title:"ui_settings_restart_after_crash",message:"ui_settings_restart_after_crash_hint",cancelVisible:!0,okVisible:!0}}).catch(function(){s.generalSettings.anticrash=!1})}),s.$watch("generalSettings.browsetransition.transition",function(){g&&x(s.generalSettings.browsetransition)}),s.$watch("sharedSettings",function(e){angular.isObject(e)&&g&&d.callDeferred("settingsObject","persistSharedSettings",angular.toJson(e))},!0),r.on("keydown.wpe.konami",function(e){var t,a,e=e.keyCode;v[h]===e&&2===s.tabInfo.activeIndex?(t=angular.element(r[0].body),a=m[e],t.css({animation:""}),n(function(){t.css({animation:a+("konamiSpin"===a?" 200ms":" 100ms")})}),++h===v.length&&(p.success("Skins unlocked",""),h=0,window.settingsObject.konamiUnlock(),s.generalSettings.konami=!0,s.generalSettings.uiskin="space")):h=0,angular.isDefined(u)&&(n.cancel(u),u=void 0),u=n(function(){h=0},1e3)}),s.$on("$destroy",function(){r.off("keydown.wpe.konami")}),s.$on("onCppInit",function(){s.isWindows10OrGreater=10<=l.getWindowsVersion(),s.availableLanguages=a.getAvailableLanguages()})}]),angular.module("wallpaperbrowserApp").directive("droplist",["$timeout",function(a){return{templateUrl:"views/templates/droplist.html",restrict:"E",scope:{dpOptions:"=",dpSelected:"=",dpDisabled:"=",dpChange:"&",dpEmptyText:"@"},link:function(n,t){var i,e;function o(){return angular.isString(n.dpEmptyText)&&0<n.dpEmptyText.length}t=angular.element(t),n.selectItem=function(e){n.dpSelected=e.value,n.selected=e,angular.isFunction(n.dpChange)&&a(function(){n.$eval(n.dpChange)}),angular.element(t.find(".dropdown-toggle")[0]).focus()},angular.isUndefined(n.dpSelected)&&angular.isArray(n.dpOptions)&&0<n.dpOptions.length&&(e=n.dpOptions[0],n.selected=e,angular.isFunction(n.dpChange)&&a(function(){n.$eval(n.dpChange)}),angular.element(t.find(".dropdown-toggle")[0]).focus()),n.$watch("dpSelected",function(t){var a;angular.isDefined(t)?(a=!1,angular.forEach(n.dpOptions,function(e){e.value===t&&(n.selected=e,a=!0)}),a||(i=t)):o()&&(delete n.selected,delete n.dpSelected)}),n.$watch("dpOptions",function(e,t){var a;angular.isArray(e)&&angular.isArray(t)&&e!==t&&(a=!1,angular.forEach(e,function(e){e&&n.selected&&angular.equals(e.value,n.selected.value)&&(a=!0,n.selected=e)}),a||(o()?(delete n.selected,delete n.dpSelected):(n.selected=e[0],n.dpSelected=n.selected&&n.selected.value))),angular.isDefined(i)&&angular.isDefined(e)&&angular.isUndefined(n.selected)&&(angular.forEach(e,function(e){e.value===i&&(n.selected=e)}),i=void 0)}),n.keyDown=function(e){var t,a,i;38!==e.keyCode&&40!==e.keyCode||(t=38===e.keyCode?-1:1,(i=(a=n.dpOptions.filter(function(e){return angular.isDefined(e.value)&&null!==e.value})).map(function(e){return e.value}).indexOf(n.dpSelected))<0||(i=Math.max(0,Math.min(a.length-1,i+t)),n.selectItem(a[i]),e.stopPropagation(),e.preventDefault()))}}}}]),angular.module("wallpaperbrowserApp").directive("checkbox",["$timeout",function(n){return{templateUrl:"views/templates/checkbox.html",restrict:"E",scope:{cbChecked:"=",cbDisabled:"=",cbTitle:"=",cbBit:"=",cbRecalculateBits:"&",cbChanged:"&",cbType:"@"},link:function(a,e){var t="normal";angular.isDefined(a.cbType)&&(t=a.cbType);var i=e.find(".checkBoxOuter")[0];a.toggle=function(){if(!a.cbDisabled){switch(t){case"tag":angular.isNumber(a.cbChecked)||(a.cbChecked=0),a.cbChecked+=1,1<a.cbChecked&&(a.cbChecked=0);break;case"bit":a.cbChecked=a.cbRecalculateBits(),a.cbChecked^=a.cbBit;break;default:a.cbChecked=!a.cbChecked}angular.isFunction(a.cbChanged)&&n(a.cbChanged)}},a.bitChecked=function(){return a.cbChecked&a.cbBit},a.$watch("cbChecked",function(e,t){a.cbType&&"bit"===a.cbType&&(e&=a.cbBit,t&=a.cbBit),e!==t&&(i.classList.add("checkboxClickAnim"),n(function(){i.classList.remove("checkboxClickAnim")},200))})}}}]),angular.module("wallpaperbrowserApp").controller("EditorCtrl",["$document","$compile","$q","$uibModalStack","$rootScope","$scope","$translate","$timeout","modals","host","utils","contextMenu",function(e,w,y,t,n,k,x,S,C,E,P,M){var o,r=!0,A=0,s=!0,i=0,l=[],c=[],d=!1,p=!1,a=!1,u={};function g(){var t;if(t=k.project,angular.forEach(k.filemenu,function(e){angular.isFunction(e.shouldHide)&&angular.isObject(t)&&(e.hidden=e.shouldHide(t)),function t(a,e){angular.forEach(e,function(e){angular.isFunction(e.shouldHide)&&angular.isObject(a)&&(e.hidden=e.shouldHide(a)),angular.isFunction(e.shouldDisable)&&(e.disabled=e.shouldDisable(a)),angular.isString(e.iconTemplate)&&(e.icon=e.iconTemplate.replace(/%provider%/g,P.getProviderIcon())),angular.isArray(e.children)&&t(a,e.children)})}(t,e.children)}),k.filemenu=angular.copy(k.filemenu),angular.forEach(k.filemenu,function(e){e.disabled=!1}),angular.isUndefined(k.project))for(var e=1;e<k.filemenu.length;++e)k.filemenu[e].disabled=!0}function f(e){angular.isUndefined(e)&&(e=!1),E.callEditor("setGridVisible",e)}function m(e){angular.isUndefined(e)&&(e=!1),E.callEditor("setSelectionBoxVisible",e)}function v(e,t){angular.isUndefined(e)&&(e=!1);var a={};a[t]=e,E.callEditor("setEditorGraphicsFlagsVisible",a)}function h(){k.selectedResource.item=null}function b(e){P.openUrl(e.workshopurl,{},P.usePlatformBrowser())}function _(){var t=y.defer();return C.open("genericConfirm",{data:{title:"ui_editor_modal_unsaved_changes_header",message:"ui_editor_modal_unsaved_changes_body",leftIcon:"images/warning.png",okVisible:!0,okText:"ui_save",cancelVisible:!0,cancelText:"ui_discard",leftVisible:!0,leftText:"ui_cancel",leftClass:"btn-default",leftAction:"cancelPrompt"}}).then(function(e){"cancelPrompt"===e?t.reject():t.resolve(!0)}).catch(function(){t.resolve(!1)}),t.promise}function T(){var t=y.defer();return E.callEditor("checkUnsavedChanges").then(function(e){return e?_():void t.resolve()}).then(function(e){return E.callEditor("confirmUnsavedChanges",e)}).then(function(e){t.resolve(e)}),t.promise}function O(t,a){return fe(),k.blockEditorInput=!0,++i,E.callEditor("openProject",t).then(function(e){k.blockEditorInput=!1,P.flushTexturePreviews(),angular.isObject(e.data.general)||(e.data.general={}),angular.isObject(e.data.general.properties)||(e.data.general.properties={}),angular.isObject(e.data.general.properties.schemecolor)||(e.data.general.properties.schemecolor={value:"0 0 0"}),angular.isObject(e.objectproperties)||(e.objectproperties={}),e.data.type=e.data.type.toLowerCase(),k.editorLayoutClass="scene"===e.data.type?"editorLayoutScene":"editorLayoutSimple",S(function(){window.dispatchEvent(new Event("resize"))},500),"scene"===e.data.type?(k.showSceneLayout(),f(k.editorSettings.showgrid),m(k.editorSettings.showselectionbox),v(k.editorSettings.showparticlecollision,"showparticlecollision"),v(k.editorSettings.showparticlecontrolpoints,"showparticlecontrolpoints"),v(k.editorSettings.showhitboxes,"showhitboxes")):k.showSimpleLayout(),r=!1,R(t),D(e.data),k.project=e,g(),k.isRunningScriptPreview=!1,k.cameraMode="fly",k.gizmoMode="none",k.setGizmoGeometryMode("none",!0),delete k.gizmoContext,k.resetGizmoOrientationState(),k.editorTemp.previewphone=!1,k.editorTemp.previewdesktop=!1,k.waitForScriptToggle=!1,l=[],p=d=!(c=[]),o=void 0,h(),k.nativeDropOptions.previewExtension=angular.isObject(e.scene)?["texture","model","sound"]:"",P.onProjectNameChanged(e.data.title),k.updateRunScriptVisibility(),S(function(){r=!0,k.selectedResource.item=k.project.tree&&k.project.tree[0],e.scene&&(k.setGizmoMode(e.scene.is2d?"multi":"translate"),k.setGizmoOrientation(e.scene.is2d?"local":"world")),angular.isArray(e.data.templateoptions)&&!e.data.templatewizardshownonce?(e.data.templatewizardshownonce=!0,pe()):a&&a.backgroundfile&&(P.isExtension(a.backgroundfile,"texture")?ue(a.backgroundfile,{instantImport:!0,lock:!0,disableTransparentCrop:!0,cropAndResize:a.backgroundfileresize}):P.isExtension(a.backgroundfile,"model")&&le(a.backgroundfile))})}).catch(function(){E.callEditor("closeProject",!0),k.blockEditorInput=!1}).then(function(){--i})}function I(t){var a;return angular.forEach(k.filemenu,function(e){angular.forEach(e.children,function(e){e.tag===t&&(a=e)})}),a}function R(e){if(angular.isObject(k.editorSettings)){if(angular.isArray(k.editorSettings.recentfiles)||(k.editorSettings.recentfiles=[]),angular.isString(e)){e=e.replaceAll("\\","/");for(var t=0;t<k.editorSettings.recentfiles.length;++t)if(k.editorSettings.recentfiles[t].replaceAll("\\","/")===e){k.editorSettings.recentfiles.splice(t,1);break}4<k.editorSettings.recentfiles.length&&(k.editorSettings.recentfiles.length=4),k.editorSettings.recentfiles.unshift(e)}var a=[];angular.forEach(k.editorSettings.recentfiles,function(e){a.push({label:e,fn:function(){T().then(function(){O(e)})}})});var i=I("fileRecentList");i&&(i.children=a,i.disabled=0===a.length)}}function D(e){var t=I("showWallpaperInWorkshop");t&&t.id!==e.workshopid&&(t.id=e.workshopid,t.disabled=!angular.isDefined(e.workshopid),t.fn=t.disabled?void 0:function(){b(e)},g())}function W(e,t){angular.isNumber(t)||(t=angular.isNumber(e.index)?e.index:k.project.tree.length);var a=k.project.tree.slice(),t=[t,0].concat(e.items);return Array.prototype.splice.apply(a,t),k.project.tree=a,angular.isObject(e.objectproperties)&&angular.merge(k.project.objectproperties,e.objectproperties),h(),k.selectedResource.item=e.items[0],angular.isObject(e.userproperties)&&(k.project.data.general.properties=k.project.data.general.properties||{},angular.merge(k.project.data.general.properties,e.userproperties)),k.updateRunScriptVisibility(),e.info&&!u[e.info.key]&&(u[e.info.key]=!0,C.open("genericConfirm",{data:{title:e.info.title,message:e.info.message,okVisible:!0}})),k.selectedResource.item}function B(t){if(angular.isString(t.project))return x("ui_editor_delete_project_modal_body",{title:t.title}).then(function(e){return C.open("genericConfirm",{data:{title:"ui_editor_delete_project_modal_header",message:e,leftIcon:"images/warning.png",cancelVisible:!0,okVisible:!0}},{backdropClass:"modal-backdrop-danger"}).then(function(){return k.currentSelection=void 0,E.callEditor("deleteProject",t.project)})})}function F(){C.open("editorOpenWallpaper",{data:{deleteProject:B}}).then(function(e){angular.isString(e)&&T().then(function(){O(e)})})}function j(e,t){C.open("editorWelcome",{editorScope:k,options:{smallDialog:e,autoImportFile:t,suggestResizeResolution:k.editorSettings.suggestimportresolution}}).then(function(e){angular.isString(e.file)?O(e.file,e):"openProjects"===e.action&&F()})}function V(e){k.editorSettings.previewratio=e.value}function L(){return!angular.isObject(k.steamWorkshopStatus)||!k.steamWorkshopStatus.error}function z(){fe(),E.callEditor("unlockPublishAchievement"),E.callEditor("choosePublishMethod","wallpaper").then(function(){return C.open("editorSteamPublish",{projectData:k.project.data,editorSettings:{category:"wallpaper",isSteamAvailable:L}})})}function $(e){return E.callDeferred("ui","subscribeWorkshopItem",e)}(window.editorCtrl=k).getUserVote=function(e){E.callDeferred("ui","getUserVote","editorCtrl",e)},k.setUserVote=function(e,t){E.callDeferred("ui","setUserVote","editorCtrl",e,t)},k.setFavorited=function(e,t){E.callDeferred("ui","setFavorited",e,t)};var H,U,G=[],q={handle:1},N={editorSettings:{category:"asset",subscribeItem:$,publishedItems:[],isSteamAvailable:L}};k.steamUserInfos={};var Q={setUserVote:k.setUserVote,getUserVote:k.getUserVote,setFavorited:k.setFavorited,subscribeWorkshopItem:$,unsubscribeWorkshopItem:function(e,t){return x("ui_browse_modal_unsubscribe_body_short",{title:e}).then(function(e){return C.open("genericConfirm",{data:{title:"ui_browse_modal_unsubscribe_header",message:e,cancelVisible:!0,okVisible:!0}})}).then(function(){return E.callDeferred("ui","unsubscribeWorkshopItem",t)})},requestSteamUserInfo:function(e){E.callDeferred("ui","pollSteamUserInfo",e,"editorCtrl")},steamUserInfos:k.steamUserInfos,openSteamWorkshopPage:b,callbacks:[]};function K(e,t){var a=P.assetTypeGroups[e];return"installed"===t.status&&angular.isArray(t.assettypes)&&0<t.assettypes.filter(function(e){return-1!==a.indexOf(e)}).length}function Y(e){return{name:e.title,description:e.description,path:e.file,workshopid:e.workshopid,workshopurl:e.workshopurl,previewimg:"file://"+e.preview,authorsteamid:e.authorsteamid,filesizelabel:e.filesizelabel,editable:e.editable,type:"workshopasset",group:"workshop",nestedgroup:e.assetgenre,assettypeslabel:e.assettypes.join(", "),assetscripttype:e.assetscripttype,isworkshopasset:!0,project:e.project,variantsenabled:e.variantsenabled,options:e.options,rating:e.rating,ratingrounded:e.ratingrounded,favorite:e.favorite,uservote:e.uservote}}function X(t,a){H=a,U=t,angular.forEach(G,function(e){K(t,e)&&a.push(Y(e))})}function J(e){var t;L()?(angular.isString(e)||(e="default"),(t=angular.copy(k.editorSettings.assetBrowser)||{}).typetags=t.typetags||{},t.typetags=t.typetags[e]||{},k.editorSettings.assetBrowser=k.editorSettings.assetBrowser||{},C.open("queryWorkshop",{data:{assetBrowserSettings:t,assetBrowserSettingsGroup:e,assetBrowserItems:G,assetBrowserItemsUpdateHandle:q,workshopController:Q}}).catch(function(){k.editorSettings.assetBrowser=t})):P.showSteamError()}function Z(t){var e;fe(),N.projectData={},L()?(e=y.when(),(e=!k.editorSettings.hasacceptedassetsharingtos?C.open("genericConfirm",{data:{title:"ui_editor_publish_modal_info_asset_reuse_header",message:"ui_editor_publish_modal_info_asset_reuse_body",cancelVisible:!0,okVisible:!0}}).then(function(){k.editorSettings.hasacceptedassetsharingtos=!0}):e).then(function(){return E.callEditor("choosePublishMethod","asset")}).then(function(){return E.callEditor("listAvailableEffects")}).then(function(e){return angular.isObject(t)?y.when():C.open("editorSelectAssets",{data:{assets:{layers:k.project.tree,effects:e.filter(function(e){return e.editable})},fnOpenWallpaperPublish:z}})}).then(function(e){return N.editorSettings.publishedItems=[],N.editorSettings.ageRatingDisabled=t&&t.script,angular.isObject(t)?E.callEditor("preparePublishAssets",t):angular.isArray(e.items)?E.callEditor("preparePublishAssets",{renderables:e.items,variantsenabled:e.variantsEnabled}):angular.isString(e.item)?E.callEditor("preparePublishAssets",{path:e.item}):void 0}).then(function(){return C.open("editorSteamPublish",N)})):P.showSteamError()}function ee(e){var t={title:"ui_editor_generic_modal_puppet_create_clipping_mask_title",message:"ui_editor_generic_modal_puppet_create_clipping_mask_body",cancelVisible:!0,okVisible:!0,textinputVisible:!0,textinput:x.instant("ui_editor_generic_modal_puppet_create_clipping_mask_default").toString()};return C.open("genericConfirm",{data:t}).then(function(){return E.callEditor("genericSceneAction","puppetCreateNewClippingMask",e,t.textinput)}).then(function(){return k.genericSceneAction({args:"paintPuppetClippingMask",value:e})})}k.applyUserVote=function(t,a){angular.forEach(G,function(e){e.workshopid===t&&(e.uservote=a)}),angular.forEach(Q.callbacks,function(e){e.applyUserVote(t,a)}),window.safeApply(k)},k.registerSteamUser=function(e){var t=k.steamUserInfos[e.id]||{};t.name=e.name,t.avatar=e.avatar,k.steamUserInfos[e.id]=t,window.safeApply(k)},k.onReceivePublishedAssets=function(e){N.editorSettings.publishedItems=N.editorSettings.publishedItems.concat(e)},k.updateAssetData=function(e){for(var t,a=0;a<e.length;++a){var i=e[a],n=!1;if(angular.isDefined(i.workshopid))for(t=0;t<G.length;++t){var o=G[t];if(angular.isDefined(o.workshopid)&&o.workshopid===i.workshopid){angular.merge(o,i),n=!0;break}}n||G.push(i);var r="unsubscribed"===i.status,s="installed"===i.status;r&&H?H.findAndRemove(function(e){return e.workshopid===i.workshopid}):s&&H&&K(U,i)&&H.pushIfNew(Y(i),function(e){return e.workshopid===i.workshopid})}++q.handle},k.editTextFile=function(n){var o="shader_"+n.value,e=k.layoutCtrl.findWindow(o);e?k.layoutCtrl.activateWindow(e,!0):E.callEditor("readProjectFile",n.value).then(function(e){var a=e.text,i=k.$new();i.editorControls={openHLSLError:function(e){var t,a;e.tag=o+"_error",e.title=x.instant("ui_editor_pane_header_hlsl",{name:x.instant(n.name).toString()}).toString(),t=e,(e=k.layoutCtrl.findWindow(t.tag))?k.layoutCtrl.activateWindow(e,!0):((a=k.$new()).editorControls={},a.scriptName=t.tag,a.content=t.source,a.contentType="hlslerror",a.initialError={message:"",line:1,column:0,errorlevel:1,name:t.tag},(e=t.error.replace(/(\r\n|\n|\r)/gm,"").match(/[.]*\((\d+),(\d+)\-*(\d*)\):(.+)/i))&&5===e.length&&(a.initialError.line=parseInt(e[1]),a.initialError.column=parseInt(e[2]),a.initialError.columnEnd=parseInt(e[3]||"0")+1,a.initialError.message=e[4].trim()),w('<div class="editorLayoutPanel"><code-editor ce-apply="apply(value)" ce-close="close()" ce-cancel="cancel()" ce-content="content" ce-controls="editorControls" ce-script-name="scriptName" ce-script-property-name="scriptPropertyName" ce-content-type="contentType" ce-initial-error="initialError"></code-editor></div>')(a,function(e){a.close=function(){k.layoutCtrl.removeWindow(e)},k.layoutCtrl.insertWindow(e,a,{noSave:!0,tag:t.tag,icon:"fas fa-fw fa-scroll",title:t.title,closeFunction:function(){a.close()}})}))}},i.scriptName=n.value,i.scriptPropertyName=n.name,i.content=a,i.contentType=n.editmode,w('<div class="editorLayoutPanel"><code-editor ce-apply="apply(value)" ce-close="close()" ce-cancel="cancel()" ce-content="content" ce-controls="editorControls" ce-script-name="scriptName" ce-script-property-name="scriptPropertyName" ce-content-type="contentType"></code-editor></div>')(i,function(e){i.close=function(){k.layoutCtrl.removeWindow(e)},i.cancel=function(){i.apply(a)},i.apply=function(e){E.callEditor("writeProjectFile",n.root,e).then(function(){return E.callEditor("writeProjectFile",n.value,e).then(function(e){delete i.editorControls.errorInfo,e.error&&e.source&&(i.editorControls.errorInfo=e)})})};var t="ui_editor_pane_header_shader_editor";angular.isString(n.name)&&(t=x.instant("ui_editor_pane_header_shader",{name:x.instant(n.name).toString()}).toString()),k.layoutCtrl.insertWindow(e,i,{noSave:!0,tag:o,icon:"fas fa-fw fa-code",title:t,closeFunction:function(){var e=i.editorControls.getValue();e===(a||"")?i.close():C.open("genericConfirm",{data:{title:"ui_editor_script_unsaved_changes_header",message:"ui_editor_script_unsaved_changes_body",cancelVisible:!0,cancelText:"ui_close",okVisible:!0}}).then(function(){i.apply(e),i.close()}).catch(function(){i.cancel(),i.close()})}})})})},k.editPuppetTextureChannels=function(e){var e=e.value.split(":"),t={textureChannels:{renderable:e[0],alphaWriting:"false"!==e[1]}};E.callEditor("genericSceneAction","confirmTextureChannelAvailability",e[0]).then(function(e){e.error?C.open("genericConfirm",{data:{title:"ui_editor_character_separation_texture_channel_incompatible_title",message:"ui_editor_character_separation_texture_channel_incompatible_body",leftIcon:"images/warning.png",okVisible:!0,okText:"ui_close"}}):C.open("editorCharacterSeparation",{data:t})})},k.removePuppetWarp=function(e){C.open("genericConfirm",{data:{title:"ui_editor_puppet_warp_delete_warning_title",message:"ui_editor_puppet_warp_delete_warning_body",leftIcon:"images/warning.png",cancelVisible:!0,okVisible:!0}}).then(function(){return E.callEditor("genericSceneAction","removePuppetWarp",e.value).then(function(){var e;0<k.selectedResource.stack.length&&(e=k.selectedResource.stack[0],k.navigateProperty(e.key,e.id))})})};var te,ae="simple";function ie(e){return!e.key||"readonly"===e.type||"nestedlink"===e.type||"materiallink"===e.type||"texture"===e.type||"texturepreview"===e.type||"effects"===e.type||!angular.isString(e.key)||angular.isObject(e.value)||angular.isArray(e.value)}function ne(){E.callEditor("resetView")}function oe(){k.editorSettings.showgrid&&!0===k.editorSettings.showgrid||(k.editorSettings.showgrid=!1),k.editorSettings.showgrid=!k.editorSettings.showgrid,f(k.editorSettings.showgrid)}function re(){k.editorSettings.showselectionbox&&!0===k.editorSettings.showselectionbox||(k.editorSettings.showselectionbox=!1),k.editorSettings.showselectionbox=!k.editorSettings.showselectionbox,m(k.editorSettings.showselectionbox)}function se(e){k.editorSettings[e.binding]&&!0===k.editorSettings[e.binding]||(k.editorSettings[e.binding]=!1),k.editorSettings[e.binding]=!k.editorSettings[e.binding],v(k.editorSettings[e.binding],e.binding)}function le(e){E.callEditor("importModel",e).then(function(e){return C.open("editorImportModel",{objInfo:e,project:{}})}).then(W)}function ce(e){E.callEditor("addLight",e).then(W)}function de(){E.callEditor("addCamera").then(W)}function pe(){C.open("editorTemplateWizard",{projectData:k.project.data,sceneData:k.project.scenegeneraldata})}function ue(e,a){var i={status:!1};a=a||{},E.callEditor("importImage",e).then(function(e){return e.renderableCount=k.project.tree&&k.project.tree.length,e.instantImport=a.instantImport,e.jsonConfig={locktransforms:a.lock},a.disableTransparentCrop&&e.config&&(e.config.croptransparent=!1,e.config.canCropTransparency=!1),e.config.cropandresizestr=a.cropAndResize,C.open("editorImportModel",{objInfo:e,project:k.project})}).then(function(e){if(angular.isObject(e)){var t=angular.isArray(e.items)&&0<e.items.length&&e.items[0];return e.shouldAdjustProjection&&e.resolution&&t?(k.project.scenegeneraldata.orthogonalprojection.width=e.resolution.width,k.project.scenegeneraldata.orthogonalprojection.height=e.resolution.height,E.callEditor("moveRenderable",e.items[0].id,.5*e.resolution.width,.5*e.resolution.height,0),i.status=!0):a.originReferenceLayerId&&E.callEditor("moveRenderable",e.items[0].id,a.originReferenceLayerId),e}}).then(W).then(function(){i.status&&ne()})}function ge(e){E.callEditor("importSound",e).then(function(e){return E.callEditor("addSound",e.file)}).then(W)}function fe(e){angular.isFunction(k.endModalAction)&&k.endModalAction(e)&&(k.endModalAction=void 0)}function me(e){a||(a=!0,n.$broadcast("undoRedoBegin"),E.callEditor("performUndoRedo",e||!1).then(function(){a=!1,n.$broadcast("undoRedoPerformed")}))}function ve(e){return"scene"!==e.data.type}function he(e){return"web"!==e.data.type}function be(e){return!angular.isObject(e)}function _e(e){return(!angular.isObject(e)||!e.hasimageediting)&&(C.open("genericConfirm",{data:{title:"ui_editor_character_separation_not_image_layer_title",message:"ui_editor_character_separation_not_image_layer_body",leftIcon:"images/warning.png",okVisible:!0}}),1)}function ye(e){e=e.properties&&e.properties.find(function(e){return"effects"===e.type});return e&&angular.isArray(e.value)&&0<e.value.length}function we(e){return angular.isObject(e)&&ye(e)&&(C.open("genericConfirm",{data:{title:"ui_editor_character_separation_disabled_title",message:"ui_editor_character_separation_disabled_body",leftIcon:"images/warning.png",okVisible:!0}}),1)}function ke(e,t){_e(e)||(fe(),E.promptExternalApp(k.editorSettings,"externalpathimageeditor","Image Editor",".exe","ui_editor_external_custom_image_editor_not_found_title","ui_editor_external_custom_image_editor_not_found_body").then(function(){E.callEditor("genericSceneAction","runExternalImageEditor",e.id,k.editorSettings.externalpathimageeditor,"other",t)}))}function xe(e){k.editorSettings.showstatsmode=e.value}function Se(e){if(angular.isArray(e&&e.properties))for(var t=0;t<e.properties.length;++t){var a=e.properties[t];switch(a.type){case"effects":angular.forEach(a.value,function(e){var t=Ee(e.material,"material");e.properties=t&&t.properties});break;case"itemlist":case"flatlist":case"constlist":case"multilist":angular.forEach(a.value,function(e){var t;e.subkey&&(t=Ee(e.subid,e.subkey),e.properties=t&&t.properties)});break;case"link":var i=Pe(a.id,a.name);i&&i.property&&((i=i.property).condition=a.condition,i.overrideresourceid=a.overrideresourceid,i.overrideresourcekey=a.overrideresourcekey,e.properties.splice(t,1,i))}}}function Ce(e){k.selectedResource.stack.push(e);var t=k.selectedResource.stack.indexOf(e),a="renderable"!==e.key;k.selectedResource.stack=t<0||!a?[e]:k.selectedResource.stack.slice(0,t+1)}function Ee(a,e){var i;return e&&"renderable"!==e||angular.forEach(k.project.tree,function(t){t.id===a?i=t:angular.forEach(t.properties,function(e){e.overrideresourceid===a&&(i=t)})}),i||(e?i=k.project.objectproperties[e]&&k.project.objectproperties[e][a]:angular.forEach(k.project.objectproperties,function(e){angular.isDefined(e[a])&&(i=e[a])})),i}function Pe(e,t,a){if(angular.isString(e)){var i,n=t?[e,t]:e.split(/_(.+)/),a=Ee(n[0],a);if(a&&angular.isArray(a.properties))if(angular.forEach(a.properties,function(e){e.key===n[1]&&(i=e)}),i)return{property:i,item:a}}}k.genericSceneAction=function(a,e){var t=[],i=y.when();switch(a.args){case"resetPuppetWarpWeights":i=C.open("genericConfirm",{data:{title:"ui_editor_properties_reset_all_weights_modal_title",message:"ui_editor_properties_reset_all_weights_modal_body",leftIcon:"images/warning.png",cancelVisible:!0,okVisible:!0}});break;case"paintPuppetWarpWeights":k.initPaintAction("weightmask");break;case"paintPuppetWarpDepth":k.initPaintAction("displacement");break;case"resetSelectedPuppetWarpPose":if(e&&e.selectedFlatItem&&e.selectedFlatItem.item&&e.selectedFlatItem.item.value)return i.then(function(){E.callEditor("genericSceneAction",a.args,a.value+":"+e.selectedFlatItem.item.value)});break;case"lockPuppetWarpGeometry":i=C.open("genericConfirm",{data:{title:"ui_editor_properties_vertex_editing",message:"ui_editor_properties_lock_geometry_vertex_edit_modal_body",cancelVisible:!0,okVisible:!0}}).then(function(){return E.callEditor("genericSceneAction","checkLockPuppetWarpGeometry",a.value).then(function(e){return 2===e?(C.open("genericConfirm",{data:{title:"ui_editor_properties_vertex_editing",message:"ui_editor_properties_lock_geometry_vertex_edit_modal_vertex_count",leftIcon:"images/warning.png",okVisible:!0,okText:"ui_close"}}),y.reject()):1===e?C.open("genericConfirm",{data:{title:"ui_editor_properties_vertex_editing",message:"ui_editor_properties_lock_geometry_vertex_edit_modal_subdivision_hint",cancelVisible:!0,okVisible:!0}}):void 0})});break;case"unlockPuppetWarpGeometry":i=C.open("genericConfirm",{data:{title:"ui_editor_properties_unlock_geometry_vertex_edit",message:"ui_editor_properties_unlock_geometry_vertex_edit_modal_body",leftIcon:"images/warning.png",cancelVisible:!0,okVisible:!0}});break;case"puppetWarpSelectedVerticesDepthAuto":var n={title:"ui_editor_generic_modal_puppet_auto_depth_title",message:"ui_editor_generic_modal_puppet_auto_depth_body",cancelVisible:!0,okVisible:!0,numberInputVisible:!0,numberinput:1},i=C.open("genericConfirm",{data:n}).then(function(){var e=angular.isNumber(n.numberinput)?n.numberinput:1;t.push(e)});break;case"assignPuppetClippingMask":return void E.callEditor("genericSceneAction","puppetGetAllClippingMasks",a.value).then(function(e){e.empty()?ee(a.value):C.open("browseCollections",{data:{type:"editorclippingmasks",onDeleted:function(e){E.callEditor("genericSceneAction","puppetDeleteClippingMask",a.value,e.id)},onCreateNew:function(){ee(a.value)},collection:e}}).then(function(e){return E.callEditor("genericSceneAction","puppetAssignClippingMask",a.value,e.id)})});case"paintPuppetClippingMask":k.initPaintAction("opacitymask",{showMask:!0});break;case"puppetExpressionEditMatrix":return void E.callEditor("genericSceneAction","getPuppetExpressionMatrix",a.value).then(function(e){return C.open("editorExpressionMatrix",{data:e}).then(function(e){return E.callEditor("genericSceneAction","setPuppetExpressionMatrix",a.value,e)})});case"puppetBlendShapeEditSettings":return void E.callEditor("genericSceneAction","getPuppetBlendShapeSettings",a.value).then(function(t){E.callEditor("getBoneInfos",a.key).then(function(e){return C.open("editorBlendShapeSettings",{data:{settings:t,bones:e}}).then(function(e){return E.callEditor("genericSceneAction","setPuppetBlendShapeSettings",a.value,e)})})});case"genericActionMessage":var o=angular.fromJson(a.value);return void C.open("genericConfirm",{data:{title:o.title,message:o.message,okVisible:!0}});case"configureModel":return void C.open("editorModelEditor",{data:{model:a.value,editor:k,physicsConstraintDefaults:k.makeDefaultPhysicsConstraintSettings(ae,!0)}}).then(function(e){return ae=e.state.physicsConstraintDefaultLayout,E.callEditor("reloadModel",a.value)});case"cameraEnterPOV":fe(),k.endModalAction=function(){return E.callEditor("genericSceneAction","cameraExitPOV",a.value),!0};break;case"textureAddVariant":var r={title:"ui_editor_generic_modal_texture_variant_add_title",message:"ui_editor_generic_modal_texture_variant_add_body",cancelVisible:!0,okVisible:!0,textinputVisible:!0,textinput:x.instant("ui_editor_properties_variant").toString()};i=C.open("genericConfirm",{data:r}).then(function(){t.push(r.textinput)})}return i.then(function(){E.callEditor.apply(E,["genericSceneAction",a.args,a.value].concat(t))})},k.genericWebAction=function(e){switch(e.args.function){case"showMessageModal":var t={title:e.args.title,message:e.args.message,okVisible:!0};e.args.url&&(t.leftVisible=!0,t.leftClass="btn-info",t.leftText="ui_editor_warn_puppet_editor_version_mismatch_learn_more",t.leftCallback=function(){P.openUrl(e.args.url)}),C.open("genericConfirm",{data:t});break;case"showActionModal":C.open("genericConfirm",{data:{title:e.args.title,message:e.args.message,okVisible:!0,cancelVisible:!0}}).then(function(){E.callEditor("genericSceneAction",e.value,e.args.parameters)})}},k.navigateUp=function(){var e=k.selectedResource.stack[k.selectedResource.stack.length-2];k.navigateProperty(e.key,e.id)},k.reselect=function(){var e=k.selectedResource.stack[k.selectedResource.stack.length-1];k.navigateUp(),S(function(){k.navigateProperty(e.key,e.id)})},k.doPropertiesCopy=function(e){var t={};angular.forEach(e,function(e){e.key&&e.value&&e.type&&(ie(e)||(t[e.key]=e.value))}),E.callDeferred("ui","copyToClipboard",angular.toJson(t))},k.doPropertiesPaste=function(t,n){E.callDeferred("ui","pasteFromClipboard").then(function(e){var a=angular.fromJson(e),i=[];angular.forEach(n,function(e){var t;ie(e)||(t=a[e.key],(angular.isNumber(t)&&angular.isNumber(e.value)||angular.isString(t)&&angular.isString(e.value)||angular.isBoolean(t)&&angular.isBoolean(e.value))&&t!==e.value&&(e.value=t,delete e.lastValue,i.push(e)))}),i.empty()||k.sendAssetPropertyChange(t,i,{save:!0})})},k.onPaintBrushClosed=function(){fe()},k.onAnimationClosed=function(){fe()},k.animationToggleKeyframe=function(){k.animationCtrl.insertKeyframeAtCurrentPosition()},k.updateWorkshopStatus=function(e){(k.steamWorkshopStatus=e).complete&&S(function(){k.steamWorkshopStatus.hidden=!0},5e3)},k.showTextureOptimizationFaq=function(){P.openUrl(P.url.docsSceneTextureOptimization)},k.filemenu=[{label:"ui_editor_filemenu_file",children:[{label:"ui_editor_filemenu_new",icon:"glyphicon glyphicon-file",fn:function(){T().then(function(){j(!0)})}},{label:"ui_editor_filemenu_open",icon:"glyphicon glyphicon-folder-open",fn:F},{tag:"fileRecentList",label:"ui_editor_filemenu_open_recent",children:[]},{},{label:"ui_editor_filemenu_save",icon:"fas fa-save faMenuIcon",fn:function(){var e=y.when();angular.isObject(k.project.data)&&(e=e.then(function(){return E.callEditor("saveProjectData",angular.toJson(k.project.data))})),(e=angular.isObject(k.project.scenegeneraldata)?e.then(function(){return E.callEditor("saveSceneGeneralData",angular.toJson(k.project.scenegeneraldata))}):e).then(function(){return E.callEditor("forceSave")})},shouldDisable:be},{label:"ui_editor_filemenu_save_as",icon:"fas fa-save faMenuIcon",fn:function(){fe();var t=T().then(function(e){!1!==e&&(angular.isObject(k.project.data)&&(t=t.then(function(){return E.callEditor("saveProjectData",angular.toJson(k.project.data))})),t=(t=angular.isObject(k.project.scenegeneraldata)?t.then(function(){return E.callEditor("saveSceneGeneralData",angular.toJson(k.project.scenegeneraldata))}):t).then(function(){return E.callEditor("forceSave")})),t.then(function(){var e={title:"ui_editor_save_as_header",message:"ui_editor_save_as_body",textinputVisible:!0,textinput:k.project.data.title.toString(),cancelVisible:!0,okVisible:!0};return C.open("genericConfirm",{data:e}).then(function(){return E.callEditor("saveAs",e.textinput)})}).then(function(e){O(e)})})},shouldHide:ve,shouldDisable:be},{label:"ui_editor_filemenu_export",icon:"fas fa-file-export faMenuIcon",fn:function(){fe(),T().then(function(){C.open("editorExport",{data:{editorSettings:k.editorSettings,project:k.project}})})},shouldHide:function(e){return ve(e)||!k.isDebugRuntime},shouldDisable:be},{},{label:"ui_editor_open_modal_delete",icon:"fas fa-trash faMenuIcon",fn:function(){B(k.project.data)},shouldDisable:be},{label:"ui_editor_filemenu_apply_wallpaper",icon:"fas fa-image faMenuIcon",fn:function(){fe(),T().then(function(){E.callEditor("applyWallpaper")})},shouldDisable:be},{},{label:"ui_editor_filemenu_editor_settings",icon:"fas fa-cogs faMenuIcon",fn:function(){C.open("editorSettings",{data:k.editorSettings}).then(function(e){angular.extend(k.editorSettings,e)})},shouldHide:ve},{label:"ui_editor_filemenu_quit",icon:"fas fa-power-off faMenuIcon",fn:function(){window.ui.close()}}]},{label:"ui_editor_filemenu_edit",children:[{label:"ui_editor_filemenu_undo",icon:"fas fa-undo faMenuIcon",fn:function(){me()},shouldHide:ve,shouldDisable:function(){return!(k.undoState&&k.undoState.canundo)}},{label:"ui_editor_filemenu_redo",icon:"fas fa-redo faMenuIcon",fn:function(){me(!0)},shouldHide:ve,shouldDisable:function(){return!(k.undoState&&k.undoState.canredo)}},{shouldHide:ve},{label:"ui_editor_filemenu_change_video_file",icon:"glyphicon glyphicon-film",fn:function(){k.replaceFile(k.project.tree[0])},shouldHide:function(e){return"video"!==e.data.type}},{label:"ui_editor_filemenu_import_image",icon:"far fa-image faMenuIcon",fn:ue,shouldHide:function(e){return"scene"!==e.data.type||!e.scene.is2d}},{label:"ui_editor_filemenu_import_model",icon:"fas fa-cube faMenuIcon",fn:le,shouldHide:function(e){return"scene"!==e.data.type}},{label:"ui_editor_filemenu_import_sound",icon:"fas fa-volume-up faMenuIcon",fn:ge,shouldHide:function(e){return"scene"!==e.data.type}},{label:"ui_editor_filemenu_add_light",icon:"far fa-lightbulb faMenuIcon",fn:ce,shouldHide:ve},{label:"ui_editor_filemenu_add_camera",icon:"fas fa-camera-movie faMenuIcon",fn:de,shouldHide:ve},{label:"ui_editor_context_menu_image_editing",shouldHide:function(e){return"scene"!==e.data.type||!e.scene.is2d},children:[{label:"ui_editor_context_menu_foreground_separation",icon:"fas fa-cut faMenuIcon",fn:function(){var t;_e(t=k.selectedResource.item)||we(t)||C.open("editorCharacterSeparation",{data:{referenceId:t.id}}).then(function(){return E.callEditor("genericSceneAction","finishCharacterSeparation",t.id).then(function(e){if(e.path)return ue(e.path,{instantImport:!0,originReferenceLayerId:t.id})})})}},{label:"ui_editor_context_menu_character_sheet",icon:"fas fa-child faMenuIcon",fn:function(){var t;_e(t=k.selectedResource.item)||we(t)||E.callEditor("genericSceneAction","getBaseTexturePath",t.id).then(function(e){return C.open("editorCharacterSeparation",{data:{referenceId:t.id,isSheet:!0,dstPath:e.path}}).then(function(e){return k.onResourceRemove(t),ue(e,{instantImport:!0,disableTransparentCrop:!0})})})}},{},{label:"ui_editor_context_menu_edit_with_other",icon:"fas fa-file-edit faMenuIcon",fn:function(){ke(k.selectedResource.item)}}]},{shouldHide:ve},{label:"ui_editor_filemenu_change_project_settings",icon:"fas fa-cog faMenuIcon faMenuIcon",fn:function(){C.open("editorProjectSettings",{project:k.project}).then(function(){k.userPropertyPreviewCtrl.reload()})}},{label:"ui_editor_filemenu_template_wizard",icon:"fas fa-magic faMenuIcon",fn:pe,shouldHide:function(e){return!angular.isArray(e.data.templateoptions)}},{label:"ui_editor_filemenu_clean_project",icon:"fas fa-broom faMenuIcon faMenuIcon",fn:function(){C.open("editorCleanProject",{data:{}})},shouldHide:ve},{label:"ui_editor_filemenu_clean_local_storage",icon:"fas fa-database faMenuIcon faMenuIcon",fn:function(){E.callEditor("genericSceneAction","cleanLocalStorage"),k.project.localstorageinfo&&(k.project.localstorageinfo.data=!1,g())},shouldDisable:function(e){return!e||!e.localstorageinfo||!e.localstorageinfo.data},shouldHide:ve},{shouldHide:ve},{label:"ui_editor_filemenu_open_in_explorer",icon:"fas fa-folder-open faMenuIcon",fn:function(){E.callEditor("openInExplorer")}}]},{label:"ui_editor_filemenu_view",children:[{label:"ui_editor_filemenu_restart_preview",icon:"fas fa-sync-alt faMenuIcon",fn:function(){E.callEditor("restartPreview")},shouldHide:function(e){return"scene"===e.data.type}},{label:"ui_editor_filemenu_reset_camera",icon:"fas fa-undo faMenuIcon",fn:ne,shouldHide:ve},{label:"ui_editor_filemenu_reset_layout",icon:"fas fa-table faMenuIcon",fn:function(){k.layoutCtrl.reset()},shouldHide:ve},{label:"ui_editor_filemenu_windows",shouldHide:ve,children:[{label:"ui_editor_pane_header_assets",icon:"fas fa-fw fa-copy",fn:function(){k.layoutCtrl.showBaseWindow(k.layoutCtrl.findWindow("assets"))}},{label:"ui_editor_pane_header_log",icon:"fas fa-fw fa-terminal",fn:function(){k.layoutCtrl.showBaseWindow(k.layoutCtrl.findWindow("log"))}},{label:"ui_editor_pane_header_user_properties",icon:"fas fa-fw fa-user",fn:function(){k.layoutCtrl.showBaseWindow(k.layoutCtrl.findWindow("userproperties"))}}]},{label:"ui_editor_filemenu_preview_aspect_ratio",children:[{label:"4 : 3",value:"4x3",binding:"previewratio",fn:V},{label:"16 : 10",value:"16x10",binding:"previewratio",fn:V},{label:"16 : 9",value:"16x9",binding:"previewratio",fn:V},{label:"21 : 9",value:"21x9",binding:"previewratio",fn:V}]},{shouldHide:ve},{label:"ui_editor_filemenu_show_asset_creation",icon:"",value:!0,binding:"showassetcreation",fn:function(){var e=k.editorSettings.showassetcreationhidedialog?y.when():C.open("genericConfirm",{data:{title:"ui_editor_warn_advanced_assets_creation_modal_header",message:"ui_editor_warn_advanced_assets_creation_modal_body",cancelVisible:!0,okVisible:!0}}).then(function(){k.editorSettings.showassetcreation&&!0===k.editorSettings.showassetcreation?k.editorSettings.showassetcreationhidedialog=!0:k.editorSettings.showassetcreation=!1});e.then(function(){k.editorSettings.showassetcreation=!k.editorSettings.showassetcreation,g()})},shouldHide:ve},{label:"ui_editor_filemenu_show_grid",icon:"",value:!0,binding:"showgrid",fn:oe,shouldHide:ve},{label:"ui_editor_filemenu_show_selection_box",icon:"",value:!0,binding:"showselectionbox",fn:re,shouldHide:ve},{label:"ui_editor_filemenu_show_debug",shouldHide:ve,children:[{label:"ui_editor_filemenu_show_particle_collision",value:!0,binding:"showparticlecollision",fn:se},{label:"ui_editor_filemenu_show_particle_control_points",value:!0,binding:"showparticlecontrolpoints",fn:se},{label:"ui_editor_filemenu_show_hitboxes",value:!0,binding:"showhitboxes",fn:se},{label:"ui_editor_filemenu_show_collision_capsules",value:!0,binding:"showcapsules",fn:se}]},{label:"ui_editor_filemenu_show_stats",shouldHide:ve,children:[{label:"ui_editor_filemenu_show_stats_never",value:"never",binding:"showstatsmode",fn:xe},{label:"ui_editor_filemenu_show_stats_auto",value:"auto",binding:"showstatsmode",fn:xe},{label:"ui_editor_filemenu_show_stats_always",value:"always",binding:"showstatsmode",fn:xe}]}]},{label:"ui_editor_filemenu_provider",children:[{label:"ui_editor_filemenu_browse_assets",iconTemplate:"%provider% faMenuIcon",fn:function(){J()},shouldHide:ve},{tag:"showWallpaperInWorkshop",label:"ui_editor_filemenu_show_in_workshop",iconTemplate:"%provider% faMenuIcon",disabled:!0,shouldHide:function(){return!P.canOpenWallpaperDetailsOnPlatform()}},{label:"ui_editor_filemenu_delete_submissions",iconTemplate:"fas fa-trash faMenuIcon",fn:function(){C.open("editorDeleteUploads")},shouldHide:function(){return!P.canDeleteSubmissionsFromPlatform()||!L()}},{},{label:"ui_editor_workshop_rules_modal_title",icon:"fas fa-book faMenuIcon",fn:function(){C.open("editorWorkshopRules")}},{label:"ui_editor_filemenu_copy_workshop_url",icon:P.getProviderIcon(),fn:function(){E.copyWorkshopUrl(k.project.data)},shouldHide:function(e){return!P.canOpenWallpaperDetailsOnWeb()||!angular.isString(e&&e.data&&e.data.workshopid)||e.data.workshopid.length<1}},{label:"ui_editor_filemenu_publish_asset",icon:"glyphicon glyphicon-share-alt",fn:function(){T().then(function(){Z()})},shouldHide:function(e){return"scene"!==e.data.type||!k.editorSettings.showassetcreation}},{label:"ui_editor_filemenu_prepare_for_publishing",icon:"glyphicon glyphicon-share-alt",fn:function(){T().then(function(){z()})}}]},{label:"ui_editor_filemenu_help",shouldHide:function(e){return"scene"!==e.data.type&&"web"!==e.data.type},children:[{label:"ui_editor_filemenu_help_show_documentation_scene",iconTemplate:"fas fa-books",fn:function(){P.openUrl(P.url.docsScene)},shouldHide:ve},{label:"ui_editor_filemenu_help_show_documentation_web",iconTemplate:"fas fa-books",fn:function(){P.openUrl(P.url.docsWeb)},shouldHide:he},{},{label:"ui_editor_filemenu_help_image_effects",iconTemplate:"fas fa-books",fn:function(){P.openUrl(P.url.docsSceneEffects)},shouldHide:ve},{label:"ui_editor_filemenu_help_particle_effects",iconTemplate:"fas fa-books",fn:function(){P.openUrl(P.url.docsSceneParticles)},shouldHide:ve},{label:"ui_editor_filemenu_help_timeline_animation",iconTemplate:"fas fa-books",fn:function(){P.openUrl(P.url.docsSceneAnimation)},shouldHide:ve},{label:"ui_editor_filemenu_help_user_properties",iconTemplate:"fas fa-books",fn:function(){P.openUrl(P.url.docsSceneUserProperties)},shouldHide:ve},{label:"ui_editor_filemenu_help_scenescript",iconTemplate:"fas fa-books",fn:function(){P.openUrl(P.url.docsSceneScript)},shouldHide:ve},{label:"ui_editor_filemenu_help_shaders",iconTemplate:"fas fa-books",fn:function(){P.openUrl(P.url.docsSceneShaders)},shouldHide:ve},{label:"ui_editor_filemenu_help_puppet_warp",iconTemplate:"fas fa-books",fn:function(){P.openUrl(P.url.docsScenePuppetWarp)},shouldHide:ve},{label:"ui_editor_filemenu_help_foreground_separation",iconTemplate:"fas fa-books",fn:function(){P.openUrl(P.url.docsSceneForegroundSeparation)},shouldHide:ve},{label:"ui_editor_filemenu_help_lighting_and_reflections",iconTemplate:"fas fa-books",fn:function(){P.openUrl(P.url.docsSceneLightingReflections)},shouldHide:ve},{label:"ui_editor_filemenu_help_texture_optimization",iconTemplate:"fas fa-books",fn:function(){P.openUrl(P.url.docsSceneTextureOptimization)},shouldHide:ve},{label:"ui_editor_filemenu_help_user_properties",iconTemplate:"fas fa-books",fn:function(){P.openUrl(P.url.docsWebUserProperties)},shouldHide:he},{label:"ui_editor_filemenu_help_audio_visualization",iconTemplate:"fas fa-books",fn:function(){P.openUrl(P.url.docsWebAudioVisualization)},shouldHide:he},{label:"ui_editor_filemenu_help_rgb_devices",iconTemplate:"fas fa-books",fn:function(){P.openUrl(P.url.docsWebRGB)},shouldHide:he},{label:"ui_editor_filemenu_help_fps_limit",iconTemplate:"fas fa-books",fn:function(){P.openUrl(P.url.docsWebFPS)},shouldHide:he},{label:"ui_editor_filemenu_help_debugging",iconTemplate:"fas fa-books",fn:function(){P.openUrl(P.url.docsWebDebugging)},shouldHide:he}]}],k.setEditorSettings=function(t){angular.merge(k.editorSettings,t.editor),t.editor.showstats&&!t.editor.showstatsmode&&(k.editorSettings.showstatsmode="always"),k.editorSettings.savedlayouts=k.editorSettings.savedlayouts||{},k.$watch("editorSettings",function(e,t){angular.equals(e,t)||(E.callEditor("saveEditorSettings",angular.toJson(e)),k.editorTemp.previewdesktop&&(k.editorTemp.previewaspect=e.previewratio))},!0),R(),g(),y.when().then(function(){var e;t.config.initialCommands?(e=angular.fromJson(t.config.initialCommands)).file?O(e.file):e.source&&j(!1,e.source):k.editorSettings.hasshownworkshoprules?j():C.open("editorWorkshopRules").then(function(){k.editorSettings.hasshownworkshoprules=!0,j()})})},k.requestOpenProject=function(e){e.file?(S(function(){t.dismissAll()}),T().then(function(){O(e.file)})):e.source&&(t.dismissAll(),T().then(function(){j(!1,e.source)}))},k.showVideoSizeError=function(e,t){x("ui_editor_modal_video_file_invalid_body",{file:e,size:t}).then(function(e){C.open("genericConfirm",{data:{title:"ui_editor_modal_video_file_invalid_header",message:e,leftIcon:"images/warning.png",okVisible:!0}})})},k.showGenericError=function(e){C.open("genericConfirm",{data:{title:e.title,message:e.message,leftIcon:"images/warning.png",okVisible:!0}})},k.updateSteamProperties=function(e){angular.isObject(k.project&&k.project.data)&&angular.isObject(e)&&angular.extend(k.project.data,e)},k.updateGeneralSettings=function(e){angular.merge(k.project.data.general,e)},k.onGizmoActivated=function(e){k.isGizmoActive!==e&&((k.isGizmoActive=e)?++A:--A)},k.updateAssetProperties=function(e){A+=1,angular.forEach(e,function(e){var a=Ee(e.id,e.key);a?e.properties?a.properties=e.properties:e.changedproperties&&angular.forEach(e.changedproperties,function(t){angular.forEach(a.properties,function(e){t.key===e.key&&(e.value=t.value,e.linkScript=t.linkScript,e.linkUser=t.linkUser,e.linkAnimation=t.linkAnimation,e.lastValue=e.value)})}):"renderable"!==e.key&&(k.project.objectproperties[e.key]=k.project.objectproperties[e.key]||{},k.project.objectproperties[e.key][e.id]=e)}),angular.forEach(e,function(e){e=Ee(e.id,e.key);e&&e===k.selectedResource.item&&Se(e)}),S(function(){--A},100),S(function(){k.$broadcast("rzSliderForceRender")})},k.clearResourceSelectionIfResourceDeleted=function(){var e;k.selectedResource.item&&"renderable"!==k.selectedResource.item.key&&(k.selectedResource.stack.empty()||(e=k.selectedResource.stack[0],k.project.tree&&-1===k.project.tree.indexOf(e)&&h()))},k.replaceAssets=function(e,t,a){var i;a?angular.forEach(e,function(t){var e=k.project.tree.find(e=>e.id===t.id);e&&(Object.clear(e),angular.extend(e,t))}):k.project.tree=e,angular.forEach(t,function(e,a){k.project.objectproperties[a]=k.project.objectproperties[a]||{},angular.forEach(e,function(e,t){angular.isObject(k.project.objectproperties[a][t])||(k.project.objectproperties[a][t]={}),angular.extend(k.project.objectproperties[a][t],e)})}),angular.isObject(k.selectedResource.item)&&"renderable"===k.selectedResource.item.key&&(i=k.selectedResource.item?k.selectedResource.item.id:-1,h(),angular.forEach(k.project.tree,function(e){e.id===i&&(k.selectedResource.item=e)})),0<k.selectedResource.stack.length&&"renderable"===k.selectedResource.stack[0].key&&((t=k.project.tree.find(function(e){return e.id===k.selectedResource.stack[0].id}))&&(k.selectedResource.stack[0]=t)),k.clearResourceSelectionIfResourceDeleted(),Se(k.selectedResource.item),S(function(){n.$broadcast("rzSliderForceRender"),o&&(k.beginPaint(o),o=void 0)}),k.updateRunScriptVisibility()},k.updateAvailableAssets=function(e){k.project.availableassets=e.availableassets,k.project.availablefonts=e.availablefonts},k.updateLocalStorageInfo=function(e){k.project.localstorageinfo=e,g()},k.resetProject=function(){r=!1,k.project=void 0,k.editorLayoutClass="editorLayoutSimple",g(),k.showSimpleLayout(),k.cameraMode="fly",k.gizmoMode="none",k.resetGizmoOrientationState(),h(),P.onProjectNameChanged()},k.replaceFile=function(t,e){E.callEditor("replaceFile",t.name,e).then(function(e){e.error?k.showVideoSizeError(e.path,e.size):(k.project.data.file=e.path,t.name=e.name,k.project.tree=k.project.tree.slice())})},k.resetGizmoOrientationState=function(){k.gizmoOrientation={rotate:"local",translate:"world",scale:"local",multi:"local"}},k.isGizmoOrientationLocked=function(){return"multi"===k.gizmoMode||"scale"===k.gizmoMode||"none"===k.gizmoMode},k.setGizmoMode=function(e,t){k.gizmoMode!==e||t||(e="none"),E.callEditor("setGizmoMode",e,k.gizmoOrientation[e]).then(function(){k.gizmoMode=e})},k.setGizmoOrientation=function(e){k.isGizmoOrientationLocked()||E.callEditor("setGizmoOrientation",e).then(function(){k.gizmoOrientation[k.gizmoMode]=e})},k.setGizmoGeometryMode=function(e,t){t||k.gizmoGeometryMode!==e?k.gizmoGeometryMode=e:k.gizmoGeometryMode="none",E.callEditor("genericSceneAction","setPuppetGeometryVertexGizmo",k.gizmoGeometryMode)},k.setCameraMode=function(e){E.callEditor("setCameraMode",e).then(function(){k.cameraMode=e})},k.onResourceRemove=function(e){fe();var t=k.project.tree.indexOf(e);if(!(t<0)){k.closeAllPropertyLinkWindows(e.id);for(var a=[e.id],i=t+1;i<k.project.tree.length;++i)a.includes(k.project.tree[i].parent)&&a.push(k.project.tree[i].id);k.project.tree.splice(t,a.length);var n=y.defer();return E.callEditor("removeFromScene",a).then(function(){k.selectedResource.item===e?h():k.clearResourceSelectionIfResourceDeleted(),n.resolve(a.length)}),n.promise}},k.onResourceDragged=function(e,t,a,i){E.callEditor("sendSceneOrderChange",{from:e,to:t,count:a,parent:i})},k.onResourceAddedToScene=function(e,t,a){return E.callEditor("addAssetToScene",angular.toJson(e),t,a.parent).then(function(e){W(e,t)}),!0},k.callbackValidateParent=function(e,t,a){if("0"===t)return!0;if((t=k.project.tree.find(e=>e.id===t)).blockchildhierarchy)return!1;for(var i=0,n=t;n;)n.supportsprerendering&&++i,n=k.project.tree.find(e=>e.id===n.parent);if(0===i)return!0;if(e.preventprerendering)return!1;function o(t){var a=0;t.supportsprerendering&&++a;var i=a,e=k.project.tree.filter(e=>e.parent===t.id);return angular.forEach(e,function(e){e=a+o(e);i=Math.max(i,e)}),i}return!(3<(i+=o(e)))||(a&&(a.message=x.instant("ui_editor_generic_modal_hierarchy_error_composition_limit",{count:3}).toString()),!1)},k.callbackShowHierarchyError=function(e){C.open("genericConfirm",{data:{title:"ui_editor_generic_modal_hierarchy_error_title",message:e,okVisible:!0}})},k.updateRunScriptVisibility=function(){te&&(S.cancel(te),te=void 0),te=S(function(){E.callEditor("canRunScriptPreview").then(function(e){k.showRunScript=e})},750)},k.$on("undoRedoBegin",function(){++i}),k.$on("undoRedoPerformed",function(){--i}),k.sendAssetPropertyChange=function(o,e,r,t){var a,s,l,c;k.lastPropertyChangeNotSaved=r&&!0===r.disableCurveEditorSave,0<A||0<i?angular.forEach(a,function(e){e.lastValue=e.value}):(a=angular.isArray(e)?e:[e],s=0,c={properties:l={},tag:t||"main"},angular.forEach(a,function(e){var t,a,i,n=!r||r.save;!1===e.lastSave&&!0===n&&delete e.lastValue,e.lastValue!==e.value&&(angular.isObject(e.value)?e.lastValue=angular.copy(e.value):e.lastValue=e.value,c.id=c.id||e.overrideresourceid||o.id,c.key=c.key||e.overrideresourcekey||o.key,t=k.isPropertyAnimationValid(e),angular.isDefined(e.linkUser)||angular.isDefined(e.linkScript)||t?(a={value:e.value},angular.isDefined(e.linkUser)&&(a.user=e.linkUser),angular.isDefined(e.linkScript)&&(a.script=e.linkScript,angular.isArray(e.linkScriptProperties)&&(a.scriptproperties=(n=angular.sanitizeObject(e.linkScriptProperties),i={},angular.forEach(n,function(e){var t;e.user?(t={value:e.value,user:e.user},angular.isString(e.condition)&&!e.condition.empty()&&(t.condition=e.condition),i[e.key]=t):i[e.key]=e.value}),i))),t&&(a.animation=e.linkAnimation),l[e.key]=a):l[e.key]=e.value,++s)}),0!==s&&(angular.isObject(r)&&(c.options=r),E.callEditor("sendAssetPropertyChange",c),k.updateRunScriptVisibility()))},k.onUserPropertyBindingsChanged=function(){k.$broadcast("onUserPropertiesModified"),k.userPropertyPreviewCtrl.reload()},k.showSimpleLayout=function(){angular.isFunction(k.layoutCtrl.removeAllWindows)&&k.layoutCtrl.removeAllWindows(),k.layoutType="simple"},k.showSceneLayout=function(){angular.isFunction(k.layoutCtrl.removeAllWindows)&&k.layoutCtrl.removeAllWindows(),k.layoutType="scene"},k.addCameraPath=function(){E.callEditor("addCameraPath").then(function(e){var t=angular.copy(k.project.camerapaths);t.push(e),k.project.camerapaths=t,h(),k.selectedResource.item=e})},k.onCameraPathRemove=function(e){var t=k.project.camerapaths.indexOf(e);if(!(t<0)){k.project.camerapaths.splice(t,1);var a=y.defer();return E.callEditor("removeCameraPath",e.id).then(function(){k.selectedResource.item===e&&h(),a.resolve()}),a.promise}},k.navigateProperty=function(e,t){fe("navigateProperty");e=Ee(t,e);if(angular.isObject(e))return Ce(e),h(),k.selectedResource.item=e,!0},k.updateResourceSelection=function(e,t,a){a=angular.fromJson(a)||[];e=Ee(e,t);e&&(t=k.selectedResource.item!==e,k.selectedResource.item=e,k.selectedResource.stack=[],angular.forEach(a,function(e){e=Ee(e.id,e.key);e&&k.selectedResource.stack.push(e)}),t&&!k.selectedResource.stack.empty()&&k.selectedResource.stack.last()===e&&k.selectedResource.stack.pop())},k.addPropertyEffect=function(t,a){var i={skipUpgrade:!1};E.callEditor("listAvailableEffects").then(function(e){return X("effects",e),C.open("editorEffectList",{data:{title:"ui_editor_effects_modal_title_add_effect",groupList:e,workshopModalFn:J,workshopController:Q,workshopGroup:"effects",showAssetCreation:k.editorSettings.showassetcreation,fnCreateNew:function(e){return E.callEditor("duplicateEffectForEditing",angular.toJson(e))},fnDelete:function(e){E.callEditor("deleteCustomEffect",angular.toJson(e))}}})}).then(function(e){return i.selectedEffect=e,E.callEditor("checkEffectCompatibility",angular.toJson(e))}).then(function(e){return e&&1===e.error?C.open("genericConfirm",{data:{title:"ui_editor_effects_modal_compatibility_warning_header",message:"ui_editor_effects_modal_compatibility_warning_body",leftIcon:"images/warning.png",cancelVisible:!0,okVisible:!0,leftVisible:!0,leftText:"ui_editor_effects_modal_compatibility_warning_skip_upgrade",leftClass:"btn-primary",leftAction:"skipUpgrade"}},{backdropClass:"modal-backdrop-danger"}).then(function(e){return i.skipUpgrade="skipUpgrade"===e,i.selectedEffect}):i.selectedEffect}).then(function(e){return E.callEditor("addEffect",t.id.toString(),angular.toJson(e),i.skipUpgrade)}).then(function(e){a.value=e.items,angular.merge(k.project.objectproperties,e.objectproperties),angular.isArray(a.value)&&0<a.value.length&&k.editPropertyEffect(a.value[a.value.length-1])})},k.editPropertyEffect=function(e){k.navigateProperty("material",e.material)},k.addPropertySound=function(e,t){E.callEditor("importSound").then(function(e){k.onPropertySoundAssetDropped(t,e,t.value.length||0)})},k.onPropertySoundAssetDropped=function(e,t,a){return E.callEditor("addSound",t.file,k.selectedResource.item.id,a).then(function(){e.value=angular.copy(e.value),e.value.splice(a,0,{name:t.file})}),!0},k.onPropertyItemRemoved=function(e,t){var a=t.id||""+e.value.indexOf(t);return t.id&&k.closeAllPropertyLinkWindows(t.id),E.callEditor("removeRenderableItem",k.selectedResource.item.id,a,t.key).then(function(){e.value.splice(e.value.indexOf(t),1),k.updateRunScriptVisibility()})},k.onPropertyItemDragged=function(e,t){return E.callEditor("dragRenderableItem",k.selectedResource.item.id,e,t)},k.closeAllPropertyLinkWindows=function(e){var t=Ee(e);t&&(angular.getNestedMemberParents(t,"linkAnimation").forEach(e=>{k.modifyAnimationLink(t,e,!0,!0)}),angular.getNestedMemberParents(t,"linkScript").forEach(e=>{k.modifyScriptLink(t,e,void 0,!0)}))};var Me,Ae={};function Te(e){var t=1;switch(e.type){case"vec4":t=4;break;case"color":case"vec3":case"vec3-slider-z":t=3;break;case"vec2":t=2}return t}function Oe(t,e,a){var i=0;for(angular.isDefined(e)&&(1===a?(t.push(e),i=1):e.split(" ").map(function(e){return parseFloat(e)}).forEach(function(e){t.push(e),++i}));i<a;)t.push(0),++i}function Ie(t,e,a){angular.isArray(e)&&e.forEach(function(e){angular.isNumber(e.value)&&(e.value=e.value+(a?t:-t))})}k.modifyScriptLink=function(i,n,e,t){var o,r,s="script_"+i.id+"_"+n.key,a=k.layoutCtrl.findWindow(s);a?t?k.layoutCtrl.removeWindow(a):k.layoutCtrl.activateWindow(a,!0):t||(o=n.linkScript,(r=k.$new()).editorControls={openBrowseWorkshop:function(){J("scripts")},openScriptPublish:function(e,t){Z({script:e,type:t})},getSubscribedScripts:function(){var e=[];return X("scripts",e),e},shouldShowPublishDialog:function(){return k.editorSettings.showassetcreation}},r.scriptName=i.id+"_"+n.key,r.scriptPropertyName=n.key,r.content=o,r.scriptType=n.type,r.scriptContextProperties=i&&i.properties,r.scriptErrorMessage=e||Ae[r.scriptName],w('<div class="editorLayoutPanel"><code-editor ce-apply="apply(value)" ce-close="close()" ce-cancel="cancel()" ce-content="content" ce-controls="editorControls" ce-script-name="scriptName" ce-script-property-name="scriptPropertyName" ce-script-type="scriptType" ce-initial-error="scriptErrorMessage" ce-script-context-properties="scriptContextProperties" ce-content-type="\'js\'"></code-editor></div>')(r,function(e){function t(){var e=Pe(r.scriptName);n=e&&e.property||n}r.close=function(){k.layoutCtrl.removeWindow(e)},r.cancel=function(){t(),k.callbackRunScriptPreview(!1),o?r.apply(o):(delete n.linkScript,delete n.lastValue,k.sendAssetPropertyChange(i,n))},r.apply=function(e){t(),k.callbackRunScriptPreview(!1),delete Ae[r.scriptName],angular.isString(e)&&0<e.length?n.linkScript=e:delete n.linkScript,delete n.lastValue,k.sendAssetPropertyChange(i,n)},r.$on("onScriptStartPlayback",function(e,t){!t||(t=r.editorControls.getValue())!==n.linkScript&&r.apply(t)});var a="ui_editor_pane_header_script_editor";angular.isString(n.name)&&(a=x.instant("ui_editor_pane_header_script",{name:x.instant(n.name).toString()}).toString()),k.layoutCtrl.insertWindow(e,r,{noSave:!0,tag:s,icon:"fas fa-fw fa-code",title:a,closeFunction:function(){var e=r.editorControls.getValue();e===(o||"")?r.close():C.open("genericConfirm",{data:{title:"ui_editor_script_unsaved_changes_header",message:"ui_editor_script_unsaved_changes_body",cancelVisible:!0,cancelText:"ui_close",okVisible:!0}}).then(function(){r.apply(e),r.close()}).catch(function(){r.cancel(),r.close()})}})}))},k.$on("onScriptMessage",function(e,t){1!==(Ae[t.name]=t).errorlevel||!k.isRunningScriptPreview||(t=k.layoutCtrl.findWindow("log"))&&(k.layoutCtrl.activateWindow(t,k.canScriptPreviewFlash),k.canScriptPreviewFlash=!1)}),k.callbackClickScriptMessage=function(e){var t=Pe(e.name);t&&k.modifyScriptLink(t.item,t.property,e)},k.callbackRunScriptPreview=function(e){k.isRunningScriptPreview!==e&&(fe(),k.$broadcast("onScriptStartPlayback",e),k.isRunningScriptPreview!==e&&(k.waitForScriptToggle=!0),e&&(Me=angular.copy(k.project&&k.project.data&&k.project.data.general&&k.project.data.general.properties||{})),k.isRunningScriptPreview=e,k.canScriptPreviewFlash=!0,E.callEditor("runScriptPreview",e).then(function(){!e&&Me&&k.project&&k.project.data&&k.project.data.general&&(angular.extend(k.project.data.general.properties,Me),Me=void 0,k.userPropertyPreviewCtrl.reload()),k.waitForScriptToggle=!1,f(k.editorSettings.showgrid),m(k.editorSettings.showselectionbox),!e&&k.gizmoMode&&k.setGizmoMode(k.gizmoMode,!0)}))},k.isPropertyAnimationValid=function(e){return!(!angular.isObject(e.linkAnimation)||!angular.isObject(e.linkAnimation.options))};var Re={},De={};function We(t){fe();var a,e,i,n,o,r,s,l,c,d,p="animation_"+t.id+"_"+t.key,u=0;function g(){a=Ee(t.id,t.key)}function f(t){if(g(),a&&a.properties)return a.properties.find(function(e){return e.key===t})}function m(e){n?(angular.forEach(e,function(t){o.findAndRemove(function(e){return e.property.key===t.property.key&&e.property.channel===t.property.channel})}),o=o.concat(e)):(n=!0,e=e.map(function(e){var t=e.property.key.split(":");return{key:t[0],type:t[1],id:t[2],keyframes:e.keyframes,channel:parseInt(e.channel.substr(1))}}),E.callEditor("genericSceneAction","saveAnimation",t.id,e).then(function(){var e;n=!1,0<o.length&&(e=o,o=[],m(e))}))}function v(){r.ctrl&&r.ctrl.performSavePendingProperties&&r.ctrl.performSavePendingProperties(),0<i.length&&m(i),i=[]}function h(){return A+(k.lastPropertyChangeNotSaved?1:0)}function b(e){var t=[];if(angular.isString(e))for(t=e.split(" ").map(function(e){return parseFloat(e)});t.length<3;)t.push(0);else angular.isNumber(e)&&(t=[e]);return t}function _(e){var a=[],i=[];angular.forEach(e,function(e){var t;e.key&&e.key.includes(":")&&(t=(t=e.key.split(":"))[1]+":"+t[2],a.includes(t)||a.push(t),i.push(e))}),angular.equals(l,a)||(l=a,e=i,++u,r.ctrl.performSavePendingProperties&&r.ctrl.performSavePendingProperties(),r.properties=e,angular.frameTimeout(S,1,function(){--u}))}function y(){l=[],g(),a&&a.properties&&_(a.properties)}g(),k.endModalAction=function(){var e=k.layoutCtrl.findWindow(p);return e&&k.layoutCtrl.removeWindow(e),!0},a&&(e=t.autoShowOptions,delete t.autoShowOptions,n=!(i=[]),o=[],r=k.$new(),s=k.$watch(h,function(e,t){0===e&&0<t&&v()}),(Re[p]=r).ctrl={getCurrentPropertyValues:function(e){e=f(e.key);return b(e&&e.value)},isEditingLocked:function(){return 0<u||k.waitForScriptToggle},getCurrentPreviewValue:function(e){if(!(0<u||k.waitForScriptToggle)){e=f(e.key);if(!angular.isDefined(e))return b();e=e&&e.previewvalue;return e&&b(e)}},savePropertyKeyframes:function(e){e=angular.copy(e),angular.forEach(e,function(e){e=f(e.property.key);e&&(e.previewvalue=e.value)}),0<h()?angular.forEach(e,function(t){var a=!1;angular.forEach(i,function(e){e.property.key===t.property.key&&e.channel===t.channel&&(a=!0,e.keyframes=t.keyframes)}),a||i.push(t)}):m(e)},saveAnimationOptions:function(e){E.callEditor("genericSceneAction","saveAnimationOptions",t.id,e)},setPreviewFrame:function(e){v();e={frame:e,id:a.id,key:a.key};E.callEditor("setAnimationPreviewFrame",e)},setPreviewPlayback:function(e){e&&r.ctrl.setPreviewFrame(0);e={play:e,id:a.id,key:a.key};++u,E.callEditor("setAnimationPreviewPlayback",e).then(function(){--u})},getMode:function(){return"puppet"},openCallback:function(){e&&angular.isFunction(r.ctrl.openAnimationOptions)&&r.ctrl.openAnimationOptions()}},r.options={length:10,fps:10,mode:"loop",wraploop:!0,smoothing:0},r.editorSettings=k.editorSettings,r.properties=[],angular.forEach(a.properties,function(e){switch(e.key){case"length":case"fps":case"wraploop":case"smoothing":case"mode":case"events":r.options[e.key]=e.value}}),l=[],c=k.$watch(function(){return g(),a&&a.properties},_),d=k.$on("rebuildAnimationCurves",y),r.$on("undoRedoBegin",function(){++u}),r.$on("undoRedoPerformed",function(){g(),y(),--u}),w('<div class="editorLayoutPanel editorAnimation"><curve-editor ce-source-properties="properties" ce-options="options" ce-ctrl="ctrl" ce-editor-settings="editorSettings"></curve-editor><div class="editorScriptBlockOverlay" ng-if="isRunningScriptPreview || waitForScriptToggle"></div></div>')(r,function(e){r.close=function(){k.layoutCtrl.removeWindow(e),k.navigateUp()},r.onClosed=function(){r.ctrl.performSavePendingProperties(),delete Re[p],r.ctrl.setPreviewFrame(-1),c(),s(),d()};k.layoutCtrl.insertWindow(e,r,{tag:p,icon:"fas fa-fw fa-play-circle",title:"ui_editor_pane_header_animation_editor",titleClass:"editorAnimationTitle",noPadding:!0,parentTag:"preview",parentSplitOrientation:"vertical",closeFunction:function(){r.close()}})}))}k.updateAnimationPreviewPlaybackFrames=function(e){angular.forEach(e,function(e){var t="animation_"+e.id+"_"+e.key,t=Re[t];angular.isObject(t)&&t.ctrl.setAnimationPreviewFrame(e.frame)})},k.modifyAnimationLink=function(c,d,e,t){var p=d.overrideresourceid||c.id,u="animation_"+p+"_"+d.key,g=p.split(":").map(function(e){return"animation_"+e+"_"+d.key});if(d.linkAnimation&&d.linkAnimation.options&&d.linkAnimation.options.parent){if(e)return;var a=Pe(d.linkAnimation.options.parent.id||c.id,d.linkAnimation.options.parent.key);if(k.isPropertyAnimationValid(a.property))return void k.modifyAnimationLink(a.item,a.property);delete d.linkAnimation.options.parent}a=k.layoutCtrl.findWindow(u);if(a)return e?k.layoutCtrl.removeWindow(a,t):k.layoutCtrl.activateWindow(a,!0),!0;if(e)return De[u]&&(De[u].rejected=!0),!1;function n(e){var t={};return e.relativeanimation&&(t.relative=!0),t}var i=[];function o(e){e.property.relativeanimation&&i.push(e)}var f=angular.isUndefined(d.linkAnimation&&d.linkAnimation.options),m=!1,v={property:d,id:p,item:c,expectedChannels:Te(d),linkAnimation:d.linkAnimation||n(d)};o(v);var h=[v];function b(e,t){e.options=e.options||{},e.options.fps=t.options.fps,e.options.length=t.options.length,e.options.mode=t.options.mode,e.options.wraploop=t.options.wraploop}function _(i){h.forEach(function(e){var t,a=Pe(e.id,e.property.key);a&&(t=a,a=i,(e=e).property=t&&t.property||e.property,e.linkAnimation.previewvalue=angular.isDefined(e.property.linkAnimation&&e.property.linkAnimation.previewvalue)?e.property.linkAnimation.previewvalue:angular.isDefined(e.linkAnimation.previewvalue)?e.linkAnimation.previewvalue:e.property.value,a?(e.linkAnimation=e.property.linkAnimation||n(e.property),e.linkAnimation.previewvalue=e.property.value):e.property.linkAnimation=e.linkAnimation,e.item=t&&t.item||e.item)})}v.linkAnimation.options=v.linkAnimation.options||{fps:30,length:60,mode:"loop",wraploop:!0},angular.forEach(v.linkAnimation.options.children,function(e){var t=Pe(e.id||c.id,e.key);t&&(b(e=t.property.linkAnimation||n(t.property),v.linkAnimation),t.property.linkAnimation=e,o(e={property:t.property,id:t.property.overrideresourceid||t.item.id,item:t.item,expectedChannels:Te(t.property),linkAnimation:e}),h.push(e))});e=y.when();i.empty()||(De[u]={rejected:!1},e=E.callEditor("getPropertiesOriginalValues",{tag:"main",properties:i.map(function(e){return{key:e.property.key,id:e.id}})}).then(function(e){_(),angular.forEach(e,function(t){var e,a;!t||(e=h.find(function(e){return e.property.key===t.key&&e.id===t.id}))&&(Oe(a=[],t.value||e.property.value,3),e.referenceValues=a)})}).then(function(){if(!De[u]||De[u].rejected)return delete De[u],y.reject()})),e.then(function(){var n=k.$new(),o=1,a=0,i=!1;function r(t){h.forEach(function(e){e.property.linkAnimation=e.linkAnimation}),0<A?i=!0:h.forEach(function(e){t&&!t.includes(e.curveProperty)||(delete e.property.lastValue,k.sendAssetPropertyChange(e.item,e.property))})}angular.forEach(g,function(e){Re[e]=n});var s=k.$watch(function(){return A},function(e,t){0===e&&0<t&&(i&&(_(),r()),i=!1)});function l(){var i=[];h.forEach(function(e){var t,a;e.linkAnimation.previewvalue=e.property.value,e.curveProperty={key:e.property.key,name:e.property.name,channelCount:e.expectedChannels,animation:angular.copy(e.linkAnimation)},e.referenceValues&&(t=e.referenceValues,a=e.curveProperty.animation,Ie(t[0],a.c0,!0),Ie(t[1],a.c1,!0),Ie(t[2],a.c2,!0)),i.push(e.curveProperty)}),n.properties=i}n.animationName=p+"_"+d.key,n.ctrl={getCurrentPropertyValues:function(t){0===o&&_();var a=[];return h.forEach(function(e){t===e.curveProperty&&Oe(a,e.property&&e.property.value,e.expectedChannels)}),a},isEditingLocked:function(){return 0<o||k.waitForScriptToggle},getCurrentPreviewValue:function(t){0===o&&_();var a=!1,i=[];if(h.forEach(function(e){e.curveProperty===t&&(angular.isUndefined(e.linkAnimation&&e.linkAnimation.previewvalue)?a=!0:Oe(i,e.linkAnimation.previewvalue,e.expectedChannels))}),!a)return i},savePropertyKeyframes:function(e){_();var i=[];angular.forEach(e,function(a){h.forEach(function(e){var t;e.curveProperty===a.property&&(i.push(a.property),e.linkAnimation[a.channel]=a.keyframes,delete e.linkAnimation.previewvalue,e.referenceValues&&(e.linkAnimation[a.channel]=angular.copy(e.linkAnimation[a.channel]),t=e.referenceValues[a.channelIndex],e=e.linkAnimation[a.channel],Ie(t,e,!1)))})}),r(i)},saveAnimationOptions:function(e){m=!0,_();var t,a,i={options:e};angular.isObject(e.parent)&&(delete e.parent.id,v.linkAnimation.options.parent=e.parent),angular.isString(e.name)&&(v.linkAnimation.options.name=e.name),angular.isString(e.startpaused)&&(v.linkAnimation.options.startpaused=e.startpaused),angular.isString(e.wraploop)&&(v.linkAnimation.options.wraploop=e.wraploop),h.forEach(function(e){b(e.linkAnimation,i)}),r(),f&&e.parent&&(t=Pe(e.parent.id||c.id,e.parent.key))&&t.item.id===c.id&&k.isPropertyAnimationValid(t.property)&&(e=t.property,k.modifyAnimationLink(t.item,e,!0,!0),e.linkAnimation.options.children=e.linkAnimation.options.children||[],a={key:d.key},e.linkAnimation.options.children.find(function(e){return e.id===a.id&&e.key===a.key})||e.linkAnimation.options.children.push(a),n.close(),k.modifyAnimationLink(t.item,e))},setPreviewFrame:function(t){_(),a=t;var e=h.map(function(e){return{frame:t,id:e.id,key:e.property.key}});E.callEditor("setAnimationPreviewFrame",e)},setPreviewPlayback:function(t){_(),t&&n.ctrl.setPreviewFrame(0);var e=h.map(function(e){return{play:t,id:e.id,key:e.property.key}});E.callEditor("setAnimationPreviewPlayback",e)},getAnimatedSiblingProperties:function(){var a=[];return angular.forEach(!m&&f&&c.properties,function(e){var t;e!==d&&k.isPropertyAnimationValid(e)&&!e.linkAnimation.options.parent&&(t=angular.isString(e.linkAnimation.options.name)&&0<e.linkAnimation.options.name.trim().length,a.push({label:t?e.linkAnimation.options.name+" ("+e.key+")":e.key,value:":"+e.key}))}),a},getMode:function(){return"property"},openCallback:function(){f&&angular.isFunction(n.ctrl.openAnimationOptions)&&n.ctrl.openAnimationOptions(),--o}},n.options=h[0].linkAnimation.options,n.editorSettings=k.editorSettings,l(),n.$on("undoRedoBegin",function(){++o}),n.$on("undoRedoPerformed",function(){_(!0),n.ctrl.setPreviewFrame(a),l(),--o}),n.$on("onScriptStartPlayback",function(e,t){o+=t?1:-1,t||(_(!0),l())}),w('<div class="editorLayoutPanel editorAnimation"><curve-editor ce-source-properties="properties" ce-options="options" ce-ctrl="ctrl" ce-editor-settings="editorSettings"></curve-editor><div class="editorScriptBlockOverlay" ng-if="isRunningScriptPreview || waitForScriptToggle"></div></div>')(n,function(e){_(),r(),n.close=function(){k.layoutCtrl.removeWindow(e)},n.onClosed=function(){angular.forEach(g,function(e){delete Re[e]}),n.ctrl.setPreviewFrame(-1),s()};var t="ui_editor_pane_header_animation_editor";angular.isString(d.name)&&(t=x.instant("ui_editor_pane_header_animation",{name:x.instant(d.name).toString()}).toString()),k.layoutCtrl.insertWindow(e,n,{tag:u,icon:"fas fa-fw fa-play-circle",title:t,titleClass:"editorAnimationTitle",noPadding:!0,parentTag:"preview",parentSplitOrientation:"vertical",closeFunction:function(){n.close()}})})}).catch(function(){console.log("Animation editor deferred reject:",u)})},k.deleteAnimationLink=function(e,t){var a=t.linkAnimation&&t.linkAnimation.options&&t.linkAnimation.options.parent,i=angular.isObject(a)&&Pe(a.id||e.id,a.key);k.modifyAnimationLink(e,t,!0,!0),delete t.lastValue,delete t.linkAnimation,i?((i.property&&i.property.linkAnimation&&i.property.linkAnimation.options&&i.property.linkAnimation.options.children||[]).findAndRemove(function(e){return e.key===t.key}),a=k.modifyAnimationLink(i.item,i.property,!0,!0),delete i.property.lastValue,k.sendAssetPropertyChange(i.item,[t,i.property]),a&&k.modifyAnimationLink(i.item,i.property)):k.sendAssetPropertyChange(e,t)},k.makeDefaultPhysicsConstraintSettings=function(e,t){return{se:!1,rs:200,rf:20,ri:30,ts:200,tf:20,ti:30,re:!1,ge:!1,gd:"0 -1 0",m:20,s:0,a:"1 0 0",r:!0,rax:t,ray:t,raz:!0,t:!1,tax:!0,tay:!0,taz:!0,tm:200,la:!1,lamin:"0 0 -3.14159265358",lamax:"0 0 3.14159265358",lt:!1,ltmax:100,ik:!1,ikd:2,ikg:!0,ikr:!0,ikrd:25,ikce:!1,ikrmin:0,ikrmax:Math.PI,ikcp:!1,ikcpn:1,ikm:"",ikse:!0,ikfe:!1,layout:e,preset:"none"}};var Be="simple";k.editBoneAnimationConstraints=function(t){var a=!k.project.scene.is2d;E.callEditor("genericSceneAction","puppetGetBoneConstraintsConfig",k.selectedResource.item.id+":"+t.key).then(function(e){C.open("editorBoneConstraints",{data:{settings:e||{},renderable:k.selectedResource.item.id,boneId:t.key.split(":")[1],constraintMode:t.args,defaults:k.makeDefaultPhysicsConstraintSettings(Be,a)}}).then(function(e){Be=e.layout,t.value=angular.toJson(e),k.sendAssetPropertyChange(k.selectedResource.item,t)})})};var Fe={add:function(e,a){E.callEditor("genericSceneAction","addAnimation",e.id).then(function(e){var t;a.value=a.value||[],a.value.push(e.item),angular.merge(k.project.objectproperties,e.objectproperties),angular.isArray(a.value)&&0<a.value.length&&((e=Ee((t=a.value[a.value.length-1]).id,t.key))&&(e.autoShowOptions=!0),Fe.edit(t))})},edit:function(e){k.navigateProperty(e.key,e.id)},remove:function(e,t){return E.callEditor("genericSceneAction","removeAnimation",t.id).then(function(){e.value.splice(e.value.indexOf(t),1)})},drag:function(e,t){E.callEditor("dragRenderableItem",k.selectedResource.item.id,e,t,"puppetsingleanimation")},contextMenu:function(e,t,a){M.builder().button("ui_editor_context_menu_duplicate","fas fa-fw fa-clone",function(){E.callEditor("genericSceneAction","duplicateAnimation",a.id)}).open(k,e)}},je={add:function(e,t){var a={title:"ui_editor_properties_animations",cancelVisible:!0,okVisible:!0,selectionVisible:!0};E.callEditor("getAvailableAnimations",e.id).then(function(e){if(0!==e.length)return a.selectionItems=e,a.selectedItem=e[0],C.open("genericConfirm",{data:a})}).then(function(){return E.callEditor("addAnimationLayer",e.id,a.selectedItem.value)}).then(function(e){t.value=e.items,angular.merge(k.project.objectproperties,e.objectproperties),angular.isArray(t.value)&&0<t.value.length&&je.edit(t.value[t.value.length-1]),k.updateRunScriptVisibility()})},edit:function(e){k.navigateProperty(e.key,e.id)},remove:function(e,t){return k.onPropertyItemRemoved(e,t)},drag:function(e,t){E.callEditor("dragRenderableItem",k.selectedResource.item.id,e,t,"animationlayer")},contextMenu:function(e,t,a){M.builder().button("ui_editor_context_menu_duplicate","fas fa-fw fa-clone",function(){E.callEditor("genericSceneAction","duplicateAnimationLayer",k.selectedResource.item.id,a.id)}).open(k,e)}},Ve={nextPoseIndex:1,save:function(t,e,a){var i="ui_editor_puppet_warp_save_pose_title",n={title:i=(a=!angular.isArray(a&&a.properties)||"0"===a.value?void 0:a)?x.instant("ui_editor_puppet_warp_overwrite_pose_title",{name:a.properties[0].value}):i,message:"",cancelVisible:!0,okVisible:!0,textinputVisible:!0,textinput:a?a.properties[0].value:""};C.open("genericConfirm",{data:n}).then(function(){var e=n.textinput.trim();e||(e=x.instant("ui_editor_properties_pose_index",{index:Ve.nextPoseIndex}).toString(),++Ve.nextPoseIndex),E.callEditor("genericSceneAction","saveSkeletalPose",t.id,a?a.value:"0",e)})},load:function(e,t){E.callEditor("genericSceneAction","applySkeletalPose",e.id,t.value)},remove:function(e,t,a){return E.callEditor("genericSceneAction","removeSkeletalPose",e.id,a.value)},drag:function(e,t,a){0!==t&&(0===a&&(a=1),E.callEditor("genericSceneAction","orderSkeletalPoses",e.id,--t,--a))},contextMenu:function(e,t,a){console.log(e,t,a)}},Le={itemSelected:function(e,t,a){E.callEditor("genericSceneAction","selectVertexIsland",e.id,a.id)},contextMenu:function(e,t,a){M.builder().button("ui_editor_properties_show_single","fas fa-fw fa-angle-right",function(){angular.forEach(t.value,function(e){var t=e.properties.find(e=>"visible"===e.key);t.value=e===a,k.sendAssetPropertyChange(e,t)})}).button("ui_editor_properties_show_all","fas fa-fw fa-angle-double-right",function(){angular.forEach(t.value,function(e){var t=e.properties.find(e=>"visible"===e.key);t.value=!0,k.sendAssetPropertyChange(e,t)})}).open(k,e)}},ze={itemSelected:function(e,t,a){E.callEditor("genericSceneAction","selectClippingMask",e.id,a.id)}},$e={add:function(e,t){E.callEditor("genericSceneAction","addBlendShape",e.id).then(function(e){t.value=t.value||[],t.value.push(e.item),angular.merge(k.project.objectproperties,e.objectproperties),angular.isArray(t.value)&&0<t.value.length&&(e=t.value[t.value.length-1],$e.edit(e))})},edit:function(e){k.navigateProperty(e.key,e.id)},remove:function(e,t){return E.callEditor("genericSceneAction","removeBlendShape",t.id).then(function(){})},drag:function(e,t){E.callEditor("dragRenderableItem",k.selectedResource.item.id,e,t,"puppetblendshape")},contextMenu:function(e,t,a){M.builder().button("ui_editor_context_menu_duplicate","fas fa-fw fa-clone",function(){E.callEditor("genericSceneAction","duplicateBlendShape",a.id)}).open(k,e)}},He={add:function(e,t){E.callEditor("genericSceneAction","addExpression",e.id).then(function(e){t.value=t.value||[],t.value.push(e.item),angular.merge(k.project.objectproperties,e.objectproperties),angular.isArray(t.value)&&0<t.value.length&&(e=t.value[t.value.length-1],He.edit(e))})},edit:function(e){k.navigateProperty(e.key,e.id)},remove:function(e,t){return E.callEditor("genericSceneAction","removeExpression",t.id).then(function(){})},drag:function(e,t){E.callEditor("dragRenderableItem",k.selectedResource.item.id,e,t,"puppetexpression")},contextMenu:function(e,t,a){M.builder().button("ui_editor_context_menu_duplicate","fas fa-fw fa-clone",function(){E.callEditor("genericSceneAction","duplicateExpression",a.id)}).open(k,e)}},Ue={add:function(e,t){E.callEditor("genericSceneAction","addCameraPath",e.id).then(function(e){t.value=e.items,angular.merge(k.project.objectproperties,e.objectproperties),angular.isArray(t.value)&&0<t.value.length&&(e=t.value[t.value.length-1],Ue.edit(e))})},edit:function(e){k.navigateProperty(e.key,e.id)},remove:function(e,t){return E.callEditor("genericSceneAction","removeCameraPath",t.id).then(function(){e.value.splice(e.value.indexOf(t),1)})},drag:function(e,t){E.callEditor("dragRenderableItem",k.selectedResource.item.id,e,t,"camerapath")},contextMenu:function(e,t,a){M.builder().button("ui_editor_context_menu_duplicate","fas fa-fw fa-clone",function(){E.callEditor("genericSceneAction","duplicateCameraPath",a.id)}).open(k,e)}},Ge={itemSelected:function(e,t,a){E.callEditor("genericSceneAction","selectAnimationBoneList",e.id,a.map(function(e){return e.id}))}};k.promptUnsaveChanges=function(){_().then(function(e){E.callEditor("confirmClose",e)})};var qe,Ne,Qe,Ke={};k.getPaintShowShading=function(){return k.paintOptions.fnshowshading?k.paintOptions.fnshowshading():k.paintOptions.showshading},k.setPaintShowShading=function(e){k.paintOptions.fnsetshowshading?k.paintOptions.fnsetshowshading(e):k.paintOptions.showshading=e},k.initPaintAction=function(e,t){var a,i=k.selectedResource.stack[0];if(fe(),k.paintOptions.fnshowshading=void 0,k.paintOptions.fnsetshowshading=void 0,k.paintOptions.enabled=!0,k.paintOptions.mode=e,k.paintOptions.brushtype="",k.paintOptionsLocal={isolateEffect:!1,renderable:i,hiddenEffects:[]},Ke={},k.paintOptions.lastMode!==e)switch(k.paintOptions.lastMode=e){case"opacitymask":case"depth":case"flowmask":k.paintOptions.value=255;break;case"rgbmask":k.paintOptions.color="1 1 1";break;case"weightmask":case"displacement":k.paintOptions.value=255}switch(e){case"weightmask":case"displacement":k.paintOptions.showmask=!1,k.paintOptions.showshading=!1}t&&t.showMask&&(k.paintOptions.showmask=!0),"displacement"===e&&(a=k.selectedResource.item,angular.forEach(a&&a.properties,function(e){e&&"preview"===e.key&&(k.paintOptions.fnshowshading=function(){var e=Pe(a.id,"preview",a.key);return e&&e.property.value},k.paintOptions.fnsetshowshading=function(e){var t=Pe(a.id,"preview",a.key);t&&(t.property.value=e,S(function(){k.sendAssetPropertyChange(t.item,t.item.properties)}))})})),k.endModalAction=function(){return k.endPaint(!0),!0},k.layoutCtrl.showBaseWindow(k.layoutCtrl.findWindow("brush"))},k.beginPaint=function(t){k.initPaintAction(t.mode);var e=t.overriderenderableid||k.selectedResource.stack[0].id;E.callEditor("beginPaint",e,t.material,t.textureindex,t.component,k.paintOptions).then(function(e){e||(k.endModalAction=void 0,k.paintOptions.enabled=!1,k.layoutCtrl.removeWindow(k.layoutCtrl.findWindow("brush")),o=t)})},k.endPaint=function(e){k.endModalAction=void 0,k.endMaskEyeDropper(),k.paintOptions.enabled=!1,k.layoutCtrl.removeWindow(k.layoutCtrl.findWindow("brush")),E.callEditor("endPaint",e)},k.clearPaint=function(){var e;switch(k.paintOptions.mode){case"weightmask":e=k.selectedResource.stack[0],k.genericSceneAction({args:"resetPuppetWarpWeights",value:e.id});break;case"displacement":e=k.selectedResource.stack[0],k.genericSceneAction({args:"resetPuppetWarpDepth",value:e.id});break;default:E.callEditor("clearPaint")}},k.applyPaintHistory=function(e){E.callEditor("applyPaintHistory",e)},k.updatePaintHistoryState=function(e){k.paintHistoryState=e},k.getPaintBrushSizePreview=function(){return 24*Math.pow(Math.min(2e3,k.paintOptions.size)/2e3,.2)},k.startMaskEyeDropper=function(){k.maskEyeDropperActive=!0,E.callEditor("genericSceneAction","startMaskEyeDropper"),n.$broadcast("showPreviewCrosshair",{visible:!0,type:"eyedropper"})},k.endMaskEyeDropper=function(){k.maskEyeDropperActive&&(k.maskEyeDropperActive=!1,n.$broadcast("showPreviewCrosshair",{visible:!1}),E.callEditor("genericSceneAction","endMaskEyeDropper"))},k.updateEyeDropperValue=function(e){k.maskEyeDropperActive&&(k.paintOptions.value=Math.clamp(Math.round(255*e),0,255))},k.togglePaintIsolateEffect=function(){var e=k.paintOptionsLocal.renderable&&k.paintOptionsLocal.renderable.properties&&k.paintOptionsLocal.renderable.properties.find(function(e){return"effects"===e.key});console.log("togglePaintIsolateEffect",e)},k.openTextureGenerator=function(t){var a={},e=k.selectedResource.stack[0];E.callEditor("getCropSettings",e&&e.id).then(function(e){angular.merge(a,e)});var i,n={generator:{renderable:e&&e.id,material:t.material,textureIndex:t.textureindex,mode:t.mode}},e=y.when();"depth"===t.mode&&(i=y.defer(),E.callEditor("isDLCInstalled",P.dlc.editorExtensions.id()).then(function(e){e.installed&&!e.downloading?i.resolve():e.offline?C.open("genericConfirm",{data:{title:"ui_editor_modal_dlc_prompt_title",message:x.instant("ui_editor_modal_dlc_prompt_message_offline",{name:x.instant(P.dlc.editorExtensions.name).toString(),size:P.dlc.editorExtensions.size}),cancelVisible:!0,cancelText:"ui_close"}}):C.open("dlcPrompt",{data:{dlc:P.dlc.editorExtensions}}).then(function(){i.resolve()}).catch(function(){i.reject()})}),e=i.promise),e.then(function(){C.open("editorCharacterSeparation",{data:n}).then(function(e){E.callEditor("genericSceneAction","renameEditFile","",e.dst,e.desiredFilename).then(function(e){if(e.success)return k.importTextureFile(t.material,t.textureindex,-1,t.format,e.dst,{instantImport:!0,objInfoOverride:a})})})})},k.dropFile=function(e){e.sort();var t=e[0];"scene"===k.project.data.type?P.isExtension(t,"sound")?ge(t):P.isExtension(t,"texture")?ue(e):le(t):"video"===k.project.data.type&&k.replaceFile(k.project.tree[0],t)},k.importTextureFile=function(t,a,i,n,e,o){fe(),o=o||{};var r=y.when(e);(r=!angular.isString(e)&&!angular.isArray(e)?r.then(function(){return E.callEditor("importImage").then(function(e){return e.file})}):r).then(function(e){return E.callEditor("importImage",e,n,o).then(function(e){return delete e.config.addcommand,"normalmap"===n&&(e.config.shaderpresetkey+="n"),e.config.textureonly=!0,e.config.subdirectory=o.subDirectory||"",e.instantImport=o.instantImport,o.objInfoOverride&&angular.merge(e.config,o.objInfoOverride),C.open("editorImportModel",{objInfo:e,project:{}})})}).then(function(e){E.callEditor("importTextureFile",{material:t,texture:a,component:i,texturepath:e,tag:o.tag||"main"})})},k.exportTextureFile=function(e,t){fe(),E.callEditor("exportTextureFile",e,t)},k.editTextureFileExternally=function(e){ke({hasimageediting:!0,id:e},"path")},k.openMaterialBrowser=function(t,a,e){return C.open("editorMaterials",{data:{currentPath:t.value,subDirectory:e}}).then(function(e){return fe(),E.callEditor("importTextureFile",{material:t.material,texture:t.textureindex,texturepath:e,component:t.component,tag:a||"main"})})},k.resetTextureFile=function(e,t,a,i){fe(),E.callEditor("importTextureFile",{material:e,texture:t,component:a,tag:i||"main"})},k.duplicateTextureFile=function(e,t,a){return fe(),C.open("genericConfirm",{data:{title:"ui_editor_modal_duplicate_texture_header",message:"ui_editor_modal_duplicate_texture_body",cancelVisible:!0,okVisible:!0}}).then(function(){E.callEditor("duplicateTextureFile",{material:e,texture:t,tag:a||"main"})})},k.contextMenuPropertyEffect=function(e,t,a){var i=M.builder();a&&i.button("ui_editor_context_menu_copy_effect","fas fa-fw fa-copy",function(){E.callEditor("getEffectConfig",k.selectedResource.item.id,a.id).then(function(e){qe=e})}),i.button("ui_editor_context_menu_paste_effect","fas fa-fw fa-paste",function(){E.callEditor("addEffectFromConfig",k.selectedResource.item.id,qe)},{},qe?"":"fa-disabled"),a&&(i.button("ui_editor_context_menu_paste_effect_settings","fas fa-fw fa-paste",function(){E.callEditor("applyEffectConfig",k.selectedResource.item.id,a.id,qe)},{},qe&&a.file===qe.file?"":"fa-disabled"),i.divider(),i.button("ui_editor_context_menu_duplicate_effect","fas fa-fw fa-clone",function(){E.callEditor("getEffectConfig",k.selectedResource.item.id,a.id).then(function(e){E.callEditor("addEffectFromConfig",k.selectedResource.item.id,e,a.id)})})),i.open(k,e)},k.renderableDroppedOnTextureCondition=function(e,t){return!(angular.isObject(k.selectedResource.stack[0])&&k.selectedResource.stack[0].id===e.id||!angular.isNumber(e.type))&&("model"!==(t&&t.droptype)?1===e.type||4===e.type:5===e.type||1===e.type&&e.haspuppet)},k.renderableDroppedOnTexture=function(e,t,a){E.callEditor("importTextureFile",{material:e,texture:t,texturepath:"_rt_imageLayerComposite_"+a.id+"_a",tag:"main"})},k.showAddRenderableModal=function(){E.callEditor("listAvailablePresets",k.project.scene.is2d?"scene2d":"scene3d").then(function(n){function e(e,t,a,i){n.push({name:e,description:a,type:t,group:"renderable",options:i})}function t(e,t,a,i){n.push({name:e,description:a,type:t,group:"utility",options:i})}var a=k.project.scene.is2d?k.particleDefaultPresets:k.particleDefaultPresets3d;return e("ui_editor_effects_modal_imagelayer_name","imagelayer","ui_editor_effects_modal_imagelayer_description"),e("ui_editor_effects_modal_textlayer_name","textlayer","ui_editor_effects_modal_textlayer_description",{nameVisible:!0,name:"Text Layer"}),e("ui_editor_effects_modal_particle_system_name","particle","ui_editor_effects_modal_particle_system_description",{nameVisible:!0,name:"new particle system",droplistOptions:a,droplistSelected:a[0].value}),e("ui_editor_effects_modal_sound_name","sound","ui_editor_effects_modal_sound_description"),e("ui_editor_effects_modal_light_name","light","ui_editor_effects_modal_light_description",{color:"1 1 1",colorLabel:"ui_editor_properties_light_color"}),e("ui_editor_effects_modal_model_name","model","ui_editor_effects_modal_model_description"),t("ui_editor_effects_modal_solidlayer_name","solidlayer","ui_editor_effects_modal_solidlayer_description",{color:"1 1 1",resolution:{width:256,height:256}}),t("ui_editor_effects_modal_replaceablesolidlayer_name","replaceablesolidlayer","ui_editor_effects_modal_replaceablesolidlayer_description",{color:"1 1 1",resolution:{width:256,height:256}}),t("ui_editor_effects_modal_transform_name","transformlayer","ui_editor_effects_modal_transform_description"),t("ui_editor_effects_modal_fullscreenlayer_name","fullscreenlayer","ui_editor_effects_modal_fullscreenlayer_description"),k.project.scene.is2d&&t("ui_editor_effects_modal_projectlayer_name","projectlayer","ui_editor_effects_modal_projectlayer_description"),t("ui_editor_effects_modal_composelayer_name","composelayer","ui_editor_effects_modal_composelayer_description",{resolution:{width:512,height:512}}),t("ui_editor_effects_modal_camera_name","camera","ui_editor_effects_modal_camera_description"),X("layers",n),C.open("editorEffectList",{data:{title:"ui_editor_effects_modal_title_add_renderable",groupList:n,workshopModalFn:J,workshopController:Q,workshopGroup:"layers"}})}).then(function(e){switch(e.type){case"imagelayer":ue();break;case"textlayer":E.callEditor("addTextLayer",{text:e.options.name}).then(W);break;case"projectlayer":E.callEditor("addCompositionLayer",{projectlayer:!0}).then(W);break;case"fullscreenlayer":E.callEditor("addCompositionLayer").then(W);break;case"solidlayer":E.callEditor("addSolidLayer",{color:e.options.color,width:e.options.resolution.width,height:e.options.resolution.height}).then(W);break;case"replaceablesolidlayer":E.callEditor("addSolidLayer",{color:e.options.color,width:e.options.resolution.width,height:e.options.resolution.height,instanced:!0}).then(W);break;case"transformlayer":E.callEditor("addTransformLayer").then(W);break;case"composelayer":E.callEditor("addCompositionLayer",{width:e.options.resolution.width,height:e.options.resolution.height}).then(W);break;case"particle":E.callEditor("createParticle",{name:e.options.name,source:e.options.droplistSelected}).then(function(e){return E.callEditor("addParticle",e)}).then(function(e){e=W(e);k.editParticle(e)});break;case"sound":E.callEditor("importSound").then(function(e){return E.callEditor("addSound",e.file)}).then(W);break;case"light":ce({color:e.options.color});break;case"camera":de();break;case"model":le();break;case"postprocessingctrl":E.callEditor("addPostProcessingCtrl").then(W);break;case"preset":E.callEditor("addPreset",angular.toJson(e)).then(W);break;case"workshopasset":E.callEditor("addLayersFromWorkshopAsset",angular.toJson(e)).then(W)}})},k.updateRenderStats=function(e){k.renderStats=e},k.updateUndoState=function(e){k.undoState=e,g()},k.updateScriptMessages=function(e){angular.forEach(e,function(e){k.$broadcast("onScriptMessage",e)})},k.editParticle=function(t,a){angular.isUndefined(a)&&angular.forEach(t.properties,function(e){"particle"===e.type&&(a=e)});var i=[];angular.forEach(k.project.availableassets,function(e){"particle"===e.type&&i.push({name:e.name,label:e.name,value:e.file,preview:e.file})}),C.open("editorParticleEditor",{data:{particle:a.value,existingParticles:i,editor:k}}).then(function(e){angular.isString(e)&&E.callEditor("applyParticle",t.id,e),E.callEditor("reloadParticles")})};var Ye,Xe=!(k.makeLabelEditable=function(e,t){var a=angular.element(e.currentTarget.parentElement),i=angular.element(a.children(".inputElement")[0]);function n(e){i.off("blur.edit"),i.off("keydown.edit"),a.removeClass("editSliderLabel"),!0!==e&&(k.paintOptions[t.name]=i.val(),angular.isDefined(t.min)&&(k.paintOptions[t.name]=Math.max(t.min,k.paintOptions[t.name])),angular.isDefined(t.max)&&(k.paintOptions[t.name]=Math.min(t.max,k.paintOptions[t.name])),window.safeApply(k))}a.addClass("editSliderLabel"),i.focus(),i.val(k.paintOptions[t.name]),i.select(),i.off("blur.edit"),i.off("keydown.edit"),i.on("blur.edit",n),i.on("keydown.edit",function(e){13===e.which?n():27===e.which&&n(!0)})});function Je(){return k.editorTemp.previewphone||k.editorTemp.previewdesktop?y.when():E.callEditor("getViewTransforms").then(function(e){Ne=e,Qe=k.gizmoMode})}function Ze(){(k.editorTemp.previewphone||k.editorTemp.previewdesktop)&&(k.editorTemp.previewphone=!1,k.editorTemp.previewdesktop=!1,delete k.editorTemp.previewaspect,k.setGizmoMode(Qe))}function et(e){var t=[e.id],a=[],e=k.project.tree.indexOf(e);if(e<0)return a;for(var i=e+1;i<k.project.tree.length;++i){var n=k.project.tree[i];t.includes(n.parent)&&(a.push(n),t.push(n.id))}return a}k.togglePhonePreview=function(){Xe||(Xe=!0,Je().then(function(){Xe=!1,k.editorTemp.previewphone=!k.editorTemp.previewphone,k.editorTemp.previewphone?(k.editorTemp.previewdesktop=!1,k.editorTemp.previewaspect="9 x 16",E.callEditor("setViewTransforms",{origin:"0 0 0",zoom:1}),k.setGizmoMode("none")):(delete k.editorTemp.previewaspect,E.callEditor("setViewTransforms",Ne),k.setGizmoMode(Qe))}))},k.toggleDesktopPreview=function(){Xe||(Xe=!0,Je().then(function(){Xe=!1,k.editorTemp.previewdesktop=!k.editorTemp.previewdesktop,k.editorTemp.previewdesktop?(k.editorTemp.previewphone=!1,k.editorTemp.previewaspect=k.editorSettings.previewratio,k.editorTemp.previewaspect&&"free"!==k.editorTemp.previewaspect||(k.editorTemp.previewaspect="16 x 9"),E.callEditor("setViewTransforms",{origin:"0 0 0",zoom:1}),k.setGizmoMode("none")):(delete k.editorTemp.previewaspect,E.callEditor("setViewTransforms",Ne),k.setGizmoMode(Qe))}))},k.showLimitError=function(e){C.open("genericConfirm",{data:{title:e.title,message:x.instant(e.message,{limit:e.value}),okVisible:!0}})},k.togglePreviewFPSLock=function(){k.editorSettings.previewfpslock=!k.editorSettings.previewfpslock},e.on("keydown.editor.previewexit",function(){Ze()});var tt=[];k.callbackAssetContextMenu=function(e,i){if(i){var t,n=["origin","scale","angles"],o=function(t){var a;return angular.forEach(i.properties,function(e){e.key===t&&(a=e)}),a},a=M.builder();k.project.scene.is2d&&i.enabletransforms&&(a.button("ui_editor_context_menu_center","fas fa-fw fa-align-center",function(){E.callEditor("centerRenderable",i.id)}),i.cropoffset&&a.button("ui_editor_context_menu_align_with_background","fas fa-fw fa-align-justify",function(){E.callEditor("centerRenderable",i.id,i.cropoffset)}),a.button("ui_editor_context_menu_rotate_clockwise","fas fa-fw fa-redo",function(){E.callEditor("rotateRenderable",i.id,2,P.toRadians(-90))}),a.button("ui_editor_context_menu_rotate_counterclockwise","fas fa-fw fa-undo",function(){E.callEditor("rotateRenderable",i.id,2,P.toRadians(90))}),a.divider()),i.enabletransforms&&(a.button("ui_editor_context_menu_copy_transforms","fas fa-fw fa-copy",function(){var t,a,e=(t=n,a=[],angular.forEach(i.properties,function(e){t.includes(e.key)&&a.push(e)}),a);Ye=angular.copy(e)}),a.button("ui_editor_context_menu_paste_transforms","fas fa-fw fa-paste",function(){var a=[];angular.forEach(Ye,function(e){var t=o(e.key);t&&(t.value=angular.copy(e.value),a.push(t))}),0<a.length&&k.sendAssetPropertyChange(i,a)},{},Ye?"":"fa-disabled"),(t=o("locktransforms"))&&(u=t.value,a.button(u?"ui_editor_context_menu_unlock":"ui_editor_context_menu_lock","fas fa-fw "+(u?"fa-lock-open":"fa-lock"),function(){t.value=!t.value,k.sendAssetPropertyChange(i,t)})));var r,s,l,c=k.project.tree.indexOf(i);if(0<=c&&1<k.project.tree.length){var d="0"!==i.parent?k.project.tree.filter(e=>e.parent===i.parent):[],p=d.empty()?k.project.tree.first()!==i:d.first()!==i,u=d.empty()?k.project.tree.last()!==i:d.last()!==i,g=et(i).length,f=M.builder();f.button("ui_editor_context_menu_move_to_top","fas fa-fw fa-arrow-up-to-line",function(){var e={from:c,to:0,count:g+1,updateGraph:!0};d.empty()||(e.to=k.project.tree.indexOf(d.first()),e.parent=i.parent),E.callEditor("sendSceneOrderChange",e)},{},p?"":"fa-disabled").button("ui_editor_context_menu_move_to_bottom","fas fa-fw fa-arrow-down-to-line",function(){var e={from:c,to:k.project.tree.length-1-g,count:g+1,updateGraph:!0};d.empty()||(e.to=k.project.tree.indexOf(d.last())+et(d.last()).length-g,e.parent=i.parent),E.callEditor("sendSceneOrderChange",e)},{},u?"":"fa-disabled").divider().button("ui_editor_context_menu_move_to_custom_position","fas fa-fw fa-input-numeric",function(){var t={title:"ui_editor_generic_modal_enter_layer_position_title",message:x.instant("ui_editor_generic_modal_enter_layer_position_body",{last:k.project.tree.length}),numberInputVisible:!0,okVisible:!0,cancelVisible:!0,numberinput:void 0};C.open("genericConfirm",{data:t}).then(function(){if(angular.isNumber(t.numberinput)){for(var e=Math.max(0,Math.min(k.project.tree.length-1,t.numberinput-1));e<k.project.tree.length&&"0"!==k.project.tree[e].parent;)++e;c<e&&--e,c<e&&(e-=g),e!==c&&E.callEditor("sendSceneOrderChange",{from:c,to:e,count:g+1,updateGraph:!0})}})},{},"0"!==i.parent?"fa-disabled":"").divider();u=k.project.tree.find(e=>e.id===i.parent);if("0"===i.parent){for(var m=c-1,v=0<=m?k.project.tree[m]:void 0;v&&0!==v.indentation;)v=0<=--m?k.project.tree[m]:void 0;b=v&&(v.properties.find(e=>"name"===e.key).value||v.name)||"?",f.button(x.instant("ui_editor_context_menu_parent_attach_to",{name:b}),"fas fa-fw fa-link",function(){var e={from:c,to:c,count:g+1,parent:v.id,updateGraph:!0};E.callEditor("sendSceneOrderChange",e)},{},void 0!==v?"":"fa-disabled")}else{for(var h=c;h+1<k.project.tree.length&&0!==k.project.tree[h+1].indentation;)++h;b=u&&(u.properties.find(e=>"name"===e.key).value||u.name)||"?",f.button(x.instant("ui_editor_context_menu_parent_detach_from",{name:b}),"fas fa-fw fa-link-slash",function(){var e={from:c,to:h-g,count:g+1,updateGraph:!0};E.callEditor("sendSceneOrderChange",e)})}var b=u&&angular.isArray(u.attachments)&&0<u.attachments.length,_=M.builder();b&&(_.button("ui_editor_context_menu_parent_set_attachment_none","",function(){var e={from:c,to:c,parent:i.parent,count:1,attachment:""};E.callEditor("sendSceneOrderChange",e)}).divider(),angular.forEach(u.attachments,function(t){_.button(t,"",function(){var e={from:c,to:c,parent:i.parent,count:1,attachment:t};E.callEditor("sendSceneOrderChange",e)})})),f.subMenu("ui_editor_context_menu_parent_set_attachment","fas fa-fw fa-bullseye",_,b?"":"fa-disabled"),a.requestDivider().subMenu("ui_editor_context_menu_hierarchy",f)}i.haseffects&&(r=i.properties&&i.properties.find(function(e){return"effects"===e.type}),s=ye(i),r&&(a.divider(),a.button("ui_editor_context_menu_copy_all_effects","fas fa-fw fa-copy",function(){tt=[];var t=y.when();angular.forEach(r.value,function(e){t=t.then(function(){return E.callEditor("getEffectConfig",i.id,e.id).then(function(e){tt.push(e)})})})},{},s?"":"fa-disabled").button("ui_editor_context_menu_paste_all_effects","fas fa-fw fa-paste",function(){angular.forEach(tt,function(e){E.callEditor("addEffectFromConfig",i.id,e)})},{},0<tt.length?"":"fa-disabled")),i.hasimageediting&&(f=M.builder(),l=function(){return C.open("genericConfirm",{data:{title:"ui_editor_character_separation_disabled_title",message:"ui_editor_character_separation_disabled_body",leftIcon:"images/warning.png",okVisible:!0}})},f.button("ui_editor_context_menu_foreground_separation","fas fa-fw fa-cut",function(){s?l():C.open("editorCharacterSeparation",{data:{referenceId:i.id}}).then(function(){return E.callEditor("genericSceneAction","finishCharacterSeparation",i.id).then(function(e){if(e.path)return ue(e.path,{instantImport:!0,originReferenceLayerId:i.id})})})}),f.button("ui_editor_context_menu_character_sheet","fas fa-fw fa-child",function(){s?l():E.callEditor("genericSceneAction","getBaseTexturePath",i.id).then(function(e){return C.open("editorCharacterSeparation",{data:{referenceId:i.id,isSheet:!0,dstPath:e.path}}).then(function(e){return k.onResourceRemove(i),ue(e,{instantImport:!0})})})}),f.divider(),f.button("ui_editor_context_menu_edit_with_other","fas fa-fw fa-file-edit",function(){E.promptExternalApp(k.editorSettings,"externalpathimageeditor","Image Editor",".exe","ui_editor_external_custom_image_editor_not_found_title","ui_editor_external_custom_image_editor_not_found_body").then(function(){E.callEditor("genericSceneAction","runExternalImageEditor",i.id,k.editorSettings.externalpathimageeditor,"other")})}),a.subMenu("ui_editor_context_menu_image_editing",f))),a.divider(),a.button("ui_editor_context_menu_duplicate","fas fa-fw fa-clone",function(){E.callEditor("duplicateRenderable",i.id).then(W)}),a.open(k,e)}},k.importFontFile=function(e){return E.callEditor("importFontFile",angular.isArray(e)?e[0]:void 0)},k.getFonts=function(){return k.project.availablefonts},k.navigateBackwards=function(){if(!C.isAnyModalVisible()&&!l.empty()){d=!0;try{var e=l.pop(),t=Ee(e.id,e.key);if(!angular.isObject(t))return void(d=!1);c.push(k.selectedResource.item),k.selectedResource.item=t,S(function(){d=!1})}catch(e){d=!1}}},k.navigateForwards=function(){if(!C.isAnyModalVisible()&&!c.empty()){p=!0;try{var e=c.pop(),t=Ee(e.id,e.key);angular.isObject(t)&&(k.selectedResource.item=t),S(function(){p=!1})}catch(e){p=!1}}},k.performUndoRedo=me,e.on("keydown.editor.undo",function(e){!e.ctrlKey||"z"!==e.key&&"y"!==e.key?"Escape"===e.key&&k.maskEyeDropperActive&&(k.endMaskEyeDropper(),e.stopPropagation(),e.preventDefault(),window.safeApply(k)):(e.preventDefault(),C.isAnyModalVisible()||0!==angular.element(e.target).closest(".disableEditorHotkeys").length||(k.paintOptions.enabled?k.applyPaintHistory("z"===e.key):me("y"===e.key)))}),k.propertyControl={navigateProperty:k.navigateProperty,sendAssetPropertyChange:k.sendAssetPropertyChange,onUserPropertyBindingsChanged:k.onUserPropertyBindingsChanged,textureDropCondition:k.renderableDroppedOnTextureCondition,textureDropped:k.renderableDroppedOnTexture,beginPaint:k.beginPaint,importTextureFile:k.importTextureFile,exportTextureFile:k.exportTextureFile,editTextureFileExternally:k.editTextureFileExternally,openMaterialBrowser:k.openMaterialBrowser,resetTextureFile:k.resetTextureFile,duplicateTextureFile:k.duplicateTextureFile,openTextureGenerator:k.openTextureGenerator,contextMenuPropertyEffect:k.contextMenuPropertyEffect,onPropertyEffectRemoved:k.onPropertyItemRemoved,onPropertyEffectDragged:k.onPropertyItemDragged,editPropertyEffect:k.editPropertyEffect,addPropertyEffect:k.addPropertyEffect,editParticle:k.editParticle,modifyScriptLink:k.modifyScriptLink,modifyAnimationLink:k.modifyAnimationLink,deleteAnimationLink:k.deleteAnimationLink,onPropertySoundRemoved:k.onPropertyItemRemoved,onPropertySoundDragged:k.onPropertyItemDragged,onPropertySoundAssetDropped:k.onPropertySoundAssetDropped,addPropertySound:k.addPropertySound,importFontFile:k.importFontFile,getFonts:k.getFonts,onFontFileDropped:k.onFontFileDropped,editTextFile:k.editTextFile,editPuppetTextureChannels:k.editPuppetTextureChannels,removePuppetWarp:k.removePuppetWarp,genericSceneAction:k.genericSceneAction,genericWebAction:k.genericWebAction,navigateUp:k.navigateUp,editBoneAnimationConstraints:k.editBoneAnimationConstraints,puppetAnimationListCtrl:Fe,instanceAnimationListCtrl:je,puppetPoseListCtrl:Ve,instanceVertexIslandCtrl:Le,puppetClippingMaskCtrl:ze,instanceBlendShapesCtrl:$e,instanceExpressionsCtrl:He,instanceCameraPathsListCtrl:Ue,instanceBoneMultiSelectCtrl:Ge,getProject:function(){return k.project}},k.particleDefaultPresets=[{label:"ui_editor_particle_example_basic",value:"assets/particles/example.json"},{label:"ui_editor_particle_example_cursor_follow",value:"assets/particles/examplecursorfollow.json"},{label:"ui_editor_particle_example_cursor_avoid",value:"assets/particles/examplecursoravoid.json"},{label:"ui_editor_particle_example_turbulence",value:"assets/particles/exampleturbolence.json"}],k.particleDefaultPresets3d=[{label:"ui_editor_particle_example_basic",value:"assets/particles/example3d.json"},{label:"ui_editor_particle_example_turbulence",value:"assets/particles/exampleturbolence3d.json"}],k.$watch("project.data",function(e,t){var i,n;r&&e!==t&&(k.isRunningScriptPreview||k.waitForScriptToggle?(i={},n=t&&t.general&&t.general.properties,t=e&&e.general&&e.general.properties,angular.forEach(t,function(e,t){var a=n&&n[t];a&&a.value!==e.value&&(i[t]=e)}),E.callEditor("applyTemporaryProjectData",angular.toJson({general:{properties:i}}))):(E.callEditor("saveProjectData",angular.toJson(e)),D(e)))},!0),k.$watch("project.scenegeneraldata",function(e,t){r&&e!==t&&E.callEditor("saveSceneGeneralData",angular.toJson(e))},!0);var at=["puppetgeometry","puppetskeleton","puppetweights","puppetsingleanimation"],it={};k.$watch("selectedResource.item",function(e,t){var a,i,n;e&&t&&(e.key!==t.key||e.id!==t.id)&&fe("navigateProperty"),angular.isObject(e)&&angular.isDefined(e.id)?(i=e,n=t,!d&&angular.isObject(n)&&(l.push(n),c.empty()||p||c.pop()!==i&&(c=[])),Ce(e),i=k.selectedResource.stack.map(function(e){return{key:e.key,id:e.id}}),E.callEditor("setSelectedRenderable",e.id,e.key,angular.toJson(i)),k.selectedResource.visible=[e],angular.isObject(e.next)&&k.selectedResource.visible.push(Ee(e.next.id,e.next.key)),Se(e),A+=1,k.keyDisableScriptPreview=at.includes(e.key),e&&["puppetdeformation","puppettopology","puppetblendshape"].includes(e.key)?k.gizmoContext="puppetgeometry":delete k.gizmoContext,S(function(){switch(--A,e.key){case"puppet":s&&E.callEditor("genericSceneAction","checkImageSuitableForPuppetWarp",e.id).then(function(e){e||(C.open("genericConfirm",{data:{title:"ui_editor_properties_geometry_warning_title",message:"ui_editor_properties_geometry_warning_body",leftIcon:"images/warning.png",okVisible:!0}}),s=!1)});break;case"puppetsingleanimation":We(e);break;case"camerapath":!function(t){fe();var a,e,i,n,o,r,s,l,c,d="animation_"+t.id+"_"+t.key,p=0;function u(){a=Ee(t.id,t.key)}function g(t){if(u(),a&&a.properties)return a.properties.find(function(e){return e.key===t})}function f(e){n?(angular.forEach(e,function(t){o.findAndRemove(function(e){return e.property.key===t.property.key&&e.property.channel===t.property.channel})}),o=o.concat(e)):(n=!0,e=e.map(function(e){return{key:e.property.key,keyframes:e.keyframes,channel:parseInt(e.channel.substr(1))}}),E.callEditor("genericSceneAction","cameraPathSave",t.id,e).then(function(){var e;n=!1,0<o.length&&(e=o,o=[],f(e))}))}function m(){r.ctrl&&r.ctrl.performSavePendingProperties&&r.ctrl.performSavePendingProperties(),0<i.length&&f(i),i=[]}function v(){return A+(k.lastPropertyChangeNotSaved?1:0)}function h(e){var t=[];if(angular.isString(e))for(t=e.split(" ").map(function(e){return parseFloat(e)});t.length<3;)t.push(0);else angular.isNumber(e)&&(t=[e]);return t}function b(){r.properties=a.properties.filter(e=>l.includes(e.key))}u(),k.endModalAction=function(){var e=k.layoutCtrl.findWindow(d);return e&&k.layoutCtrl.removeWindow(e),E.callEditor("genericSceneAction","cameraExitPOVPath",t.id),!0},a&&(e=t.autoShowOptions,delete t.autoShowOptions,n=!(i=[]),o=[],r=k.$new(),s=k.$watch(v,function(e,t){0===e&&0<t&&m()}),(Re[d]=r).ctrl={getCurrentPropertyValues:function(e){e=g(e.key);return h(e&&e.value)},isEditingLocked:function(){return 0<p||k.waitForScriptToggle},getCurrentPreviewValue:function(e){if(!(0<p||k.waitForScriptToggle)){e=g(e.key);if(!angular.isDefined(e))return h();e=e&&e.previewvalue;return e&&h(e)}},savePropertyKeyframes:function(e){e=angular.copy(e),angular.forEach(e,function(e){e=g(e.property.key);e&&(e.previewvalue=e.value)}),0<v()?angular.forEach(e,function(t){var a=!1;angular.forEach(i,function(e){e.property.key===t.property.key&&e.channel===t.channel&&(a=!0,e.keyframes=t.keyframes)}),a||i.push(t)}):f(e)},saveAnimationOptions:function(e){E.callEditor("genericSceneAction","cameraPathSaveOptions",t.id,e)},setPreviewFrame:function(e){m();e={frame:e,id:a.id,key:a.key};E.callEditor("setAnimationPreviewFrame",e)},setPreviewPlayback:function(e){e&&r.ctrl.setPreviewFrame(0);e={play:e,id:a.id,key:a.key};++p,E.callEditor("setAnimationPreviewPlayback",e).then(function(){--p})},getMode:function(){return"camerapath"},openCallback:function(){e&&angular.isFunction(r.ctrl.openAnimationOptions)&&r.ctrl.openAnimationOptions()}},r.options={length:10,fps:10,mode:"single",wraploop:!1},r.editorSettings=k.editorSettings,r.properties=[],angular.forEach(a.properties,function(e){switch(e.key){case"length":case"fps":case"wraploop":case"mode":case"events":r.options[e.key]=e.value}}),l=["center","eye","up","zoom","fov"],c=k.$on("rebuildAnimationCurves",b),r.$on("undoRedoBegin",function(){++p}),r.$on("undoRedoPerformed",function(){u(),b(),--p}),b(),++p,w('<div class="editorLayoutPanel editorAnimation"><curve-editor ce-source-properties="properties" ce-options="options" ce-ctrl="ctrl" ce-editor-settings="editorSettings"></curve-editor><div class="editorScriptBlockOverlay" ng-if="isRunningScriptPreview || waitForScriptToggle"></div></div>')(r,function(e){r.close=function(){k.layoutCtrl.removeWindow(e),k.navigateUp()},r.onClosed=function(){r.ctrl.performSavePendingProperties(),delete Re[d],r.ctrl.setPreviewFrame(-1),s(),c()};k.layoutCtrl.insertWindow(e,r,{tag:d,icon:"fas fa-fw fa-play-circle",title:"ui_editor_pane_header_camera_path_editor",titleClass:"editorAnimationTitle",noPadding:!0,parentTag:"preview",parentSplitOrientation:"vertical",closeFunction:function(){r.close()}})}),S(function(){--p}))}(e)}}),e.id===(t&&t.id)&&e.key===(t&&t.key)||(a=angular.element(document.getElementById("SelectedResourcePropertyList")),t&&(it[t.key.toString()+t.id.toString()]=a.scrollTop()),S(function(){a.scrollTop(it[e.key.toString()+e.id.toString()]||0)})),S(function(){k.$broadcast("rzSliderForceRender")},50)):k.selectedResource.stack.length=0}),k.$watch("paintOptions",function(e,t){angular.isObject(e)&&e!==t&&E.callEditor("updatePaintOptions",e)},!0),k.$on("onCppInit",function(e,t){t&&(k.editorSettings.showassetcreation=!0,k.editorSettings.hasacceptedassetsharingtos=!0,k.isDebugRuntime=!0,O("D:/dev/we/windows/bin/projects/myprojects/particlecreator/project.json"),S(function(){},2e3));k.tooltips={},angular.forEach([["ui_editor_gizmo_translate","V"],["ui_editor_gizmo_rotate","C"],["ui_editor_gizmo_scale","X"],["ui_editor_gizmo_multi","Y"],["ui_editor_gizmo_local_space","n"],["ui_editor_gizmo_world_space","m"]],function(t){x(t[0]).then(function(e){k.tooltips[t[0]]=e+" ("+t[1]+")"})})}),k.$on("$destroy",function(){e.off("keydown.editor.undo"),e.off("keydown.editor.previewexit")}),k.colorPickerOptions=P.getColorPickerDefaults(),k.editorSettings={previewratio:"free",scriptconsoleautoscroll:!0,suggestimportresolution:!0,autosavingenabled:!0,showstatsmode:"auto",cameracursorspeed2d:10,cameracursorspeed3d:10},k.editorTemp={previewphone:!1,previewaspect:"free"},k.editorLayoutClass="editorLayoutSimple",k.selectedResource={item:void 0,visible:[],stack:[]},k.colorPickerSettings=P.getColorPickerDefaults(),k.layoutCtrl={},k.showSimpleLayout(),k.paintOptions={enabled:!1,value:0,color:"1 1 1",size:40,opacity:100,hardness:50,mode:"opacitymask",showmask:!1,showshading:!1,maskopacity:50,wireframeopacity:10,brushtype:"",angle:0},k.paintMouseHandler={fnMouseDown:function(e){return Ze(),function(e){if(k.paintOptions.enabled&&(e.ctrlKey||e.shiftKey||e.altKey))return Ke.ctrl=e.ctrlKey,Ke.shift=e.shiftKey,Ke.alt=e.altKey,Ke.key=e.which,Ke.size=k.paintOptions.size,Ke.opacity=k.paintOptions.opacity,Ke.hardness=k.paintOptions.hardness,Ke.offset={left:e.offsetX,top:e.offsetY},!0}(e)},fnMouseUp:function(){Ke.ctrl=!1,Ke.shift=!1,Ke.alt=!1},fnMouseMove:function(e){if(k.paintOptions.enabled&&(Ke.ctrl||Ke.shift||Ke.alt)){var t=e.offsetX-Ke.offset.left,a=e.offsetY-Ke.offset.top;return Ke.ctrl&&Ke.shift?(k.paintOptions.hardness=Math.round(Ke.hardness+.25*t),k.paintOptions.hardness=Math.min(100,Math.max(0,k.paintOptions.hardness))):Ke.ctrl?(k.paintOptions.size=Math.round(Ke.size+t),k.paintOptions.size=Math.min(9999,Math.max(1,k.paintOptions.size)),k.paintOptions.hardness=Math.round(Ke.hardness+.25*a),k.paintOptions.hardness=Math.min(100,Math.max(0,k.paintOptions.hardness))):Ke.shift?(k.paintOptions.opacity=Math.round(Ke.opacity+.25*t),k.paintOptions.opacity=Math.min(100,Math.max(1,k.paintOptions.opacity))):Ke.alt&&E.callEditor("scenePaintOverrideMove",{x:e.offsetX,y:e.offsetY,key:Ke.key}),window.safeApply(k),!0}},fnMouseWheel:Ze,fnKeyDown:function(e){if(k.paintOptions.enabled)switch(e.which){case 76:return k.paintOptions.showmask=!1,k.setPaintShowShading(!k.getPaintShowShading()),!0;case 77:return k.setPaintShowShading(!1),k.paintOptions.showmask=!k.paintOptions.showmask,!0;case 73:return k.maskEyeDropperActive?k.endMaskEyeDropper():k.startMaskEyeDropper(),!0}else switch(e.which){case 89:return"puppetgeometry"===k.gizmoContext?k.setGizmoGeometryMode("none"):k.setGizmoMode("multi"),!0;case 88:return"puppetgeometry"===k.gizmoContext?k.setGizmoGeometryMode("scale"):k.setGizmoMode("scale"),!0;case 67:return"puppetgeometry"===k.gizmoContext?k.setGizmoGeometryMode("rotate"):k.setGizmoMode("rotate"),!0;case 86:return"puppetgeometry"===k.gizmoContext?k.setGizmoGeometryMode("translate"):k.setGizmoMode("translate"),!0;case 78:return k.setGizmoOrientation("world"),!0;case 77:return k.setGizmoOrientation("local"),!0}}},k.paintOptionsSliderSize={ceil:2e3,floor:1,customValueToPosition:function(e,t,a){return((e=Math.log(e))-(t=Math.log(t)))/((a=Math.log(a))-t)},customPositionToValue:function(e,t,a){return t=Math.log(t),a=Math.log(a),Math.exp(e*(a-t)+t)}},k.nativeDropOptions={previewExtension:""},k.animationCtrl={},k.userPropertyPreviewCtrl={reload:function(){}},k.toggleShowGrid=oe,k.toggleShowSelectionBox=re,k.toggleShowStats=function(){"always"===k.editorSettings.showstatsmode?k.editorSettings.showstatsmode="auto":k.editorSettings.showstatsmode="always"},k.toggleShowItemBinding=se,E.setCallErrorSuppressed("validateVideoFile",!0),n.$on("$translateChangeEnd",g),g()}]),angular.module("wallpaperbrowserApp").directive("filemenu",["$timeout","$translate",function(e,p){return{templateUrl:"views/templates/filemenu.html",restrict:"E",scope:{fmItems:"=",fmData:"=",fmDisabled:"="},link:function(n,t){var o,r=0;function s(e){var t=angular.element(document.createElement("span"));return t.addClass(e),t}function l(e,t){function a(e){i.text(e)}var i=angular.element(document.createElement("div"));return p(e).then(a).catch(a),angular.isDefined(t)&&i.addClass(t),i}function c(t){var a,i=angular.element(document.createElement("button"));return i.addClass("btn"),angular.isDefined(t.icon)&&i.append(s(t.icon+" pull-left itemIcon")),i.append(l(t.label,"item")),i.click(function(e){return i.hasClass("disabled")?(e.stopPropagation(),void e.currentTarget.blur()):void(angular.isFunction(t.fn)&&(t.fn(t),n.$apply()))}),t.disabled&&i.addClass("disabled"),t.binding&&((a=s("glyphicon glyphicon-ok pull-left")).css({visibility:"visible","margin-right":10}),i.prepend(a),i.on("filemenu.resfresh",function(){var e=t.value===n.fmData[t.binding];a.css({visibility:e?"visible":"hidden"})})),i}function d(e,t){var a,i=angular.element(document.createElement("div"));return i.addClass("btn filemenuNestedIndicatorElement"),i.append(l(t.label,"item")),i.append(s("glyphicon glyphicon-triangle-right")),i.click(function(e){e.stopPropagation()}),e.append(i),t.disabled?i.addClass("disabled"):(e.append((t=t.children,(a=angular.element(document.createElement("ul"))).addClass("dropdown-menu to-right nested"),angular.forEach(t,function(e){var t=angular.element(document.createElement("li"));e.label?(e=c(e),t.append(e)):t.addClass("separator"),a.append(t)}),a)),e.mouseover(function(){e.addClass("open")}),e.mouseout(function(){e.removeClass("open")})),i}n.onMouseOver=function(e){0<r&&o!==e.target&&(e=angular.element(e.target)).dropdown("toggle")},n.$watch("fmItems",function(n){o=void 0,e(function(){var e=t.find(".btn-group"),i=0;angular.forEach(e,function(e){(e=angular.element(e)).off("show.bs.dropdown"),e.off("hide.bs.dropdown"),e.on("show.bs.dropdown",function(){++r,o=e.children(".dropdown-toggle")[0],e.find("button").trigger("filemenu.resfresh")}),e.on("hide.bs.dropdown",function(){--r});var a,t=n[i++].children;e.children("ul").remove(),e.append((t=t,(a=angular.element(document.createElement("ul"))).addClass("dropdown-menu"),angular.forEach(t,function(e){var t;e.hidden||(t=angular.element(document.createElement("li")),angular.isString(e.label)?angular.isArray(e.children)?d(t,e):t.append(c(e)):t.addClass("separator"),a.append(t))}),a))})})})}}}]);var _linkedSliderUpdateTimer,_inputUpdateTimer,openSteamDownloads,_preventModalClose=!1;angular.element(document).on("keydown",function(e){27===e.which&&_preventModalClose&&(e.stopPropagation(),e.preventDefault()),13===e.which&&(document.activeElement&&["INPUT","TEXTAREA","BUTTON"].includes(document.activeElement.nodeName)&&!document.activeElement.classList.contains("ignoreModalFocus")||_preventModalClose||(e.stopPropagation(),e.preventDefault(),(e=(e=angular.element(".modal-footer")[0])&&angular.element(e).find(".btn-primary")[0])&&!e.disabled&&angular.element(e).click()))}),angular.module("wallpaperbrowserApp").service("modals",["$q","$rootScope","$timeout","$uibModal",function(i,o,r,s){var l=0,n=this;this.open=function(e,t,a){var i={animation:!0,backdrop:"static",backdropClass:a&&a.backdropClass,resolve:t};switch(e){case"editorWelcome":i.templateUrl="views/modals/editorwelcomemodal.html",i.controller="EditorWelcomeModalCtrl";break;case"editorOpenWallpaper":i.templateUrl="views/modals/editoropenwallpapermodal.html",i.controller="EditorOpenWallpaperModalCtrl",i.windowClass="modal-dialog-full";break;case"editorSteamPublish":i.templateUrl="views/modals/editorsteampublishmodal.html",i.controller="EditorSteamPublishModalCtrl",i.size="lg";break;case"editorImportModel":i.templateUrl="views/modals/editorimportmodelmodal.html",i.controller="EditorImportModelModalCtrl",i.windowClass="modal-dialog-allow-overflow",i.size="mlg";break;case"editorProjectSettings":i.templateUrl="views/modals/editorprojectsettingsmodal.html",i.controller="EditorProjectSettingsModalCtrl",i.size="slg";break;case"editorTemplateWizard":i.templateUrl="views/modals/editortemplatewizardmodal.html",i.controller="EditorTemplateWizardModalCtrl";break;case"editorWorkshopRules":i.resolve={data:{}},i.templateUrl="views/modals/editorworkshoprules.html",i.controller="EditorWorkshopRulesModalCtrl";break;case"editorEffectList":i.templateUrl="views/modals/editoreffectlistmodal.html",i.controller="EditorEffectListModalCtrl",i.size="xlg";break;case"editorParticleEditor":i.templateUrl="views/modals/editorparticleeditormodal.html",i.controller="EditorParticleEditorModalCtrl",i.size="xlg";break;case"editorModelEditor":i.templateUrl="views/modals/editormodeleditormodal.html",i.controller="EditorModelEditorModalCtrl",i.size="xlg";break;case"editorMaterials":i.templateUrl="views/modals/editormaterialsmodal.html",i.controller="EditorMaterialsModalCtrl",i.windowClass="modal-dialog-full";break;case"editorRating":i.templateUrl="views/modals/editorratingmodal.html",i.controller="EditorRatingModalCtrl",i.size="mlg";break;case"editorUserProperties":i.templateUrl="views/modals/editoruserpropertiesmodal.html",i.controller="EditorUserPropertiesModalCtrl";break;case"editorUserPropertyDetails":i.templateUrl="views/modals/editoruserpropertydetailsmodal.html",i.controller="EditorUserPropertyDetailsModalCtrl";break;case"editorSelectAssets":i.templateUrl="views/modals/editorselectassetsmodal.html",i.controller="EditorSelectAssetsModalCtrl";break;case"editorAnimationOptions":i.templateUrl="views/modals/editoranimationoptionsmodal.html",i.controller="EditorAnimationOptionsModalCtrl";break;case"editorAnimationEvents":i.templateUrl="views/modals/editoranimationeventsmodal.html",i.controller="EditorAnimationEventsModalCtrl";break;case"editorAnimationHelp":i.templateUrl="views/modals/editoranimationhelpmodal.html",i.controller="GenericConfirmModalCtrl";break;case"editorBoneConstraints":i.templateUrl="views/modals/editorboneconstraintsmodal.html",i.controller="EditorBoneConstraintsModalCtrl";break;case"editorBoneBlendRules":i.templateUrl="views/modals/editorboneblendrulesmodal.html",i.controller="EditorBoneBlendRulesModalCtrl";break;case"editorSettings":i.templateUrl="views/modals/editorsettingsmodal.html",i.controller="EditorSettingsModalCtrl";break;case"editorDeleteUploads":i.templateUrl="views/modals/editordeleteuploadsmodal.html",i.controller="EditorDeleteUploadsModalCtrl",i.windowClass="modal-dialog-full";break;case"editorCharacterSeparation":i.templateUrl="views/modals/editorcharacterseparationmodal.html",i.controller="EditorCharacterSeparationModalCtrl",i.windowClass="modal-dialog-full";break;case"editorExpressionMatrix":i.templateUrl="views/modals/editorexpressionmatrixmodal.html",i.controller="EditorExpressionMatrixModalCtrl";break;case"editorBlendShapeSettings":i.templateUrl="views/modals/editorblendshapesettingsmodal.html",i.controller="EditorBlendShapeSettingsModalCtrl";break;case"editorExport":i.templateUrl="views/modals/editorexportmodal.html",i.controller="EditorExportModalCtrl";break;case"editorEula":i.templateUrl="views/modals/editoreulamodal.html",i.controller="EditorEULAModalCtrl";break;case"editorCleanProject":i.templateUrl="views/modals/editorcleanproject.html",i.controller="EditorCleanProjectModalCtrl";break;case"editorSystemResources":i.templateUrl="views/modals/editorsystemresourcesmodal.html",i.controller="EditorSystemResourcesModalCtrl";break;case"openFromUrl":i.templateUrl="views/modals/openfromurlmodal.html",i.controller="OpenFromUrlModalCtrl";break;case"changelog":i.templateUrl="views/modals/settingschangelogmodal.html",i.controller="SettingsChangelogModalCtrl",i.size="lg";break;case"settingsPerApplication":i.templateUrl="views/modals/settingsperapplicationmodal.html",i.controller="SettingsPerApplicationModalCtrl";break;case"settingsHotkeys":i.templateUrl="views/modals/settingshotkeysmodal.html",i.controller="SettingsHotkeysModalCtrl";break;case"settingsPlugin":i.templateUrl="views/modals/settingspluginmodal.html",i.controller="SettingsPluginModalCtrl";break;case"settingsMediaBlocklist":i.templateUrl="views/modals/settingsmediablocklistmodal.html",i.controller="SettingsMediaBlocklistCtrl";break;case"settingsManageMonitors":i.templateUrl="views/modals/settingsmanagemonitorsmodal.html",i.controller="SettingsManageMonitorsCtrl";break;case"browseCollections":i.templateUrl="views/modals/browsecollectionsmodal.html",i.controller="BrowseCollectionsModalCtrl";break;case"browsePlaylistSettings":i.templateUrl="views/modals/browseplaylistsettingsmodal.html",i.controller="BrowsePlaylistSettingsModalCtrl";break;case"browseSplitMonitor":i.templateUrl="views/modals/browsesplitmonitormodal.html",i.controller="BrowseSplitMonitorModalCtrl";break;case"browseWallpaperSharePreset":i.templateUrl="views/modals/browsewallpapersharepresetmodal.html",i.controller="BrowseWallpaperSharePresetModalCtrl";break;case"browseWallpaperWorkshopInfo":i.templateUrl="views/modals/browsewallpaperworkshopinfomodal.html",i.controller="BrowseWallpaperWorkshopInfoModalCtrl";break;case"browseReport":i.templateUrl="views/modals/browsereportmodal.html",i.controller="BrowseReportModalCtrl";break;case"browseExploreCreateQuery":i.templateUrl="views/modals/browseexplorecreatequerymodal.html",i.controller="BrowseExploreCreateQueryModalCtrl";break;case"browseAssignHotkey":i.templateUrl="views/modals/browseassignhotkey.html",i.controller="BrowseAssignHotkeyModalCtrl";break;case"browseSetDefaults":i.templateUrl="views/modals/browsesetdefaultsmodal.html",i.controller="BrowseSetDefaultsModalCtrl";break;case"browseResolutionSettings":i.templateUrl="views/modals/browseresolutionsettingsmodal.html",i.controller="BrowseResolutionSettingsModalCtrl";break;case"browseMobileUpload":i.templateUrl="views/modals/browsemobileuploadmodal.html",i.controller="BrowseMobileUploadModalCtrl",i.size="mlg";break;case"browseMobilePermissionsMissing":i.templateUrl="views/modals/browsemobilepermissionsmissing.html",i.controller="GenericConfirmModalCtrl";break;case"browseAssignUserShortcut":i.templateUrl="views/modals/browseassignusershortcut.html",i.controller="BrowseAssignUserShortcutModalCtrl";break;case"genericConfirm":i.templateUrl="views/modals/genericconfirmmodal.html",i.controller="GenericConfirmModalCtrl";break;case"ageGate":i.templateUrl="views/modals/agegatemodal.html",i.controller="AgeGateModalCtrl";break;case"dlcPrompt":i.templateUrl="views/modals/dlcpromptmodal.html",i.controller="DLCPromptModalCtrl";break;case"queryWorkshop":i.templateUrl="views/modals/queryworkshopmodal.html",i.controller="QueryWorkshopModalCtrl",i.windowClass="modal-dialog-flex"}function n(){_preventModalClose=!1,r(function(){o.$broadcast("previewtoggle",-1)},350),o.$broadcast("modalVisible",--l)}a&&a.size&&(i.size=a.size);a=s.open(i);return a.opened.then(function(){o.$broadcast("previewtoggle",1),o.$broadcast("modalVisible",++l)}),a.result.then(n).catch(n),a.result},this.setPreventModalClose=function(e){_preventModalClose=e},this.showHighPriorityWarning=function(e,t){var a=i.when();return a=e&&!t.hasshownhighprioritywarning?n.open("genericConfirm",{data:{title:"ui_settings_highpriority_warning_header",message:"ui_settings_highpriority_warning",okVisible:!0,cancelVisible:!0}}).then(function(){t.hasshownhighprioritywarning=!0}):a},this.isAnyModalVisible=function(){return 0<l}}]),angular.module("wallpaperbrowserApp").controller("EditorWelcomeModalCtrl",["$timeout","$translate","$uibModalInstance","$rootScope","$scope","modals","host","utils","editorScope","options",function(e,i,t,a,n,o,r,s,l,c){function d(){n.templates=[],r.callEditor("getTemplates",void 0).then(function(e){n.templates=e})}function p(e){var t=n.project;r.callEditor("getDominantColorFromFile",e).then(function(e){t.schemecolor=e.schemecolor})}n.resize={},n.ok=function(){r.setCallErrorSuppressed("createNewProject",!0),r.callEditor("createNewProject",angular.toJson(n.project),n.resize.enabled&&n.resize.selected).then(function(e){t.close(e)}).catch(function(e){angular.isString(e)?s.showError(e):angular.isObject(e)&&o.open("genericConfirm",{data:{title:e.title,message:e.body,leftIcon:"images/warning.png",okVisible:!0}})})},n.cancel=function(){t.dismiss("cancel")},n.openPage=function(e){n.project={schemecolor:"0 0 0"};var t=s.getWallpaperTypeIcon(e.capitalizeFirstLetter());switch(e){case"scene":n.newTitle="ui_editor_welcome_modal_new_scene_wallpaper";break;case"templates":n.newTitle="ui_editor_welcome_modal_new_template_wallpaper",n.project.resolution={width:1920,height:1080},d();break;case"video":n.newTitle="ui_editor_welcome_modal_new_video_wallpaper";break;case"web":n.newTitle="ui_editor_welcome_modal_new_web_wallpaper";break;case"application":n.newTitle="ui_editor_welcome_modal_new_application_wallpaper"}n.project.type=e,n.page=e,n.pageIcon=t,n.project.template=""},n.importFile=function(){r.callEditor("importFile").then(function(e){n.fileDropped(e)})},n.openRecent=function(e){t.close(e)},n.openProjects=function(){t.close({action:"openProjects"})},n.openWiki=function(){s.openUrl(s.url.docs)},n.fileDropped=function(t){var e,a=s.getFilename(t,!0)||"New Wallpaper";s.isExtension(t,"video")?r.callEditor("validateVideoFile",t).then(function(){n.openPage("video"),n.project.type="video",n.project.file=t,n.project.title=a,p(t)}).catch(function(e){l.showVideoSizeError(t,e)}):s.isExtension(t,"texture")?(n.openPage("scene"),n.project.type="scene2d",n.project.file=t,n.project.title=a,r.callEditor("checkBadGIF",t).then(function(e){e.error&&s.displayGifWarning()}),p(t),e=t,n.resize.visible=!1,r.callEditor("getResizeRecommendationsFromFile",e).then(function(e){var a;0!==e.options.length&&(n.resizeHintValues={width:e.width,height:e.height},n.resize.selected=e.options[0].value,n.resize.visible=!0,n.resize.enabled=e.enabled&&c.suggestResizeResolution,n.resize.showHint=e.enabled,n.resize.hint=e.portraitwarning?"ui_editor_welcome_modal_resize_alert_portrait":"ui_editor_welcome_modal_resize_alert",n.resize.hintClass=e.portraitwarning?"alert-danger":"alert-info",a=!0,n.resizeOptions=e.options.map(function(e){var t=i.instant(e.group)+": "+s.translateTagInstant(e.value);return a&&(a=!1,t+=" "+i.instant("ui_editor_welcome_modal_resize_recommended")),{value:e.value,label:t}}))})):s.isExtension(t,"model")?(n.openPage("scene"),n.project.type="scene3d",n.project.file=t,n.project.title=a):s.isExtension(t,"web")?r.callEditor("getImportFileList",t).then(function(e){n.openPage("web"),n.project.file=t,n.project.type="web",n.project.filelist=e,n.project.title=a}):s.isExtension(t,"application")&&r.callEditor("getImportFileList",t).then(function(e){n.openPage("application"),n.project.file=t,n.project.type="application",n.project.filelist=e,n.project.title=a})},n.$watch("project.template",function(t){n.currentPreview=void 0,angular.isString(t)&&angular.forEach(n.templates,function(e){e.value===t&&angular.isString(e.preview)&&(n.currentPreview="file://"+e.preview)})}),n.colorPickerOptions=s.getColorPickerDefaults(),n.project={},n.editorScope=l,n.smallDialog=0,n.title=c.smallDialog?"ui_editor_welcome_modal_title_new":"ui_editor_welcome_modal_title_welcome",n.supportedFileTypes=".jpeg, .png, .tga, .gif, .mp4, .html, .obj, .fbx",r.callEditor("getProjects",!0).then(function(e){n.showOpenBtn=0<e}),s.canUploadApplications()&&(n.supportedFileTypes+=", .exe"),n.recentFileDetails=[],angular.isArray(l.editorSettings.recentfiles)&&r.callEditor("getWallpaperDetails",l.editorSettings.recentfiles).then(function(e){n.recentFileDetails=e}),c.autoImportFile&&e(function(){n.fileDropped(c.autoImportFile)})}]),angular.module("wallpaperbrowserApp").service("host",["$q","$http","$timeout","$translate","$httpParamSerializer","modals","utils",function(c,s,t,a,l,r,d){var e,p,u=this,g={};this.setCallErrorSuppressed=function(e,t){g[e+"Callback"]=t},this.callDeferred=function(e,t){for(var a=c.defer(),i=[],n=2;n<arguments.length&&!angular.isUndefined(arguments[n]);++n)i.push(arguments[n]);var o=t;"genericSceneAction"===o&&2<arguments.length?o+="_"+arguments[2]:"modelAction"===o&&3<arguments.length&&(o+="_"+arguments[3]);function r(){window[s]=void 0,window[l]=void 0}var s=o+"Callback",l=o+"CallbackError";return window[s]=function(){r(),a.resolve.apply(null,arguments)},window[l]=function(){r(),!g[s]&&arguments[0]&&d.showError(arguments[0]),a.reject.apply(null,[1<arguments.length?arguments[1]:void 0])},window[e][t].apply(window[e],i),a.promise},this.callEditor=function(e){for(var t=["editorObject",e],a=1;a<arguments.length;++a)t.push(arguments[a]);return this.callDeferred.apply(null,t)},this.callUI=function(e){for(var t=["ui",e],a=1;a<arguments.length;++a)t.push(arguments[a]);return this.callDeferred.apply(null,t)},this.logError=function(e){window.ui&&window.ui.logError&&window.ui.logError(e)},this.getVirtualKeyNames=function(){return e=angular.isUndefined(e)?u.callDeferred("ui","getVirtualKeyNames"):e},this.selectExternalApp=function(e,t,a){return u.callEditor("selectExternalApp",e).then(function(e){a[t]=e})},this.promptExternalApp=function(e,t,a,i,n,o){return u.callEditor("checkExternalApp",e[t]).catch(function(){return r.open("genericConfirm",{data:{title:n||"ui_editor_external_app_not_found_title",message:o||"ui_editor_external_app_not_found_body",labelValues:{name:a},okVisible:!0}}).then(function(){return u.selectExternalApp(i,t,e)}).then(function(){u.callEditor("saveEditorSettings",angular.toJson(e))})})};var f=0;this.sendRequestWithSteamAuth=function(a,i,n){function o(){if(p)return e=c.defer(),a.listeners.push(function(){e.resolve()}),e.promise;var e,t=c.defer();return a.ticket="",a.listeners.push(function(){p=void 0,t.resolve()}),p=u.callDeferred("ui","refreshAuthToken"),t.promise}function r(e){var t=e||c.defer(),e=l({steamauthticket:a.ticket});return s.post(i+"?"+e,n).then(function(e){t.resolve(e)}).catch(function(e){return 3<f?void t.reject(e):(++f,console.error("steam rejected user ticket."),o().then(function(){r(t)}))}),t.promise}var e=c.when();return(e=!a.ticket||0===a.ticket.length?o():e).then(r)},this.getWorkshopUrl=function(e){return e.workshopid?"https://steamcommunity.com/sharedfiles/filedetails/?id="+e.workshopid:void 0};var i=!0;this.copyWorkshopUrl=function(e){e=u.getWorkshopUrl(e);e&&u.callDeferred("ui","copyToClipboard",e).then(function(){i&&(i=!1,t(function(){i=!0},3e3),a("ui_browse_details_toast_url_copied").then(function(e){d.showSuccess(e)}))})},this.wpxAPIBackendUrl="https://www.wallpaperengineapi.com:3000";var n=!1,o=!1;this.wpxAPISetDev=function(){this.wpxAPIBackendUrl="http://localhost:3000",n=!0},this.wpxAPIGet=function(e){function t(){s.get("http://85.214.114.121:2999"+e,{timeout:6e3}).then(function(e){o=!0,a.resolve(e)}).catch(function(e){a.reject(e)})}var a=c.defer();return o?t():s.get(u.wpxAPIBackendUrl+e,{timeout:6e3}).then(function(e){a.resolve(e)}).catch(function(e){n?a.reject(e):t()}),a.promise},this.isAPIDNSBlocked=function(){return o}}]),angular.module("wallpaperbrowserApp").directive("treeView",["$translate","$timeout","dragdrop",function($,e,H){return{restrict:"E",scope:{tvData:"=",tvMode:"=",tvSelectedItem:"=",tvDragDropEnabled:"=",tvDragDropTag:"@",tvMultiSelectMode:"@",tvRemoveClicked:"&",tvElementDragged:"&",tvElementSelected:"&",tvElementDoubleClicked:"&",tvNewElementAdded:"&",tvSendAssetPropertyChange:"&",tvContextMenu:"&",tvValidateParent:"&",tvShowError:"&",tvShowButtons:"=",tvDefaultSelection:"="},link:function(w,k,x){var a,l,i,n,s="treeViewDirectoryInvisible",S=[],t=k,C="directory"===w.tvMode,E=-1,r=!1,P=!1,e=angular.element(document.createElement("div"));function M(){return"scene"===w.tvMode||"sceneHierarchy"===w.tvMode}function A(){return"sceneHierarchy"===w.tvMode}function T(){return"enabled"===w.tvMultiSelectMode||"full"===w.tvMultiSelectMode||"always"===w.tvMultiSelectMode}function O(){return"deselect"===w.tvMultiSelectMode||"full"===w.tvMultiSelectMode}function I(e){e.preventDefault(),e.stopPropagation()}function R(e){angular.isFunction(e.unregisterNameWatcher)&&e.unregisterNameWatcher(),angular.isFunction(e.unregisterVisibilityWatcher)&&e.unregisterVisibilityWatcher(),angular.isFunction(e.unregisterLockWatcher)&&e.unregisterLockWatcher()}function h(e){if(A()&&angular.isArray(e))for(var t=[],a=0;a<e.length;++a){var i,n=e[a];n.indentation=0,"0"!==n.parent?t.includes(n.parent)?(i=t.indexOf(n.parent),t.length>i+1&&(t.length=i+1),n.indentation=i+1):(t.push(n.parent),n.indentation=t.length):t=[]}}function o(e,t){t?(T()?a.includes(e)||a.push(e):(angular.isDefined(a)&&a!==e&&o(a,!1),a=e),e.addClass("active")):(T()&&a.findAndRemove(e),e.removeClass("active"))}function c(t){!T()&&angular.isDefined(a)&&o(a,!1),angular.forEach(S,function(e){e[0].item===t&&o(e,!0)})}function d(e,t,a){var i=e[t];if(0<i.indentation){a.indentPositions={};for(var n=i.indentation,o=t+1;o<e.length;++o){var r=e[o];if(0===r.indentation)break;r.indentation<=n&&(a.indentPositions[r.indentation]=!0),r.indentation<i.indentation&&(n=Math.min(n,r.indentation))}}}function D(e,t,a){var i=angular.element(document.createElement("span"));a.indentPositions[e.indentation]?i.addClass("tvBox tvBoxMiddleRight"):i.addClass("tvBox tvBoxTopRight"),t.prepend(i);for(var n=e.indentation-1;0<n;--n){var o=angular.element(document.createElement("span"));a.indentPositions[n]?o.addClass("tvBox tvBoxMiddle"):o.addClass("tvBox tvBoxSpace"),t.prepend(o)}}function p(){for(var e=0;e<(w.tvData&&w.tvData.length);++e)!function e(t,a){for(++a;a<w.tvData.length;){var i=w.tvData[a];if(0===i.indentation)return;i.parent===t.id&&(i.hideElem=!t.vis||t.hideElem),e(i),++a}}(w.tvData[e],e);for(var t=k.children(),a=0;a<t.length;++a)a<w.tvData.length&&w.tvData[a].hideElem?angular.element(t[a]).css({display:"none"}):angular.element(t[a]).css({display:""})}function W(t,e){var a,i;r&&(a=!w.tvData.filter(e=>e.parent===t.id).empty(),i=angular.element(document.createElement("span")),a?((i[0].item=t).vis?i.addClass("tvBox tvBoxCaret fas fa-fw fa-caret-down"):i.addClass("tvBox tvBoxCaret fas fa-fw fa-caret-right"),i.mousedown(window.cancelEventBubble),i.mouseup(window.cancelEventBubble),i.click(e=>{e.stopPropagation(),e.preventDefault(),t.vis?(i.removeClass("fa-caret-down"),i.addClass("fa-caret-right")):(i.removeClass("fa-caret-right"),i.addClass("fa-caret-down")),t.vis=!t.vis,p()}),t.vis?(i.removeClass("fa-caret-right"),i.addClass("fa-caret-down")):(i.removeClass("fa-caret-down"),i.addClass("fa-caret-right"))):i.addClass("tvBox tvBoxCaret fas fa-fw"),e.prepend(i))}function B(){k.find(".tvBox").remove()}function F(e){if(A()){r=!e.filter(e=>"0"!==e.parent).empty();var t={};if(angular.isArray(e))for(var a=k.find(".editorTreeViewSceneGraphBtn"),i=0;i<e.length;++i){d(e,i,t);var n=e[i],o=a.toArray().filter(function(e){return e.item===n});0<n.indentation&&D(n,angular.element(o),t),W(n,angular.element(o))}}}function j(e,t){return t&&t.id?void 0!==e.find(function(e){return e.id===t.id}):e.includes(t)}function u(o,e){var r=angular.element(document.createElement("a")),t=angular.element(document.createElement("span"));t.text($.instant(o.name)),t.addClass("editorTreeViewItemLabel"),r.append(t),r.addClass("btn activeBackHighlight"),C&&r.addClass("treeViewDirectoryListingItem");var a=-1,i=-1,n=-1;if(angular.isArray(o.properties)&&0<o.properties.length){for(var s,l=0;l<o.properties.length;++l){var c=o.properties[l];"name"===c.key?a=l:"visible"===c.key?i=l:"locktransforms"===c.key&&(n=l)}0<=a&&(s=w.$watch(function(){return o&&o.properties&&o.properties[a].value},function(e){angular.isString(e)&&0<e.trim().length?t.text(e):t.text($.instant(o.name))}),r.unregisterNameWatcher=s)}var d,p,u,g,f,m,v=angular.element(document.createElement("span"));v.addClass("editorTreeViewItemIcon"),d=angular.isString(o.icon)?o.icon:"glyphicon glyphicon-file",v.addClass(d),r.prepend(v),r.addClass("editorTreeViewSceneGraphBtn"),M()&&0<=n&&angular.isDefined(x.tvSendAssetPropertyChange)&&(v.on("mousedown",function(e){1===e.which&&(e.preventDefault(),e.stopPropagation(),w.$apply(function(){o.properties[n].value=!o.properties[n].value,w.tvSendAssetPropertyChange({resource:o,property:o.properties[n]})}))}),(g=function(e){var t="fas fa-fw fa-lock warningText";e?(v.removeClass(d),v.addClass(t)):(v.removeClass(t),v.addClass(d))})(o.properties[n].value),g=w.$watch(function(){return o&&o.properties&&o.properties[n].value},g),r.unregisterLockWatcher=g),M()&&0<=i&&angular.isDefined(x.tvSendAssetPropertyChange)&&!1!==w.tvShowButtons&&((p=angular.element(document.createElement("a"))).addClass("editorTreeViewVisibilityButton"),(u=angular.element(document.createElement("span"))).addClass("fas fa-fw fa-eye"),p.append(u),r.append(p),p.on("mousedown",function(e){1===e.which&&(e.preventDefault(),e.stopPropagation(),w.$apply(function(){o.properties[i].value=!o.properties[i].value,w.tvSendAssetPropertyChange({resource:o,property:o.properties[i]})}))}),p.on("click",I),p.on("dblclick",I),f=w.$watch(function(){return{visible:o&&o.properties&&o.properties[i].value,show:o&&o.properties&&!o.properties[i].linkUser}},function(e){u.removeClass("fa-eye fa-eye-slash"),u.addClass(e.visible?"fa-eye":"fa-eye-slash"),p.removeClass("forceVisible"),r.removeClass("treeViewItemFade"),!1===e.visible&&(p.addClass("forceVisible"),r.addClass("treeViewItemFade")),e.show?p.show():p.hide()},!0),r.unregisterVisibilityWatcher=f),M()&&!o.disableRemove&&((g=angular.element(document.createElement("a"))).addClass("editorTreeViewRemoveButton"),(f=angular.element(document.createElement("span"))).addClass("glyphicon glyphicon-remove"),g.append(f),r.append(g),g.on("mousedown",function(e){e.stopPropagation(),w.$apply(function(){w.tvRemoveClicked({item:o}).then(function(e){angular.isNumber(e)||(e=1);for(var t=r.nextAll(),a=0;a<e-1&&a<t.length;++a)t[a].remove();r.remove(),R(r),B(),F(w.tvData)})})})),o.customClass&&r.addClass(o.customClass),A()&&(0<o.indentation&&D(o,r,e),W(o,r));var h=!1,b=!1,_=!1;r[0].item=o,r.on("mousedown",function(e){1===e.which&&(m={x:e.offsetX,y:e.offsetY},h=!0),b="always"===w.tvMultiSelectMode||e.ctrlKey,_=e.shiftKey}),r.on("mouseup",function(){if(h){var e=h=!1;if(M()){if(!T()&&angular.isDefined(w.tvSelectedItem)&&w.tvSelectedItem.item===o)return void(O()&&(w.tvSelectedItem.item=void 0,w.$apply()));if(angular.isDefined(o)){if(T()){var t=_||!b||!j(w.tvSelectedItem,o);if(b&&j(w.tvSelectedItem,o)||O()&&j(w.tvSelectedItem,o)&&1===w.tvSelectedItem.length){var a=w.tvSelectedItem.length;w.tvSelectedItem.findAndRemove(o),e=a!==w.tvSelectedItem.length}else if(t){_||b||(w.tvSelectedItem.length=0),j(w.tvSelectedItem,o)||(w.tvSelectedItem.push(o),e=!0);var i,n=S.indexOf(r);if(_){for(;n<E&&!(++n>=S.length);)i=S[n][0].item,j(w.tvSelectedItem,i)||(w.tvSelectedItem.push(S[n][0].item),e=!0);for(;E<n&&!(--n<0);)i=S[n][0].item,j(w.tvSelectedItem,i)||(w.tvSelectedItem.push(S[n][0].item),e=!0)}E=n}}else w.tvSelectedItem.item!==o&&(e=!0),w.tvSelectedItem.item=o;w.$apply()}}e&&angular.isFunction(w.tvElementSelected)&&(T()?w.tvElementSelected({item:w.tvSelectedItem}):w.tvElementSelected({item:w.tvSelectedItem.item}),w.$apply())}}),r.dblclick(function(){angular.isFunction(w.tvElementDoubleClicked)&&(w.tvElementDoubleClicked({item:o}),w.$apply())}),r.contextmenu(function(e){angular.isFunction(w.tvContextMenu)&&(e.stopPropagation(),e.preventDefault(),w.tvContextMenu({item:o,$event:e}),w.$apply())});function y(){h=!1,H.finish();var e=r.css("opacity");r.css({opacity:.35}),k.addClass("treeViewInHover"),P=!0;var t={onCancelled:function(){r.css({opacity:e}),k.removeClass("treeViewInHover"),P=!1},onDragged:function(){C?r.css({opacity:e}):r.remove(),k.removeClass("treeViewInHover"),P=!1}};H.start(r,o,t,w.tvDragDropTag)}return r.on("mouseleave",function(){h&&w.tvDragDropEnabled&&y()}),r.on("mousemove",function(e){h&&w.tvDragDropEnabled&&5<Math.abs(e.offsetX-m.x)+Math.abs(e.offsetY-m.y)&&y()}),S.push(r),r}function g(e,t,a){if(a=a||{},angular.isArray(t))for(var i=0;i<t.length;++i){var n,o,r=t[i];angular.isArray(r.children)?(n=angular.element(document.createElement("div")),o=function(e,t){var a=angular.element(document.createElement("a")),i=angular.element(document.createElement("span"));return a.text(e),a.addClass("btn btn-default editorTreeViewSceneGraphBtn activeBackHighlight"),a.click(function(){t.toggleClass(s),i.toggleClass("glyphicon-folder-close"),i.toggleClass("glyphicon-folder-open")}),t.addClass("treeViewDirectory "+s),i.addClass("editorTreeViewItemIcon treeViewFolderIcon glyphicon glyphicon-folder-close "),a.prepend(i),a}(" "+r.name,n),e.append(o),e.append(n),g(n,r.children,a)):(d(t,i,a),o=u(r,a),e.append(o))}}function f(e){r=e&&!e.filter(e=>"0"!==e.parent).empty(),angular.forEach(S,function(e){R(e)}),"full"!==w.tvMultiSelectMode&&(E=-1),S=[],k.empty(),a=T()?[]:void 0,h(e),g(k,e),p(),t.off("contextmenu.tvDefaultContextMenu"),t.on("contextmenu.tvDefaultContextMenu",function(e){angular.isFunction(w.tvContextMenu)&&(e.stopPropagation(),e.preventDefault(),w.tvContextMenu({$event:e}),w.$apply())}),T()?angular.forEach(w.tvSelectedItem,function(e){c(e)}):w.tvSelectedItem&&w.tvSelectedItem.item&&(angular.forEach(e,function(e){e&&e.value&&e.value===w.tvSelectedItem.item.value&&(w.tvSelectedItem.item=e)}),c(w.tvSelectedItem.item))}function b(e){for(var t=0;t<w.tvData.length;++t)if(w.tvData[t]===e)return t;return-1}function _(e,t){for(var a=k.children().filter(function(){return l&&this!==l[0]}),i=a.outerHeight(),e=e.pageY-k[0].getBoundingClientRect().top,n=Math.round(e/i),n=Math.min(n,a.length),o=0,r=0,s=0;s<w.tvData.length&&s<n+o;++s)w.tvData[s].hideElem&&++o;for(;s<w.tvData.length&&(s<n+o||w.tvData[s].hideElem);++s)w.tvData[s].hideElem&&++r;return t?(n=Math.min(w.tvData.length-o-r,n),n*=i):(n+=o+r,n=Math.min(w.tvData.length,n)),n}e.addClass("treeViewScroll"),k.append(e),k=e;var m=10,v=18,y=32;function V(e,t){if(!A())return 0;var a=_(e),i=t?[t.id]:[],n=t?w.tvData.indexOf(t):-1;if(0<=n)for(++n;n<w.tvData.length;){var o=w.tvData[n];if(!i.includes(o.parent))break;i.push(o.id),++n}for(var r=a;0<r&&i.includes(w.tvData[r-1].id);)--r;var s=0;for(0<r&&(s=w.tvData[r-1].indentation);a<w.tvData.length&&i.includes(w.tvData[a].id);)++a;var l=a<w.tvData.length?w.tvData[a].indentation:0,c=Math.max(l,s),d=k[0].getBoundingClientRect(),t=d.right-d.left,d=Math.max(0,e.pageX-d.left),c=.7<d/t?s+1:(d=(d-m)/v,Math.max(l,Math.min(c,Math.floor(d))));return c=0<r&&(w.tvData[r-1].hideElem||!w.tvData[r-1].vis)?0:c}function L(e,t,a){var i={parent:"0"};if(!A())return i;var n=V(e,a<w.tvData.length?w.tvData[a]:void 0);if(0<n)if(a===t-1&&0<t&&--t,0<t){for(var o=t-1,r=w.tvData[o];r&&r.indentation!==n-1;)r=0<=--o?w.tvData[o]:void 0;i.parent=r?r.id:"0"}else t<w.tvData.length&&(t=w.tvData[t],i.parent=t.parent);return i}function z(e,t,a,i){if(!A())return 1;for(var n=b(t),o=_(e),r=(a=a||L(e,o,n)).parent;"0"!==r;){if(r===t.id)return;var s=w.tvData.find(e=>e.id===r),r=s&&s.parent||"0"}return!(angular.isFunction(w.tvValidateParent)&&!w.tvValidateParent({item:t,parent:a.parent,errorInfo:i}))}w.$on("$destroy",function(){H.unregisterContainer(t)}),w.$on("renderableNameChanged",f),w.$watch("tvData",function(e,a){var t,i,n;angular.forEach(e,function(t){var e=a&&a.find(e=>e.id===t.id);t.vis=!e||!0!==e.vis&&!1!==e.vis||e.vis}),T()&&(t=w.tvSelectedItem,i=e,n=t.slice(),t.length=0,angular.forEach(i,function(e){j(n,e)&&t.push(e)})),f(e)},!1),w.$watch("tvDefaultSelection",function(t){var a;t&&(angular.isArray(w.tvSelectedItem)?(a=0,w.tvSelectedItem.length=0,angular.forEach(w.tvData,function(e){e&&t.includes(e.id)&&(j(w.tvSelectedItem,e)||(w.tvSelectedItem.push(e),++a))}),a&&(w.tvDefaultSelection=void 0)):angular.forEach(w.tvData,function(e){e&&e.id===t&&(w.tvSelectedItem.item=e,w.tvDefaultSelection=void 0)}))}),T()?w.$watch("tvSelectedItem",function(t){angular.forEach(S,function(e){o(e,t.includes(e[0].item))})},!0):w.$watch("tvSelectedItem.item",function(e,t){e!==t&&c(e)}),H.registerContainer(t,{onMouseEnter:function(){w.tvDragDropEnabled&&!C&&(function(){(l=angular.element(document.createElement("div"))).addClass("treeViewHoverRoot");var e=angular.element(document.createElement("div"));e.addClass("treeViewHoverIndicator"),l.append(e),n=e,(e=angular.element(document.createElement("span"))).addClass("treeViewHoverNestedIcon fas fa-arrow-turn-down-right"),l.append(e),i=e,(e=angular.element(document.createElement("span"))).addClass("treeViewHoverInvalidIcon fas fa-xmark"),l.append(e),k.append(l)}(),P||k.addClass("treeViewInHover"))},onMouseLeave:function(){l&&(l.remove(),n=i=l=void 0),P||k.removeClass("treeViewInHover")},onMouseMove:function(e,t){var a;w.tvDragDropEnabled&&(a=e,e=t,l&&(t=_(a,!0),l.css({top:t}),0<(t=V(a,e))?(l.addClass("nested"),i.css({left:t=t*v+m}),n.css({left:t+y})):(l.removeClass("nested"),n.css({left:0})),z(a,e)?l.removeClass("invalidHierarchy"):l.addClass("invalidHierarchy")))},onElementDropped:function(e,t){if(!w.tvDragDropEnabled||C)return!1;var a=b(t),i=_(e),n=L(e,i,a),o={};if(!z(e,t,n,o))return o.message&&angular.isFunction(w.tvShowError)&&w.tvShowError({message:o.message}),!1;e=!1;if(0<=a){var r=k.children(),s=w.tvData[a],o=1;if(A()){for(var l=["0",s.parent],c=s.parent;"0"!==c;){var d=w.tvData.find(e=>e.id===c),c=d&&d.parent||"0";l.push(c)}for(var p=[],u=a;u<w.tvData.length;++u){var g=w.tvData[u];if(l.includes(g.parent)&&g!==s)break;p.push(g)}w.tvData.splice(a,p.length),a<i&&(i-=p.length,i=Math.max(a,i)),Array.prototype.splice.apply(w.tvData,[i,0].concat(p)),o=p.length}else w.tvData.splice(a,1),a<i&&--i,w.tvData.splice(i,0,s);for(var f=w.tvData.length-1;0<=f;--f){for(var m,v=0;v<r.length;++v)r[v].item===w.tvData[f]&&(m=r[v]);m&&k.prepend(m)}angular.isFunction(w.tvElementDragged)&&(t.parent=n.parent,h(w.tvData),w.tvElementDragged({from:a,to:i,count:o,parent:n.parent}))}else angular.isFunction(w.tvNewElementAdded)&&(t.parent=n.parent,h(w.tvData),e=w.tvNewElementAdded({item:t,index:i,hierarchyData:n}));return B(),F(w.tvData),e}},w.tvDragDropTag)}}}]);const canvasTransferVS=`#version 300 es
in vec3 position;
in vec2 coord;
out vec2 texCoord;
void main(void) {
gl_Position = vec4(position, 1.0);
texCoord = coord;
}`,canvasTransferPS=`#version 300 es
precision highp float;
uniform sampler2D texture0;
in vec2 texCoord;
out vec4 outColor;
void main(void) {
outColor = vec4(textureLod(texture0, texCoord, 0.0).rgb, 1);
}`;angular.module("wallpaperbrowserApp").directive("preview",["$timeout","host",function(x,S){return{templateUrl:"views/templates/preview.html",restrict:"E",scope:{pOptions:"=",pAspectRatio:"=",pInputHandler:"="},link:function(r,e){var t,a,i=angular.element(e.find("#pluginCrossHairOverlay")[0]);r.pOptions=r.pOptions||{},r.isInShaderReload=!1,r.isInShaderReloadOverlay=!1;var s,l,n,o=0,c="main"===r.pOptions.tag,d=angular.element(e.children()[0]),p=e.find("#previewPlugin")[0],u=angular.element(p),g=0,f={},m=p;function v(){angular.isObject(n)&&x.cancel(n),n=x(function(){var e=u.offset(),t=window.devicePixelRatio,a=Math.floor(u.innerWidth()*t),t=Math.floor(u.innerHeight()*t);m.width=a,m.height=t,S.callEditor("previewSizeChanged",e.left,e.top,a,t,r.pOptions.tag)},50)}function h(){m.style.visibility="hidden",s&&(cancelAnimationFrame(s),s=void 0)}function b(e){S.callEditor("previewToggleVisibility",e)}(window[r.pOptions.ctrl]=r).onPreviewSizeChanged=function(e){h(),e.handle&&function(e){m.style.visibility="visible";var t=(l=m.getContext("webgl2")).createShader(l.VERTEX_SHADER);l.shaderSource(t,canvasTransferVS),l.compileShader(t);var a=l.createShader(l.FRAGMENT_SHADER);l.shaderSource(a,canvasTransferPS),l.compileShader(a);var i=l.createProgram();l.attachShader(i,t),l.attachShader(i,a),l.linkProgram(i),l.useProgram(i),a=l.createTexture(),l.activeTexture(l.TEXTURE0),l.bindTexture(l.TEXTURE_2D,a),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MIN_FILTER,l.LINEAR),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MAG_FILTER,l.LINEAR),l.texImage2DShared(e);const n=[-1,-1,0,1,-1,0,1,1,0,-1,-1,0,1,1,0,-1,1,0];function o(){l.drawArrays(l.TRIANGLES,0,n.length/3),s=requestAnimationFrame(o)}e=l.createBuffer(),l.bindBuffer(l.ARRAY_BUFFER,e),l.bufferData(l.ARRAY_BUFFER,new Float32Array(n),l.STATIC_DRAW),e=l.getAttribLocation(i,"position"),l.vertexAttribPointer(e,3,l.FLOAT,!1,0,0),l.enableVertexAttribArray(e),e=l.createBuffer(),l.bindBuffer(l.ARRAY_BUFFER,e),l.bufferData(l.ARRAY_BUFFER,new Float32Array([0,1,1,1,1,0,0,1,1,0,0,0]),l.STATIC_DRAW),i=l.getAttribLocation(i,"coord"),l.vertexAttribPointer(i,2,l.FLOAT,!1,0,0),l.enableVertexAttribArray(i),l.viewport(0,0,l.canvas.width,l.canvas.height),l.disable(l.DEPTH_TEST),l.disable(l.BLEND),s=requestAnimationFrame(o)}(e.handle)};function _(){r.$apply()}window.addEventListener("resize",_),c&&(angular.element(".dropdown").on("show.bs.dropdown",function(){b(!1)}),angular.element(".dropdown").on("hidden.bs.dropdown",function(){b(!0)})),r.notifyShaderReload=function(e){e?++o:(--o,o=Math.max(0,o)),0<o?(r.isInShaderReload=!0,x.cancel(a),angular.isUndefined(t)&&(t=x(()=>{r.isInShaderReloadOverlay=!0},100))):(x.cancel(a),a=x(()=>{x.cancel(t),t=void 0,r.isInShaderReloadOverlay=!1,r.isInShaderReload=!1},200))},c&&r.$on("previewtoggle",function(e,t){var a=0===g;0===(g+=t)?b(!0):1===g&&a&&b(!1)});var y,w=new ResizeObserver(v);function k(e){var t=window.devicePixelRatio;return e.y=u.innerHeight()-e.y,e.x=Math.round(e.x*t),e.y=Math.round(e.y*t),e}w.observe(u[0]),r.$on("$destroy",function(){w.disconnect(),window.removeEventListener("resize",_),window[r.pOptions.ctrl]=void 0,e.off("pointerenter.preview"),i.off("pointerenter.preview"),e.off("pointerleave.preview"),i.off("pointerleave.preview"),e.off("pointermove.preview"),i.off("pointermove.preview"),e.off("pointerdown.preview"),i.off("pointerdown.preview"),e.off("pointerup.preview"),i.off("pointerup.preview"),e.off("touchend.preview"),i.off("touchend.preview"),e.off("pointercancel.preview"),i.off("pointercancel.preview"),h()}),angular.isDefined(r.pAspectRatio)&&r.$watch(function(){return{width:d.outerWidth(),height:d.outerHeight(),aspect:r.pAspectRatio}},function(e){var t,a,i,n,o=(e.aspect||"").toLowerCase().split("x");2!==o.length||(t=Number(o[0])/Number(o[1]))<=0?r.previewPadding="":(a=e.width,(i=n=0)<(o=e.height)&&0<a&&((e=a/o)<t?i=(o-a/t)/2:t<e&&(n=(a-o*t)/2)),r.previewPadding=Math.floor(i)+"px "+Math.floor(n)+"px")},!0),x(v,1e3),r.$on("onCppInit",v),r.$on("showPreviewCrosshair",function(e,t){angular.isObject(t)||(t={visible:!!t}),i.css({display:t.visible?"block":"none",cursor:"eyedropper"===t.type?"url('../images/eyedropper.cur'), pointer":"crosshair"})}),r.mouseEnter=function(e){document.documentElement.style["touch-action"]="none",f={},S.callEditor("sceneMouseMove",angular.toJson(k({tag:r.pOptions.tag,mode:"enter",x:e.offsetX,y:e.offsetY,type:e.originalEvent.pointerType})))},r.mouseLeave=function(e){document.documentElement.style["touch-action"]="auto",S.callEditor("sceneMouseMove",angular.toJson(k({tag:r.pOptions.tag,mode:"leave",x:e.offsetX,y:e.offsetY,type:e.originalEvent.pointerType})))},r.mouseMove=function(e){var t;r.pInputHandler&&r.pInputHandler.fnMouseMove&&r.pInputHandler.fnMouseMove(e)||(t={x:Math.round(e.offsetX),y:Math.round(e.offsetY)},f.x===t.x&&f.y===t.y||(f=t,S.callEditor("sceneMouseMove",angular.toJson(k({tag:r.pOptions.tag,mode:"move",x:e.offsetX,y:e.offsetY,type:e.originalEvent.pointerType,shift:e.shiftKey,alt:e.altKey,ctrl:e.ctrlKey})))))},e.on("pointerenter.preview",r.mouseEnter),e.on("pointerleave.preview",r.mouseLeave),e.on("pointermove.preview",r.mouseMove),i.on("pointermove.preview",r.mouseMove),r.pOptions.interactive&&(r.mouseDown=function(e){e.target.setPointerCapture(e.originalEvent.pointerId),e.stopPropagation(),r.pInputHandler&&r.pInputHandler.fnMouseDown&&r.pInputHandler.fnMouseDown(e)||r.isInShaderReload||1!==e.which&&2!==e.which&&3!==e.which||S.callEditor("sceneMouseMove",angular.toJson(k({tag:r.pOptions.tag,mode:"down",x:e.offsetX,y:e.offsetY,key:e.which,type:e.originalEvent.pointerType,shift:e.shiftKey,alt:e.altKey,ctrl:e.ctrlKey})))},r.mouseUp=function(e){e.target.releasePointerCapture(e.originalEvent.pointerId),e.stopPropagation(),r.pInputHandler&&r.pInputHandler.fnMouseUp&&r.pInputHandler.fnMouseUp(e)||1!==e.which&&2!==e.which&&3!==e.which||S.callEditor("sceneMouseMove",angular.toJson(k({tag:r.pOptions.tag,mode:"up",x:e.offsetX,y:e.offsetY,key:e.which,type:e.originalEvent.pointerType,shift:e.shiftKey,alt:e.altKey,ctrl:e.ctrlKey})))},r.mouseCancel=function(e){e.stopPropagation(),r.pInputHandler&&r.pInputHandler.fnMouseUp&&r.pInputHandler.fnMouseUp(e)||S.callEditor("sceneMouseMove",angular.toJson(k({tag:r.pOptions.tag,mode:"up",x:e.offsetX,y:e.offsetY,type:e.originalEvent.pointerType,shift:e.shiftKey,alt:e.altKey,ctrl:e.ctrlKey})))},r.mouseWheel=function(e,t){r.pInputHandler&&r.pInputHandler.fnMouseWheel&&r.pInputHandler.fnMouseWheel(e)||r.isInShaderReload||S.callEditor("sceneMouseWheel",{tag:r.pOptions.tag,delta:t,type:"mouse"})},r.touchEnd=function(e){e.stopPropagation(),S.callEditor("sceneMouseMove",angular.toJson(k({tag:r.pOptions.tag,mode:"up",x:e.offsetX,y:e.offsetY,key:1,type:"touch",shift:e.shiftKey,alt:e.altKey,ctrl:e.ctrlKey})))},y={},r.keyDown=function(e){y[e.keyCode]||(y[e.keyCode]=!0,r.pInputHandler&&r.pInputHandler.fnKeyDown&&r.pInputHandler.fnKeyDown(e)||r.isInShaderReload||S.callEditor("sceneKey",angular.toJson({tag:r.pOptions.tag,mode:"down",key:e.keyCode})))},r.keyUp=function(e){delete y[e.keyCode],r.pInputHandler&&r.pInputHandler.fnKeyUp&&r.pInputHandler.fnKeyUp(e)||S.callEditor("sceneKey",angular.toJson({tag:r.pOptions.tag,mode:"up",key:e.keyCode}))},e.on("pointerdown.preview",r.mouseDown),i.on("pointerdown.preview",r.mouseDown),e.on("pointerup.preview",r.mouseUp),i.on("pointerup.preview",r.mouseUp),e.on("touchend.preview",r.touchEnd),i.on("touchend.preview",r.touchEnd),e.on("pointercancel.preview",r.mouseCancel),i.on("pointercancel.preview",r.mouseCancel)),r.previewPadding=""}}}]),angular.module("wallpaperbrowserApp").directive("previewToggle",["$rootScope",function(i){return{restrict:"A",link:function(e,t){var a=!1;t.on("shown.bs.dropdown.evt",function(){i.$broadcast("previewtoggle",1),a=!0}),t.on("hidden.bs.dropdown.evt",function(){i.$broadcast("previewtoggle",-1),a=!1}),e.$on("$destroy",function(){t.off("shown.bs.dropdown.evt"),t.off("hidden.bs.dropdown.evt"),a&&i.$broadcast("previewtoggle",-1)})}}}]),angular.module("wallpaperbrowserApp").controller("EditorOpenWallpaperModalCtrl",["$uibModalInstance","$scope","modals","utils","host","data",function(e,i,t,n,a,o){function r(){a.callEditor("getProjects").then(function(e){e.sort(function(e,t){return angular.isString(e.title)&&angular.isString(t.title)?e.official!==t.official?e.official?1:-1:e.title.localeCompare(t.title):0}),i.allWallpapers=e,i.wallpapers=e})}function s(){var t,a=i.filter.text;if(angular.isString(a)&&0!==a.trim().length?(t=[],angular.forEach(i.allWallpapers,function(e){n.smartStringCompare(a,e.title)&&t.push(e)}),i.wallpapers=t):i.wallpapers=i.allWallpapers.slice(),angular.isArray(i.wallpapers))switch(i.filter.sort){case"name":i.wallpapers.sort(function(e,t){return e.title.localeCompare(t.title)});break;case"modifieddate":i.wallpapers.sort(function(e,t){return t.subscriptiondate-e.subscriptiondate})}}i.filter={text:"",sort:"name"},i.sortOptions=[{value:"name",label:"ui_browse_sort_name"},{value:"modifieddate",label:"ui_browse_sort_last_date_modified"}],i.ok=function(){e.close(i.currentSelection.project)},i.cancel=function(){e.dismiss("cancel")},i.selectItem=function(e){i.currentSelection=e},i.deleteProject=function(e){if(angular.isString(e.project))return o.deleteProject(e).then(r)},i.callbackWallpaperAllMouse=function(e,t){"left"===e?i.currentSelection=t:"dbl"===e&&(i.currentSelection=t,i.ok())},i.$watch("filter.text",s),i.$watch("filter.sort",s),r()}]),angular.module("wallpaperbrowserApp").controller("EditorSteamPublishModalCtrl",["$uibModalInstance","$q","$scope","$translate","$timeout","modals","utils","host","projectData","editorSettings",function(e,a,i,n,t,o,r,s,l,c){window.editorSteamPublishModalCtrl=i;i.providerIcon=r.getProviderIcon(),i.successText="wallpaper"===c.category||"preset"===c.category?"ui_editor_publish_modal_button_show_in_workshop":"ui_editor_publish_modal_button_show_in_workshop_generic",i.canOpenWallpaperDetailsOnPlatform=r.canOpenWallpaperDetailsOnPlatform(),i.canOpenWallpaperDetailsOnWeb=r.canOpenWallpaperDetailsOnWeb(),i.close=function(){e.dismiss("cancel")},i.tagsInvalid=function(){return!angular.isArray(i.projectData.tags)||i.projectData.tags.length<1},i.getPublishButtonText=function(){return i.projectData.workshopid?"ui_editor_publish_modal_button_publish_update":"ui_editor_publish_modal_button_publish"},i.startPublish=function(){var e,t;c.isSteamAvailable()?(e=a.when(),c.ageRatingDisabled||(r.canUseAgeRatingTags()?l.contentrating&&l.ratingviolence&&l.ratingsex||((t=l.title&&l.title.toLowerCase()||"").includes("r18")||t.includes("r-18")||t.includes("18+")?(l.contentrating="Mature",l.ratingviolence="none",l.ratingsex="adult"):e=e.then(function(){return o.open("editorRating",{data:i.projectData})})):"Everyone"!==l.contentrating&&(e=e.then(function(){return o.open("genericConfirm",{data:{title:"ui_editor_workshop_modal_rating_no_rating_info_header",message:"ui_editor_workshop_modal_rating_no_rating_info_body",leftIcon:"images/warning.png",cancelVisible:!0,okVisible:!0}}).then(function(){l.contentrating="Everyone"})}))),"wallpaper"!==c.category||!i.projectData||"scene"!==i.projectData.type||angular.isArray(i.projectData.templateoptions)||l.workshopid||(e=e.then(function(){return s.callEditor("checkSceneAnimated").then(function(e){if("noanimation"===e)return o.open("genericConfirm",{data:{title:"ui_editor_no_animation_modal_header",message:"ui_editor_no_animation_modal_body",leftIcon:"images/warning.png",cancelVisible:!0,okVisible:!0}},{backdropClass:"modal-backdrop-danger"})})})),(e=(e=!r.canSkipReview()?e.then(function(){return o.open("genericConfirm",{data:{title:"ui_editor_review_info_header",message:"ui_editor_review_info_body",okVisible:!0}})}):e).then(function(){var t=a.defer();return"wallpaper"===c.category?s.callUI("checkWorkshopAgreementRequired").then(function(e){e?o.open("editorEula").then(function(){t.resolve()}).catch(function(){t.reject()}):t.resolve()}):t.resolve(),t.promise})).then(function(){i.page="publish",i.publishPage="progress",i.publishPreventCancel=!1,i.publishProgressMessage="",i.publishProgressValue=0,i.publishProgressError=void 0,i.publishSubscriptionStatus=!1,s.callUI("publishToSteam",i.projectData,i.editorSettings.dependentProject).then(function(e){i.needsToAcceptAgreement=e.needsToAcceptAgreement,i.itemId=e.id,i.workshopurl=e.workshopurl,i.publishPage="success"}).catch(function(){i.page="initial"})})):r.showSteamError()},i.cancelPublish=function(){s.callUI("cancelPublishToSteam").then(function(e){e&&(i.page="initial",i.publishProgressValue=0)})},i.openItemInWorkshop=function(){r.openUrl(i.workshopurl,{},r.usePlatformBrowser())},i.copyItemWorkshopURL=function(){s.copyWorkshopUrl(i.projectData)},i.setPublishProgress=function(e,t,a){i.publishProgressMessage=e,i.publishProgressValue=Math.floor(t),i.publishPreventCancel=a,o.setPreventModalClose(a)},i.setWorkshopId=function(e){i.projectData.workshopid=e.workshopid,i.projectData.workshopurl=e.workshopurl},i.onPublishError=function(e){i.publishPage="error",i.publishPreventCancel=!1,i.publishProgressError=e,i.publishProgressValue=0,o.setPreventModalClose(!1)},i.isPublishDisabled=function(){return!i.projectData.title||(!i.projectData.preview||i.tagsInvalid())},"wallpaper"===c.category&&s.callEditor("getPublishInfoMessages").then(function(e){var t;e.message&&(5<(t=e.filelist||[]).length&&(t.length=5),i.vramAlertMessage=n.instant(e.message,{files:t.join("</br>")}))}),i.$on("$destroy",function(){window.editorSteamPublishModalCtrl=void 0}),i.projectData=l,i.editorSettings=c,i.publishProgressValue=0,i.publishPage="progress","wallpaper"===c.category&&s.callEditor("requestUpdateProjectBackendTags")}]),angular.module("wallpaperbrowserApp").directive("workshopDetails",["$translate","modals","host","utils","toastr",function(o,r,s,l,c){return{templateUrl:"views/templates/workshopdetails.html",restrict:"E",scope:{wdProjectData:"=",wdEditorSettings:"="},link:function(t){var i={},n="asset"===t.wdEditorSettings.category?l.getAssetGenreTags():l.getAvailableTags();function e(e){angular.isString(e)&&(t.wdProjectData.preview=e,t.previewRefreshUrl=l.addUrlTimestamp(e))}function a(){var e=t.selectedTag.tag;angular.isString(e)&&0<e.trim().length&&(t.wdProjectData.tags=[e])}t.visibilityOptions=[{label:"ui_workshop_tags_visibility_public",value:"public"},{label:"ui_workshop_tags_visibility_friends_only",value:"friends"},{label:"ui_workshop_tags_visibility_private",value:"private"}],t.canUseAgeRatingTags=function(){return l.canUseAgeRatingTags()&&!t.wdEditorSettings.ageRatingDisabled},t.getGenreHint=function(){switch(t.selectedTag.tag){case"Unspecified":return"ui_editor_publish_modal_hint_unspecified";case"Game":return"ui_editor_publish_modal_hint_game_anime"}},t.takeSnapshot=function(){s.callUI("takeSnapshot",{format:t.wdProjectData.snapshotformat,overlay:t.wdProjectData.snapshotoverlay}).then(function(e){return t.wdProjectData.snapshotformat=e.format,t.wdProjectData.snapshotoverlay=e.overlay,e.preview}).then(e)},t.importSnapshot=function(){s.callUI("importSnapshot").then(e)},t.openRatingModal=function(e){r.open("editorRating",{data:e})},t.getTags=function(){var a=[];return angular.forEach(n,function(e){var t;a.push((t={label:e,value:e},"en-us"!==o.use()&&(angular.isString(i[t.value])&&0<i[t.value].length?t.label+=" ("+i[t.value]+")":o("ui_workshop_tags_"+t.value.toLowerCase().replace(/[\- ]/g,"_")).then(function(e){0<(e=""+e).length&&t.label!==e&&(i[t.value]=e,l.showFullTagValue()?t.label+=" ("+e+")":t.label=e)})),t))}),a},t.canAddTag=function(){var e=!angular.isArray(t.tags)||t.tags.length<3;return e||o("ui_editor_workshop_tags_limit").then(function(e){c.error(e,"Error")}),e},t.colorPickerOptions=l.getColorPickerDefaults(),t.$watch("wdProjectData.preview",function(e){t.previewRefreshUrl=l.addUrlTimestamp(e)}),t.availableTags=t.getTags(),angular.isArray(t.wdProjectData.tags)&&0<t.wdProjectData.tags.length?t.selectedTag={tag:t.wdProjectData.tags[0]}:t.selectedTag={tag:"Unspecified"},t.$watch("selectedTag.tag",function(){a()}),t.selectedUploadOption={value:null},t.$watch("wdEditorSettings.publishedItems",function(e){t.uploadProjectOptions=[{label:"ui_editor_workshop_options_upload_as_new_item",value:null}];var a=t.uploadProjectOptions;angular.forEach(e,function(t){o("ui_editor_workshop_options_upload_as_update",{name:t.title}).then(function(e){a.push({label:e,value:t})})})}),"wallpaper"!==t.wdEditorSettings.category&&t.$watch("selectedUploadOption.value",function(e){angular.isObject(e)?(t.wdProjectData.workshopid=e.workshopid,t.wdProjectData.title=e.title,t.wdProjectData.description=e.description,t.wdProjectData.tags=e.tags,t.wdProjectData.contentrating=e.contentrating,t.wdProjectData.visibility=e.visibility,delete t.wdProjectData.preview,angular.isString(e.tags)&&(t.wdProjectData.tags=e.tags=e.tags.split(",")),angular.isArray(e.tags)&&angular.forEach(e.tags,function(e){n.includes(e)&&(t.selectedTag.tag=e)})):(delete t.wdProjectData.workshopid,delete t.wdProjectData.title,delete t.wdProjectData.description,delete t.wdProjectData.contentrating,t.wdProjectData.visibility="public",t.selectedTag.tag="Unspecified",a())}),angular.element("#workshopDescription").on("keydown",function(e){var t;"PageUp"!==e.key&&"PageDown"!==e.key||(t="PageUp"===e.key?0:e.target.textLength,e.preventDefault(),e.stopPropagation(),e.target.setSelectionRange(t,t))})}}}]),angular.module("wallpaperbrowserApp").service("utils",["$document","$rootScope","$timeout","$translate","modals","toastr",function(t,a,i,n,o,r){var s,l,c,d,p,u,g,f,e,m,v=[],h=[],b=[],_=[],y=[],w=[],k=0,x=this,S={chooseText:"OK",cancelText:"Cancel",showPalette:!0,palette:[["white","silver","black"],["red","orange","yellow"],["lime","green","#254117"],["lightblue","blue","darkblue"],["cyan","purple","Magenta"]],preferredFormat:"hex",showInput:!0,maxSelectionSize:3},C=angular.copy(S);C.flat=!0;var E=angular.copy(S);function P(e){e=e.toString(16);return 1===e.length?"0"+e:e}function M(e,t,a){return"#"+P(e)+P(t)+P(a)}function A(e){e=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return e?{r:parseInt(e[1],16),g:parseInt(e[2],16),b:parseInt(e[3],16)}:{r:0,g:0,b:0}}E.showPalette=!1,E.showInput=!1,E.containerClassName="spectrumHueOnly",this.formatSize=function(e,t){if(angular.isString(e))return e;var a=Math.round(e),i=Math.round(e/1024),e=Math.round(i/1024);return 0<e?e+" MB":0<i||!t?i+" kB":a+" bytes"},this.getAvailableTags=function(e){return angular.copy(e?h:v)},this.getResolutionTags=function(){return angular.copy(b)},this.getWallpaperSourceTags=function(){return[{value:"Official",label:"ui_browse_filter_source_official"},{value:"Workshop",label:"ui_browse_filter_source_workshop"},{value:"Local",label:"ui_browse_filter_source_my_wallpapers"}]},this.getWallpaperCategoryTags=function(){return[{value:"Wallpaper",label:"ui_browse_filter_category_wallpaper"},{value:"Preset",label:"ui_browse_filter_category_preset"}]},this.getWallpaperTypeTags=function(){return[{value:"Scene",label:"ui_browse_filter_type_scene"},{value:"Video",label:"ui_browse_filter_type_video"},{value:"Web",label:"ui_browse_filter_type_web"},{value:"Application",label:"ui_browse_filter_type_application"}]},this.getWallpaperRatingTags=function(){return[{value:"Everyone",label:"ui_workshop_tags_rating_everyone"},{value:"Questionable",label:"ui_workshop_tags_rating_questionable"},{value:"Mature",label:"ui_workshop_tags_rating_mature"}]},this.setAvailableTags=function(e,t,a){v=e,angular.isArray(t)&&(h=t),angular.isArray(a)&&(b=a)},this.setAvailableAssetTags=function(e,t){_=e,y=t},this.getAssetTypeTags=function(){return angular.copy(_)},this.getAssetGenreTags=function(){return angular.copy(y)},this.prepareTagForTranslation=function(e){return e&&e.toLowerCase().replace(/[\- ]/g,"_")||""},this.translateTag=function(t){return n("ui_workshop_tags_"+x.prepareTagForTranslation(t)).then(function(e){return 0<e.toString().length?e.toString():t}).catch(function(){return t})},this.translateTagInstant=function(e){var t=e&&n.instant("ui_workshop_tags_"+e.toLowerCase().replace(/[\- ]/g,"_")).toString()||"";return 0<t.length?t:e},this.translateRatingTag=function(t){return n("ui_workshop_tags_rating_"+t.toLowerCase().replace(/[\- ]/g,"_")).then(function(e){return 0<e.toString().length?e.toString():t}).catch(function(){return t})},this.translateRatingTagInstant=function(e){var t=e&&n.instant("ui_workshop_tags_rating_"+e.toLowerCase().replace(/[\- ]/g,"_")).toString()||"";return 0<t.length?t:e},this.translateAssetTypeTag=function(t){return n("ui_workshop_tags_asset_type_"+t.toLowerCase().replace(/[\- ]/g,"_")).then(function(e){return 0<e.toString().length?e.toString():t}).catch(function(){return t})},this.createTranslatedTagList=function(e){var e=angular.isArray(e)?e:e.split(","),t=["everyone","questionable","mature"],a=[];return angular.forEach(e,function(e){t.includes(e.toLowerCase())?x.canUseAgeRatingTags()&&a.push(x.translateRatingTagInstant(e)):v.includes(e)||h.includes(e)?a.push(x.translateTagInstant(e)):a.push(e)}),a},this.showError=function(e,t){var a={};angular.isNumber(t)&&(a.timeOut=t,a.extendedTimeOut=t),r.error(e,"Error",a)},this.showWarning=function(e){r.warning(e,"Warning")},this.showSuccess=function(e){r.success(e,"Success")},this.showBuildVersionError=function(e,t){c={callerVersion:e,appVersion:t},l={title:"ui_modal_updaterequired_title",message:"",leftIcon:"images/warning.png",okClass:"btn-primary",okText:"ui_ok",okVisible:!0},o.open("genericConfirm",{data:l},{backdropClass:"modal-backdrop-warning"}),n(s="ui_modal_updaterequired_body",c).then(function(e){l.message=e})},this.registerWindowsVersion=function(e){k=e},this.showAvailableDistroUpdate=function(e){var t=0<k&&k<10;c={distroVersion:e},l={title:"ui_modal_updateavailable_title",message:"",okClass:"btn-primary",okText:"ui_ok",okVisible:!0,cancelVisible:!0},s="ui_modal_updateavailable_body_distro",t&&(l.title="ui_modal_updateavailable_body_title",s="ui_modal_updateavailable_body_outdated"),o.open("genericConfirm",{data:l}).then(function(){t||window.ui.updatedistro()}),n(s,c).then(function(e){l.message=e})},this.showInstallationWarning=function(e,t){u={runPath:e,steamPath:t},p={title:"ui_modal_installationpath_error_title",message:"",leftIcon:"images/warning.png",okClass:"btn-default",cancelVisible:!0,leftVisible:!0,left2Visible:!0,leftClass:"btn btn-primary",left2Class:"btn btn-default",leftText:"ui_modal_installationpath_fix_auto_start",left2Text:"ui_modal_installationpath_disable_auto_start",leftAction:"fix",left2Action:"disable",leftImg:"images/uac_small.png",left2Img:"images/uac_small.png"};t=o.open("genericConfirm",{data:p},{backdropClass:"modal-backdrop-warning"});return n(d="ui_modal_installationpath_error_body",u).then(function(e){p.message=e}),t},this.getColorPickerDefaults=function(e){switch(e){case"flat":return C;case"hueonly":return E;default:return S}};var T=function(e,t,a,i){e=(i+e/60)%6;return a-a*t*Math.max(Math.min(e,4-e,1),0)};this.convertVec3ToHex=function(e){if(!angular.isString(e))return"#000000";var t=e.split(" ");return 3===t.length?M(Math.round(255*parseFloat(t[0])),Math.round(255*parseFloat(t[1])),Math.round(255*parseFloat(t[2]))):e},this.convertVec3ToHex_255=function(e){if(!angular.isString(e))return"#000000";var t=e.split(" ");return 3===t.length?M(Math.round(parseFloat(t[0])),Math.round(parseFloat(t[1])),Math.round(parseFloat(t[2]))):e},this.convertHueFloatToHex=function(e){if(!angular.isNumber(e))return"#FF0000";var t,a,e=[T(t=360*e,a=1,e=1,5),T(t,a,e,3),T(t,a,e,1)];return M(Math.round(255*e[0]),Math.round(255*e[1]),Math.round(255*e[2]))},this.convertHexToVec3=function(e){e=A(e);return e.r/255+" "+e.g/255+" "+e.b/255},this.convertHexToVec3_255=function(e){e=A(e);return e.r+" "+e.g+" "+e.b},this.convertHexToHueFloat=function(e){var t,a,i,n=A(e);return(t=n.r,a=n.g,i=n.b,e=Math.max(t,a,i),n=e-Math.min(t,a,i),[60*((a=n&&(e===t?(a-i)/n:e===a?2+(i-t)/n:4+(t-a)/n))<0?a+6:a),e&&n/e,e])[0]/360%1},this.onProjectNameChanged=function(e){angular.isString(e)&&0<e.length?a.captionPrefix=e+" - ":a.captionPrefix="Untitled - "},this.damerauLevenshteinDistance=function(e,t){if(!angular.isString(e)||e.length<1)return angular.isString(t)&&0<t.length?t.length:0;if(!angular.isString(t)||t.length<1)return angular.isString(e)&&0<e.length?e.length:0;for(var a,i,n,o,r=e.length,s=t.length,l=new Array(r+1),c=0;c<l.length;++c)l[c]=new Array(s+1);for(c=0;c<=r;++c)l[c][0]=c;for(c=0;c<=s;++c)l[0][c]=c;for(c=1;c<=r;c++)for(var d=1;d<=s;d++)a=e[c-1]===t[d-1]?0:1,i=l[c-1][d]+1,n=l[c][d-1]+1,o=l[c-1][d-1]+a,l[c][d]=Math.min(i,Math.min(n,o)),1<c&&1<d&&e[c-1]===t[d-2]&&e[c-2]===t[d-1]&&(l[c][d]=Math.min(l[c][d],l[c-2][d-2]+a));return l[r][s]},this.getWallpaperTypeIcon=function(e){var t="fas fa-pencil-ruler";switch(e){case"Video":t="fas fa-film";break;case"Web":t="fas fa-globe-americas";break;case"Application":t="fas fa-application";break;case"Image":t="fas fa-image"}return t},this.smartStringCompare=function(e,t){e=e.toLowerCase().replace(/[\?\.\!]/g,""),t=t.toLowerCase().replace(/[\?\.\!]/g,"");return!!(t.includes(e)||x.damerauLevenshteinDistance(t,e)<3)},this.getQualityPreset=function(e){switch(e){case"low":return{msaa:"none",resolution:"full",fps:10,postprocessing:"disabled",reflection:!1,shadows:"low",volumetrics:"low",preset:"low"};case"medium":return{msaa:"none",resolution:"full",fps:15,postprocessing:"enabled",reflection:!0,shadows:"medium",volumetrics:"medium",preset:"medium"};case"high":return{msaa:"x2",resolution:"full",fps:25,postprocessing:"enabled",reflection:!0,shadows:"high",volumetrics:"high",preset:"high"};case"ultra":return{msaa:"x2",resolution:"full",fps:30,postprocessing:"ultra",reflection:!0,shadows:"ultra",volumetrics:"ultra",preset:"ultra"}}},this.getFilename=function(e,t){var a=e.split(/(\\|\/)/g).pop();return a=t?a.split(/(\.)/g)[0]||a||e:a},this.isURL=function(e){return e.beginsWith("http://")||e.beginsWith("https://")||e.beginsWith("www.")||e.beginsWith("edge://")},this.openUrl=function(e,t,a){t=n.instant(e,t);a?window.ui.openplatformbrowser(t.toString()||e):window.ui.shellexecute(t.toString()||e)},this.addUrlTimestamp=function(e){return angular.isString(e)&&0<e.length?e+"?refresh="+(new Date).getTime():e},this.cppInit=function(e,t){x.setLanguage(e),x.setSteamLanguage(t)},this.setProvider=function(e){f=e},this.getProvider=function(){return f},this.lockAgeRating=function(){e=!0},this.canSendReports=function(){return"steamint"===f},this.canUseAdminMenu=function(){return"steamint"===f},this.canUseBackup=function(){return"steamint"===f},this.canUseFilterSettings=function(){return"wegame"!==f},this.canUseApprovedTag=function(){return"wegame"!==f},this.canUseAgeRatingTags=function(){return"steamint"===f&&!0!==e},this.canOpenWallpaperDetailsOnPlatform=function(){return"steamchina"!==f},this.canDeleteSubmissionsFromPlatform=function(){return"steamchina"===f},this.canOpenWallpaperDetailsOnWeb=function(){return"steamint"===f},this.canSkipReview=function(){return"steamint"===f},this.canUseDiscover=function(){return"wegame"!==f},this.canUseCollectionsInDiscover=function(){return"wegame"!==f},this.canUseExactMatch=function(){return"wegame"!==f},this.requiresFullAsyncWorkshop=function(){return"wegame"===f},this.useRatingStars=function(){return"wegame"!==f},this.useDynamicWorkshopAuthor=function(){return"steamint"===f},this.canUploadApplications=function(){return"wegame"!==f},this.showOSProviderConnectionOverlay=function(){return!0},this.canShowSpecializedBrowseLists=function(){return"wegame"!==f},this.showFullTagValue=function(){return"wegame"!==f},this.usePlatformBrowser=function(){return"wegame"===f},this.canTakeScreenshots=function(){return"wegame"!==f},this.getDefaultWorkshopTab=function(){return"wegame"===f?"workshop":"explore"},this.canUseSeasonalTheming=function(){return"wegame"!==f},this.canShowTrialWarning=function(){return"wegame"===f},this.canPublishUnlisted=function(){return"steamint"===f},this.requiresMobileApproval=function(){return"wegame"!==f},this.getWorkshopAgreementURL=function(){return"steamint"===f?"steam://url/WorkshopEula/431960/":"steamchina://url/WorkshopEula/431960/"},this.supportsDLCManagement=function(){return!0},this.getWorkshopAgreementHelpURL=function(){return"https://help.wallpaperengine.io/mobile/workshop"},this.getAccountPreferencesUrl=function(){return n.instant("var_url_platform_account_preferences")},this.getProviderIcon=function(e){return e?"wegame"===f?"fas fa-globe-asia":"fab fa-steam-square":"wegame"===f?"fas fa-globe-asia":"fab fa-steam"},this.canUseMotd=function(){return"wegame"!==f},this.setLanguage=function(e){"default"===e&&angular.isString(g)&&(e=g),n.use(e).then(function(){i(n.refresh)}),a.languageClass="langCSS"+e},this.setSteamLanguage=function(e){g=e},this.setAvailableLanguages=function(e){(w=e).sort(function(e,t){return e.label.localeCompare(t.label)}),angular.forEach(w,function(t){"en-us"!==t.value&&n("system_language_"+t.value).then(function(e){t.label+=" ("+e+")"})});var t={label:"Default",icon:x.getProviderIcon(!0),value:"default"};w.splice(0,0,t),n("system_language_"+g).then(function(e){t.label+=" ("+e+")"})},this.getAvailableLanguages=function(){return w};var O={};this.setKnownExtensions=function(e){O=e},this.isExtension=function(e,t){e=(e="."+/(?:\.([^.]+))?$/.exec(e)[1]).toLowerCase();return 0<=(O[t]||[]).indexOf(e)},this.toDegrees=function(e){return e*(180/Math.PI)},this.toRadians=function(e){return e*(Math.PI/180)},this.getElementBounds=function(e){var t={top:e.position().top,left:e.position().left};return t.bottom=t.top+e.innerHeight(),t.right=t.left+e.innerWidth(),t},this.checkBoundsOverlap=function(e,t){return!(e.right<t.left||e.left>t.right||e.bottom<t.top||e.top>t.bottom)};var I,R={};this.updateTexturePreview=function(e){R[e.id]=e.data},this.getTexturePreviews=function(){return R},this.flushTexturePreviews=function(){for(var e in R)R.hasOwnProperty(e)&&delete R[e]},this.incrementNameIndex=function(e,t){for(;0<=t.indexOf(e);){var a=e.split(" "),i=parseInt(a[a.length-1]);return a.length<2||i<2?e+" 2":(a.pop(),a.join(" ")+(i+1))}return e},this.setWrongProviderFound=function(){m=!0},this.showSteamError=function(){return o.open("genericConfirm",{data:{title:"ui_browse_modal_no_steam_title",message:m?"ui_browse_modal_no_steam_body_wrong_provider":"ui_browse_modal_no_steam_body",okVisible:!0}})},this.getStaticExploreQueries=function(){var e=[],t=["Portrait Standard Definition","Portrait 720 x 1280","Portrait 1080 x 1920","Portrait 1440 x 2560","Portrait 2160 x 3840"],e=(e=x.canUseApprovedTag()?e.concat([{querytype:"most_recent",tags:["Approved"],excludetags:t,emoji:"🏆",priority:1,title:"ui_browse_explore_category_genre_recent_approved",sticky:!0},{querytype:"trend_month",tags:["Approved"],excludetags:t,emoji:"🔥",priority:.9,sticky:!0},{querytype:"trend_year",excludetags:t,tags:["Approved"]},{querytype:"most_recent",includetags:["Approved"],tags:["Mobile"],title:"ui_browse_explore_category_mobile",requiredtaggroups:[t],emoji:"📱",priority:.5}]):e).concat([{querytype:"trend_year",tags:["Audio responsive"],excludetags:["Relaxing","Anime","CGI","Game"]},{querytype:"top_rated",tags:["Abstract"]},{querytype:"top_rated",tags:["Animal"]},{querytype:"top_rated",tags:["Anime"]},{querytype:"top_rated",tags:["Cartoon"]},{querytype:"top_rated",tags:["Cyberpunk"]},{querytype:"top_rated",tags:["Fantasy"]},{querytype:"top_rated",tags:["Game"]},{querytype:"top_rated",tags:["Landscape"]},{querytype:"top_rated",tags:["Medieval"]},{querytype:"top_rated",tags:["MMD","Anime"]},{querytype:"top_rated",tags:["Nature"]},{querytype:"top_rated",tags:["Pixel art"]},{querytype:"top_rated",tags:["Retro"]},{querytype:"top_rated",tags:["Sci-fi"]},{querytype:"top_rated",tags:["Sports"]},{querytype:"top_rated",tags:["Technology"]},{querytype:"top_rated",tags:["Vehicle"]},{querytype:"top_rated",tags:["Memes"]}]),a=["Unspecified"];return angular.forEach(e,function(e){e.category="genre",e.includetags||(e.includetags=[e.tags[0]]),angular.isArray(e.excludetags)?e.excludetags=e.excludetags.concat(a):e.excludetags=a}),e},this.getSeasonalCollections=function(){var t=[];return angular.forEach([{f:{m:3,d:20},t:{m:4,d:20},e:"🌱",l:"ui_browse_explore_category_seasonal_collection_spring",i:"1884277090"},{f:{m:6,d:19},t:{m:7,d:31},e:"☀️",l:"ui_browse_explore_category_seasonal_collection_summer",i:"1884277844"},{f:{m:9,d:23},t:{m:10,d:23},e:"🍂",l:"ui_browse_explore_category_seasonal_collection_fall",i:"1884263373"},{f:{m:10,d:24},t:{m:11,d:2},e:"🎃",l:"ui_browse_explore_category_seasonal_collection_halloween",i:"1873353144"},{f:{m:12,d:1},t:{m:1,d:31},e:"❄️",l:"ui_browse_explore_category_seasonal_collection_winter",i:"1884258271"}],function(e){x.isInDateRangeInclusive(e.f,e.t,!0)?t.push({category:"collection",itemid:e.i,title:e.l,emoji:e.e,tags:["Curated"],coversubmission:e.i,sticky:!0,priority:.8}):t.push({category:"collection",itemid:e.i,title:e.l,emoji:e.e,tags:["Curated"],coversubmission:e.i})}),t},this.getBestOfYearQueries=function(n){var o=[];return angular.forEach({2016:"818603284",2017:"932995255",2018:"1339064732",2019:"1962375063",2020:"2292710588",2021:"2388299037",2022:"2784382079",2023:"2944773634",2024:"3163333989",2025:"3408653683"},function(e,t){t=parseInt(t);var a=new Date(t,0,1),i=new Date(t+1,0,1),i={category:"top_year",querytype:"top_rated",title:"ui_browse_explore_category_top_year",year:t,excludetags:n?["Anime","MMD","Unspecified"]:["Unspecified"],coversubmission:e,timestampstart:x.getUnixTimestampFromDate(a),timestampend:x.getUnixTimestampFromDate(i)};o.push(i)}),o},this.updateQueryName=function(e){switch(e.category){case"genre":e.name=e.category+e.tags[0]+e.querytype;break;case"creator":e.name=e.category+e.itemid+e.querytype;break;case"collection":e.name=e.category+e.itemid;break;case"keyword":e.name=e.category+e.keyword+e.querytype;break;default:e.name=e.category+e.querytype}e.custom&&(e.name="custom"+e.name)},this.isInDateRangeInclusive=function(e,t){var a=new Date,i=a.getDate(),n=a.getMonth()+1,a=a.getFullYear();e.y&&t.y||(e.y=a=0,t.y=0);i=372*a+31*n+i,e=372*e.y+31*e.m+e.d,t=372*t.y+31*t.m+t.d;return t<e&&(i<e&&(i+=372),t+=372),e<=i&&i<=t},this.getUnixTimestampFromDate=function(e){return parseInt((e.getTime()/1e3).toFixed(0))},this.getActiveEvent=function(){},this.startHotkeyListener=function(e){I=e,window.ui.startHotkeyListener(),t.on("keydown.hotkey",window.cancelEventImmediately),t.on("keypress.hotkey",window.cancelEventImmediately),t.on("keyup.hotkey",window.cancelEventImmediately)},this.onHotkeyUpdate=function(e){angular.isFunction(I)&&I(e),(e.cancel||e.finished)&&(I=void 0,t.off("keydown.hotkey"),t.off("keypress.hotkey"),t.off("keyup.hotkey"))},this.stopHotkeyListener=function(){I=void 0,t.off("keydown.hotkey"),t.off("keypress.hotkey"),t.off("keyup.hotkey"),window.ui.stopHotkeyListener()},this.isUserHotkeyAction=function(e){return"wallpaper"===e||"playlist"===e||"profile"===e},this.validateSharedSettings=function(e){e.hotkeys=e.hotkeys||[],void 0===e.slideshowwarningenabled&&(e.slideshowwarningenabled=!0)},this.getSharedDefaultProperties=function(e){var t={alignment:0,alignmentposition:50,rate:100,volume:50,cameraparallax:!0};return e&&(t.schemecolor=""),t},this.displayGifWarning=function(e){return o.open("genericConfirm",{data:{title:"ui_editor_importer_gif_warning_header",message:"ui_editor_importer_gif_warning_body",leftIcon:"images/warning.png",okVisible:!0,cancelVisible:e}},{backdropClass:"modal-backdrop-danger"})},this.updatePagination=function(e,t,a){var i=[];a=a||1,t=t||1;for(var n=Math.max(1,t-4),o=Math.min(a,t+4),r=1;r<=a;++r)(1!==r&&r<n||r!==a&&o<r)&&(i.push({label:"…",class:"normalText"}),r=r<n?n:a),i.push({label:r});e.current=t,e.count=a,e.pages=i},this.showPaginationPageNumberPrompt=function(){var e={title:"ui_modal_pagination_enter_page_title",message:"",numberInputVisible:!0,okVisible:!0,cancelVisible:!0,numberinput:void 0};return o.open("genericConfirm",{data:e}).then(function(){return angular.isNumber(e.numberinput)?e.numberinput:void 0})},this.getPreviewUrl=function(e){return e.previewsmall||e.preview?'url("'+(e.previewsmall||e.preview)+'")':""},this.makeLogoAnimation=function(e,t){return lottie.loadAnimation({container:e,renderer:"svg",loop:!0,autoplay:!0,path:t||"anims/logo_blue.json"})},this.assetTypeGroups={layers:["Image","Particle","Sound","Model","Text","Sprite","Fullscreen","Composite"],effects:["Effect"],scripts:["Script"]},this.assetGroupType={Image:"layers",Particle:"layers",Sound:"layers",Model:"layers",Text:"layers",Sprite:"layers",Fullscreen:"layers",Composite:"layers",Effect:"effects",Script:"scripts"},this.url={docs:"https://docs.wallpaperengine.io",docsScene:"https://docs.wallpaperengine.io/scene/overview.html",docsSceneEffects:"https://docs.wallpaperengine.io/scene/effects/introduction.html",docsSceneParticles:"https://docs.wallpaperengine.io/scene/particles/introduction.html",docsSceneAnimation:"https://docs.wallpaperengine.io/scene/timeline/introduction.html",docsSceneUserProperties:"https://docs.wallpaperengine.io/scene/userproperties/overview.html",docsSceneAudioVisualization:"",docsSceneScript:"https://docs.wallpaperengine.io/scene/scenescript/introduction.html",docsSceneShaders:"https://docs.wallpaperengine.io/scene/shader/overview.html",docsSceneTextureOptimization:"https://docs.wallpaperengine.io/scene/performance/texture.html",docsScenePuppetWarp:"https://docs.wallpaperengine.io/scene/puppet-warp/introduction.html",docsSceneForegroundSeparation:"https://docs.wallpaperengine.io/scene/image-preparation/foreground-separation.html",docsSceneLightingReflections:"https://docs.wallpaperengine.io/scene/lighting/introduction.html",docsWeb:"https://docs.wallpaperengine.io/web/overview.html",docsWebUserProperties:"https://docs.wallpaperengine.io/web/customization/properties.html",docsWebAudioVisualization:"https://docs.wallpaperengine.io/web/audio/visualizer.html",docsWebRGB:"https://docs.wallpaperengine.io/web/api/rgb.html",docsWebFPS:"https://docs.wallpaperengine.io/web/performance/fps.html",docsWebDebugging:"https://docs.wallpaperengine.io/web/debug/debug.html"},this.dlc={editorExtensions:{id:function(){switch(f){case"steamint":case"steamchina":return 1790230;case"wegame":return 2001765}},name:"ui_dlc_editor_extensions_name",size:"8GB",dlSize:"3000MB"}},this.getTransitionOptions=function(){return[{label:"ui_browse_playlist_modal_settings_transition_none_no_flicker",value:"-2"},{label:"ui_browse_playlist_modal_settings_transition_none",value:"none"},{label:"ui_browse_playlist_modal_settings_transition_random",value:"random"},{label:"ui_browse_playlist_modal_settings_transition_fade",value:"0"},{label:"ui_browse_playlist_modal_settings_transition_fade_to_black",value:"18"},{label:"ui_browse_playlist_modal_settings_transition_mosaic",value:"1"},{label:"ui_browse_playlist_modal_settings_transition_diffuse",value:"2"},{label:"ui_browse_playlist_modal_settings_transition_horizontal_slide",value:"3"},{label:"ui_browse_playlist_modal_settings_transition_vertical_slide",value:"4"},{label:"ui_browse_playlist_modal_settings_transition_horizontal_fade",value:"5"},{label:"ui_browse_playlist_modal_settings_transition_vertical_fade",value:"6"},{label:"ui_browse_playlist_modal_settings_transition_clouds",value:"7"},{label:"ui_browse_playlist_modal_settings_transition_burnt_paper",value:"8"},{label:"ui_browse_playlist_modal_settings_transition_circular",value:"9"},{label:"ui_browse_playlist_modal_settings_transition_zipper",value:"10"},{label:"ui_browse_playlist_modal_settings_transition_door",value:"11"},{label:"ui_browse_playlist_modal_settings_transition_lines",value:"12"},{label:"ui_browse_playlist_modal_settings_transition_radial_wipe",value:"22"},{label:"ui_browse_playlist_modal_settings_transition_zoom",value:"13"},{label:"ui_browse_playlist_modal_settings_transition_twister",value:"19"},{label:"ui_browse_playlist_modal_settings_transition_drip",value:"14"},{label:"ui_browse_playlist_modal_settings_transition_pixelate",value:"15"},{label:"ui_browse_playlist_modal_settings_transition_bricks",value:"16"},{label:"ui_browse_playlist_modal_settings_transition_paint",value:"17"},{label:"ui_browse_playlist_modal_settings_transition_black_hole",value:"20"},{label:"ui_browse_playlist_modal_settings_transition_crt",value:"21"},{label:"ui_browse_playlist_modal_settings_transition_glass_shatter",value:"23"},{label:"ui_browse_playlist_modal_settings_transition_bullets",value:"24"},{label:"ui_browse_playlist_modal_settings_transition_ice",value:"25"},{label:"ui_browse_playlist_modal_settings_transition_boilover",value:"26"}]},this.getTransitionButtons=function(){return x.getTransitionOptions().filter(function(e){return"random"!==e.value&&"none"!==e.value&&"-2"!==e.value})},this.configureTransitionSlider=function(){return{hideLimitLabels:!0,floor:0,ceil:3e3,step:50}},this.transitionPoolSelectAll=function(e,t){t?delete e.transitionpool:e.transitionpool=[]},this.transitionPoolToggle=function(e,t,a){var i=e.transitionpool&&!e.transitionpool.includes(a);const n=x.getTransitionButtons();var o=n.length;i?(e.transitionpool.push(a),e.transitionpool.length===o&&delete e.transitionpool,(o=angular.copy(e)).transition=a,t(o)):(e.transitionpool||(e.transitionpool=n.map(function(e){return e.value})),e.transitionpool.findAndRemove(a))},this.isValueUserShortcut=function(e){return angular.isString(e)&&(e.startsWith("cmd:")||e.startsWith("file:")||e.startsWith("directory:")||e.startsWith("web:"))},a.$on("$translateChangeEnd",function(){angular.isObject(c)&&angular.isObject(l)&&n(s,c).then(function(e){l.message=e}),angular.isObject(u)&&angular.isObject(p)&&n(d,u).then(function(e){p.message=e}),n(["ui_ok","ui_cancel"]).then(function(e){S.chooseText=e.ui_ok.toString(),S.cancelText=e.ui_cancel.toString(),C.chooseText=S.chooseText,C.cancelText=S.cancelText,E.chooseText=S.chooseText,E.cancelText=S.cancelText})})}]),angular.module("wallpaperbrowserApp").controller("EditorImportModelModalCtrl",["$uibModalInstance","$q","$scope","$timeout","toastr","utils","compiler","host","objInfo","project",function(t,e,i,a,n,o,r,s,l,c){var d=e.when();function p(e,t,a){return a=a||"previewUrl",s.callEditor("getTexturePreview",{path:e,size:128}).then(function(e){t[a]=e.data})}i.project=c,i.selectTexture=function(t,e){var a=i.objInfo&&i.objInfo.file;s.callEditor("selectModelTexture",{selected:e,directory:a}).then(function(e){t.file=e.file,t.name=e.name,d=d.then(function(){return p(t.file,t)})})},i.selectNormalMap=function(t,e){var a=i.objInfo&&i.objInfo.file;s.callEditor("selectModelTexture",{selected:e,directory:a}).then(function(e){t.normalmap=e.file,t.normalmapname=e.name,d=d.then(function(){return p(t.normalmap,t,"previewUrlNormalMap")})})},i.removeNormalMap=function(e){delete e.normalmap,delete e.normalmapname},i.openTextureFormatFAQ=function(){o.openUrl(o.url.docsSceneTextureOptimization)},i.close=function(){t.dismiss("cancel")},i.ok=function(){i.waitingForResponse=!0;var t=angular.copy(i.objInfo);angular.forEach(t.materials,function(e){e.config.spritesheet?(delete t.config.importAsImageSequence,delete e.config.croptransparent,e.shaderpreset.combos=e.shaderpreset.combos||{},e.shaderpreset.combos.spritesheet=1):delete e.config.spritesheetsequences}),s.callEditor(l.config.copycommand,angular.toJson(t)).then(function(e){i.waitingForResponse=!1,i.modelDestinationPath=e,i.compileCtrl.start()}).catch(function(){i.waitingForResponse=!1})};var u={onCompileFailed:function(e){n.error(e,"Error"),i.okButtonLabel="Retry",i.$apply()},onCompileFinished:function(){a(function(){angular.isString(i.modelDestinationPath)&&(angular.isString(l.config.addcommand)?s.callEditor(l.config.addcommand,i.modelDestinationPath,l.jsonConfig).then(function(e){e.shouldAdjustProjection=l.shouldAdjustProjection,t.close(e)}).catch(function(){i.compileCtrl.cancel(),i.okButtonLabel="Retry"}):t.close(i.modelDestinationPath))},1e3),i.$apply()}};i.$on("$destroy",function(){r.removeListener(u)}),i.compileCtrl={},i.okButtonLabel="OK",r.addListener(u),s.callEditor("getShaderPresets",l.config.shaderpresetkey).then(function(t){var a;i.shaderPresets=t,i.objInfo=l,i.objInfo.shouldAdjustProjection=l.isImage&&0===l.renderableCount,angular.forEach(i.objInfo.materials,function(e){e.shaderpreset=t[0],e.config=e.config||{},e.config.spritesheetsequences=[{width:64,height:64,frames:10,duration:1}],d=d.then(function(){return p(e.file,e)}),e.formats=t[0].textures[0].formats,angular.merge(e.config,t[0].textures[0].config),e.config.format=e.config.format||e.formats[0].value,i.objInfo.shouldAdjustProjection&&(e.config.clampuvs=!0),a=a||e.file}),angular.isString(a)&&!l.instantImport&&s.callEditor("checkBadGIF",a).then(function(e){e.error&&o.displayGifWarning()})}).then(function(){l.instantImport&&i.ok()})}]).directive("cropOverlay",function(){return{restrict:"E",scope:{coGeneral:"=",coConfig:"=",coMaterial:"="},link:function(i,n){var a=n.prev()[0];n.addClass("editorCropOverlay");var o,r={},s=[];function l(){if(angular.isNumber(o)&&i.coConfig.croptransparent&&i.coConfig.canCropTransparency&&i.coGeneral.isImage&&!i.coMaterial.spritesheet){if(0===s.length){for(var e=0;e<8;++e){var t=angular.element(document.createElement("div"));t.addClass("crop"),s.push(t),n.append(t)}s[4].addClass("cropTop"),s[5].addClass("cropRight"),s[6].addClass("cropBottom"),s[7].addClass("cropLeft")}var a={x0:Math.max(0,i.coConfig.cropx0-i.coConfig.croppadding)/i.coConfig.width*r.width,x1:Math.min(i.coConfig.width,i.coConfig.cropx1+i.coConfig.croppadding)/i.coConfig.width*r.width,y0:Math.max(0,i.coConfig.cropy0-i.coConfig.croppadding)/i.coConfig.height*r.height,y1:Math.min(i.coConfig.height,i.coConfig.cropy1+i.coConfig.croppadding)/i.coConfig.height*r.height};s[0].css({left:0,top:0,width:a.x0-2,height:a.y0}),s[1].css({left:a.x1+2,top:0,width:r.width-a.x1-3,height:a.y0}),s[2].css({left:a.x1+2,top:a.y1,width:r.width-a.x1-3,height:r.height-a.y1-1}),s[3].css({left:0,top:a.y1,width:a.x0-2,height:r.height-a.y1-1}),s[4].css({left:a.x0-2,top:0,width:a.x1-a.x0+4,height:a.y0}),s[5].css({left:a.x1,top:a.y0,width:r.width-a.x1-1,height:a.y1-a.y0}),s[6].css({left:a.x0-2,top:a.y1,width:a.x1-a.x0+4,height:r.height-a.y1-1}),s[7].css({left:0,top:a.y0,width:a.x0,height:a.y1-a.y0})}else angular.forEach(s,function(e){e.remove()}),s=[]}a.onload=function(){var e=a.naturalWidth,t=a.naturalHeight;t<e?(o=a.width/e,r.left=0,r.width=a.width,r.height=o*t,r.top=.5*(a.height-r.height)):(o=a.height/t,r.top=0,r.height=a.height,r.width=o*e,r.left=.5*(a.width-r.width)),r.top+=a.offsetTop-1,r.left+=a.offsetLeft-1;e=angular.copy(r);e.width+=1,e.height+=1,n.css(e),l()},i.$watch("coConfig",l,!0),i.$watch("coMaterial",l,!0)}}}),angular.module("wallpaperbrowserApp").service("compiler",["utils",function(t){window.compilerService=this;var a=[];this.onCompileStarted=function(t){angular.forEach(a,function(e){angular.isFunction(e.onCompileStarted)&&e.onCompileStarted(t)})},this.onCompileFailed=function(t){angular.forEach(a,function(e){angular.isFunction(e.onCompileFailed)&&e.onCompileFailed(t)})},this.onCompileFinished=function(e){angular.isString(e)&&0<e.length&&t.showWarning(e),angular.forEach(a,function(e){angular.isFunction(e.onCompileFinished)&&e.onCompileFinished()})},this.addListener=function(e){a.push(e)},this.removeListener=function(e){a.splice(a.indexOf(e),1)}}]),angular.element.fn.getStyleObject=function(){var e=this.get(0),t={};if(window.getComputedStyle){for(var a,i=function(e,t){return t.toUpperCase()},n=0,o=(a=window.getComputedStyle(e,null)).length;n<o;n++){var r,s=(r=a[n]).replace(/\-([a-z])/g,i),l=a.getPropertyValue(r);t[s]=l}return t}if(a=e.currentStyle){for(r in a)t[r]=a[r];return t}return this.css()},angular.module("wallpaperbrowserApp").service("dragdrop",["$rootScope","$timeout","$q","$document",function(n,u,e,g){var o,r,s,l,i,c=this,d=angular.element(g[0].body),p=[],f=[];function m(){o.remove(),o=void 0,d.off("mousemove.dragdrop"),d.off("mouseup.dragdrop"),r=s=void 0}function v(e){for(var t=0;t<p.length;++t){var a,i,n=p[t];angular.isDefined(n[0])&&(a=n[0].getBoundingClientRect(),(i=(i=e.pageX>a.left&&e.pageX<a.left+a.width&&e.pageY>a.top&&e.pageY<a.top+a.height)&&angular.isFunction(n.dragDropListener.condition)?n.dragDropListener.condition({data:s}):i)&&l!==n&&(a=n,angular.isDefined(r)&&(angular.isString(r.dragDropTag)===angular.isString(a.dragDropListener.dragDropTag)&&r.dragDropTag===a.dragDropListener.dragDropTag))?(l=n).dragDropListener.onMouseEnter():i||l!==n||(l=void 0,n.dragDropListener.onMouseLeave()),i&&l===n&&n.dragDropListener.onMouseMove(e,s))}}(window.dragdrop=this).finish=function(e){l&&l.dragDropListener&&l.dragDropListener.onMouseLeave(),r&&(e?r.onDragged():r.onCancelled()),n.$broadcast("onInternalDropStop",s)},this.start=function(e,t,a,i){o&&(c.finish(),m()),s=t,(r=a).dragDropTag=i,l=void 0,o=e.createDragDropElement&&e.createDragDropElement()||e.clone();e=e.getStyleObject();o.css(e),o.css({opacity:0,position:"absolute","pointer-events":"none"}),d.append(o),d.on("mousemove.dragdrop",function(e){o.css({opacity:.5,left:e.pageX,top:e.pageY}),v(e)}),d.on("mouseup.dragdrop",function(e){l&&l.dragDropListener.onElementDropped(e,s)?c.finish(!0):c.finish(),m(),window.safeApply(n)}),n.$broadcast("onInternalDropStart",t)},this.registerContainer=function(e,t,a){(e.dragDropListener=t).dragDropTag=a,p.push(e)},this.unregisterContainer=function(e){e=p.indexOf(e);0<=e&&p.splice(e,1)},this.registerInitiator=function(e){0===f.length&&(g.on("mousedown.dragdropservice.initiators",function(e){for(var t=0;t<f.length;++t){var a=f[t].findElement(e);if(a){(i=a).x=e.offsetX,i.y=e.offsetY;break}}}),g.on("mouseup.dragdropservice.initiators",function(){i=void 0}),g.on("mousemove.dragdropservice.initiators",function(e){var t,a;angular.isObject(i)&&5<Math.abs(e.offsetX-i.x)+Math.abs(e.offsetY-i.y)&&(a=(t=i).element.css("opacity"),t.element.css({opacity:.35}),e={onCancelled:function(){t.element.css({opacity:a})},onDragged:function(){t.element.css({opacity:a})}},c.start(t.element,t.data,e,t.tag),i=void 0)})),f.push(e)},this.unregisterInitiator=function(e){f.findAndRemove(e),0===f.length&&(g.off("mousedown.dragdropservice.initiators"),g.off("mouseup.dragdropservice.initiators"),g.off("mousemove.dragdropservice.initiators"))},this.beginDragTest=function(e,t){var a={x:e.offsetX,y:e.offsetY,isAccepted:!1};return g.on("mouseup.dragdropservice.tmpDragTest",function(e){g.off("mouseup.dragdropservice.tmpDragTest"),g.off("mousemove.dragdropservice.tmpDragTest"),a.isAccepted?t.finish&&t.finish(e):t.cancel&&t.cancel(e)}),g.on("mousemove.dragdropservice.tmpDragTest",function(e){a.isAccepted?t.move&&t.move(e):5<Math.abs(e.offsetX-a.x)+Math.abs(e.offsetY-a.y)&&(a.isAccepted=!0,t.start&&t.start(e))}),a},this.beginAutoScroll=function(e,t,a){function i(){r.timer||(r.timer=u(p))}function n(){r.timer&&(u.cancel(r.timer),r.timer=void 0)}var o="dragdropservice."+e+".autoscroll",r={cancel:function(){g.off("mousemove."+o),g.off("mouseup."+o),r.timer&&(u.cancel(r.timer),r.timer=void 0)},timer:void 0,speed:0},s=a?function(){return t.scrollLeft()}:function(){return t.scrollTop()},l=a?function(e){return t.scrollLeft(e)}:function(e){return t.scrollTop(e)},c=a?t[0].scrollWidth:t[0].scrollHeight,d=a?function(){return t.innerWidth()}:function(){return t.innerHeight()},p=function(){l(Math.clamp(s()+r.speed,0,c-d())),r.timer=u(p)};return g.on("mouseup."+o,function(){r.cancel()}),g.on("mousemove."+o,function(e){e.target===t||angular.element.contains(t[0],e.target)?(e=a?angular.offsetToAncestor(e,t).left:angular.offsetToAncestor(e,t).top,(e-=s())<50?(r.speed=e-50,i()):e>d()-50?(r.speed=e-d()+50,i()):n()):n()}),r};var a,h=[];this.onNativeDropStart=function(e,t,a){e=e.map(function(e){return e.file}),h=e,n.osDropActive=!0,n.$broadcast("onNativeDropStart",{files:h,x:t,y:a}),window.safeApply(n)},this.onNativeDropStop=function(){u.cancel(a),n.osDropActive=!1,n.$broadcast("onNativeDropStop"),window.safeApply(n)},this.onNativeDropMove=function(e,t){u.cancel(a),n.$broadcast("onNativeDropMove",{x:e,y:t}),a=u(function(){window.safeApply(n)})},this.onNativeDropEvent=function(e,t){u.cancel(a),n.osDropActive=!1,n.$broadcast("onNativeDropDropped",{files:h,x:e,y:t}),window.safeApply(n)}}]),angular.module("wallpaperbrowserApp").directive("propertyList",["$timeout","$http","contextMenu","modals","host","skin","utils",function(i,d,p,u,g,e,o){return{templateUrl:"views/templates/propertylist.html",restrict:"E",scope:{pList:"=",pOwner:"=",pCtrl:"=",pConditionScope:"=",pModalDepth:"=",pResourcePool:"="},link:function(l){var n=!1;function a(t){var a;return angular.forEach(l.pList,function(e){e.key===t&&(a=e)}),{resource:l.pOwner,property:a}}function c(){l.pCtrl.onUserPropertyBindingsChanged&&l.pCtrl.onUserPropertyBindingsChanged()}l.colorPickerSettings=o.getColorPickerDefaults(),l.colorPickerSettingsHueOnly=o.getColorPickerDefaults("hueonly"),l.selectedEffect={item:void 0},l.selectedItem={item:void 0},l.selectedFlatItem={item:void 0},l.selectedConstItem={item:void 0},l.selectedMultiItem=[],l.texturePreviews=o.getTexturePreviews(),l.puppetReferenceOverlayState={isClosed:!0},l.dropListTextureVariantBlendOptions=[{label:"ui_editor_properties_replace",value:"replace"},{label:"ui_editor_properties_alpha_blended",value:"alphablend"}],l.findProperty=function(t,e){var a;return angular.forEach(e||l.pList,function(e){e.key===t&&(a=e)}),a},l.togglePuppetReferenceOverlayVisibility=function(){l.puppetReferenceOverlayState.isClosed=!l.puppetReferenceOverlayState.isClosed},l.evalCondition=function(e){return l.$eval(e,l.pConditionScope||l)},l.checkBit=function(e,t){return 0!=(e&t)},l.checkFlags=function(t){var a=0;return angular.forEach(l.pList,function(e){"flags"===e.key&&e.bit===t&&(a|=e.value)}),0!=(a&t)},l.checkValue=function(e,t){e=l.findProperty(e);return e&&e.value===t},l.checkRemapValueIsScalar=function(e){e=(e=l.findProperty(e))&&e.value||"size";return["lifetimefraction","maxlifetime","size","opacity","speed","rotation","angularspeed","distancetocontrolpoint","positionbetweentwocontrolpoints","runtime","timeofday","particlesystemtime","layertime"].includes(e)},l.checkRemapValueIsControlPoint=function(e){e=(e=l.findProperty(e))&&e.value||"size";return["distancetocontrolpoint","positionbetweentwocontrolpoints","controlpoint","deltatocontrolpoint","directiontocontrolpoint"].includes(e)},l.checkRemapValueIsControlPoint2=function(e){e=(e=l.findProperty(e))&&e.value||"size";return["positionbetweentwocontrolpoints"].includes(e)},l.recalculateBitFlags=function(a){var i=0;return angular.forEach(l.pList,function(e){var t;e.key===a&&(t=e.bit,"checkboxbit3"===e.type&&(t=e.bit|e.bit<<1|e.bit<<2),i|=e.value&t)}),i},l.getBit=function(e,t){return e<<t},l.forceValueGreater=function(e,t){e=l.findProperty(e),(t=l.findProperty(t)).value<=e.value&&(t.value=e.value+.1,l.pCtrl.sendAssetPropertyChange(l.pOwner,t))},l.forceValueSmaller=function(e,t){e=l.findProperty(e),(t=l.findProperty(t)).value>=e.value&&(t.value=e.value-.1,l.pCtrl.sendAssetPropertyChange(l.pOwner,t))},l.forceValueDisabledIfTrue=function(e,t){!e||(t=l.findProperty(t))&&(t.value=!1,l.pCtrl.sendAssetPropertyChange(l.pOwner,t))},l.onLabelClick=function(e){e.disabled||("checkbox"===e.type?(e.value=!e.value,l.sendAssetPropertyChange(l.pOwner,e)):"checkboxbit"===e.type&&(e.value=l.recalculateBitFlags(e.key),e.value^=e.bit,l.pCtrl.sendAssetPropertyChange(l.pOwner,e)))},l.onScriptLabelClick=function(e,t){delete t.lastValue,"checkbox"===e.type?(e.value=!e.value,l.pCtrl.sendAssetPropertyChange(l.pOwner,t)):"checkboxbit"===e.type&&(e.value=l.recalculateBitFlags(e.key),e.value^=e.bit,l.pCtrl.sendAssetPropertyChange(l.pOwner,t))},l.hasBindings=function(e){if(!angular.isFunction(l.pCtrl.getProject)||l.pCtrl.hideBasicBindings)return!1;if("material"!==l.pOwner.key&&"renderable"!==l.pOwner.key&&"scene"!==l.pOwner.key&&"animationlayer"!==l.pOwner.key)return!1;switch(e.type){case"vec2":case"vec3":case"vec3-slider-z":case"vec4":case"angle":case"color":case"slider":case"sliderHighPrecision":case"sliderint":case"knob":case"paragraph":case"hiddenbool":return!e.disablebindings;case"checkbox":case"checkboxbit":return!e.disablebindings&&"scene"===l.pOwner.key}return!1},l.hasNestedBindings=function(e){if(!angular.isFunction(l.pCtrl.getProject))return!1;if("material"!==l.pOwner.key&&"renderable"!==l.pOwner.key&&"animationlayer"!==l.pOwner.key)return!1;switch(e.type){case"vec2":case"vec3":case"vec3-slider-z":case"vec4":case"angle":case"color":case"slider":case"sliderHighPrecision":case"sliderint":case"knob":case"paragraph":case"hiddenbool":case"checkbox":case"checkboxbit":return!e.disablebindings}return!1},l.bindingsActive=function(e){return e.linkUser||e.linkScript||e.linkAnimation},l.bindingsNestedActive=function(e){return e.user},l.onTitleEdit=function(e){var t,a=l.findProperty(e.editPropertyKey);a&&(t={title:a.title||"ui_browse_modal_rename_bone_title",message:"",cancelVisible:!0,okVisible:!0,textinputVisible:!0,textinput:a.value},u.open("genericConfirm",{data:t}).then(function(){a.value=t.textinput.trim(),l.pCtrl.sendAssetPropertyChange(l.pOwner,a)}))},l.onLabelRightClick=function(e,o){if(angular.isFunction(l.pCtrl.getProject)&&("material"===l.pOwner.key||"renderable"===l.pOwner.key||"animationlayer"===l.pOwner.key||"scene"===l.pOwner.key)){var t,a,i,n,r,s=[];switch(o.type){case"color":s=[o.type];break;case"vec2":case"vec3":case"vec3-slider-z":case"vec4":case"angle":case"slider":case"sliderHighPrecision":case"sliderint":case"knob":s=["slider"];break;case"paragraph":s=["textinput"];break;case"hiddenbool":s=["bool","combo"];break;case"checkbox":case"checkboxbit":"scene"===l.pOwner.key&&(s=["bool","combo"])}0!==s.length&&(e.stopPropagation(),e.preventDefault(),t=angular.isDefined(o.linkUser),a=angular.isObject(o.linkAnimation),i=angular.isString(o.linkScript),n=s.includes("slider")||s.includes("color"),r=p.builder(),t?r.button("ui_editor_properties_context_menu_edit_user_property","fas fa-edit",function(){u.open("editorUserProperties",{data:{project:l.pCtrl.getProject(),selected:o.linkUser,types:s}}).then(function(e){o.linkUser=e,delete o.lastValue,l.pCtrl.sendAssetPropertyChange(l.pOwner,o),c()})}):a||r.button("ui_editor_properties_context_menu_bind_user_property","fas fa-user",function(){u.open("editorUserProperties",{data:{project:l.pCtrl.getProject(),types:s}}).then(function(e){o.linkUser=e,delete o.lastValue,l.pCtrl.sendAssetPropertyChange(l.pOwner,o),c()})}),n&&(a?r.button("ui_editor_properties_context_menu_edit_animation","fas fa-edit",function(){l.pCtrl.modifyAnimationLink(l.pOwner,o)}):t||r.button("ui_editor_properties_context_menu_bind_animation","fas fa-play-circle",function(){l.pCtrl.modifyAnimationLink(l.pOwner,o)})),i?r.button("ui_editor_properties_context_menu_edit_script","fas fa-edit",function(){l.pCtrl.modifyScriptLink(l.pOwner,o)}):r.button("ui_editor_properties_context_menu_bind_script","fas fa-cog",function(){l.pCtrl.modifyScriptLink(l.pOwner,o)}),o.attachmentproject&&r.button("ui_editor_properties_context_menu_bind_attachment_projection","fas fa-paperclip",function(){g.callEditor("getAllAttachments").then(function(a){if(0===a.length)u.open("genericConfirm",{data:{title:"ui_editor_properties_context_menu_bind_attachment_projection_modal_no_attachments",message:"ui_editor_properties_context_menu_bind_attachment_projection_modal_no_attachments_msg",okVisible:!0,okText:"ui_close"}});else{for(var e=[],t=0;t<a.length;++t){var i=a[t];e.push({value:""+t,label:i.label})}var n={title:"ui_editor_properties_context_menu_bind_attachment_projection_modal_select_attachment",message:"ui_editor_properties_context_menu_bind_attachment_projection_modal_select_attachment_msg",droplistVisible:!0,droplistOptions:e,droplistSelected:e[0].value,cancelVisible:!0,okVisible:!0};u.open("genericConfirm",{data:n}).then(function(){return d.get(o.attachmentangles?"monaco/snippets/script_project_attachment_angle.js":"monaco/snippets/script_project_attachment.js")}).then(function(e){var t=e&&e.data||"";t.empty()||(e=a[n.droplistSelected],t=(t=t.replace("{{ID}}",e.id)).replace("{{NAME}}",e.name),o.attachmentangles&&(t=t.replace("{{ANGLE}}",o.attachmentangles)),o.linkScript=t,delete o.lastValue,l.pCtrl.sendAssetPropertyChange(l.pOwner,o))})}})}),(t||a||i)&&(r.divider(),t&&r.button("ui_editor_properties_context_menu_unbind_user_property","fas fa-times",function(){delete o.linkUser,delete o.lastValue,l.pCtrl.sendAssetPropertyChange(l.pOwner,o),c()},void 0,"browserReportButton"),a&&r.button("ui_editor_properties_context_menu_unbind_animation","fas fa-times",function(){l.pCtrl.deleteAnimationLink(l.pOwner,o)},void 0,"browserReportButton"),i&&r.button("ui_editor_properties_context_menu_unbind_script","fas fa-times",function(){delete o.linkScript,delete o.lastValue,l.pCtrl.sendAssetPropertyChange(l.pOwner,o),l.pCtrl.modifyScriptLink(l.pOwner,o,void 0,!0)},void 0,"browserReportButton")),r.open(l,e,{placement:{target:e.currentTarget}}))}},l.onNestedLabelRightClick=function(e,t,a){if(angular.isFunction(l.pCtrl.getProject)&&("material"===l.pOwner.key||"renderable"===l.pOwner.key)){var i,n=[];switch(t.type){case"color":n=[t.type];break;case"vec2":case"vec3":case"vec4":case"angle":case"slider":case"sliderHighPrecision":case"sliderint":n=["slider"];break;case"paragraph":n=["textinput"];break;case"hiddenbool":n=["bool","combo"];break;case"checkbox":case"checkboxbit":n=["bool","combo"]}0!==n.length&&(e.stopPropagation(),e.preventDefault(),i=p.builder(),t.user?i.button("ui_editor_properties_context_menu_edit_user_property","fas fa-edit",function(){u.open("editorUserProperties",{data:{project:l.pCtrl.getProject(),selected:t.user,types:n}}).then(function(e){t.user=e,delete a.lastValue,l.pCtrl.sendAssetPropertyChange(l.pOwner,a)})}).button("ui_editor_properties_context_menu_unbind_user_property","fas fa-times",function(){delete t.user,delete a.lastValue,l.pCtrl.sendAssetPropertyChange(l.pOwner,a)}):i.button("ui_editor_properties_context_menu_bind_user_property","fas fa-user",function(){u.open("editorUserProperties",{data:{project:l.pCtrl.getProject(),types:n}}).then(function(e){t.user=e,delete a.lastValue,l.pCtrl.sendAssetPropertyChange(l.pOwner,a)})}),i.open(l,e,{placement:{target:e.currentTarget}}))}},l.isTextureOptionsVisible=function(e){return"error"!==e.value&&!e.iscomponent&&(!e.mode||e.generated||"rgbmask"===e.mode||"opacitymask"===e.mode)},l.onTextureContextMenu=function(e,t){e.stopPropagation(),e.preventDefault();var a=["scenetexture","usershortcut"],i=angular.isString(t.linkUser)||angular.isObject(t.linkUser)&&"usershortcut"===t.linkUser.type,n=angular.isObject(t.linkUser)&&"system"===t.linkUser.type,o=!t.hideBasicBindings,r=p.builder();i?r.button("ui_editor_properties_context_menu_edit_user_property","fas fa-edit",function(){u.open("editorUserProperties",{data:{project:l.pCtrl.getProject(),selected:t.linkUser,types:a}}).then(function(e){t.linkUser=e,delete t.lastValue,l.pCtrl.sendAssetPropertyChange(l.pOwner,t)})}):!n&&o&&r.button("ui_editor_properties_context_menu_bind_user_property","fas fa-user",function(){u.open("editorUserProperties",{data:{project:l.pCtrl.getProject(),types:a}}).then(function(e){t.linkUser=e,delete t.lastValue,l.pCtrl.sendAssetPropertyChange(l.pOwner,t)})}),n?r.button("ui_editor_properties_context_menu_edit_system_resource","fas fa-edit",function(){u.open("editorSystemResources",{data:{item:t.linkUser.name}}).then(function(e){t.linkUser={type:"system",name:e},delete t.lastValue,l.pCtrl.sendAssetPropertyChange(l.pOwner,t)})}):!i&&o&&r.button("ui_editor_properties_context_menu_bind_system_resource","fas fa-music",function(){u.open("editorSystemResources",{data:{}}).then(function(e){t.linkUser={type:"system",name:e},delete t.lastValue,l.pCtrl.sendAssetPropertyChange(l.pOwner,t)})}),i&&r.button("ui_editor_properties_context_menu_unbind_user_property","fas fa-times",function(){delete t.linkUser,delete t.lastValue,l.pCtrl.sendAssetPropertyChange(l.pOwner,t)},void 0,"browserReportButton"),n&&r.button("ui_editor_properties_context_menu_unbind_system_resource","fas fa-times",function(){delete t.linkUser,delete t.lastValue,l.pCtrl.sendAssetPropertyChange(l.pOwner,t)},void 0,"browserReportButton"),t.noneditable||"rgbmask"===t.mode||"opacitymask"===t.mode||t.iscomponent||(r.empty()||r.divider(),r.button("ui_editor_properties_context_menu_texture_properties","fas fa-cog",function(){l.pCtrl.navigateProperty("texture",t.id)})),r.open(l,e,{placement:{target:e.currentTarget}})},l.sendAssetPropertyChangeWeights=function(e,t,a){a.all&&angular.forEach(t.value.vertices,function(e){angular.forEach(e.weights,function(e){e.all||e.bone!==a.bone||(e.weight=a.weight)})}),l.sendAssetPropertyChange(e,t,a)},l.sendAssetPropertyChange=function(e,t,a){if(!angular.isUndefined(t.value)&&null!==t.value)return n&&((a=a||{}).save=!1),t.changeevent&&l.$eval(t.changeevent,l.pConditionScope||l),l.pCtrl.sendAssetPropertyChange(e,t,a)},l.sendNestedAssetPropertyChange=function(e,t,a,i){angular.isUndefined(e.value)?e.value=e.lastValue:e.value!==e.lastValue&&(e.lastValue=e.value,delete a.lastValue,n&&((i=i||{}).save=!1,i.disableCurveEditorSave=!0),l.pCtrl.sendAssetPropertyChange(t,a,i))},l.sendNestedAssetPropertyChangeForce=function(e,t,a){i(function(){delete e.lastValue,l.sendNestedAssetPropertyChange(e,t,a)})},l.linkedControlSave=function(e){n=e},l.linkedSliderStart=function(){n=!0},l.linkedSliderEnd=function(e){n=!1;e=a(e);delete e.property.lastValue,l.pCtrl.sendAssetPropertyChange(e.resource,e.property)},l.onChangeColorListCount=function(e){var t=a(e);for(angular.isArray(t.property.value)||(t.property.value=[]);t.property.value.length<t.property.arraysize;)t.property.value.push("1 1 1");for(;t.property.value.length>t.property.arraysize;)t.property.value.pop();l.pCtrl.sendAssetPropertyChange(t.resource,t.property)},l.updateColorListColor=function(e,t,a){e.value[a]=t},l.sendAssetPropertyChangeSliderStart=function(e){n=!0;e=a(e);l.pCtrl.sendAssetPropertyChange(e.resource,e.property,{save:!1,disableCurveEditorSave:!0})},l.sendAssetPropertyChangeSliderChange=function(e){var t=a(e),e={};n&&(e.save=!1,e.disableCurveEditorSave=!0),t.property.changeevent&&l.$eval(t.property.changeevent,l.pConditionScope||l),l.pCtrl.sendAssetPropertyChange(t.resource,t.property,e)},l.sendAssetPropertyChangeSliderEnd=function(e){n=!1;e=a(e);delete e.property.lastValue,l.pCtrl.sendAssetPropertyChange(e.resource,e.property)},l.sendAssetPropertyChangeColorEnd=function(e,t){i(function(){delete t.lastValue,l.pCtrl.sendAssetPropertyChange(e,t)})},l.sendAssetPropertyChangeBoneDepth=function(e,t){t.key&&t.key.startsWith("bonedepthoffset")?angular.forEach(l.pList,function(e){e.key&&e.key.startsWith("bonedepthcalculated")&&(e.value=Math.round(t.defaultpriority+t.inheritedpriority+t.value),e.lastValue=e.value)}):t.key&&t.key.startsWith("bonedepthcalculated")&&angular.forEach(l.pList,function(e){e.key&&e.key.startsWith("bonedepthoffset")&&(e.value=Math.round(t.value-(t.defaultpriority+t.inheritedpriority)),e.lastValue=e.value)}),l.pCtrl.sendAssetPropertyChange(e,t)},l.revertBoneDepth=function(t){angular.forEach(l.pList,function(e){e.key&&e.key.startsWith("bonedepthoffset")&&(e.value=0,delete e.lastValue,l.sendAssetPropertyChangeBoneDepth(t,e))})},l.sendMultipleProperties=function(e,n){var o=[];angular.forEach(n.value,function(t,a){var i=angular.copy(n);i.key=a,i.value=t,angular.forEach(l.pList,function(e){e.key===a&&(e.value=t,i.linkUser=e.linkUser,i.linkScript=e.linkScript,i.linkAnimation=e.linkAnimation)}),o.push(i)}),l.pCtrl.sendAssetPropertyChange(e,o)},l.openTextureMenu=function(e,t){var a=p.builder();"depth"===t.mode&&a.button("ui_editor_properties_paint","fas fa-fw fa-paint-brush",function(){l.pCtrl.beginPaint(t)}),a.button("ui_editor_properties_import_texture_file","fas fa-fw fa-file-import",function(){l.pCtrl.importTextureFile(t.material,t.textureindex,t.component,t.format,void 0,{ismodeltexture:t.ismodeltexture})}),t.value&&"error"!==t.value&&(a.button("ui_editor_properties_export_texture_file","fas fa-fw fa-file-export",function(){l.pCtrl.exportTextureFile(t.value,t.iscomponent)}),t.noneditable||a.divider().button("ui_editor_context_menu_edit_with_other","fas fa-fw fa-file-edit",function(){l.pCtrl.editTextureFileExternally(t.value)})),a.open(l,e,{placement:{target:e.currentTarget}})},l.getTexturePreview=function(e,t,a){var i;return e.lastTexturePath!==t&&(i=!l.texturePreviews.hasOwnProperty(e.id)||!e.lastTexturePath,e.lastTexturePath=t,i&&(l.texturePreviews.hasOwnProperty(e.id)||o.updateTexturePreview({id:e.id,data:l.noPreviewURL}),g.callEditor("getTexturePreview",{id:e.id,path:t,isasync:!1!==a}))),l.texturePreviews.hasOwnProperty(e.id)},l.noPreviewURL="images/no_texture_preview.jpg",l.toggleStringProperty=function(e,t){e.value===t?e.value="":e.value=t,l.sendAssetPropertyChange(l.pOwner,e)},l.setStringProperty=function(e,t){e.value=t,l.sendAssetPropertyChange(l.pOwner,e)},l.importFontFileToProperty=function(t,e){l.pCtrl.importFontFile(e).then(function(e){t.value=e,l.sendAssetPropertyChange(l.pOwner,t)})},l.selectAll=function(e,t){l.selectedMultiItem.length=0,t&&angular.forEach(e.value,function(e){l.selectedMultiItem.push(e)}),l.pCtrl[e.objectcontroller].itemSelected(l.pOwner,e,l.selectedMultiItem)},l.textureOpenVariantOptions=function(e,t){e.stopPropagation(),e.preventDefault(),p.builder().button("ui_editor_properties_rename_option","fas fa-fw fa-pen-to-square",function(){l.textureRenameVariantOption(t)}).button("ui_editor_properties_replace_texture","fas fa-fw fa-file-import",function(){l.textureReplaceVariantOption(t)}).divider().button("ui_editor_properties_remove_option","fas fa-fw fa-xmark",function(){l.textureRemoveVariantOption(t)},void 0,"browserReportButton").open(l,e,{placement:{target:e.currentTarget}})},l.textureSortVariantOption=function(e,t){g.callEditor("genericSceneAction","textureSortVariantOption",e.id,t)},l.textureRemoveVariantOption=function(e){g.callEditor("genericSceneAction","textureRemoveVariantOption",e.id)},l.textureSetVariantOptionBlend=function(e){g.callEditor("genericSceneAction","textureSetVariantOptionBlend",e.id,e.blend)},l.textureReplaceVariantOption=function(e){g.callEditor("genericSceneAction","textureReplaceVariantOption",e.id)},l.textureRenameVariantOption=function(e){var t={title:"ui_browse_modal_rename_texture_variant_option_title",message:"",cancelVisible:!0,okVisible:!0,textinputVisible:!0,textinput:e.name};u.open("genericConfirm",{data:t}).then(function(){g.callEditor("genericSceneAction","textureRenameVariantOption",e.id,t.textinput)})},l.textureEditVariantOptionCondition=function(t){u.open("editorUserProperties",{data:{project:l.pCtrl.getProject(),selected:t.variantcondition,types:["bool","combo"]}}).then(function(e){t.variantcondition=e,g.callEditor("genericSceneAction","textureSetVariantOptionCondition",t.id,e),c()})},l.textureVariantOptionHasCondition=function(e){return angular.isObject(e.variantcondition)||angular.isString(e.variantcondition)},l.matrixSelectorIsActiveBtn=function(e,t,a){return e.previewx===t&&e.previewy===a},l.matrixSelectorSelectBtn=function(e,t,a){g.callEditor("genericSceneAction","selectExpressionBlendShapeMatrix",e.id,t,a)},l.titleControls={sendAssetPropertyChange:function(e){l.pCtrl.sendAssetPropertyChange(l.pOwner,e)},onPropertyRightClick:l.onLabelRightClick,bindingsActive:l.bindingsActive};var s=[];l.getHueSteps=function(){var e=l.findProperty("huemin"),t=l.findProperty("huemax"),a=l.findProperty("huesteps");if(e&&t&&a){for(var i=e.value,e=t.value,n=Math.max(1,Math.min(100,a.value));s.length<n;)s.push({});for(;s.length>n;)s.pop();t=e-i;0===t&&(t=1);a=n-1;Math.abs((e-i)%1)<1/360&&(a+=1);for(var o=t/Math.max(1,a),r=0;r<n;++r)s[r].color="hsl("+360*(i+r*o)%360+"deg 100% 50%)"}else s.length=0;return s}}}}]).directive("propertyTitleControls",function(){return{templateUrl:"views/templates/propertylisttitlecontrols.html",restrict:"E",link:function(a){a.toggleVisible=function(e){var t=a.pProperties.visible;t.value=e,a.titleControls.sendAssetPropertyChange(t)},a.toggleLock=function(e){var t=a.pProperties.locktransforms;t.value=e,a.titleControls.sendAssetPropertyChange(t)},a.$watch("property",function(e){a.pProperties={visible:a.findProperty("visible"),locktransforms:a.findProperty("locktransforms")},a.pRoot=e})}}}).directive("nestedProperties",function(){return{templateUrl:"views/templates/nestedproperties.html",restrict:"E",link:function(t){t.$watch("property",function(e){e&&"titleVisibleLock"===e.type?t.activeProperty=t.findProperty("visible"):t.activeProperty=t.property})}}}).directive("truncateFloat",function(){return{restrict:"A",require:"?ngModel",link:function(e,t,a,i){var n=a.truncateFloat&&parseFloat(a.truncateFloat)||5;i.$formatters.push(function(e){return parseFloat(parseFloat(e).toFixed(n))})}}}).filter("truncateFloat",function(){return function(e){return parseFloat(parseFloat(e).toFixed(5))}}),angular.module("wallpaperbrowserApp").directive("cameraTimeline",["$document","$timeout","$translate","host",function(e,D,W,B){return{restrict:"E",scope:{ctData:"="},link:function(s,c){var d,p,u,g,f,t,n,a=angular.element(e[0].body),m={cursorPosition:0,buttonPlayState:"play",buttonKeyState:"add",playInProgress:!1},l={active:!1,keyFrame:void 0},o={duration:0},v=[];function i(e,t){var a=e.pageX-d.offset().left,e=d.width();a=(a=Math.max(0,Math.min(e,a)))/e*u.duration*2;var i,n,o,r=(a=Math.round(a))/2;angular.isObject(l.keyFrame)?t?(n=l.keyFrame[0].dataId,angular.forEach(v,function(e){e.id===n&&(o=e)}),i=o,B.callEditor("moveCameraTransform",s.ctData.id,i.id,r).then(function(){_(i.timestamp=r,i.marker),angular.forEach(u.transforms,function(e){e.id===i.id&&(e.timestamp=i.timestamp)})}).catch(function(){_(i.timestamp,i.marker)})):_(r):_(m.cursorPosition=r)}function h(){1<v.length?g.removeClass("disabled"):g.addClass("disabled")}function b(){var t=!1;angular.forEach(v,function(e){t=t||e.timestamp===m.cursorPosition}),M(1,t?"remove":"add")}function r(e,t){t=t/u.duration*100,e.css({left:t+"%"}),b()}function _(e,t){r(t||l.keyFrame||p,e)}function y(){p.removeClass("play"),m.playInProgress=!1,B.callEditor("pausePlayback"),angular.isDefined(t)&&(D.cancel(t),t=void 0)}function w(){a.off("mousemove.cameraTimeline"),a.off("mouseup.cameraTimeline"),a.off("mouseleave.cameraTimeline")}function k(){var e=angular.element(document.createElement("div"));e.addClass("editorCameraTimeline"),e.on("mousedown",function(e){m.playInProgress||(i(e),l.active=!0)}),w(),a.on("mousemove.cameraTimeline",function(e){l.active&&i(e)});function t(e){angular.isObject(l.keyFrame)&&i(e,!0),l.active=!1,l.keyFrame=void 0}return a.on("mouseup.cameraTimeline",t),a.on("mouseleave.cameraTimeline",t),e}function x(){var e=angular.element(document.createElement("span"));return e.addClass("timelineRow"),e}function S(){var e=angular.element(document.createElement("span"));return e.addClass("timestampContainer"),e}function C(e){var t=angular.element(document.createElement("span"));return t.text(Math.round(e)),t.addClass("timestamp"),t}function E(e,t){var a=angular.element(document.createElement("span"));return a.addClass(t?"smallLine":"line"),e&&a.addClass("left"),a}function P(){var e=angular.element(document.createElement("a")),t=angular.element(document.createElement("span")),a=angular.element(document.createElement("span"));return e.append(t),e.append(a),e.addClass("btn btn-primary fullWidth"),a.addClass("buttonText"),e}function M(e,t){var a=0===e?g:f,i=angular.element(a.children("span")[0]);i.removeClass();var n=angular.element(a.children("span")[1]);switch(t){case"play":n.text(" Play"),i.addClass("glyphicon glyphicon-play");break;case"pause":n.text(" Pause"),i.addClass("glyphicon glyphicon-pause");break;case"add":n.text(" Add Key"),i.addClass("glyphicon glyphicon-plus");break;case"remove":n.text(" Remove"),i.addClass("glyphicon glyphicon-remove")}0===e?m.buttonPlayState=t:m.buttonKeyState=t}function A(){"play"===m.buttonPlayState?(M(0,"pause"),m.cursorPosition+.25>u.duration&&(m.cursorPosition=0,_(m.cursorPosition)),p.addClass("play"),m.playInProgress=!0,B.callEditor("startPlayback",s.ctData.id,m.cursorPosition).then(function(){var e=function(){m.cursorPosition+.25>u.duration?(y(),M(0,"play")):(m.cursorPosition+=.5,_(m.cursorPosition),t=D(e,500))};t=D(e,500)})):(M(0,"play"),y())}function T(e,t){var a=angular.element(document.createElement("span"));return a.addClass("marker keyFrameMarker"),a.on("mousedown",function(e){m.playInProgress&&A(),e.stopPropagation(),l.keyFrame=a,l.active=!0}),v.push({marker:a,id:e,timestamp:t}),a[0].dataId=e,r(a,t),a}function O(){var t,a,i;"add"===m.buttonKeyState?B.callEditor("addCameraTransformToPath",s.ctData.id,m.cursorPosition).then(function(e){var t=T(e.id,e.timestamp);d.prepend(t),u.transforms.push({id:e.id,timestamp:e.timestamp}),h()}):(a=m.cursorPosition,angular.forEach(v,function(e){e.timestamp===a&&(i=e)}),t=i,angular.isObject(t)&&B.callEditor("removeCameraTransformFromPath",s.ctData.id,t.id).then(function(){t.marker.remove(),v.splice(v.indexOf(t),1);for(var e=0;e<u.transforms.length;++e)if(u.transforms[e].id===t.id){u.transforms.splice(e,1);break}h(),b()}))}function I(e){c.empty(),v=[],(u=angular.copy(e)).transforms=e.transforms,u.duration=Math.ceil(u.duration);var t=k();c.append(t);var a=x();a.addClass("timeStamps");for(var i,n=t.width()/u.duration<40,o=0;o<u.duration;++o){var r,s=S(u.duration);0===o&&((r=C(0)).addClass("left"),s.append(r)),n&&(o+1)%5!=0&&o!==u.duration-1||(r=C(o+1),s.append(r)),a.append(s)}for(t.append(a),a=x(),o=0;o<u.duration;++o){s=S(u.duration);var l=E();s.append(l),n||s.append(E(!1,!0)),0===o&&s.append(E(!0)),a.append(s)}t.append(a),p=function(){var e=angular.element(document.createElement("span"));e.addClass("marker cursorMarker");var t=angular.element(document.createElement("span"));return t.addClass("arrow fas fa-play"),e.append(t),e}(),(i=angular.element(document.createElement("span"))).addClass("markerContainer"),(d=i).append(p),t.append(d),angular.forEach(e.transforms,function(e){e=T(e.id,e.timestamp);d.prepend(e)});e=angular.element(document.createElement("div"));e.addClass("editorCameraTimelineControls"),g=P(),f=P(),M(0,m.buttonPlayState),M(1,m.buttonKeyState),h(),b(),e.append(g),e.append(f),c.append(e),g.click(A),f.click(O),_(m.cursorPosition)}function R(){c.empty();var e=angular.element(document.createElement("div"));e.addClass("editorCameraTimeline errorMessage");var t=angular.element(document.createElement("span"));W("ui_editor_camera_select_path").then(function(e){t.text(e)}),e.append(t),c.append(e)}R(),s.$watch("ctData",function(e){var a,i;angular.isObject(e)?(a=!1,i=e.transforms||[],angular.forEach(e.properties,function(e,t){"duration"===e.key&&(a=!0,angular.isFunction(n)&&n(),n=s.$watch("ctData.properties["+t+"].value",function(e){(!angular.isNumber(e)||e<1)&&(e=1),I(o={duration:e,transforms:i})}))}),a||R()):R()}),s.$on("$destroy",function(){w(),angular.element(window).off("resize.cameraTimelineResize")}),I(o),angular.element(window).on("resize.cameraTimelineResize",function(){I(o)})}}}]),angular.module("wallpaperbrowserApp").directive("disableAnimate",["$animate",function(a){return{restrict:"A",link:function(e,t){a.enabled(t,!1)}}}]),angular.module("wallpaperbrowserApp").controller("EditorProjectSettingsModalCtrl",["$scope","$uibModalInstance","$timeout","host","modals","utils","project",function(t,e,a,i,n,o,r){function s(e){angular.isString(e)&&(t.project.data.preview=e,t.previewRefreshUrl=o.addUrlTimestamp(e))}t.close=function(){e.close()},t.takeSnapshot=function(){i.callUI("takeSnapshot").then(function(e){return t.project.data.snapshotformat=e.format,t.project.data.snapshotoverlay=e.overlay,e.preview}).then(s)},t.importSnapshot=function(){i.callUI("importSnapshot").then(s)},t.colorPickerOptions=o.getColorPickerDefaults(),t.project=r,t.$watch("project.data.title",function(e){o.onProjectNameChanged(e)}),t.$watch("project.data.preview",function(e){t.previewRefreshUrl=o.addUrlTimestamp(e)}),a(function(){t.$broadcast("rzSliderForceRender")},300)}]),angular.module("wallpaperbrowserApp").directive("vecColorConverter",["utils",function(n){return{restrict:"A",require:"ngModel",link:function(e,t,a,i){"false"!==a.vecColorConverter?(i.$parsers.push(n.convertHexToVec3),i.$formatters.push(n.convertVec3ToHex)):(i.$parsers.push(n.convertHexToVec3_255),i.$formatters.push(n.convertVec3ToHex_255))}}}]).directive("vecHueConverter",["utils",function(n){return{restrict:"A",require:"ngModel",link:function(e,t,a,i){i.$parsers.push(n.convertHexToHueFloat),i.$formatters.push(n.convertHueFloatToHex)}}}]).directive("vecComponentInput",["$rootScope","$document","$parse","$timeout","utils","host",function(u,g,e,f,m,v){return{templateUrl:"views/templates/veccomponentinput.html",restrict:"E",replace:!0,require:"ngModel",scope:{model:"=ngModel",vciMode:"=",vciCount:"@",vciOptions:"=",vciOwner:"=",vciSliderOptions:"=",vciDisabled:"=",vciShowSliderZ:"@"},link:function(r,e,t,s){angular.isUndefined(r.vciCount)&&(r.vciCount="3"),r.settings={};var a,i=0;function n(e){return Math.round(1e3*(e+Number.EPSILON))/1e3}function o(e){if(angular.isString(e)){var t=e.split(" "),e={};return e.x=parseFloat(0<t.length&&t[0])||0,e.y=parseFloat(1<t.length&&t[1])||0,e.z=parseFloat(2<t.length&&t[2])||0,e.w=parseFloat(3<t.length&&t[3])||0,e}return{x:0,y:0,z:0,w:0}}function l(){switch(r.vciCount){case"4":if(angular.isUndefinedOrNull(r.value.x)||angular.isUndefinedOrNull(r.value.y)||angular.isUndefinedOrNull(r.value.z)||angular.isUndefinedOrNull(r.value.w))return 1;break;case"3":if(angular.isUndefinedOrNull(r.value.x)||angular.isUndefinedOrNull(r.value.y)||angular.isUndefinedOrNull(r.value.z))return 1;break;case"2":if(angular.isUndefinedOrNull(r.value.x)||angular.isUndefinedOrNull(r.value.y))return 1}}function c(e){var t="";switch(r.vciCount){case"2":t=(e.x||"0")+" "+(e.y||"0");break;case"3":t=(e.x||"0")+" "+(e.y||"0")+" "+(e.z||"0");break;case"4":t=(e.x||"0")+" "+(e.y||"0")+" "+(e.z||"0")+" "+(e.w||"0")}var a=t.split(" "),i=(s.$modelValue||"").split(" "),n=a.length!==i.length;if(!n)for(var o=0;o<a.length;++o)n=n||1e-6<Math.abs(parseFloat(a[o])-parseFloat(i[o]));n&&s.$setViewValue(t)}r.value={x:0,y:0,z:0,w:0},s.$render=function(){var e=s.$modelValue;if(angular.isString(e)){var t=o(e);switch(r.vciMode){case"angle":t.x=n(m.toDegrees(t.x)),t.y=n(m.toDegrees(t.y)),t.z=n(m.toDegrees(t.z)),t.w=n(m.toDegrees(t.w)),angular.isNumber(r.value.x)===angular.isNumber(t.x)&&angular.isNumber(r.value.y)===angular.isNumber(t.y)&&angular.isNumber(r.value.z)===angular.isNumber(t.z)&&angular.isNumber(r.value.w)===angular.isNumber(t.w)&&Math.round(1e3*r.value.x)===Math.round(1e3*t.x)&&Math.round(1e3*r.value.y)===Math.round(1e3*t.y)&&Math.round(1e3*r.value.z)===Math.round(1e3*t.z)&&Math.round(1e3*r.value.w)===Math.round(1e3*t.w)||(r.value=t);break;case"startdelta":0===t.y?t.y=0:t.y=n(1/t.y+t.x),r.value=t;break;default:r.value=t}}},s.$render(),r.$watch("model",function(e,t){e!==t&&s.$render()}),r.$watch("value",function(e){if(e=angular.copy(e),!r.settings.linked||e.x===e.y){var t=o(r.model);switch(r.vciMode){case"angle":(i<=0||!angular.isUndefinedOrNull(e.x))&&(e.x=angular.isUndefinedOrNull(e.x)?t.x:m.toRadians(e.x)),(i<=0||!angular.isUndefinedOrNull(e.y))&&(e.y=angular.isUndefinedOrNull(e.y)?t.y:m.toRadians(e.y)),(i<=0||!angular.isUndefinedOrNull(e.z))&&(e.z=angular.isUndefinedOrNull(e.z)?t.z:m.toRadians(e.z)),(i<=0||!angular.isUndefinedOrNull(e.w))&&(e.w=angular.isUndefinedOrNull(e.w)?t.w:m.toRadians(e.w));break;case"startdelta":i<=0&&angular.isUndefinedOrNull(e.x)&&(e.x=t.x),(i<=0||!angular.isUndefinedOrNull(e.y))&&(e.y=angular.isUndefinedOrNull(e.y)?t.y:e.y-e.x!=0?n(1/(e.y-e.x)):0);break;default:i<=0&&(angular.isUndefinedOrNull(e.x)&&(e.x=t.x),angular.isUndefinedOrNull(e.y)&&(e.y=t.y),angular.isUndefinedOrNull(e.z)&&(e.z=t.z),angular.isUndefinedOrNull(e.w)&&(e.w=t.w))}0<i&&l()||c(e)}},!0),r.$watch("vciOptions",function(e){r.settings.linked=e&&"linkedslider"===e.mode&&r.value.x===r.value.y,r.usePositionListener=e&&"position"===e.mode}),r.toggleLinked=function(){r.settings.linked=!r.settings.linked,r.settings.linked&&(r.value.y=r.value.x)},r.suppressSave=function(e){var t=!1;e?(++i,a=angular.copy(r.value)):(--i,t=!angular.equals(r.value,a)),r.vciSliderOptions&&r.vciSliderOptions.controlSave(e),!e&&t&&(f.cancel(_inputUpdateTimer),_inputUpdateTimer=f(function(){l()&&c(r.value),r.vciSliderOptions&&angular.isFunction(r.vciSliderOptions.onEnd)&&r.vciSliderOptions.onEnd(r.vciSliderOptions.id)}))},r.sendAssetPropertyChangeSliderStart=function(){f.cancel(_linkedSliderUpdateTimer),f.cancel(_inputUpdateTimer),r.vciSliderOptions&&angular.isFunction(r.vciSliderOptions.onStart)&&r.vciSliderOptions.onStart(r.vciSliderOptions.id)},r.sendAssetPropertyChangeSliderEnd=function(){r.vciSliderOptions&&angular.isFunction(r.vciSliderOptions.onEnd)&&(_linkedSliderUpdateTimer=f(function(){r.vciSliderOptions.onEnd(r.vciSliderOptions.id)}))},r.sliderZChangeStart=function(){r.vciSliderOptions.controlSave(!0)},r.sliderZChangeEnd=function(){r.vciSliderOptions.controlSave(!1),_linkedSliderUpdateTimer=f(function(){r.vciSliderOptions.onEnd(r.vciSliderOptions.id)})};var d,p=!(r.sendAssetPropertyChangeSliderChange=function(e,t){if(r.settings.linked)switch(e){case"x":r.value.y=t;break;case"y":r.value.x=t}});r.$on("$destroy",function(){p&&r.cancelPickPosition(),d&&g.off(d)}),r.cancelPickPosition=function(){v.callEditor("endPickPosition",!1),u.$broadcast("showPreviewCrosshair",!1),p=!1},r.pickPosition=function(){p?r.cancelPickPosition():(v.callEditor("startPickPosition",r.vciOwner.id,r.vciOptions.key).then(function(e){r.value.x=e.x,r.value.y=e.y,u.$broadcast("showPreviewCrosshair",!1),p=!1}),u.$broadcast("showPreviewCrosshair",!0),p=!0)},r.$watch("usePositionListener",function(e){d&&g.off(d),e&&(d="keydown.vec.position.picker."+r.vciOwner.id,g.on(d,function(e){p&&27===e.keyCode&&(r.cancelPickPosition(),r.$apply(),e.stopPropagation(),e.preventDefault())}))})}}}]).directive("radianConverter",["utils",function(n){return{restrict:"A",require:"ngModel",link:function(e,t,a,i){i.$parsers.push(n.toDegrees),i.$formatters.push(n.toRadians)}}}]).directive("degreeConverter",["utils",function(o){return{restrict:"A",require:"ngModel",link:function(e,t,a,i){const n=e.$eval(a.degreeConverter);i.$formatters.push(e=>{e=o.toDegrees(e);return e=n&&n.round?Math.round(e):e}),i.$parsers.push(o.toRadians)}}}]).directive("scrollHorizontal",function(){return{restrict:"A",link:function(e,t){t.on("wheel",function(e){t[0].scrollTo({top:0,left:t.scrollLeft()+e.originalEvent.deltaY,behavior:"smooth"})})}}}).directive("numberInputControls",function(){return{restrict:"A",require:"ngModel",link:function(i,n,o,r){const s=n[0];function t(e,t){var a=i.$eval(o.numberInputControls),a=a&&a.fractional&&!e.shiftKey||e.ctrlKey,e=s.valueAsNumber;a&&(e*=10),Number.isInteger(e)?t<0?--e:++e:e=t<0?Math.floor(e):Math.ceil(e),a&&(e/=10),n.val(e),r.$setViewValue(e)}function a(e){return e.target===window.document.activeElement&&!e.target.disabled}n.on("wheel",function(e){a(e)&&(e.stopPropagation(),e.preventDefault(),t(e,e.originalEvent.wheelDelta))}),n.on("keydown",function(e){!a(e)||38!==e.which&&40!==e.which||(e.stopPropagation(),e.preventDefault(),t(e,38===e.which?1:-1))})}}}),angular.module("wallpaperbrowserApp").directive("ngMouseWheel",function(){return{restrict:"A",scope:{ngMouseWheel:"&"},link:function(a,e){e.bind("DOMMouseScroll mousewheel onmousewheel",function(e){var t=Math.max(-1,Math.min(1,e.originalEvent.wheelDelta));0!==t&&(a.$apply(function(){a.ngMouseWheel({delta:t})}),e.returnValue=!1,e.preventDefault&&e.preventDefault())})}}}),angular.module("wallpaperbrowserApp").controller("EditorTemplateWizardModalCtrl",["$uibModalInstance","$q","$timeout","$scope","host","toastr","compiler","utils","projectData","sceneData",function(e,a,i,n,o,t,r,s,l,c){var d,p;function u(){p=d=void 0}n.ok=function(){e.close()},n.replaceTexture=function(t){u(),o.callEditor("replaceTexture",angular.toJson(t.parameters||{})).then(function(e){var t=a.defer();return o.callEditor("checkBadGIF",e).then(function(e){if(e.error)return s.displayGifWarning(!0)}).then(function(){t.resolve(e)}),t.promise}).then(function(e){return d=t,p=e,n.currentTemplateOptionName=t.name,o.callEditor("replaceTextureCopyFiles",e,angular.toJson(t))}).then(function(){n.compileCtrl.start()})},n.setOptionConfigured=function(e){e.configured=!0};var g={onCompileStarted:function(){},onCompileFailed:function(e){t.error(e,"Error"),u(),n.$apply()},onCompileFinished:function(){angular.isObject(d)&&(d.configured=!0,d.last=p),o.callEditor("getTextureSize",p).then(function(t){i(function(){var e;d.adjustprojection&&angular.isObject(t)&&angular.isObject(c)&&(c.orthogonalprojection=t,e=d.destination,i(function(){o.callEditor("saveSceneGeneralData",angular.toJson(c)),o.callEditor("findRenderableByMaterial",e).then(function(e){angular.isObject(e)&&o.callEditor("centerRenderable",e.id,"0 0 0",!1)})})),u(),n.compileCtrl.cancel(),n.compileCtrl.success=!1},1e3)})}};n.$on("$destroy",function(){r.removeListener(g)}),r.addListener(g),n.compileCtrl={},n.selectedOption={value:void 0},n.templateoptions=l.templateoptions,n.colorPickerOptions=s.getColorPickerDefaults("flat"),n.generalProperties=l.general&&l.general.properties||{},n.selectedOption.value=l.templateoptions[0]}]),angular.module("wallpaperbrowserApp").directive("compilerProgress",["$timeout","modals","compiler",function(r,s,l){return{templateUrl:"views/templates/compilerprogress.html",scope:{compileCtrl:"="},restrict:"E",link:function(t){var a,i;function n(e,t){if(angular.isUndefined(e))return 0;var a=1/e.total,e=a*e.current;return e+=a*t,e=Math.floor(100*e),Math.min(99,Math.max(1,e))}function o(){angular.isDefined(a)&&(r.cancel(a),a=void 0),i=0}var e={onCompileStarted:function(e){t.compileCtrl.success=!1,t.compileInfo=e,t.compileInfo.progress=n(e,0),o(),function e(){a=r(function(){i+=.02,i=Math.min(.9,i),t.compileInfo.progress=n(t.compileInfo,i),e()},500)}(),t.$apply()},onCompileFailed:function(){t.compileCtrl.active=!1,s.setPreventModalClose(!1),o(),t.$apply()},onCompileFinished:function(){s.setPreventModalClose(!1),o(),t.compileInfo.progress=100,t.compileCtrl.active=!1,t.compileCtrl.success=!0,t.$apply()}};t.compileCtrl={start:function(){t.compileInfo={},t.compileCtrl.active=!0,s.setPreventModalClose(!0)},cancel:function(){t.compileCtrl.active=!1,s.setPreventModalClose(!1),o()}},t.$on("$destroy",function(){l.removeListener(e)}),l.addListener(e)}}}]),angular.module("wallpaperbrowserApp").directive("radialProgress",["$translate","utils",function(u,g){return{restrict:"E",scope:{rpPercent:"=",rpLabel:"="},link:function(e,t){t.addClass("radialProgressContainer"),angular.isFunction(openSteamDownloads)||(openSteamDownloads=function(){g.openUrl("var_url_faqdownloads")});var a=angular.element(document.createElement("div")),i=angular.element(document.createElement("div")),n=angular.element(document.createElement("div")),o=angular.element(document.createElement("div")),r=document.createElementNS("http://www.w3.org/2000/svg","svg"),s=document.createElementNS("http://www.w3.org/2000/svg","circle"),l=document.createElementNS("http://www.w3.org/2000/svg","circle");a.addClass("steamHeader"),i.addClass("percent"),n.addClass("bytes"),o.addClass("bytes"),r.classList.add("circleBase"),s.classList.add("circleBg"),l.classList.add("circleFg"),a.click(openSteamDownloads);var c=angular.element(document.createElement("div"));c.addClass("steamDownloadLink");var d=angular.element(document.createElement("a"));d.addClass("fas fa-question-circle steamDownloadLinkInner"),d.click(openSteamDownloads),c.append(d),r.setAttribute("viewBox","-50 -50 100 100"),r.setAttribute("width","100%"),r.setAttribute("height","100%"),s.setAttribute("r",45),l.setAttribute("r",45),s.setAttribute("cx",0),s.setAttribute("cy",0);var p=-1;l.style["stroke-dasharray"]=2*Math.PI*45,l.style["stroke-dashoffset"]=2*Math.PI*45*(1-Math.min(1,p/100)),t.append(angular.element(document.createElement("div")).addClass("padTop")),t.append(a),t.append(i),t.append(n),t.append(o),t.append(c),t.append(r),r.append(s),r.append(l),o.hide(),u("ui_browse_download_header").then(function(e){a.text(e)}),u("ui_browse_download_waiting").then(function(e){o.text(e)}),e.$watch("rpPercent",function(e){p!==(e=e)&&(100<=(p=e)?(a.hide(),n.hide(),o.show()):(a.show(),n.show(),o.hide()),e<=0?i.hide():(i.show(),i.text(Math.floor(e)+"%")),l.style["stroke-dashoffset"]=2*Math.PI*45*(1-Math.min(1,e/100)))}),e.$watch("rpLabel",function(e){n.text(e)})}}}]),angular.module("wallpaperbrowserApp").controller("WelcomeCtrl",["$scope","$timeout","skin","host","modals","utils",function(a,t,i,n,e,o){var r=!1;function s(e){window.welcomeObject.applyGeneral(angular.toJson(e),!0)}function l(e){angular.isArray(e)&&(a.led.visible=!!e.find(function(e){return"ledextensions"===e.key}))}a.led={enabled:!0,visible:!1},a.adjustDWMColorModes=[{label:"ui_settings_adjust_windows_color_disabled",value:"disabled"},{label:"ui_settings_adjust_windows_color_accent",value:"accent"},{label:"ui_settings_adjust_windows_color_everything",value:"everything"}],(window.welcomeCtrl=a).applySettings=function(e){a.generalSettings=e.user,a.dwmColorSettings={adjustdwmcolor:a.generalSettings.adjustdwmcolor,adjustdwmcolormode:a.generalSettings.adjustdwmcolormode,adjustdwmcolorwarning:a.generalSettings.adjustdwmcolorwarning},l(e.discoveredplugins),a.useDarkSkin="dark"===a.generalSettings.uiskin,t(function(){r=!0,a.qualityPreset="medium",a.generalSettings.hasshownwelcomedialog=!0})},a.updateSettings=function(e){l(e.discoveredplugins)},a.setBuildVersion=function(e){a.buildVersion=e},a.advancePage=function(){var e;a.page++,3<a.page&&(a.page=3,e=a.led.visible&&!a.led.enabled,window.welcomeExtensionObject.completedDialog(a.showBrowseWallpapers,e))},a.toggleAutoStartRegistry=function(t){n.callDeferred("welcomeObject","toggleAutoStartRegistry",!1,t).then(function(e){e&&(a.generalSettings.autostart=t)})},a.toggleAutoStartScheduler=function(t){e.showHighPriorityWarning(t,a.generalSettings).then(function(){n.callDeferred("welcomeObject","toggleAutoStartHighPriority",t,!t).then(function(e){e&&(a.generalSettings.autostartscheduler=t)})})},a.openTranslationHelp=function(){o.openUrl("var_url_translations")},a.$watch("page",function(e,t){a.lastPage=t}),a.$watch("generalSettings",function(e){r&&s(e)},!0),a.$watch("dwmColorSettings",function(){r&&i.applyDWMColorSettings(a.dwmColorSettings).then(function(){angular.merge(a.generalSettings,a.dwmColorSettings)})},!0),a.$watch("qualityPreset",function(e){angular.isObject(a.generalSettings)&&angular.isString(e)&&angular.merge(a.generalSettings,o.getQualityPreset(e))}),a.$watch("generalSettings.language",function(e,t){angular.isString(e)&&angular.isString(t)&&e!==t&&(o.setLanguage(e),n.callDeferred("welcomeObject","languageChanged",e))}),a.$watch("useDarkSkin",function(e,t){r&&e!==t&&(a.generalSettings.uiskin=e?"dark":"white",s(a.generalSettings),i.refreshSkin())}),a.$on("onCppInit",function(){r=!0,a.isWindows10OrGreater=10<=i.getWindowsVersion(),a.availableLanguages=o.getAvailableLanguages()}),a.page=0,a.showBrowseWallpapers=!0,a.generalSettings={}}]),angular.module("wallpaperbrowserApp").controller("OpenFromUrlModalCtrl",["$scope","$q","$uibModalInstance","host","modals","data",function(i,a,n,o,r,e){i.hotkeys=e.hotkeys,i.keys=[],i.hideIconsKey={label:"ui_settings_hotkeys_action_hide_icons",action:"toggleicons"},i.temp={useEdge:!1},i.name="",i.ok=function(){var e=(e=i.url||"").replace(/["]/g,"'"),t=a.when();i.temp.useEdge&&(e="edge://"+e,t=o.callDeferred("browseWallpaperObject","checkEdgeWebViewAvailable").then(function(e){if(e)return r.open("genericConfirm",{data:{title:"ui_browse_open_url_livestream_runtime_modal_title",message:"ui_browse_open_url_livestream_runtime_modal_message",okUAC:!0,okVisible:!0,cancelVisible:!0}}).then(function(){return o.callDeferred("browseWallpaperObject","installEdgeWebView")}),a.reject()})),t.then(function(){n.close({url:e,name:i.name.trim()})})},i.cancel=function(){n.dismiss("cancel")},i.findHotkeyList=function(t){var a;return angular.forEach(i.hotkeys,function(e){e.action===t.action&&(a=e)}),angular.isUndefined(a)&&(a={action:t.action,keys:[]},i.hotkeys.push(a)),a}}]),angular.module("wallpaperbrowserApp").directive("tooltip",["$timeout","$document","$translate",function(p,u,g){return{restrict:"A",link:function(i,e,n){var o,t,r=i.$eval(n.tOptions)||{},r=angular.merge({delay:750},r);e=angular.element(e);var s,l={};function c(){var e;s=void 0,u.off("mousemove.tooltip.remove.general"),angular.isDefined(t)&&(p.cancel(t),t=void 0),angular.isDefined(o)&&(o.removeClass("show"),e=o,p(function(){e.remove()},100),o=void 0)}function d(a){angular.isDefined(o)||(angular.isDefined(t)&&p.cancel(t),t=p(function(){var e,t;e=a,n.tooltip&&0!==n.tooltip.length&&(u.off("mousemove.tooltip.remove.general"),o=angular.element(document.createElement("span")),t=function(e){o.text(e)},g(n.tooltip,i.$eval(n.tValues)).then(t).catch(t),s=n.tooltip,o.addClass("uiTooltip"),n.tAlignRight&&o.addClass("alignRight"),(t=e.pageY+25)>document.documentElement.clientHeight-40&&(t=e.pageY-40),o.css({top:t,left:e.pageX}),r.width&&o.css({width:r.width}),angular.element(u[0].body).append(o),p(function(){o&&(o.addClass("show"),n.tAlignRight&&o.css({left:e.pageX-o.outerWidth()}))}))},r.delay))}i.$on("$destroy",function(){c(),e.off("mousemove.tooltip"),e.off("mouseleave.tooltip"),e.off("mouseenter.tooltip"),u.off("mousemove.tooltip.remove.general")}),e.on("mousemove.tooltip",function(e){var t,a;l.left===e.pageX&&l.top===e.pageY||(angular.isDefined(o)&&(t=l.left-e.pageX,a=l.top-e.pageY,(5<Math.sqrt(t*t+a*a)||s!==n.tooltip)&&c()),l.left=e.pageX,l.top=e.pageY,d(e))}),e.on("mouseleave.tooltip",function(){l={},c()}),e.on("mouseenter.tooltip",function(e){l={},c(),d(e)})}}}]),angular.module("wallpaperbrowserApp").directive("modalmove",["$document",function(r){return{restrict:"A",link:function(e,t){var a=angular.element(t).closest(".modal-dialog");t=angular.element(t).find(".modal-header");var i=!1,n={left:0,top:0},o={};e.$on("$destroy",function(){t.off("mousedown.modalmove"),t.off("mouseup.modalmove"),t.off("mousemove.modalmove")}),t.on("mousedown.modalmove",function(e){i||(i=!0,o.left=e.pageX-n.left,o.top=e.pageY-n.top)}),r.on("mouseup.modalmove",function(){i=!1}),r.on("mousemove.modalmove",function(e){var t;i&&(t=Math.max(0,Math.min(r.width(),e.pageX)),e=Math.max(0,Math.min(r.height(),e.pageY)),n={left:t-o.left,top:e-o.top},a.css(n))}),a.css({position:"relative"})}}}]),angular.module("wallpaperbrowserApp").controller("SettingsChangelogModalCtrl",["$scope","$uibModalInstance",function(e,t){e.close=function(){t.close()}}]),angular.module("wallpaperbrowserApp").controller("GenericConfirmModalCtrl",["$scope","$translate","$timeout","$uibModalInstance","utils","host","data",function(e,t,a,i,n,o,r){var s,l=!0;e.data=r,angular.isArray(r.message)&&(s=r.message,t(s).then(function(t){var a="";angular.forEach(s,function(e){0<a.length&&(a+=" "),a+=t[e]}),r.message=a})),e.ok=function(){r.okDisabled||i.close()},e.copyToClipboard=function(e){o.callDeferred("ui","copyToClipboard",e).then(function(){l&&(l=!1,a(function(){l=!0},3e3),t("ui_browse_details_toast_url_copied").then(function(e){n.showSuccess(e)}))})},e.leftClicked=function(){angular.isFunction(r.leftCallback)?r.leftCallback(r.leftAction):i.close(r.leftAction)},e.left2Clicked=function(){angular.isFunction(r.left2Callback)?r.left2Callback(r.left2Action):i.close(r.left2Action)},e.cancel=function(){i.dismiss("cancel")}}]),angular.module("wallpaperbrowserApp").controller("EmptyCtrl",["$scope",function(e){switch(Math.floor(4*Math.random())){case 0:e.btnText="I globbed up!";break;case 1:e.btnText="JJ Flip! What the zip?";break;case 2:e.btnText="Don't just lick stuff!";break;case 3:e.btnText="Floop the pig!"}}]),angular.module("wallpaperbrowserApp").controller("BrowseCollectionsModalCtrl",["$scope","$uibModalInstance","data",function(i,n,o){var e,r=angular.isArray(o.hotkeys);switch(o.collectionItem=o.collectionItem||{},o.collectionItem.name=o.collectionItem.name||"",i.data=o,i.context={hotkey:[]},o.type){case"presets":i.type={labelHeader:o.isSaving?"ui_browse_preset_modal_save_header":"ui_browse_preset_modal_open_header",labelSave:"ui_browse_preset_modal_save_name",labelSaveDescription:"ui_browse_preset_modal_save_description",labelEmpty:"ui_browse_preset_modal_empty"};break;case"playlists":i.type={hotkeyAction:"playlist",labelHeader:o.isSaving?"ui_browse_playlist_modal_save_header":"ui_browse_playlist_modal_open_header",labelSave:"ui_browse_playlist_modal_save_name",labelSaveDescription:"ui_browse_playlist_modal_save_description",labelEmpty:"ui_browse_playlist_empty"};break;case"profiles":i.type={hotkeyAction:"profile",labelHeader:o.isSaving?"ui_browse_profiles_modal_save_header":"ui_browse_profiles_modal_open_header",labelSave:"ui_browse_profiles_modal_save_name",labelSaveDescription:"ui_browse_profiles_modal_save_description",labelEmpty:"ui_browse_profiles_empty"};break;case"blocklist":i.type={labelHeader:"ui_browse_blocklist_modal_header",labelEmpty:"ui_browse_blocklist_empty"};break;case"editorclippingmasks":i.type={labelHeader:"ui_editor_generic_modal_puppet_assign_clipping_mask_title",labelEmpty:"ui_editor_generic_modal_puppet_assign_clipping_mask_empty"}}function s(t){var a;return t&&t.name&&angular.forEach(i.data.hotkeys,function(e){e.value!==t.name||angular.isString(i.data.location)&&e.location!==i.data.location||e.action!==i.type.hotkeyAction||(a=e)}),a}i.ok=function(){var e,t,a;r&&(o.isSaving&&(i.data.hotkeys.findAndRemove(s(o.collectionItem)),0<i.context.hotkey.length&&i.data.hotkeys.findAndRemove((t=i.context.hotkey,angular.forEach(i.data.hotkeys,function(e){angular.equals(e.keys,t)&&(a=e)}),a))),o.isSaving&&0<i.context.hotkey.length&&(e={action:i.type.hotkeyAction,keys:i.context.hotkey,value:i.data.collectionItem.name},angular.isString(i.data.location)&&(e.location=i.data.location),i.data.hotkeys.push(e))),n.close(i.context.currentSelection||i.data.collectionItem)},i.cancel=function(){n.dismiss("cancel")},i.createNew=function(){o.onCreateNew(),n.dismiss("cancel")},i.deleteCollectionItem=function(e){r&&i.data.hotkeys.findAndRemove(s(e));var t=o.collection.indexOf(e);o.collection.splice(t,1),i.context.currentSelection=void 0,angular.isFunction(o.onDeleted)&&o.onDeleted(e)},o.isSaving?(e=s(o.collectionItem),i.context.hotkey=e&&e.keys||[]):(i.$watch("context.currentSelection",function(e){e=s(e);i.context.hotkey=e&&e.keys||[]}),r&&i.$watch("context.hotkey",function(e){var t;angular.isObject(i.context.currentSelection)&&(t=s(i.context.currentSelection),0===e.length&&angular.isDefined(t)?i.data.hotkeys.findAndRemove(t):0<e.length&&angular.isUndefined(t)&&(e={action:i.type.hotkeyAction,keys:e,value:i.context.currentSelection.name},angular.isString(i.data.location)&&(e.location=i.data.location),i.data.hotkeys.push(e)))},!0))}]),angular.module("wallpaperbrowserApp").controller("BrowsePlaylistSettingsModalCtrl",["$q","$timeout","$scope","$uibModalInstance","modals","utils","data",function(t,e,a,i,n,o,r){a.orderOptions=[{label:"ui_browse_playlist_modal_settings_order_random",value:"random"},{label:"ui_browse_playlist_modal_settings_order_sorted",value:"sorted"}],a.timingOptions=[{label:"ui_browse_playlist_modal_settings_timing_on_logon",value:"logon"},{label:"ui_browse_playlist_modal_settings_timing_on_timer",value:"timer"},{label:"ui_browse_playlist_modal_settings_timing_daytime",value:"daytime"},{label:"ui_browse_playlist_modal_settings_timing_dayofweek",value:"dayofweek"},{label:"ui_browse_playlist_modal_settings_timing_never",value:"never"}],a.transitionOptions=o.getTransitionOptions(),a.transitionOptionsButtons=o.getTransitionButtons(),a.transitionTimeSlider=o.configureTransitionSlider(),a.settings=angular.copy(r.settings),a.settings.delay=a.settings.delay||60,!0===a.settings.transition?a.settings.transition="0":angular.isString(a.settings.transition)||(a.settings.transition="-2"),angular.isNumber(a.settings.transitiontime)||(a.settings.transitiontime=1e3),a.tempSettings={timerhours:Math.floor(a.settings.delay/60),timerminutes:a.settings.delay%60},a.ok=function(){var e=t.when();(e="dayofweek"===a.settings.mode&&angular.isArray(r.items)&&7<r.items.length?n.open("genericConfirm",{data:{title:"ui_browse_playlist_modal_settings_day_of_week_warning_title",message:"ui_browse_playlist_modal_settings_day_of_week_warning_option_message",okVisible:!0,cancelVisible:!0}}):e).then(function(){i.close(a.settings)})},a.cancel=function(){i.dismiss("cancel")},a.toggleVideoSequence=function(){"timer"===a.settings.mode&&(a.settings.videosequence=!a.settings.videosequence)},a.toggleUpdateOnPause=function(){"timer"===a.settings.mode&&(a.settings.updateonpause=!a.settings.updateonpause)},a.toggleBeginFirst=function(){"timer"===a.settings.mode&&(a.settings.beginfirst=!a.settings.beginfirst)},a.togglePlayIntro=function(){"timer"===a.settings.mode&&a.settings.beginfirst&&(a.settings.playintro=!a.settings.playintro)},a.transitionSelectAll=function(e){o.transitionPoolSelectAll(a.settings,e)};var s=!(a.transitionToggleSingle=function(e){o.transitionPoolToggle(a.settings,r.fnPreviewTransition,e)});e(function(){a.$broadcast("rzSliderForceRender"),s=!0},250),a.$watch("tempSettings",function(e){a.settings.delay=60*e.timerhours+e.timerminutes},!0),a.$watch("settings.transition",function(){s&&r.fnPreviewTransition(a.settings)})}]),window.effectListModalGalleryMode="gallery",angular.module("wallpaperbrowserApp").controller("EditorEffectListModalCtrl",["$scope","$uibModalInstance","$timeout","$translate","modals","utils","host","data",function(o,e,t,a,r,i,n,s){function l(t,e){e=e||o.groupList,angular.forEach(e,function(e){angular.isArray(e.items)&&e.items.findAndRemove(t),angular.isArray(e.nestedGroupList)&&l(t,e.nestedGroupList)})}function c(){function i(e){return!t.empty()&&!a.instant(e.name).toString().toLowerCase().includes(t)}var t=o.search.text.trim().toLowerCase();angular.forEach(o.groupList,function(e){var a=0;angular.forEach(e.items,function(e){var t;angular.isArray(e.variants)?(t=i(e),angular.forEach(e.variants,function(e){t=t&&i(e)}),e.filtered=t):e.filtered=i(e),e.filtered||++a}),angular.forEach(e.nestedGroupList,function(e){var t=0;angular.forEach(e.items,function(e){e.filtered=i(e),e.filtered||(++a,++t)}),e.filtered=0===t}),e.filtered=0===a})}function d(e){e.videopreview&&(e.videopreviewurl="videos/previews/"+e.videopreview+".webm"),e.previewimg&&(e.previewsmall=e.previewimg),e.title=a.instant(e.name),e.status="downloadable"}function p(t){var a=!1;angular.isArray(t.variants)?(function(e,t){if(angular.isArray(e)&&angular.isArray(t))for(var a=0;a<t.length;++a){var i,n=t[a];angular.isNumber(n.value)&&n.value<e.length&&((i=e[n.value]).name=n.label,i.droplistIndex=n.value)}}(t.variants,t.options&&t.options.droplistOptions),angular.forEach(t.variants,d)):d(t),angular.forEach(o.groupList,function(e){e.group!==t.group&&(t.group||"empty"!==e.group)||a||(t.nestedgroup?(angular.forEach(e.nestedGroupList,function(e){e.nestedgroup===t.nestedgroup&&(e.items.push(t),a=!0,e.items.sort(function(e,t){return e.name.localeCompare(t.name)}))}),a||(e.nestedGroupList.push({name:i.translateTagInstant(t.nestedgroup)||"",items:[t],nestedgroup:t.nestedgroup,visible:!0,open:!0}),e.nestedGroupList.sort(function(e,t){return e.name.localeCompare(t.name)}))):(e.items.push(t),a=!0),e.visible=!0,a&&(t.nogallery=e.nogallery,t.nogalleryvariantexpansion=e.nogalleryvariantexpansion))}),c()}(window.effectListModalCtrl=o).galleryMode=s.disableGallery?"list":window.effectListModalGalleryMode,o.dataUI=s.ui,o.workshopController=s.workshopController,o.inputList=s.groupList,o.showAssetCreation=s.showAssetCreation,o.fnCreateNew=s.fnCreateNew,o.fnDelete=s.fnDelete,o.currentSelection=void 0,o.disableGallery=s.disableGallery,o.wallpaperThumbnailConfig={videosupport:!0,removePseudoElements:!0},o.groupList=[{group:"workshop",name:"ui_editor_effects_modal_group_workshop",visible:!1,filtered:!1,open:!0,nestedGroupList:[],items:[],nogalleryvariantexpansion:!0},{group:"localeffects",name:"ui_editor_effects_modal_group_my_effects",visible:!1,filtered:!1,open:!0,items:[],nogallery:!0},{group:"preset",name:"ui_editor_effects_modal_group_presets",visible:!1,filtered:!1,open:!0,items:[]},{group:"renderable",name:"ui_editor_effects_modal_group_renderables",visible:!1,filtered:!1,open:!0,items:[],nogallery:!0},{group:"utility",name:"ui_editor_effects_modal_group_utilities",visible:!1,filtered:!1,open:!0,items:[],nogallery:!0},{group:"animate",name:"ui_editor_effects_modal_group_animate",visible:!1,filtered:!1,open:!0,gallerycombineitems:!0,items:[]},{group:"interactive",name:"ui_editor_effects_modal_group_interactive",visible:!1,filtered:!1,open:!0,gallerycombineitems:!0,items:[]},{group:"blur",name:"ui_editor_effects_modal_group_blur",visible:!1,filtered:!1,open:!0,gallerycombineitems:!0,items:[]},{group:"colorize",name:"ui_editor_effects_modal_group_colorize",visible:!1,filtered:!1,open:!0,gallerycombineitems:!0,items:[]},{group:"distort",name:"ui_editor_effects_modal_group_distort",visible:!1,filtered:!1,open:!0,gallerycombineitems:!0,items:[]},{group:"enhance",name:"ui_editor_effects_modal_group_enhance",visible:!1,filtered:!1,open:!0,gallerycombineitems:!0,items:[]},{group:"empty",name:void 0,visible:!1,filtered:!1,open:!0,gallerycombineitems:!0,items:[]}],o.search={text:""},o.selected={},s.disableGallery&&angular.forEach(o.groupList,function(e){e.nogallery=!0}),angular.forEach(s.groupList,p),o.title=s.title,o.colorPickerOptions=i.getColorPickerDefaults(),0<o.groupList.length&&(o.selected.group=o.groupList[0]),o.close=function(){e.dismiss("cancel")},o.ok=function(){e.close(o.selected.item)},o.browseWorkshop=function(){s.workshopModalFn(s.workshopGroup)},o.registerSteamUser=function(e){var t=o.steamUserInfos[e.id]||{};t.name=e.name,t.avatar=e.avatar,o.steamUserInfos[e.id]=t},o.providerIcon=i.getProviderIcon(),o.openSteamUserPage=function(e){i.openUrl("var_url_userpage",{id:e})},o.openSteamWorkshopPage=function(e){i.openUrl(e.workshopurl)},o.openInfoLinkPage=function(){i.openUrl(o.dataUI.infoLink)},o.unsubscribeWorkshopItem=function(e){o.workshopController.unsubscribeWorkshopItem(e.name,e.workshopid).then(function(){l(e),o.selected.item=void 0})},o.createNew=function(i){var n=angular.isDefined(i),e=n&&i.name||"";return a(n?"ui_editor_effect_list_modal_create_duplicate_effect_body":"ui_editor_effect_list_modal_create_new_effect_body",{effect:a.instant(e).toString()}).then(function(e){var t={title:n?"ui_editor_effect_list_modal_create_duplicate_effect_header":"ui_editor_effect_list_modal_create_new_effect_header",message:e,cancelVisible:!0,okVisible:!0,textinputVisible:!0,textinput:"",textinputRequired:!0},a=n&&angular.copy(i)||{path:"effects/_empty/effect.json"};r.open("genericConfirm",{data:t}).then(function(){return a.name=t.textinput,o.fnCreateNew(a)}).then(function(e){o.selected.item=e,o.ok()})})},o.deleteItem=function(e){return a("ui_editor_effect_list_modal_delete_effect_body",{effect:e.name}).then(function(e){return r.open("genericConfirm",{data:{title:"ui_editor_effect_list_modal_delete_effect_header",message:e,leftIcon:"images/warning.png",cancelVisible:!0,okVisible:!0}},{backdropClass:"modal-backdrop-danger"})}).then(function(){l(e),o.fnDelete(e),o.selected.item=void 0})},o.applyUserVote=function(e,t){e===o.selected.item.workshopid&&(o.selected.item.uservote=t)},o.rebuildGalleryPreviews=function(){var a=[];angular.forEach(o.groupList,function(e){e&&e.items&&0!==e.items.length&&angular.forEach(e.items,function(t){t.preview?a.push({path:t.path,preview:t.preview}):angular.isArray(t.variants)&&angular.forEach(t.variants,function(e){a.push({path:t.path,preview:e.preview})})})}),n.callEditor("exportListModalPreviews",a)},o.callbackGalleryAllMouse=function(e,t){var a,i,n;"left"!==e&&"dbl"!==e||(o.currentSelection=t,i=t,angular.forEach(o.groupList,function(e){angular.forEach(e.items,function(t){angular.forEach(t.variants,function(e){e===i&&(n=t)})})}),a=n,console.log("variantParent",a),o.selected.item=a||t,a&&(a.options.droplistSelected=t.droplistIndex)),"dbl"===e&&o.ok()},o.$watch("selected.item",function(e,t){angular.isObject(e)&&e!==t&&(e.preview&&!e.isworkshopasset?n.callEditor("startEffectPreview",e.path||"",e.preview):e.options&&e.options.droplistOptions&&("gallery"===o.galleryMode&&!e.isworkshopasset||(e.options.droplistSelected=e.options.droplistOptions[0].value),e.variants&&!e.isworkshopasset&&n.callEditor("startEffectPreview",e.path,e.variants[e.options.droplistSelected].preview)),o.workshopController&&(e.authorsteamid&&o.workshopController.requestSteamUserInfo(e.authorsteamid),e.workshopid&&o.workshopController.getUserVote(e.workshopid)))}),o.$watch("selected.item.options.droplistSelected",function(e,t){angular.isObject(o.selected.item)&&angular.isArray(o.selected.item.variants)&&angular.isObject(o.selected.item.variants[e])&&angular.isString(o.selected.item.variants[e].preview)&&e!==t&&!e.isworkshopasset&&n.callEditor("startEffectPreview",o.selected.item.path,o.selected.item.variants[e].preview)}),o.$watch("inputList",function(e){angular.isArray(e)&&(!function t(e){angular.forEach(e,function(e){angular.isArray(e.items)&&e.items.findAndRemove(function(e){return angular.isString(e.workshopid)}),angular.isArray(e.nestedGroupList)&&t(e.nestedGroupList)})}(o.groupList),angular.forEach(e.filter(function(e){return angular.isString(e.workshopid)}),p))},!0),o.workshopController&&o.workshopController.callbacks.push(o),o.$on("$destroy",function(){window.effectListModalCtrl=null,s.disableGallery||(window.effectListModalGalleryMode=o.galleryMode),n.callEditor("stopEffectPreview"),o.workshopController&&o.workshopController.callbacks.findAndRemove(o)}),o.$watch("search.text",c)}]),angular.module("wallpaperbrowserApp").directive("nativeDropTarget",["$translate","utils","dragdrop",function(p,u,e){return{restrict:"A",scope:{nativeDropTarget:"&",ndtExtensionTag:"=",ndtConfig:"=",ndtInternalFunction:"&",ndtInternalCondition:"&",ndtDesiredModalDepth:"=",ndtInternalDisabled:"=",ndtEnabled:"="},link:function(n,a){var i,o,r=!0,s=n.ndtDesiredModalDepth||0;function l(e){var t;angular.isDefined(i)||(t=e||angular.element("#nativeDropLayer"),(i=angular.element(document.createElement("div"))).addClass("nativeDropHoverIndicator "+(n.ndtConfig&&n.ndtConfig.class||"")),n.ndtConfig&&n.ndtConfig.disabled&&i.addClass("disabled"),t.append(i),(t=(e=angular.element(a)).offset()).left-=5,t.top-=5,i.offset(t),i.width(e.outerWidth()),i.height(e.outerHeight()),angular.isObject(n.ndtConfig)&&angular.isDefined(n.ndtConfig.label)&&((t=angular.element(document.createElement("div"))).addClass("nativeDropHoverLabel"),e="",angular.isString(n.ndtConfig.icon)&&(e='<div><span class="'+n.ndtConfig.icon+'"></span></div>'),t.html(e+p.instant(n.ndtConfig.label).toString()),i.append(t)))}function c(){angular.isUndefined(i)||(i.remove(),i=void 0)}function d(e){var t;angular.isUndefined(i)?o=!1:(t=i.offset(),(o=!(e.x<t.left||e.x>t.left+i.outerWidth()||e.y<t.top||e.y>t.top+i.outerHeight()||n.ndtConfig&&n.ndtConfig.disabled))?i.addClass("over"):i.removeClass("over"))}angular.isFunction(n.ndtInternalFunction)&&angular.isFunction(n.ndtInternalCondition)&&(e.registerContainer(a,{condition:n.ndtInternalCondition,onMouseEnter:function(){angular.isDefined(i)&&i.addClass("over")},onMouseLeave:function(){angular.isDefined(i)&&i.removeClass("over")},onMouseMove:function(){},onElementDropped:function(e,t){n.ndtInternalFunction({data:t})}},"renderable"),n.$on("onInternalDropStart",function(e,t){n.ndtInternalCondition({data:t})&&!n.ndtInternalDisabled&&l(angular.element("body"))}),n.$on("onInternalDropStop",function(){c()})),n.$on("onNativeDropStart",function(e,a){if(r&&(!angular.isDefined(n.ndtEnabled)||n.ndtEnabled)){var t=angular.isString(n.ndtExtensionTag)?[n.ndtExtensionTag]:angular.isArray(n.ndtExtensionTag)?n.ndtExtensionTag:void 0;if(angular.isArray(t)){var i=!1;if(angular.forEach(t,function(t){angular.forEach(a.files,function(e){i=i||u.isExtension(e,t)})}),!i)return}angular.isObject(n.ndtConfig)&&angular.isFunction(n.ndtConfig.fnCondition)&&!n.ndtConfig.fnCondition(a.files)||(l(),d(a))}}),n.$on("onNativeDropStop",function(){c()}),n.$on("onNativeDropMove",function(e,t){d(t)}),n.$on("onNativeDropDropped",function(e,t){d(t),o&&angular.isFunction(n.nativeDropTarget)&&n.nativeDropTarget({droppedFiles:t.files}),c()}),n.$on("modalVisible",function(e,t){r=t===s}),n.$on("$destroy",function(){e.unregisterContainer(a)})}}}]),angular.module("wallpaperbrowserApp").service("localeLoaderSupport",["$sanitize",function(i){var t={};this.insertTranslations=function(e){e=angular.copy(e),angular.forEach(e,function(a){angular.forEach(angular.copy(a),function(e,t){angular.isString(t)&&0===t.indexOf("ui_")?a[t]=i(a[t]):delete a[t]})}),angular.merge(t,e)},this.getTranslations=function(e){return t[e]}}]).filter("san",["$sanitize",function(t){return function(e){return t(e)}}]),angular.module("wallpaperbrowserApp").service("contextMenu",["$document","$translate","$compile","$timeout",function(e,u,g,f){var s,i=this,l=angular.element(e[0].body),m=angular.element(window),v=[];function h(){angular.forEach(v,function(e){e.$destroy()}),v=[],l.off("mousedown.ctxMenuDown"),l.off("wheel.ctxMenuDown"),s&&(s.remove(),s=void 0)}function c(e,t,a){var i=m.width(),n=m.height(),o=t.innerWidth(),r=t.innerHeight(),s={left:Math.floor(e.pageX)+1,top:Math.floor(e.pageY)};a&&a.target?(a.target=angular.element(a.target),e=a.target.offset(),a={width:a.target.outerWidth(),height:a.target.outerHeight()},s.left=Math.floor(e.left),s.top=Math.floor(e.top)+a.height,s["min-width"]=Math.max(0,a.width)+"px",s.left+o>i&&(s.left-=s.left+o-i,s.left=Math.max(0,s.left)),s.top+r>n&&(s.top=e.top-r,s.top=Math.max(0,s.top))):(s.left+o>i&&(s.left-=o,s.left=Math.max(0,s.left)),s.top+r>n&&(s.top-=s.top+r-n,s.top=Math.max(0,s.top))),t.css(s)}function b(d,e){var p=angular.element(document.createElement("ul"));return p.addClass("dropdown-menu ctxMenu"),angular.forEach(e,function(a){var i,t,n,e;switch(a.type){case"slider":r=angular.element(document.createElement("li")),i=angular.element(document.createElement("a")),(t=angular.element(document.createElement("span"))).addClass("fas fa-fw ctxMenuIcon"),a.icon&&t.addClass(a.icon),i.addClass("ctxLink"),i.append(t),r.append(i);var o=d.$new();return o.entry=a,o.callbackChange=function(){a.options.onChange(a.options.value)},v.push(o),g('<rzslider rz-slider-model="entry.options.value" rz-slider-options="{ceil:entry.options.max, floor:entry.options.min, enforceStep:false, onChange:callbackChange}"></rzslider>')(o,function(e){e.addClass("ctxSlider"),i.append(e)}),void p.append(r);case"divider":o=angular.element(document.createElement("li"));return o.addClass("divider"),void p.append(o);case"grid":var r=angular.element(document.createElement("li")),s=angular.element(document.createElement("div"));s.addClass("ctxGrid"),r.append(s),p.append(r);var l=0,c=angular.element(document.createElement("div"));return c.addClass("ctxGridRow"),s.append(c),void angular.forEach(a.items,function(e){l>=a.width?(l=1,(c=angular.element(document.createElement("div"))).addClass("ctxGridRow"),s.append(c)):++l,r=angular.element(document.createElement("li")),i=angular.element(document.createElement("a")),t=angular.element(document.createElement("span")),n=angular.element(document.createElement("span")),e.icon&&t.addClass(e.icon),t.addClass("fa-fw"),i.addClass("ctxLink"),i.addClass(e.class),i.append(t),n.text(u.instant(e.label)),e.labelElement=n,i.append(n),angular.isFunction(e.callback)&&i.click(function(){e.callback(e.callbackData),h(),window.safeApply(d)}),r.append(i),r.addClass("ctxGridItem"),c.append(r)})}r=angular.element(document.createElement("li")),i=angular.element(document.createElement("a")),t=angular.element(document.createElement("span")),n=angular.element(document.createElement("span")),a.icon&&t.addClass(a.icon),t.addClass("fa-fw ctxMenuIcon"),i.addClass("ctxLink"),i.addClass(a.class),i.append(t),n.addClass("ctxLabel"),n.text(u.instant(a.label)),a.labelElement=n,i.append(n),a.hotkey&&((e=angular.element(document.createElement("span"))).addClass("ctxHotkey "+a.hotkeyClass),e.text(a.hotkey),i.append(e)),angular.isFunction(a.callback)&&i.click(function(){a.callback(a.callbackData),h(),window.safeApply(d)}),r.append(i),angular.isArray(a.nested)&&((e=angular.element(document.createElement("span"))).addClass("fas fa-fw fa-chevron-right ctxChevron"),i.append(e),i.hover(function(){var e,t;p.lastOpenContextMenu&&p.lastOpenContextMenu.p!==i&&(p.lastOpenContextMenu.p.nestedMenu=void 0,p.lastOpenContextMenu.e.remove(),p.lastOpenContextMenu=void 0),f.cancel(i.pendingTimeout),i.nestedMenu||(e=b(d,a.nested),(t=angular.element(document.createElement("div"))).addClass("ctxMenuWrapper"),t.append(e),i.append(t),i.nestedMenu=t,p.lastOpenContextMenu={e:t,p:i},f(function(){t&&(t.addClass("open"),function(e,t){var a=t.offset(),i=t.position(),n=a.left;i.left+=t.width(),a.left+=t.width();var o=m.width(),r=m.height(),s=e.innerWidth(),l=e.innerHeight();a.left+s>o&&(i.left-=s+t.width(),i.left=Math.max(-n,i.left)),a.top+l>r&&(i.top-=a.top+l-r,i.top=Math.max(20-a.top+t.position().top,i.top),r-20<l&&(e.addClass("ctxMenuOverflow"),i.height=r-20)),e.css(i)}(e,r))}))},function(){f.cancel(i.pendingTimeout),i.pendingTimeout=f(function(){i.nestedMenu&&(i.nestedMenu.remove(),i.nestedMenu=void 0)},1e3)})),p.append(r)}),p}this.open=function(e,t,a,i){function n(e){s&&s[0].contains(e.target)||i&&i.ignoreClearTarget&&i.ignoreClearTarget===e.target||h()}h(),l.on("mousedown.ctxMenuDown",n),l.on("wheel.ctxMenuDown",n);var o=angular.element(document.createElement("div"));o.addClass("ctxMenuWrapper");var r=b(e,a);return c(t,r,i&&i.placement),o.append(r),o.ctxTag=i&&i.tag,s=o,l.append(s),f(function(){s&&(s.addClass("open"),c(t,r,i&&i.placement))}),o},this.builder=function(){var o=[];return{open:function(e,t,a){return i.open(e,t,o,a)},getElements:function(){return o},button:function(e,t,a,i,n){return angular.isString(t)?o.push({label:e,icon:t,callback:a,callbackData:i,class:n}):angular.isFunction(t)&&o.push({label:e,callback:t}),this},hotkey:function(e,t){return o[o.length-1].hotkey="("+e+")",o[o.length-1].hotkeyClass=t||"",this},slider:function(e,t){return o.push({icon:e,type:"slider",options:t}),this},divider:function(){return o.push({type:"divider"}),this},subMenu:function(e,t,a,i){return o.push({label:e,icon:t,nested:(angular.isObject(t)?t:a).getElements(),class:i}),this},empty:function(){return 0===o.length},hasDivider:function(){return 0<o.length&&o.last()&&"divider"===o.last().type},requestDivider:function(){return this.hasDivider()?this:this.divider()},id:function(e){return o.last().id=e,this},updateLabel:function(t,a){return angular.forEach(o,function(e){e.id===t&&(e.label=a,e.labelElement&&e.labelElement.text(a))}),this},grid:function(e){return this.currentGrid={type:"grid",width:e,items:[]},o.push(this.currentGrid),this},gridItem:function(e,t,a,i,n){angular.isString(t)?this.currentGrid.items.push({label:e,icon:t,callback:a,callbackData:i,class:n}):angular.isFunction(t)&&this.currentGrid.items.push({label:e,callback:t})}}},this.closeCurrentContextMenu=function(){h()},this.getCurrentContextMenu=function(){return s},this.getCurrentContextMenuTag=function(){return s&&s.ctxTag}}]),angular.module("wallpaperbrowserApp").controller("EditorParticleEditorModalCtrl",["$scope","$q","$uibModalInstance","$translate","$timeout","modals","host","utils","contextMenu","data",function(r,s,e,a,t,l,c,i,n,o){var d,p={color:"0.5 0.5 0.5",showaxis:!0,showstats:!0};function u(){r.data.existingParticles.sort((e,t)=>e.name.localeCompare(t.name))}function g(){angular.isDefined(d)&&(t.cancel(d),d=void 0)}function f(){c.callEditor("getParticleStats",r.currentParticle.id).then(function(e){r.particleStats=e}),g(),d=t(f,1e3)}function m(t){r.selected={},g(),c.callEditor("loadParticleInEditor",t,r.particleeditorsettings).then(function(e){r.currentParticle={id:e.id,path:t},r.replaceAssets(e),f()})}function v(){angular.isObject(r.currentParticle)&&c.callEditor("saveParticle",r.currentParticle.id,r.currentParticle.path)}window.particleEditorCtrl=r,angular.isObject(o.editor.editorSettings.particleeditorsettings)||(o.editor.editorSettings.particleeditorsettings={}),o.editor.editorSettings.particleeditorsettings=angular.merge(angular.copy(p),o.editor.editorSettings.particleeditorsettings),r.data=o,r.particleeditorsettings=o.editor.editorSettings.particleeditorsettings,r.elementGroups={},r.selected={},r.propertyControl={sendAssetPropertyChange:function(e,t,a){return o.editor.sendAssetPropertyChange(e,t,a,"particle")},navigateProperty:function(e,t){r.selected.item=r.objectProperties[e][t]},importTextureFile:function(e,t,a,i,n){return o.editor.importTextureFile(e,t,a,i,n,{tag:"particle",subDirectory:"particle"})},exportTextureFile:function(e,t){return o.editor.exportTextureFile(e,t)},openMaterialBrowser:function(e){o.editor.openMaterialBrowser(e,"particle",["particle","util"])},resetTextureFile:function(e,t,a){return o.editor.resetTextureFile(e,t,a,"particle")},duplicateTextureFile:function(e,t){return o.editor.duplicateTextureFile(e,t,"particle")},editChild:function(t){o.existingParticles.find(e=>e.value===t.args)&&(v(),r.data.particle=t.args)},editTextureFileExternally:o.editor.editTextureFileExternally,getProject:function(){return o.editor.project},hideBasicBindings:!0},r.viewportControl={sendAssetPropertyChange:function(e,t){t=angular.isArray(t)?t:[t];angular.forEach(t,function(e){r.particleeditorsettings[e.key]=e.value}),c.callEditor("updateParticleEditorSettings",r.particleeditorsettings)}},r.replaceAssets=function(e){r.elementGroups=e.elementGroups,r.objectProperties=e.properties,r.selected={item:r.elementGroups[0].items[0]},r.elementGroups.forEach(function(e){e.items.forEach(function(e){e.viewport&&e.properties.forEach(function(e){"reset"===e.key?e.value=p:e.key&&(e.value=r.particleeditorsettings[e.key],delete e.lastValue)})})})},r.ok=function(){v(),e.close(r.data.particle)},r.cancel=function(){v(),e.close()},r.deleteParticle=function(t){a("ui_editor_particle_delete_particle_body",{particle:t}).then(function(e){return l.open("genericConfirm",{data:{title:"ui_editor_particle_delete_particle_header",message:e,leftIcon:"images/warning.png",cancelVisible:!0,okVisible:!0}})}).then(function(){c.callEditor("deleteParticle",t).then(function(){angular.isObject(r.currentParticle)&&r.currentParticle.path===t&&(r.currentParticle=void 0),r.data.existingParticles.findAndRemove(function(e){return e.value===t}),0<r.data.existingParticles.length?r.data.particle=r.data.existingParticles[0].value:delete r.data.particle})})},r.duplicateParticle=function(e){var t={title:"ui_editor_particle_duplicate_particle_header",message:"ui_editor_particle_duplicate_particle_body",cancelVisible:!0,okVisible:!0,textinputVisible:!0,textinput:i.incrementNameIndex("new_particle_system",r.data.existingParticles.map(function(e){return e.value}))};l.open("genericConfirm",{data:t}).then(function(){return v(),c.callEditor("createParticle",{name:t.textinput,source:e}).then(function(e){r.data.existingParticles.push({value:e.file,name:e.name,label:e.name,preview:e.file}),r.data.particle=e.file,u()})})},r.newParticle=function(){var e={title:"ui_editor_particle_new_particle_header",message:"ui_editor_particle_new_particle_body",cancelVisible:!0,okVisible:!0,textinputVisible:!0,textinput:"new particle system",droplistVisible:!0,droplistOptions:o.editor.particleDefaultPresets,droplistSelected:o.editor.particleDefaultPresets[0].value};l.open("genericConfirm",{data:e}).then(function(){return c.callEditor("createParticle",{name:e.textinput,source:e.droplistSelected}).then(function(e){r.data.existingParticles.push({value:e.file,name:e.name,label:e.name,preview:e.file}),r.data.particle=e.file,u()})})},r.addElement=function(t,a){var i="ui_editor_particle_add_element_"+a+"_header",n="ui_editor_particle_add_element_"+a+"_body",o="var_url_editor_particleeditor_"+a,e="children"===a?((e=angular.copy(r.data.existingParticles)).findAndRemove(function(e){return e.value===r.data.particle}),s.when(e)):c.callEditor("getAvailableParticleElements",a);e.then(function(e){return l.open("editorEffectList",{data:{title:i,groupList:e,disableGallery:"children"===a,ui:{caption:n,infoLinkText:"ui_editor_particle_add_element_documentation",infoLink:o}}})}).then(function(e){e=e.value;return c.callEditor("addParticleElement",r.currentParticle.id,a,e)}).then(function(e){t.items=angular.copy(t.items),t.items.push(e),r.selected.item=e})},r.onElementDragged=function(e,t,a){return c.callEditor("orderParticleElements",r.currentParticle.id,a,e,t)},r.onElementRemoved=function(e,t,a){var i=e.indexOf(t);if(!(i<0))return e.splice(i,1),r.selected.item===t&&delete r.selected.item,c.callEditor("removeParticleElement",r.currentParticle.id,a,t.id)},r.elementContextMenu=function(e,t,a){var i=n.builder();i.button("ui_editor_context_menu_duplicate","fas fa-fw fa-clone",function(){c.callEditor("duplicateParticleElement",r.currentParticle.id,t.tag,a.id).then(function(e){t.items=angular.copy(t.items),t.items.splice(e.index,0,e.item),r.selected.item=e.item})}),i.open(r,e,{placement:{target:e.currentTarget}})},r.openInfoLinkPage=function(){i.openUrl("var_url_editor_particleeditor_general")},angular.isString(r.data.particle)&&m(r.data.particle),r.$watch("data.particle",function(e,t){angular.isString(e)&&e!==t&&(v(),m(e))}),r.$watch("selected.item",function(){t(function(){r.$broadcast("rzSliderForceRender")},200)}),r.$on("$destroy",function(){c.callEditor("stopParticleEditorPreview"),window.particleEditorCtrl=void 0,g()}),r.$on("modal.closing",function(e,t){"escape key press"===t&&(e.preventDefault(),r.cancel())}),u(),t(function(){r.$broadcast("rzSliderForceRender")},500)}]),angular.module("wallpaperbrowserApp").controller("EditorModelEditorModalCtrl",["$scope","$q","$uibModalInstance","$translate","$timeout","modals","host","utils","data",function(a,e,t,i,n,o,r,s,l){window.modelEditorCtrl=a;var c,d=[],p=[];function u(){delete a.selectedAnimation.item,delete a.selectedAttachment.item,delete a.selectedFBX.item,delete a.selectedConstraint.item,a.temp.events=[];var e="clips";switch(a.tabInfo.activeIndex){case 1:e="attachments";break;case 2:e="events";break;case 3:e="constraints"}a.currentModel&&a.callModelAction("setEditMode",e)}function g(e){angular.forEach(e.properties,function(e){"rootmotion"===e.key&&(e.options=d)})}function f(e){e.icon="fas fa-fw fa-paperclip",angular.forEach(e.properties,function(e){"bone"===e.key&&(e.options=p)})}o.setPreventModalClose(!0),a.constraintSettings=angular.copy(l.physicsConstraintDefaults),a.constraintDefaults=l.physicsConstraintDefaults,a.constraintMode="noik",a.physicsCtrl={},a.data=l,a.tabInfo={activeIndex:0},a.elementGroups={},a.propertyControl={sendAssetPropertyChange:function(e,t,a){return l.editor.sendAssetPropertyChange(e,t,a,"model")},navigateProperty:function(e,t){a.selected.item=a.objectProperties[e][t]},exportTextureFile:function(e,t){return l.editor.exportTextureFile(e,t)},getProject:function(){return l.editor.project},hideBasicBindings:!0},a.replaceAssets=function(e){delete a.selectedAttachment.item,delete a.selectedAnimation.item,e&&e.properties?(d=[{label:"ui_editor_properties_none",value:""}].concat(e.properties.bones.map(e=>({label:e.name,value:e.name}))),p=e.properties.bones.map(e=>({label:e.name,value:e.name})).sort((e,t)=>e.label.localeCompare(t.label)),a.objectProperties=e.properties,a.objectProperties.previewAnimations=[{name:"ui_editor_model_editor_none",id:"",disableRemove:!0,icon:"fas fa-fw fa-circle-stop"}].concat(a.objectProperties.animations),a.boneConstraints=e.properties.bones.map(e=>{var t=angular.copy(a.constraintSettings);return t.layout=a.constraintSettings.layout,t.presetresponsiveness=50,{value:e.name,name:e.name,icon:"fas fa-bone",constraints:angular.extend(t,e.constraints||{})}}).sort((e,t)=>e.name.localeCompare(t.name)),angular.forEach(a.objectProperties.clips,g),angular.forEach(a.objectProperties.attachments,f)):a.objectProperties={}},a.updateAssetProperties=function(e){angular.forEach(e,function(t){var e;"constraints"===t.key?angular.forEach(t.changedproperties,function(t){a.selectedConstraint.item=a.boneConstraints.find(e=>e.value===t.value)}):(e=a.objectProperties[t.key].find(e=>e.id===t.id))&&angular.forEach(t.changedproperties,function(t){angular.forEach(e.properties,function(e){e.key===t.key&&(e.value=t.value,delete e.lastValue,n(function(){a.propertyControl.sendAssetPropertyChange(a.selectedAttachment.item,e)}))})})})},a.ok=function(){angular.isObject(a.currentModel)&&r.callEditor("saveModel",a.currentModel.id,a.currentModel.path),t.close({model:a.data.model,state:{physicsConstraintDefaultLayout:a.constraintSettings.layout}})},a.cancel=function(){t.close()},a.callModelAction=function(){return a.currentModel&&r.callEditor.apply(r,["modelAction",a.currentModel.id].concat(...arguments))},a.onFBXRemoved=function(e){return a.callModelAction("removeFBXfile",e.value)},a.addFBXFile=function(){a.callModelAction("addFBXfile")},a.addClip=function(e){a.callModelAction("addClip",e).then(function(e){g(e),a.objectProperties.clips.push(e),a.objectProperties.clips=a.objectProperties.clips.slice(),a.selectedAnimation.item=e})},a.onClipRemoved=function(e){return a.selectedAnimation.item===e&&delete a.selectedAnimation.item,a.callModelAction("removeClip",e.id).then(function(){a.objectProperties.clips.findAndRemove(e)})},a.addAttachment=function(){a.callModelAction("addAttachment").then(function(e){f(e),a.objectProperties.attachments.push(e),a.objectProperties.attachments=a.objectProperties.attachments.slice(),a.selectedAttachment.item=e})},a.onAttachmentRemoved=function(e){return a.selectedAttachment.item===e&&delete a.selectedAttachment.item,a.callModelAction("removeAttachment",e.id).then(function(){a.objectProperties.attachments.findAndRemove(e)})},a.selectBone=function(e){angular.isObject(a.selectedAttachment.item)&&(a.selectedAttachment.item.bone=e)},a.addEvent=function(e){a.callModelAction("addEvent",e.id).then(function(e){a.objectProperties.events.push(e),a.temp.events.push(e),a.objectProperties.events=a.objectProperties.events.slice(),a.temp.events=a.temp.events.slice(),a.selectedAnimation.item=e})},a.onEventRemoved=function(e){return a.selectedAttachment.item===e&&delete a.selectedAttachment.item,a.callModelAction("removeEvent",e.id).then(function(){a.objectProperties.events.findAndRemove(e),a.temp.events.findAndRemove(e)})},a.resetConstraintSettings=function(){return a.physicsCtrl.resetSettings()},a.copyConstraintSettings=function(){return a.physicsCtrl.copySettings()},a.canConstraintPaste=function(){return a.physicsCtrl.canPaste&&a.physicsCtrl.canPaste()},a.pasteConstraintSettings=function(){return a.physicsCtrl.pasteSettings()},angular.isString(a.data.model)&&(c=a.data.model,a.selectedAnimation={},a.selectedAttachment={},a.selectedFBX={},a.selectedConstraint={},a.temp={events:[]},r.callEditor("loadModelEditor",c).then(function(e){a.currentModel={id:e.id,path:c},a.replaceAssets(e),u()})),a.$on("$destroy",function(){r.callEditor("stopModelEditorPreview"),window.modelEditorCtrl=void 0}),a.$on("modal.closing",function(e,t){"escape key press"===t&&(e.preventDefault(),a.cancel())}),a.$watch("tabInfo.activeIndex",u),a.$watch("selectedAnimation.item",function(t){t?(t.clip?a.callModelAction("playClipAnimation",t.id):t.event?t.clipid?a.callModelAction("playClipAnimation",t.clipid):a.callModelAction("playStaticAnimation",t.animationid):a.callModelAction("playStaticAnimation",t.id),t.clip?a.temp.events=a.objectProperties.events.filter(e=>t.id===e.clipid):t.staticanimation&&(a.temp.events=a.objectProperties.events.filter(e=>t.id===e.animationid))):a.callModelAction("stopAnimation")}),a.$watch("selectedAttachment.item",function(e){e&&a.callModelAction("selectAttachment",e.id)}),a.$watch("selectedConstraint.item",function(e,t){e!==t&&e&&(e.constraints.layout=t&&t.constraints.layout||a.constraintSettings.layout,e!==t&&e.constraints&&"none"===e.constraints.preset&&(e.constraints.se||e.constraints.re)&&(e.constraints.layout="advanced"),a.callModelAction("selectConstraintBone",e.value))}),a.$watch("selectedConstraint.item.constraints",function(e){e&&a.physicsCtrl.updateCurrentSettingsFromTemp&&(a.physicsCtrl.updateCurrentSettingsFromTemp(),a.callModelAction("applyBoneConstraints",angular.toJson(e)))},!0)}]),angular.module("wallpaperbrowserApp").controller("EditorMaterialsModalCtrl",["$scope","$q","$uibModalInstance","$translate","$timeout","modals","utils","host","data",function(a,e,t,i,n,o,r,s,l){var c=[];function d(){c.length=0}function p(){!function e(){if(0!==c.length){var t=c.shift();return n(function(){return s.callEditor("getTexturePreview",{id:t.local,path:t.local,size:128})}).then(e)}}()}function u(t){a.visibleMaterials=[],angular.forEach(a.availableMaterials,function(e){(!t||1<t.length&&r.smartStringCompare(t,e.local))&&a.visibleMaterials.push(e)})}a.data=l,a.selected={item:void 0},a.ok=function(){t.close(a.selected.item.local)},a.cancel=function(){t.dismiss()},a.texturePreviews=r.getTexturePreviews(),s.callEditor("getAvailableTextures",l.subDirectory||"").then(function(e){a.availableMaterials=e,angular.forEach(e,function(e){e.local===l.currentPath&&(a.selected.item=e)}),d(),c=angular.copy(e),p(),u()}),a.$on("$destroy",function(){d()}),a.$watch("textureFilter",function(e,t){angular.isString(e)&&e!==t&&u(e)})}]);var _lastRegisteredPropertyObject,_curveFrameCopy,_copiedBoneConstraintsSettings,_deletedIdsInLastSession=[];angular.module("wallpaperbrowserApp").controller("EditorDeleteUploadsModalCtrl",["$uibModalInstance","$translate","$scope","modals","utils","host",function(e,a,i,n,t,o){(window.ctrlReceivePublishedFiles=i).wallpapers=[],i.onPublishedFilesReceived=function(e){angular.forEach(_deletedIdsInLastSession,function(t){e.findAndRemove(function(e){return e.workshopid===t})}),i.wallpapers=i.wallpapers.concat(e)},i.callbackWallpaperAllMouse=function(e,t){"left"===e&&(i.currentSelection=t)},i.deleteUpload=function(t){a(["ui_editor_modal_delete_published_wallpapers_confirm_header","ui_editor_modal_delete_published_wallpapers_confirm_body"],{title:t.title}).then(function(e){return n.open("genericConfirm",{data:{title:e.ui_editor_modal_delete_published_wallpapers_confirm_header,message:e.ui_editor_modal_delete_published_wallpapers_confirm_body,leftIcon:"images/warning.png",okVisible:!0,okText:"ui_editor_modal_delete_published_wallpapers_button",okClass:"btn-danger",cancelVisible:!0}},{backdropClass:"modal-backdrop-danger"}).then(function(){return _deletedIdsInLastSession.push(t.workshopid),i.wallpapers.findAndRemove(t),i.wallpapers=i.wallpapers.slice(),o.callEditor("deleteFileFromWorkshop",t.workshopid)})})},o.callEditor("queryWorkshopPublishedFiles"),i.cancel=function(){e.dismiss("cancel")}}]),angular.module("wallpaperbrowserApp").controller("BrowseSplitMonitorModalCtrl",["$scope","$uibModalInstance","data",function(t,a,e){t.directionOptions=[{label:"ui_browse_monitors_vertical",value:0},{label:"ui_browse_monitors_horizontal",value:1}],t.settings=angular.copy(e),t.settings.config.position*=t.settings.bounds[t.settings.config.direction].max,t.settings.config.position=Math.floor(t.settings.config.position),t.resetPosition=function(){var e=t.settings.bounds[t.settings.config.direction].max;t.settings.config.position=e/2,t.settings.config.position=Math.floor(t.settings.config.position)},t.ok=function(){var e=t.settings.bounds[t.settings.config.direction].max;angular.isNumber(t.settings.config.position)||(t.settings.config.position=e/2,t.settings.config.position=Math.floor(t.settings.config.position)),t.settings.config.position=Math.max(1,Math.min(e-1,t.settings.config.position)),t.settings.config.position/=e,a.close(t.settings)},t.cancel=function(){a.dismiss("cancel")}}]),angular.module("wallpaperbrowserApp").directive("monitorSelection",["$document","$compile",function(a,x){return{restrict:"E",scope:{msController:"=",msMonitors:"=",msScale:"=",msSplits:"=",msGroups:"=",msLayout:"=",msSelectedMonitor:"=",msSelectionState:"=",msUserMonitorSettings:"=",msMakeSelection:"&",msOnSplitMoved:"&",msSplitDblClick:"&",msCreateGroup:"&",msMonitorContextMenu:"&",msSplitContextMenu:"&"},link:function(v,i){var s,n=i.parent(),o=[],r=[],e=angular.element(a[0].body),h=[],b=[];function l(e,t){r.push({object:e,element:t})}function c(t,e,a){e.click(function(){v.msSelectionState.createGroup?v.msCreateGroup({monitors:o}):v.msMakeSelection({monitor:t}),window.safeApply(v)}),e.dblclick(function(){v.msSelectionState.createGroup||(v.msMakeSelection({monitor:t,toggleMonitorSelection:!0}),window.safeApply(v))}),e.contextmenu(function(e){v.msMonitorContextMenu({$event:e,monitor:t,baseMonitor:a}),window.safeApply(v)})}function d(i,t){var n,e=angular.element(document.createElement("div")),a=angular.element(document.createElement("div")),o=angular.element(document.createElement("div")),r=angular.element(document.createElement("div")),s=angular.element(document.createElement("div")),l=angular.element(document.createElement("div")),c=angular.element(document.createElement("div")),d=angular.element(document.createElement("div")),p=angular.element(document.createElement("span")),u=angular.element(document.createElement("span")),g=angular.element(document.createElement("div"));n=v.$new(),h.push(n),n.isAudioEnabled=function(){return v.msController.audioIsEnabledForMonitor(i)},x("<span class=\"audioToggle fas\" ng-class=\"{'fa-volume-up':isAudioEnabled(),'fa-volume-mute dangerText':!isAudioEnabled()}\" tooltip=\"{{isAudioEnabled() ? 'ui_browse_monitors_mute' :'ui_browse_monitors_unmute'}}\"></span>")(n,function(a){a.click(function(e){var t=!n.isAudioEnabled();v.msController.audioSetEnabledForMonitor(i,t),a.removeClass("fa-volume-up fa-volume-mute dangerText"),a.addClass(t?"fa-volume-up":"fa-volume-mute dangerText"),n.muteToolTip=t?"ui_browse_monitors_mute":"ui_browse_monitors_unmute",e.stopPropagation(),window.safeApply(v)}),a.dblclick(function(e){e.stopPropagation()}),d.append(a),d.append(p),d.append(u)}),e.addClass("inner"),a.addClass("monitorImg"),o.addClass("cell"),r.addClass("number"),s.addClass("resolution"),l.addClass("menuButton"),c.addClass("fas fa-caret-down"),p.addClass("fas fa-lock-alt cloneSource"),u.addClass("fas fa-reflect-horizontal cloneSource"),d.addClass("bottomIcons"),g.addClass("title");var f=i.index+1;i.isClone?f="C"+(i.group?i.group.index+1:""):i.isGroup?f="G"+f:i.splitIndex&&(f="S"+i.splitIndex),s.text(Math.round(i.w)+"x"+Math.round(i.h)+", "+i.name),p.toggle(!0===i.isCloneMaster),u.toggle(!0===i.isFlipped),i.isFlipped&&a.addClass("flipH"),e.append(a),e.append(d),r.text(f),o.append(r),e.append(o),e.append(s),e.append(l),l.append(c),e.append(g),g.hide(),l.click(function(e){e.stopPropagation(),e.preventDefault(),v.msMonitorContextMenu({$event:e,monitor:t||i,baseMonitor:i}),window.safeApply(v)}),l.dblclick(function(e){e.stopPropagation()});var m=i.group&&i.group.wallpaper||i.wallpaper,l=function(e){e?(a.show(),g.hide(),a.css({"background-image":"url('"+e+"')"})):(a.hide(),g.show(),g.text(m&&m.title))};l(m&&m.preview);l=v.$watch(function(){var e=i.group&&i.group.wallpaper||i.wallpaper;return e&&e.preview},l,!0);return b.push(l),e}function p(e,t,a){var i,n=0===e.direction,o=angular.element(document.createElement("div"));return o.addClass("monitorSplitUnit"),angular.isObject(v.msSplits[t.location])?(i=v.msSplits[t.location],o.addClass("noHover"),o.append(u(i))):(i=t.isClone&&0===v.msLayout?(c(t.group,o,t),d(t,t.group)):(c(t,o),d(t)),l(t,o),o.append(i)),a?n?o.css({width:(e.w-e.w*e.position)*v.msScale}):o.css({height:(e.h-e.h*e.position)*v.msScale}):n?o.css({width:e.w*e.position*v.msScale}):o.css({height:e.h*e.position*v.msScale}),o}function u(t){var e=angular.element(document.createElement("div")),a=0===t.direction;e.addClass(a?"monitorSplitContainerVertical":"monitorSplitContainerHorizontal"),e.append(p(t,t.left,!1)),e.append(p(t,t.right,!0));var i=angular.element(document.createElement("div"));i.addClass("monitorSplitDrag"),i.addClass(a?"vertical":"horizontal");var n={width:a?4:t.w*v.msScale,height:a?t.h*v.msScale:4,top:a?0:t.h*t.position*v.msScale-2,left:a?t.w*t.position*v.msScale-2:0};i.css(n),e.append(i);var o=a?t.w:t.h,r=v.msSplits[t.location+"/R"];return angular.isObject(r)&&r.direction===t.direction&&(o*=t.position+(1-t.position)*r.position),i.on("mousedown",function(e){s=s||{split:t,element:i,isVertical:a,elementCss:n,lastX:e.pageX,lastY:e.pageY,max:o*v.msScale-5}}),i.dblclick(function(){v.msSplitDblClick({location:t.location}),window.safeApply(v)}),i.contextmenu(function(e){v.msSplitContextMenu({$event:e,location:t.location}),window.safeApply(v)}),e}function g(e,t){var a=v.msScale,i=angular.element(document.createElement("div"));return i.addClass("monitorSelectionMonitor"),i.css({left:Math.floor(t.x*a),top:Math.floor(t.y*a),width:Math.floor(t.w*a),height:Math.floor(t.h*a)}),angular.isObject(v.msSplits)&&angular.isDefined(v.msSplits[e.location])?(i.addClass("noHover"),i.append(u(v.msSplits[e.location]))):i.append((t=e,(a=angular.element(document.createElement("div"))).addClass("monitorRoot"),t.isClone&&0===v.msLayout?(c(t.group,a,t),a.append(d(t,t.group))):(c(t,a),a.append(d(t))),a)),l(e,i),i}function f(){angular.forEach(r,function(e){e.object===v.msSelectedMonitor||e.object.group===v.msSelectedMonitor?e.element.addClass("active"):e.element.removeClass("active")})}function m(e){return{leftMin:e.x,leftMax:e.x+e.w,topMin:e.y,topMax:e.y+e.h}}function _(e,t){return{x:e.x-t.x,y:e.y-t.y,w:e.w,h:e.h}}function y(e,t){return{leftMin:Math.min(e.leftMin,t.leftMin),leftMax:Math.max(e.leftMax,t.leftMax),topMin:Math.min(e.topMin,t.topMin),topMax:Math.max(e.topMax,t.topMax)}}function t(){angular.forEach(h,function(e){e.$destroy()}),h=[],r=[],angular.forEach(b,function(e){e()}),s=void 0,i.empty();var t,e,a={x:0,y:0};angular.forEach(v.msMonitors,function(e){a.x=Math.min(a.x,e.x),a.y=Math.min(a.y,e.y)}),1===v.msLayout?v.msMonitors&&0<v.msMonitors.length&&(t=m(v.msMonitors[0]),angular.forEach(v.msMonitors,function(e){t=y(t,m(e))}),t.x=t.leftMin,t.w=t.leftMax-t.leftMin,t.y=t.topMin,t.h=t.topMax-t.topMin,e=g(v.msMonitors[0],t),i.append(e)):2===v.msLayout?angular.forEach(v.msMonitors,function(e){e=g(e,_(e,a));i.append(e)}):(angular.forEach(v.msMonitors,function(e){e.isInGroup&&1===e.group.layout||(e=g(e,_(e,a)),i.append(e))}),angular.forEach(v.msGroups,function(e){1===e.layout&&(e=g(e,_(e,a)),i.append(e))})),f()}function w(i){var n;return angular.forEach(r,function(e){var t=e.object;if(2===v.msSelectionState.createGroup){if(angular.isObject(v.msSplits[t.location]))return}else if(t.isSplit||t.isInGroup)return;var a=m(t);e=a,(a=i).left>=e.leftMin&&a.left<e.leftMax&&a.top>=e.topMin&&a.top<=e.topMax&&(n=t)}),n}function k(i){var n=[];return angular.forEach(r,function(e){var t,a;e.object.isSplit||e.object.isInGroup||(t=m(e.object),a=t,(t=i).leftMin<a.leftMax&&t.leftMax>a.leftMin&&t.topMin<a.topMax&&t.topMax>a.topMin&&n.push(e))}),n}v.msController.audioGetMonitorLocation=function(e){return e.group&&e.group.location||e.location},v.msController.audioIsEnabledForMonitor=function(e){return!angular.isObject(v.msUserMonitorSettings)||!angular.isObject(v.msUserMonitorSettings[v.msController.audioGetMonitorLocation(e)])||v.msUserMonitorSettings[v.msController.audioGetMonitorLocation(e)].videoaudiooutput},v.msController.audioSetEnabledForMonitor=function(e,t){v.msUserMonitorSettings=v.msUserMonitorSettings||{},v.msUserMonitorSettings[v.msController.audioGetMonitorLocation(e)]=v.msUserMonitorSettings[v.msController.audioGetMonitorLocation(e)]||{},v.msUserMonitorSettings[v.msController.audioGetMonitorLocation(e)].videoaudiooutput=t},e.on("mousemove.splitdrag",function(e){var t;s&&(t={},s.isVertical?(s.elementCss.left+=e.pageX-s.lastX,s.lastX=e.pageX,t.left=s.elementCss.left,t.left=Math.max(1,Math.min(s.max,t.left))):(s.elementCss.top+=e.pageY-s.lastY,s.lastY=e.pageY,t.top=s.elementCss.top,t.top=Math.max(1,Math.min(s.max,t.top))),s.element.css(t))}),e.on("mouseup.splitdrag",function(){var e;s&&(e=s.element.position(),e=Math.round(((s.isVertical?e.left:e.top)+2)/v.msScale),(e/=s.isVertical?s.split.w:s.split.h)!==s.split.position&&(v.msOnSplitMoved({location:s.split.location,position:e}),window.safeApply(v))),s=void 0}),e.on("mousemove.monitorCreateGroup",function(e){var t,a,i;0!==v.msSelectionState.createGroup&&(o=[],t={top:e.pageY,left:e.pageX},e=n.offset(),t.left-=e.left,t.top-=e.top,t.left/=v.msScale,t.top/=v.msScale,angular.forEach(r,function(e){e.element.removeClass("groupHover")}),a=w(t),angular.isObject(a)&&a!==v.msSelectedMonitor&&(1===v.msSelectionState.createGroup?i=function e(t){var a=k(t);return angular.forEach(a,function(e){e=m(e.object),t=y(t,e)}),k(t).length>a.length?e(t):a}(y(m(v.msSelectedMonitor),m(a))):(i=[],angular.forEach(r,function(e){e.object!==a&&e.object!==v.msSelectedMonitor||i.push(e)}),v.msSelectedMonitor.isGroup&&i.push(v.msSelectedMonitor)),angular.forEach(i,function(e){e.isGroup?o.push(e):(e.element.addClass("groupHover"),o.push(e.object))})))}),v.$watch("msMonitors",t,!0),v.$watch("msScale",t,!0),v.$watch("msSplits",t,!0),v.$watch("msGroups",t,!0),v.$watch("msLayout",t,!0),v.$watch("msSelectedMonitor",f),v.msController.rebuid=t,v.$on("$destroy",function(){e.off("mousemove.splitdrag"),e.off("mouseup.splitdrag"),e.off("mousemove.monitorCreateGroup")})}}}]),angular.module("wallpaperbrowserApp").controller("BrowseWallpaperWorkshopInfoModalCtrl",["$scope","$uibModalInstance","$rootScope","modals","utils","data",function(e,t,a,i,n,o){e.data=o,e.filterConfig=o.filterConfig,e.ok=function(){t.close(e.genres)},e.cancel=function(){t.dismiss("cancel")},e.isDefaultFilterSelect=function(){return void 0!==e.filterConfig.Anime},o.canCancel||i.setPreventModalClose(!0),e.$on("$destroy",function(){i.setPreventModalClose(!1)})}]),angular.module("wallpaperbrowserApp").controller("BrowseWallpaperSharePresetModalCtrl",["$scope","$uibModalInstance","utils","data",function(a,e,i,t){function n(a){return angular.forEach(a,function(e,t){i.isValueUserShortcut(e)&&delete a[t]}),a}t.preset=n(t.preset),a.data={preset:angular.toJson(t.preset,!0)},a.ok=function(){e.close(n(angular.fromJson(a.data.preset)))},a.cancel=function(){e.dismiss("cancel")},a.$watch("data.preset",function(e){try{angular.isString(e)&&0<e.length&&(t=atob(e),angular.isString(t)&&0<t.length&&(e=angular.toJson(n(angular.fromJson(t)),!0),a.data.preset=e))}catch(e){}var t={exception:""};a.isJsonValid=JSON.validate(e,t),a.jsonError=t.exception}),a.copyPreset=function(){var e=angular.element("#jsonTextArea"),t=angular.element("#jsonTextAreaTmp"),e=e.val();t.val(btoa(e)),t.select(),document.execCommand("Copy")},a.pastePreset=function(){angular.element("#jsonTextArea").val("").select(),document.execCommand("Paste")}}]),angular.module("wallpaperbrowserApp").controller("BrowseReportModalCtrl",["$scope","$translate","$http","$httpParamSerializer","$uibModalInstance","host","data","utils",function(i,t,e,a,n,o,r,s){i.categories=[{label:"ui_browse_report_modal_category_other",value:"other"},{label:"ui_browse_report_modal_category_genre",value:"genre"},{label:"ui_browse_report_modal_category_rating",value:"rating"},{label:"ui_browse_report_modal_category_copyright",value:"copyright"},{label:"ui_browse_report_modal_category_spam",value:"spam"}],i.descriptions={other:"ui_browse_report_modal_category_other_description",genre:"ui_browse_report_modal_category_genre_description",rating:"ui_browse_report_modal_category_rating_description",copyright:"ui_browse_report_modal_category_copyright_description",spam:"ui_browse_report_modal_category_spam_description"};var l=s.getAvailableTags();i.genres=l.map(function(e){return{label:e,value:e}}),angular.forEach(i.genres,function(t){s.translateTag(t.value).then(function(e){t.label=e})}),i.ratings=[{value:"Questionable",label:"ui_workshop_tags_rating_questionable"},{value:"Mature",label:"ui_workshop_tags_rating_mature"},{value:"Ban",label:"ui_workshop_tags_rating_ban"}],i.data=r.wallpaper,i.steamAuth=r.steamAuth,i.translatedCurrentTags="",i.translatedCurrentRatingTags="",angular.forEach(r.wallpaper.tags.split(","),function(t){l.includes(t)?(i.genres.findAndRemove(function(e){return e.value===t}),s.translateTag(t).then(function(e){0<i.translatedCurrentTags.length&&(i.translatedCurrentTags+=", "),i.translatedCurrentTags+=e})):"Everyone"!==t&&"Questionable"!==t&&"Mature"!==t||s.translateRatingTag(t).then(function(e){0<i.translatedCurrentRatingTags.length&&(i.translatedCurrentRatingTags+=", "),i.translatedCurrentRatingTags+=e})}),i.context={category:i.categories[0].value,workshopid:i.data.workshopid,creatorid:i.data.authorsteamid,suggestedgenre:"",suggestedrating:""},i.ok=function(){var e=angular.copy(i.context);"rating"===e.category&&"Ban"===e.suggestedrating&&(e.category="violation",e.suggestedrating=""),o.isAPIDNSBlocked()?(n.close(),t("ui_browse_report_modal_success").then(function(e){s.showSuccess(e.toString())})):(i.reportInProgress=!0,o.sendRequestWithSteamAuth(r.steamAuth,r.backendUrl+"/api/reports/v1",e).then(function(e){i.reportInProgress=!1,e&&e.error?t("ui_browse_report_modal_error").then(function(e){s.showError(e.toString())}):(n.close(),t("ui_browse_report_modal_success").then(function(e){s.showSuccess(e.toString())}))}).catch(function(a){i.reportInProgress=!1;var e=401===(a&&a.status)?"ui_browse_report_modal_error_401":"ui_browse_report_modal_error";t(e).then(function(e){var t=a&&a.status&&" (HTTP "+a.status+")";angular.isString(t)||(t=""),s.showError(e.toString()+t)})}))},i.cancel=function(){n.dismiss("cancel")},i.isReportDisabled=function(){return"genre"===i.context.category&&i.context.suggestedgenre.length<1||("rating"===i.context.category&&i.context.suggestedrating.length<1||("copyright"===i.context.category||(!i.context.note||i.context.note.length<1)))},i.openDMCA=function(){window.ui.shellexecute("https://steamcommunity.com/dmca/create/")},i.$watch("context.category",function(){i.context.suggestedgenre="",i.context.suggestedrating=""})}]),angular.module("wallpaperbrowserApp").controller("EditorRatingModalCtrl",["$scope","$q","$translate","$uibModalInstance","modals","data",function(a,e,t,i,n,o){a.data=angular.copy(o),a.ok=function(){o.ratingviolence=a.data.ratingviolence,o.ratingsex=a.data.ratingsex,o.contentrating=a.data.contentrating,i.close()},a.cancel=function(){i.dismiss("cancel")},a.$watch("data.ratingsex",function(e,t){if(e!==t)switch(e){case"mild":a.data.contentrating="Questionable";break;case"full":case"adult":a.data.contentrating="Mature";break;default:a.data.contentrating="Everyone"}})}]),angular.module("wallpaperbrowserApp").controller("AgeGateModalCtrl",["$scope","$uibModalInstance","modals",function(a,e,t){var i=new Date;a.okDisabled=!0,a.date={day:i.getDate(),month:i.getMonth(),year:i.getFullYear()},a.ok=function(){if(a.okDisabled)return e.dismiss("cancel"),void t.open("genericConfirm",{data:{title:"ui_browse_age_gate_modal_header",message:"ui_browse_age_gate_modal_error_message",okVisible:!0}});e.close()},a.cancel=function(){e.dismiss("cancel")},a.$watchGroup(["date.month","date.year"],function(){var e;a.days=[];var t=a.date.month;if(1===t)if(a.date.year%4==0)for(e=1;e<=29;++e)a.days.push({value:e,label:""+e});else for(e=1;e<=28;++e)a.days.push({value:e,label:""+e});else if(8===t||3===t||5===t||10===t)for(e=1;e<=30;++e)a.days.push({value:e,label:""+e});else for(e=1;e<=31;++e)a.days.push({value:e,label:""+e})}),a.$watch("date",function(e){var t=new Date(e.year,e.month,e.day,0,0,0,0),e=new Date(i.getFullYear()-18,i.getMonth(),i.getDate(),0,0,0,0);a.okDisabled=e<t},!0),function(){a.years=[];for(var e=0;e<100;++e)a.years.push({value:i.getFullYear()-e,label:""+(i.getFullYear()-e)})}(),function(){a.months=[];for(var e=0;e<12;++e)a.months.push({value:e,label:""+(e+1)})}()}]),angular.module("wallpaperbrowserApp").controller("BrowseExploreCreateQueryModalCtrl",["$scope","$uibModalInstance","utils","data",function(t,e,a,i){t.data=i,t.categoryOptions=[{label:"ui_browse_explore_create_query_modal_keyword",value:"keyword"},{label:"ui_browse_explore_create_query_modal_creator",value:"creator"}],a.canUseCollectionsInDiscover()&&t.categoryOptions.push({label:"ui_browse_explore_create_query_modal_collection",value:"collection"}),t.ok=function(){e.close(i.query)},t.cancel=function(){e.dismiss("cancel")},t.validateQuery=function(){switch(t.data.query.category){case"keyword":return angular.isString(t.data.query.keyword);case"creator":case"collection":return/^\d+$/.test(t.data.query.itemid)}return!1},t.$watch("data.query.category",function(e){switch(e){case"keyword":t.queryTypeOptions=[{label:"ui_browse_query_sort_by_trend_year",value:"trend_year"},{label:"ui_browse_query_sort_by_trend_last_week",value:"trend_week"},{label:"ui_browse_query_sort_by_date",value:"most_recent"},{label:"ui_browse_query_sort_most_subscriptions",value:"subscriptions"}],t.data.query.querytype=t.queryTypeOptions[0].value;break;case"creator":t.queryTypeOptions=[{label:"ui_browse_query_sort_by_votes",value:"published_votes"},{label:"ui_browse_query_sort_by_date",value:"published_desc"}],t.data.query.querytype=t.queryTypeOptions[0].value}delete t.data.query.keyword,delete t.data.query.itemid})}]),angular.module("wallpaperbrowserApp").controller("BrowseResolutionSettingsModalCtrl",["$scope","$uibModalInstance","$rootScope","modals","utils","data",function(e,t,a,i,n,o){e.data=o,e.filterConfig=o.filterConfig,e.ok=function(){t.close(e.genres)},e.cancel=function(){t.dismiss("cancel")}}]),angular.module("wallpaperbrowserApp").controller("EditorSettingsModalCtrl",["$timeout","$scope","$uibModalInstance","host","utils","data",function(e,a,t,i,n,o){a.settings=angular.copy(o),a.selectExternalApp=function(e,t){i.selectExternalApp(e,t,a.settings)},a.ok=function(){t.close(a.settings)},a.cancel=function(){t.dismiss()},e(function(){a.$broadcast("rzSliderForceRender")},250)}]),angular.module("wallpaperbrowserApp").directive("ngRightClick",["$parse",function(n){return function(t,e,a){var i=n(a.ngRightClick);e.bind("contextmenu",function(e){t.$apply(function(){e.preventDefault(),i(t,{$event:e})})})}}]),angular.module("wallpaperbrowserApp").directive("wallpaperThumbnail",["$translate","$document","$timeout","$compile","utils","dragdrop",function(F,j,V,L,z,$){return{restrict:"E",scope:{wtWallpapers:"=",wtWallpaperFlags:"=",wtFolders:"=",wtSelection:"=",wtMultiselection:"=",wtEnabledragdrop:"=",wtTag:"=",wtSteamUserInfos:"=",wtMousecallback:"&",wtSelectioncallback:"&",wtFlagcallback:"&",wtBlacklist:"=",wtConfig:"="},link:function(m,r,v){r=angular.element(r);var o,s,l=[],c=[],n=[],t=!1,d={},p=[],u=[],g=!1;const h="data:image/bmp;base64,Qk08AAAAAAAAADYAAAAoAAAAAQAAAAEAAAABABAAAAAAAAYAAAASCwAAEgsAAAAAAAAAAAAA/39vVAAA",b=document.createElement("template");b.innerHTML=`<div class="icons">
<span class="fas fa-trophy statusIconAppoved wallpaperStatusIcon galleryTooltipApproved"></span>
<span class="fas fa-mobile-android statusIconPortrait wallpaperStatusIcon galleryTooltipPortrait"></span>
<span class="fas fa-heart statusIconHeart wallpaperStatusIcon galleryTooltipFavorite"></span>
<span class="fas fa-save statusIconInstalled wallpaperStatusIcon galleryTooltipInstalled"></span>
<div class="browseWallpaperImageIconTooltipParent">
<div class="browseWallpaperImageIconTooltip">
<div class="galleryTooltipApproved">
<span class="fas fa-fw fa-trophy statusIconAppoved galleryTooltipIcon"></span><span class="iconLabelApproved"></span>
</div>
<div class="galleryTooltipPortrait">
<span class="fas fa-fw fa-mobile-android statusIconPortrait galleryTooltipIcon"></span><span class="iconLabelPortrait"></span>
</div>
<div class="galleryTooltipFavorite">
<span class="fas fa-fw fa-heart statusIconHeart galleryTooltipIcon"></span><span class="iconLabelFavorite"></span>
</div>
<div class="galleryTooltipInstalled">
<span class="fas fa-fw fa-save statusIconInstalled galleryTooltipIcon"></span><span class="iconLabelInstalled"></span>
</div>
</div>
</div>
</div>`;const a=document.createElement("template");function i(e){e.stopPropagation()}function f(e){o&&(o.removeClass("selected"),o=void 0),e&&(o=e).addClass("selected")}function _(e){m.wtMultiselection&&m.wtMultiselection.includes(e.ctx.wallpaper)?e.addClass("multiselect"):e.removeClass("multiselect")}function y(e){e.ctx.info&&e.ctx.info.checkbox&&(m.wtWallpaperFlags&&m.wtWallpaperFlags[e.ctx.wallpaper.file]?(e.ctx.info.checkboxChecked.show(),e.ctx.info.checkboxNotChecked.hide(),e.ctx.info.checkbox.addClass("visible")):(e.ctx.info.checkboxChecked.hide(),e.ctx.info.checkboxNotChecked.show(),e.ctx.info.checkbox.removeClass("visible")))}function w(t){switch(m.wtTag){case"exploreHighlights":case"homeHighlights":var e=F.instant(t.ctx.wallpaper.titleoverride||t.ctx.wallpaper.title,{collectiontitle:t.ctx.wallpaper.queryTitle,user:t.ctx.wallpaper.queryTitle,year:t.ctx.wallpaper.year,emoji:t.ctx.wallpaper.emoji}).toString().replace(/(<b>|<\/b>)/g,"");t.ctx.title[0].innerHTML!==e&&t.ctx.title.text(e);break;default:t.ctx.title[0].innerHTML!==t.ctx.wallpaper.title&&t.ctx.title.text(t.ctx.wallpaper.title)}if(t.ctx.info){if(t.ctx.lastStatus!==t.ctx.wallpaper.status){switch(t.removeClass("installed downloadable"),t.ctx.progress&&"downloading"!==t.ctx.wallpaper.status?(V.cancel(t.ctx.progressShowTimeout),V.cancel(t.ctx.progressHideTimeout),t.ctx.downloadElement.addClass("hideProgress"),"installed"===t.ctx.wallpaper.status&&t.ctx.downloadElement.addClass("finishProgress"),t.ctx.progressHideTimeout=V(function(){p.findAndRemove(t.progressContext),t.progressContext.$destroy(),t.ctx.progress.remove(),delete t.progressContext,delete t.ctx.progress,t.ctx.downloadElement.hide()},700)):t.ctx.progress||"downloading"!==t.ctx.wallpaper.status||(t.ctx.downloadElement.removeClass("finishProgress"),t.ctx.downloadElement.addClass("hideProgress"),t.ctx.downloadElement.show(),t.progressContext=t.ctx.$new(),p.push(t.progressContext),t.ctx.progress=L('<radial-progress class="inner radialProgressContainer" rp-percent="wallpaper.downloadpercent" rp-label="wallpaper.downloadlabel"></radial-progress>')(t.progressContext,function(e){t.ctx.downloadElement.append(e),t.ctx.progressShowTimeout=V(function(){t.ctx.downloadElement.removeClass("hideProgress")})})),"error"===t.ctx.lastStatus?((n=t).removeClass("error"),n.ctx.steamDownloadError&&n.ctx.steamDownloadError.hide()):"error"===t.ctx.wallpaper.status&&((i=t).addClass("error"),i.ctx.steamDownloadError?i.ctx.steamDownloadError.show():(i.ctx.steamDownloadError=angular.element(document.createElement("div")),i.ctx.steamDownloadError.addClass("steamDownloadError"),i.ctx.steamDownloadError.html(F.instant("ui_browse_download_error_restart_steam").toString()),i.append(i.ctx.steamDownloadError))),t.ctx.wallpaper.status){case"installed":t.addClass("installed");break;case"downloadable":t.addClass("downloadable");break;case"downloading":V.cancel(t.ctx.progressHideTimeout)}t.ctx.lastStatus=t.ctx.wallpaper.status}if(t.css({"background-image":(i=t.ctx.wallpaper.previewsmall)?'url("'+i+'")':""}),t.ctx.video&&t.ctx.video.attr("src",t.ctx.wallpaper.videopreviewurl),t.ctx.wallpaper===m.wtSelection?f(t):t===o&&f(),t.ctx.wallpaper.approved?t.ctx.info.icons.addClass("showGalleryTooltipApproved"):t.ctx.info.icons.removeClass("showGalleryTooltipApproved"),t.ctx.wallpaper.portrait?t.ctx.info.icons.addClass("showGalleryTooltipPortrait"):t.ctx.info.icons.removeClass("showGalleryTooltipPortrait"),t.ctx.wallpaper.favorite?t.ctx.info.icons.addClass("showGalleryTooltipFavorite"):t.ctx.info.icons.removeClass("showGalleryTooltipFavorite"),"installed"===m.wtTag||t.ctx.wallpaper.local||"installed"!==t.ctx.wallpaper.status?t.ctx.info.icons.removeClass("showGalleryTooltipInstalled"):t.ctx.info.icons.addClass("showGalleryTooltipInstalled"),m.wtBlacklist&&t.ctx.wallpaper.authorsteamid&&m.wtBlacklist.includes(t.ctx.wallpaper.authorsteamid)?t.addClass("blacklisted"):t.removeClass("blacklisted"),t.ctx.assetCategory&&(t.ctx.assetCategory.removeClass("layers effects scripts"),t.ctx.wallpaper.assettypes&&0<t.ctx.wallpaper.assettypes.length)){var a="ui_query_workshop_modal_asset_category_layers";switch(z.assetGroupType[t.ctx.wallpaper.assettypes[0]]){case"layers":t.ctx.assetCategory.addClass("layers");break;case"effects":t.ctx.assetCategory.addClass("effects"),a="ui_query_workshop_modal_asset_category_effects";break;case"scripts":t.ctx.assetCategory.addClass("scripts"),a="ui_query_workshop_modal_asset_category_scripts"}i=d[a];i||(d[a]=F.instant(a),i=d[a]),t.ctx.assetCategory.text(i)}t.ctx.avatar&&(t.ctx.wallpaper.avatar?(t.ctx.avatar.show(),t.ctx.avatar.attr("src",t.ctx.wallpaper.avatar)):t.ctx.avatar.hide()),_(t),y(t,m.wtWallpaperFlags)}var i,n}function k(e,t){e.ctx.wallpaper=t,w(e)}function x(e){var t,t=(t=a.content.firstChild.cloneNode(!0),angular.element(t));return t.click(i),t.dblclick(i),e.checkboxChecked=angular.element(t[0].querySelector(".chkYes")),e.checkboxNotChecked=angular.element(t[0].querySelector(".chkNo")),t}a.innerHTML=`<div class="checkBoxBase">
<div class="checkBoxOuter">
<span class="fas fa-square checkBoxBackground"></span>
<span>
<span class="fas fa-check-square checkBox chkYes" style="display:none"></span>
<span class="far fa-square checkBox chkNo"></span>
</span>
</div>
</div>`;var S={click:function(e){t||(m.wtMousecallback({btn:"left",context:e.currentTarget.ctx.wallpaper,$event:e}),window.safeApply(m))},dblclick:function(e){m.wtMousecallback({btn:"dbl",context:e.currentTarget.ctx.wallpaper,$event:e}),window.safeApply(m)},contextmenu:function(e){m.wtMousecallback({btn:"right",context:e.currentTarget.ctx&&e.currentTarget.ctx.wallpaper,$event:e}),window.safeApply(m)},folderclick:function(e){e.currentTarget.ctx.editTitle.val(e.currentTarget.ctx.wallpaper.title),e.currentTarget.ctx.title.hide(),e.currentTarget.ctx.editTitle.show(),e.stopPropagation(),e.currentTarget.ctx.editTitle.focus()},folderkeyup:function(e){13!==e.which&&27!==e.which||(27===e.which&&e.currentTarget.ctx.editTitle.val(e.currentTarget.ctx.wallpaper.title),e.currentTarget.ctx.editTitle.blur(),window.safeApply(m))},folderblur:function(e){e.currentTarget.ctx.wallpaper.title=e.currentTarget.ctx.editTitle.val(),e.currentTarget.ctx.title.text(e.currentTarget.ctx.wallpaper.title),e.currentTarget.ctx.editTitle.hide(),e.currentTarget.ctx.title.show(),window.safeApply(m)},toggleplaylist:function(e){e=angular.element(e.currentTarget).closest(".browseWallpaperImage")[0].ctx.wallpaper;m.wtFlagcallback({wallpaper:e}),window.safeApply(m)}},C={click:function(){g=!0,m.rebuildGallery(m.wtWallpapers)}};function E(e){var t=m.$new(!0);t.wallpaper=e;var a=angular.element(document.createElement("div"));a[0].ctx=t,a.ctx=t,a.addClass("browseWallpaperImage"),m.wtConfig&&m.wtConfig.videosupport&&((p=angular.element(document.createElement("video"))).addClass("videoBg"),p.attr("autoplay","autoplay"),p.attr("muted","muted"),p.attr("loop","loop"),a.append(p),t.video=p);var i=angular.element(document.createElement("img"));i.attr("src",h),i.addClass("translucentBox"),a.append(i),a.click(S.click),a.dblclick(S.dblclick),a.contextmenu(S.contextmenu);var n,o,r,s,l,c,d,p=angular.element(document.createElement("div")),u=angular.element(document.createElement("div")),g=angular.element(document.createElement("div")),i=angular.element(document.createElement("div"));switch("folder"!==e.type?((n=angular.element(document.createElement("div"))).addClass("progressParent"),(t.downloadElement=n).hide(),a.append(n),s={},(d=b.content.firstChild.cloneNode(!0)).querySelector(".iconLabelPortrait").textContent=F.instant("ui_browse_wallpaper_info_portrait"),d.querySelector(".iconLabelApproved").textContent=F.instant("ui_browse_wallpaper_info_approved"),d.querySelector(".iconLabelFavorite").textContent=F.instant("ui_browse_wallpaper_info_favorite"),d.querySelector(".iconLabelInstalled").textContent=F.instant("ui_browse_wallpaper_info_installed"),n=angular.element(d),s.icons=n,a.append(n),"wtFlagcallback"in v&&(o=angular.element(document.createElement("div")),r=x(s),o.addClass("checker"),o.append(r),s.checkbox=o,p.append(o),r.click(S.toggleplaylist)),t.info=s):(a.addClass("folder"),d=angular.element(document.createElement("div")),n=angular.element(document.createElement("span")),o=angular.element(document.createElement("span")),r=angular.element(document.createElement("span")),s=angular.element(document.createElement("input")).attr("type","text"),e.folderIcon?(l=e.folderIcon.replace("fa ","fas "),c=(e.folderIconOpen||e.folderIcon).replace("fa ","fas "),e.folderIconOpen&&(l+=" folderClosed",c+=" folderOpened")):(l="fas fa-folder folderClosed",c="fas fa-folder-open folderOpened"),e.folderColor&&(l+=" "+e.folderColor,c+=" "+e.folderColor),o.addClass(l+" fa-stack-1x"),r.addClass(c+" fa-stack-1x"),d.addClass("folderContainer"),n.addClass("browseFolderStack fa-stack"),s.addClass("folderTitleEdit"),s.hide(),u.addClass("editable"),n.append(o),n.append(r),d.append(n),a.append(d),g.append(s),t.editTitle=s,g[0].ctx=t,s[0].ctx=t,g.click(S.folderclick),s.keyup(S.folderkeyup),s.blur(S.folderblur)),p.addClass("wallpaperInfo"),u.addClass("caption"),m.wtTag){case"assetworkshop":var f=angular.element(document.createElement("span"));f.addClass("assetCategory"),a.append(f),t.assetCategory=f;break;case"exploreHighlights":case"homeHighlights":f=angular.element(document.createElement("img"));f.addClass("avatarImg"),g.append(f),t.avatar=f,u.addClass("captionHighlights")}t.title=i,g.append(i),u.append(g),p.append(u),a.append(p);p=angular.element(document.createElement("div"));return p.addClass("selectBorder"),a.append(p),w(a),a}r.contextmenu(S.contextmenu);var P,e,M={findElement:function(e){if(1===e.which&&m.wtEnabledragdrop){var t=angular.element(angular.element(e.target).closest(".browseWallpaperImage")[0]),e=t&&t[0]&&t[0].ctx;if(angular.isObject(e)&&angular.isObject(e.wallpaper)&&"downloadable"!==e.wallpaper.status)return{element:t,data:e.wallpaper}}}};function A(){P&&P.element&&P.element.remove(),P=void 0}function T(e){e=angular.offsetToAncestor(e,r),e={left:Math.min(P.origin.left,e.left),top:Math.min(P.origin.top,e.top),width:Math.abs(P.origin.left-e.left),height:Math.abs(P.origin.top-e.top)};e.top+e.height>r[0].scrollHeight&&(e.height=r[0].scrollHeight-e.top),P.element.css(e)}function O(){e&&(e.cancel(),e=void 0)}function I(){function e(e){var t=z.getElementBounds(e);z.checkBoundsOverlap(i,t)&&a.push(e)}var a=[],i=z.getElementBounds(P.element);return angular.forEach(n,e),angular.forEach(l,e),a}if($.registerInitiator(M),r.mousedown(function(a){O(),e=$.beginAutoScroll("browseScroll",r),1===a.which&&m.wtEnabledragdrop&&a.target===r[0]&&$.beginDragTest(a,{start:function(e){var t;t=a,e=e,A(),t=angular.offsetToAncestor(t,r),(P={origin:t,element:angular.element(document.createElement("div"))}).element.addClass("browseWallpaperSelectionRectangle"),r.append(P.element),T(e)},finish:function(){var e=I().map(function(e){return e.ctx.wallpaper});m.wtSelectioncallback({items:e,$event:a}),window.safeApply(m),A()},cancel:function(){A()},move:function(e){T(e)}})}),r.contextmenu(function(e){m.wtMousecallback({btn:"right",$event:e}),window.safeApply(m)}),j.mouseup(O),!("explore"===m.wtTag||"exploreHighlights"===m.wtTag||m.wtConfig&&m.wtConfig.removePseudoElements))for(var R=0;R<20;++R){var D=angular.element(document.createElement("div"));D.addClass("browseWallpaperImage pseudo"),u.push(D)}function W(e){if(!angular.isArray(e))return angular.forEach(l,function(e){e.detach()}),c=l.concat(c),void(l=[]);for(var t=0;t<Math.min(e.length,l.length);++t)k(l[t],e[t]);var a=g?0:function(e){if(!m.wtBlacklist)return 0;for(var t=0,a=0;a<e.length;++a)e[a].authorsteamid&&m.wtBlacklist.includes(e[a].authorsteamid)&&++t;return t}(e),i=l.length!==e.length||0<a&&void 0===s;if(0===a&&s&&(s.detach(),s=void 0),i&&angular.forEach(u,function(e){e.detach()}),0<c.length&&l.length<e.length){for(var n=Math.min(e.length-l.length,c.length),t=0;t<n;++t)k(c[t],e[l.length]),l.push(c[t]),r.append(c[t]);c.splice(0,n)}for(t=l.length;t<e.length;++t){var o=E(e[t]);o.attr("id","wpimg"+t),r.append(o),l.push(o)}if(e.length<l.length){for(t=e.length;t<l.length;++t)c.push(l[t]),l[t].detach();l.splice(e.length,l.length-e.length)}void 0===s&&0<a&&(s=function(){var e=m.$new(!0),t=angular.element(document.createElement("div"));t[0].ctx=e,t.ctx=e,t.addClass("browseWallpaperImage");var a=angular.element(document.createElement("img"));return a.attr("src",h),a.addClass("translucentBox"),t.append(a),(a=angular.element(document.createElement("div"))).addClass("browseWallpaperBlacklistInfo"),t.append(a),a.click(C.click),e.hint=a,t}(),r.append(s)),i&&angular.forEach(u,function(e){r.append(e)}),a=a,s&&s.ctx.hint.text(F.instant("ui_browse_gallery_block_info",{count:a}).toString()),0<a?r.addClass("blacklistTruncated"):r.removeClass("blacklistTruncated")}function B(){"exploreHighlights"!==m.wtTag&&"homeHighlights"!==m.wtTag||l.forEach(e=>{switch(e.ctx.wallpaper.category){case"creator":var t=m.wtSteamUserInfos&&m.wtSteamUserInfos[e.ctx.wallpaper.itemid];e.ctx.wallpaper.queryTitle=t&&t.name,e.ctx.wallpaper.avatar=t&&t.avatar||"images/noavatar.jpg";break;case"collection":delete e.ctx.wallpaper.avatar}w(e)})}m.rebuildGallery=W,m.$watch("wtWallpapers",function(e,t){angular.isArray(e)&&angular.isArray(t)&&e.length===t.length&&0!==e.length&&0!==t.length&&e[0].workshopid===t[0].workshopid||(g=!1),W(e),B()}),m.$watch("wtFolders",function(e){if(angular.forEach(n,function(e){e.remove()}),n=[],angular.isArray(e))for(var t=e.length-1;0<=t;--t){var a=E(e[t]);a.attr("id","wpfolder"+t),r.prepend(a),n.push(a)}}),m.$watch("wtWallpaperFlags",function(){angular.forEach(l,y)},!0),m.$watch("wtSelection",function(t){var a;o&&o.ctx.wallpaper===t||(a=!1,angular.forEach(l,function(e){e.ctx.wallpaper===t&&(f(e),a=!0)}),a||f())}),m.$watch("wtMultiselection",function(){angular.forEach(l,function(e){_(e)}),angular.forEach(n,function(e){_(e)})},!0),m.$watch("wtTag",function(e,t){e&&t&&e!==t&&(W(),c=[],W(m.wtWallpapers),B())}),m.$watch("wtSteamUserInfos",function(){B()},!0),m.$on("$destroy",function(){$.unregisterInitiator(M),angular.forEach(p,function(e){e.$destroy()}),p=[]}),m.$on("onInternalDropStart",function(){V(function(){t=!0})}),m.$on("onInternalDropStop",function(){V(function(){t=!1})})}}}]),angular.module("wallpaperbrowserApp").directive("ratingTable",function(){return{templateUrl:"views/templates/ratingtable.html",restrict:"E",scope:{highlight:"="},link:function(){}}}),angular.module("wallpaperbrowserApp").directive("explorescroll",function(){return{restrict:"A",link:function(e,t){var a=(t=angular.element(t)).children(".browseExploreQueryScroll"),i=t.children(".exploreArrowLeft"),n=t.children(".exploreArrowRight"),o={left:!0,right:!0},t=function(){var e={left:0<a.scrollLeft(),right:Math.floor(a.scrollLeft())<Math.floor(a[0].scrollWidth-a.innerWidth())-1};e.left!==o.left&&(o.left=e.left,e.left?i.show():i.hide()),e.right!==o.right&&(o.right=e.right,e.right?n.show():n.hide())};a.scroll(t);var r=new ResizeObserver(t);r.observe(a[0]),t(),e.$on("$destroy",function(){r.disconnect()}),i.click(function(){a[0].scroll({left:a.scrollLeft()-.9*a.innerWidth(),behavior:"smooth"})}),n.click(function(){a[0].scroll({left:a.scrollLeft()+.9*a.innerWidth(),behavior:"smooth"})})}}}),angular.module("wallpaperbrowserApp").directive("intersectionhandler",function(){return{restrict:"A",scope:{ishSentinel:"@",ishCallback:"&"},link:function(t,e){var a=(e=angular.element(e)).find(t.ishSentinel),i=new IntersectionObserver(function(e){angular.isArray(e)&&0!==e.length&&(angular.forEach(e,function(e){t.ishCallback({visible:e.isIntersecting})}),window.safeApply(t))},{root:e[0]});i.observe(a[0]),t.$on("$destroy",function(){i.disconnect()})}}}),angular.module("wallpaperbrowserApp").directive("explorequerytitle",["$rootScope","$q","$translate","utils",function(t,a,s,l){return{restrict:"E",templateUrl:"views/templates/explorequerytitle.html",scope:{eqtQuery:"=",eqtUserInfo:"="},link:function(n){function o(e){n.translatedTitle=e.toString()}function r(){n.translatedTitle=n.eqtQuery.title.toString()}function e(){var e=a.when(""),i=angular.isArray(n.eqtQuery.tags)&&0<n.eqtQuery.tags.length;(e=i?l.translateTag(n.eqtQuery.tags[0]):e).then(function(e){var t=s.use(),t=n.eqtQuery.translation&&n.eqtQuery.translation[t],a={genre:e.toString(),user:n.eqtUserInfo[n.eqtQuery.itemid]&&n.eqtUserInfo[n.eqtQuery.itemid].name||s.instant("ui_browse_details_author_pending").toString(),collectiontitle:n.eqtQuery.collection&&n.eqtQuery.collection.title,keyword:n.eqtQuery.keyword,emoji:n.eqtQuery.emoji,year:n.eqtQuery.year};t&&0<t.length?o(t):i?(t=l.prepareTagForTranslation(n.eqtQuery.tags[0]),s(n.eqtQuery.title+"_"+t).then(o).catch(function(){return s(n.eqtQuery.title,a).then(o).catch(r)})):s(n.eqtQuery.title,a).then(o).catch(r)})}n.translateTag=l.translateTagInstant,n.$watch("eqtQuery",e,!0),n.$watch("eqtUserInfo",e,!0),t.$on("$translateChangeEnd",e)}}}]),angular.module("wallpaperbrowserApp").directive("explorequeryactions",function(){return{restrict:"E",templateUrl:"views/templates/explorequeryactions.html",scope:{eqtQuery:"=",eqtSettings:"=",eqtCallbacks:"="}}}),angular.module("wallpaperbrowserApp").directive("ngVisible",function(){return{restrict:"A",link:function(e,t,a){e.$watch(a.ngVisible,function(e){t.css("visibility",e?"visible":"hidden")})}}}),angular.module("wallpaperbrowserApp").directive("hotkeyinput",["$translate","$q","utils","host","modals",function(s,l,c,d,p){return{restrict:"E",templateUrl:"views/templates/hotkeyinput.html",scope:{hkKeys:"=",hkItem:"=",hkPool:"="},link:function(n,e){var a=angular.element(angular.element(e).find(".hotkeyInput")),o=!1,i={pause:"ui_settings_hotkeys_action_pause",stop:"ui_settings_hotkeys_action_stop",mute:"ui_settings_hotkeys_action_mute",nextwallpaper:"ui_settings_hotkeys_action_next_wallpaper",togglerecord:"ui_settings_hotkeys_action_recording",toggleicons:"ui_settings_hotkeys_action_hide_icons",screenshot:"ui_settings_hotkeys_action_take_screenshot",wallpaper:"ui_settings_hotkeys_action_user_wallpaper",playlist:"ui_settings_hotkeys_action_user_playlist",profile:"ui_settings_hotkeys_action_user_profile",windowbrowser:"ui_settings_hotkeys_action_window_browser",windowsettings:"ui_settings_hotkeys_action_window_settings",windoweditor:"ui_settings_hotkeys_action_window_editor"};function r(e,t){if(n.isInputFocused&&(!angular.isArray(e)||0===e.length))return n.hotkeyLabel=s.instant("ui_settings_hotkeys_prompt_enter_combination").toString(),n.displayFaintText=!0,void(n.showCombinationError=t&&o);n.displayFaintText=!1,d.getVirtualKeyNames().then(function(t){var a="",i=!1;angular.forEach(e,function(e){angular.isString(t[e])&&(o=!0,n.showCombinationError=!1,i&&(a+=" + "),i=!0,a+=t[e])}),n.hotkeyLabel=a})}function t(t){r(t.keys,!0),(t.cancel||t.finished)&&(p.setPreventModalClose(!1),a.blur(),t.finished&&(n.showCombinationError=!1,function(t){var a;angular.forEach(n.hkPool,function(e){e&&e.keys===t||e&&angular.equals(e.keys,t)&&(a=e)});var e=a&&angular.isObject(n.hkItem)&&n.hkItem.action===a.action&&(!angular.isString(n.hkItem.value)||n.hkItem.value===a.value)&&(!angular.isString(n.hkItem.location)||n.hkItem.location===a.location);return angular.isDefined(a)?e?l.when(a):s(i[a.action]).then(function(e){return s("ui_settings_hotkeys_modal_prompt_override_body",{action:e.toString()}).then(function(e){return p.open("genericConfirm",{data:{title:"ui_settings_hotkeys_modal_prompt_override_header",message:e,okVisible:!0,cancelVisible:!0}}).then(function(){return a})})}):l.when()}(t.keys).then(function(e){angular.isObject(e)&&(e.keys.length=0,c.isUserHotkeyAction(e.action)&&n.hkPool.findAndRemove(e)),n.hkKeys.length=0,angular.forEach(t.keys,function(e){n.hkKeys.push(e)})}).catch(function(){n.hkKeys.length=0,r()}))),window.safeApply(n)}a.click(function(e){window.cancelEventImmediately(e)}),a.keydown(function(e){window.cancelEventImmediately(e)}),a.keyup(function(e){window.cancelEventImmediately(e)}),a.keypress(function(e){window.cancelEventImmediately(e)}),a.blur(function(){n.showCombinationError=!1,c.stopHotkeyListener(),n.isInputFocused=!1,r(n.hkKeys),window.safeApply(n)}),n.$on("$destroy",function(){a.off("click"),a.off("keydown"),a.off("keyup"),a.off("keypress"),a.off("blur ")}),n.clearHotkey=function(){n.hkKeys.length=0},n.startHotkeyRecording=function(){o=!1,p.setPreventModalClose(!0),c.startHotkeyListener(t),n.isInputFocused=!0,r()},n.$watch("hkKeys",r,!0),n.isInputFocused=!1}}}]),angular.module("wallpaperbrowserApp").directive("radiobutton",function(){return{templateUrl:"views/templates/radiobutton.html",restrict:"E",scope:{model:"=ngModel",rbDisabled:"=",rbTitle:"=",rbValue:"="},require:"ngModel",link:function(e){e.toggle=function(){angular.isDefined(e.rbDisabled)&&e.rbDisabled||(e.model=e.rbValue)}}}}),angular.module("wallpaperbrowserApp").directive("userProperties",["$q","$timeout","$sanitize","$translate","utils","modals","host",function(l,c,d,p,u,g,f){return{templateUrl:"views/templates/userproperties.html",restrict:"E",scope:{upProperties:"=",upProjectData:"=",upSelectedProperty:"=",upVisibleTypes:"=",upDisableEditing:"=",upController:"="},link:function(n,a){a=angular.element(a),n.properties=[],n.colorPickerOptions=u.getColorPickerDefaults();var i=!1,o=angular.isArray(n.upVisibleTypes)&&0<n.upVisibleTypes.length&&"color"===n.upVisibleTypes[0];function r(){var t=0;angular.forEach(n.properties,function(e){delete e.order,e.index=t,++t})}function s(){var t=!1;angular.forEach(n.properties,function(e){n.isTypeVisible(e.type)&&(t=!0)}),n.propertyTitlesVisible=t}function e(){f.callEditor("getUsedUserProperties").then(function(e){n.activeProperties=e.activeUserProperties})}function t(){!function(){n.properties=[];var i=10;angular.forEach(n.upProperties,function(e,t){var a;"schemecolor"===t&&!o||((a=angular.copy(e)).key=t,angular.isNumber(e.order)?i=Math.max(e.order,i):a.order=i++,n.properties.push(a))}),n.properties.sort(function(e,t){return e.order-t.order}),r(),s()}(),e()}n.isPropertyReadOnly=function(e){return"schemecolor"===e.key||n.upDisableEditing},n.moveProperty=function(e,t){e=n.properties.indexOf(e),t=e+t,t=Math.max(0,Math.min(n.properties.length-1,t));n.properties.move(e,t),r()},n.movePropertyToIndex=function(e){var t,a;i||(t=n.properties.indexOf(e),n.properties.move(t,e.index),a=0,angular.forEach(n.properties,function(e){delete e.order,e.index=a,++a}),r())},n.orderKeyPress=function(e,t){13===e.which&&(n.movePropertyToIndex(t),i=!0,angular.frameTimeout(c,1,function(){var e=angular.element(a.find(".orderInput")[t.index]);e.select(),e[0].scrollIntoView()}),angular.frameTimeout(c,2,function(){i=!1}))},n.createProperty=function(){g.open("editorUserPropertyDetails",{data:{mode:"create",projectData:n.upProjectData,allowedTypes:n.upVisibleTypes}}).then(function(e){for(var t=n.properties.map(function(e){return e.key}),a=1,i=e.key;t.includes(e.key);)e.key=i+a,++a;n.properties.push(e),angular.isArray(n.activeProperties)&&n.activeProperties.push(e.key),angular.isObject(n.upSelectedProperty)&&!angular.isString(n.upSelectedProperty.selected)&&(n.upSelectedProperty.selected=e.key),r(),s()})},n.editProperty=function(a){g.open("editorUserPropertyDetails",{data:{mode:"edit",projectData:n.upProjectData,property:a,allowedTypes:n.upVisibleTypes}}).then(function(e){var t=n.properties.indexOf(a);n.properties.splice(t,1,e)})},n.removeProperty=function(e){l.when();(n.activeProperties&&n.activeProperties.includes(e.key)&&angular.isString(n.upProjectData.workshopid)&&0<n.upProjectData.workshopid.length?g.open("genericConfirm",{data:{title:"ui_editor_user_properties_delete_warning_title",message:"ui_editor_user_properties_delete_warning_message",leftIcon:"images/warning.png",cancelVisible:!0,okVisible:!0,okText:"ui_editor_user_properties_delete_warning_confirm"}}):g.open("genericConfirm",{data:{title:"ui_editor_user_properties_delete_warning_title_unpublished",message:p.instant("ui_editor_user_properties_delete_warning_message_unpublished",{name:d(e.text)}).toString(),cancelVisible:!0,okVisible:!0,okText:"ui_editor_user_properties_delete_warning_confirm"}})).then(function(){n.properties.findAndRemove(e),r(),s()})},n.performUserTextureTest=function(e){f.callEditor("performUserTextureTest",e.key)},n.performUserShortcutTest=function(e){f.callEditor("performUserShortcutTest",e.key)},n.isTypeVisible=function(e){return!angular.isArray(n.upVisibleTypes)||n.upVisibleTypes.includes(e)},n.$watch("properties",function(e,t){var a;angular.isObject(t)&&!angular.equals(e,t)&&(a=100,angular.forEach(n.upProperties,function(e,t){"schemecolor"!==t&&delete n.upProperties[t]}),angular.forEach(n.properties,function(e){var t=angular.copy(e);t.order=a++,delete t.key,n.upProperties[e.key]=t}))},!0),n.$watch("upProjectData",function(e){angular.isObject(e)&&t()}),n.$on("onUserPropertiesModified",e),n.$on("undoRedoPerformed",e),n.upController&&(n.upController.reload=t)}}}]),angular.module("wallpaperbrowserApp").directive("layout",["$rootScope","$document","$timeout","$compile",function(se,le,ce,de){return{restrict:"A",scope:{lSavedLayouts:"=",lLayoutType:"=",lCtrl:"="},link:function(g,f){var o;f=angular.element(f);var n,r,m,e,i={},s=[],d=4,v=26,l=4,p=16,u=20,h=36,b=2,c=[],t=[],_={},y=[],w=0,k=[],a={simple:{background:{orientation:"horizontal",position:300,first:{panels:["files"]},second:{panels:["preview"]}},floating:[]},scene:{background:{orientation:"horizontal",position:250,first:{panels:["layers","sceneoptions","camerapaths","brush"]},second:{orientation:"horizontal",position:300,align:"end",first:{orientation:"vertical",position:165,align:"end",first:{panels:["preview"]},second:{panels:["assets","log","userproperties","animation"]}},second:{panels:["properties"]}}},floating:[]}};function x(e,t){e.panelOptions.noHide?t?e.css({visibility:"visible"}):e.css({visibility:"hidden"}):t?e.css({display:""}):e.css({display:"none"})}function S(e){var t;angular.isObject(e)&&(angular.isArray(e.panels)&&(t=[],angular.forEach(e.panels,function(e){e=i[e];angular.isObject(e)&&(e.panelOptions&&e.panelOptions.hidden&&(e.hidden=!0),t.push(e))}),0<t.length?e.panels=t:delete e.panels),S(e.first),S(e.second))}function C(e,t){angular.isObject(t)&&(angular.isArray(t.panels)&&(t.panels.findAndRemove(e),delete e.split),C(e,t.first),C(e,t.second))}function E(t){C(t,o.background),angular.forEach(o.floating,function(e){C(t,e.first)})}function P(e,t){var a;angular.isObject(t)&&(angular.isArray(t.panels)&&t.activePanel===e&&(t.activePanel=void 0,a=0,angular.forEach(t.panels,function(e){e.hidden||++a}),0===a&&(t.panels=[],delete e.split)),P(e,t.first),P(e,t.second))}function M(e){delete e.second,delete e.first,delete e.panels,delete e.align,delete e.activePanel,delete e.titleContainer,delete e.position,delete e.orientation,delete e.isFloating,delete e.panelBackground,delete e.drag}function A(e){return function e(t,a){var i;if(angular.isObject(a))return angular.forEach(a.panels,function(e){e.panelOptions&&e.panelOptions.tag===t&&(i=a)}),i||e(t,a.first)||e(t,a.second)}(e,o.background)}function T(e,t){return function e(t,a,i,n,o){if(angular.isObject(n)){var r;if(angular.forEach(n.panels,function(e){e.panelOptions&&e.panelOptions.tag===t&&(r=n)}),r&&i){if(i.orientation===a)return o?i.second:i.first;var s={orientation:a,position:200,first:angular.extend({},n),align:"end",second:{panels:[]}};return M(o=i[o?"first":"second"]),angular.extend(o,s),s.second}return e(t,a,n,n.first,!0)||e(t,a,n,n.second,!1)}}(e,t,void 0,o.background,!1)}function O(){angular.forEach(c,function(e){e.remove()}),c=[]}function I(){angular.forEach(t,function(e){e.remove()}),t=[]}function R(){angular.forEach(k,function(e){e.$destroy()}),k=[]}function D(){angular.isObject(m)&&m.$destroy(),m=void 0}function W(e){if(!angular.isObject(e))return 0;var t=0;angular.forEach(e.panels,function(e){e.hidden||++t});var a,i=W(e.first),n=W(e.second);return angular.isObject(e.first)&&0===i?(a=e.second,M(e),angular.extend(e,a)):angular.isObject(e.second)&&0===n&&(a=e.first,M(e),angular.extend(e,a)),t+i+n}function B(e){angular.isObject(e)&&(delete e.activePanel,delete e.titleContainer,delete e.isFloating,delete e.panelBackground,delete e.drag,delete e.background,angular.isArray(e.panels)&&(e.panels=e.panels.filter(function(e){return e.panelOptions&&!e.panelOptions.noSave}).map(function(e){return e.panelOptions.tag})),B(e.first),B(e.second))}function F(e,t,a){var i,n=t?'tooltip="'+(e.panelOptions.tooltip||e.panelOptions.title)+'"':"",t=e.panelOptions.icon?"optionalLabel":"",a=a?'<a class="closeIcon" ng-click="closeWindow(panel)"><span class="fas fa-fw fa-times"></span></a>':"";return angular.isString(e.panelOptions.title)?(i='<span class="'+e.panelOptions.icon+' panelIcon"></span>',de("<span "+n+">"+i+' <span class="'+t+'" translate="'+e.panelOptions.title+'"></span>'+a+"</span>")):(i='<span class="'+e.panelOptions.icon+' panelIcon single"></span>',de("<span "+n+">"+i+' <span class="'+t+'"></span>'+a+"</span>"))}function j(e,t){var a=angular.element(document.createElement("div")),i=angular.element(document.createElement("span"));a.addClass("editorLayoutAnchor"),a.css({width:h,height:h}),i.addClass("icon far fa-fw "+e),a.append(i),a[0].anchorOptions=t,f.append(a),y.push(a)}function V(){angular.forEach(y,function(e){e.remove()}),y=[]}function L(){var o=f.innerWidth(),r=f.innerHeight(),s=.5*o,l=.5*r,c=.5*h;angular.forEach(y,function(e){var t=e[0].anchorOptions;if(t.hoverElement){var a=.5*t.hoverElement.innerWidth(),i=.5*t.hoverElement.innerHeight(),n=t.hoverElement.position();switch(t.orientation){case"n":e.css({left:n.left+a-c,top:n.top+i-c-h});break;case"e":e.css({left:n.left+a-c+h,top:n.top+i-c});break;case"s":e.css({left:n.left+a-c,top:n.top+i-c+h});break;case"w":e.css({left:n.left+a-c-h,top:n.top+i-c});break;default:e.css({left:n.left+a-c,top:n.top+i-c})}}else switch(t.orientation){case"n":e.css({left:s-c});break;case"e":e.css({left:o-h,top:l-c});break;case"s":e.css({left:s-c,top:r-h});break;case"w":e.css({top:l-c})}})}function z(e){V(),j("fa-arrow-to-top",{orientation:"n"}),j("fa-arrow-to-right",{orientation:"e"}),j("fa-arrow-to-bottom",{orientation:"s"}),j("fa-arrow-to-left",{orientation:"w"}),e&&Math.min(e.innerWidth(),e.innerHeight())>5*h&&(j("fa-square",{hoverElement:e}),e.split.isFloating||(j("fa-arrow-square-up",{orientation:"n",hoverElement:e}),j("fa-arrow-square-right",{orientation:"e",hoverElement:e}),j("fa-arrow-square-down",{orientation:"s",hoverElement:e}),j("fa-arrow-square-left",{orientation:"w",hoverElement:e}))),L()}function $(e){angular.isArray(e.split.panels)&&e.split.panels.includes(e)||(e.split.panels=e.split.panels||[],e.split.panels.push(e)),(e.split.activePanel=e).hidden&&(e.hidden=!1,g.applyLayout())}function H(t){angular.isObject(t)&&(H(t.first),H(t.second),angular.forEach(t.panels,function(e){e.split=t}),angular.isArray(t.panels)?angular.isObject(t.activePanel)&&t.panels.includes(t.activePanel)||!(0<t.panels.length)||$(t.panels[0]):delete t.activePanel)}function U(){le.off("mousemove.editor.layout"),le.off("mouseup.editor.layout"),le.off("mousemove.editor.floatresize"),le.off("mouseup.editor.floatresize")}function G(e){e.overlay&&(e.overlay.remove(),delete e.overlay),e.panel&&(e.panel.removeClass("editorLayoutDragOverlayContent"),delete e.panel)}function q(){le.off("mousemove.editor.title"),le.off("mouseup.editor.title"),G(_),V()}function N(c,e,t,d){var a=angular.element(document.createElement("div"));a.addClass("editorLayoutResizeHandle");var i=l;switch(d){case"n":a.css({left:i,top:-i,right:i,height:2*i,cursor:"ns-resize"});break;case"e":a.css({right:-i,top:i,bottom:i,width:2*i,cursor:"ew-resize"});break;case"s":a.css({left:i,bottom:-i,right:i,height:2*i,cursor:"ns-resize"});break;case"w":a.css({left:-i,top:i,bottom:i,width:2*i,cursor:"ew-resize"});break;case"ne":a.css({right:-i,top:-i,width:2*i,height:2*i,cursor:"ne-resize"});break;case"nw":a.css({left:-i,top:-i,width:2*i,height:2*i,cursor:"nw-resize"});break;case"se":a.css({right:-i,bottom:-i,width:2*i,height:2*i,cursor:"se-resize"});break;case"sw":a.css({left:-i,bottom:-i,width:2*i,height:2*i,cursor:"sw-resize"});break;case"move":a.css({left:i,top:i,right:i,height:p+v,cursor:"move"})}t.append(a),e.push(a),a.on("mousedown",function(a){var i,n,o,r,s,l;switch(d){case"n":r=c.top,s=c.top+c.height-u-v,l=c.top+c.height,le.on("mousemove.editor.floatresize",function(e){e=Math.min(s,r+e.pageY-a.pageY);c.top=e,c.height=l-e,g.resizeLayout()});break;case"s":r=c.height,s=u+v,le.on("mousemove.editor.floatresize",function(e){e=Math.max(s,r+e.pageY-a.pageY);c.height=e,g.resizeLayout()});break;case"e":i=c.width,n=u,le.on("mousemove.editor.floatresize",function(e){e=Math.max(n,i+e.pageX-a.pageX);c.width=e,g.resizeLayout()});break;case"w":i=c.left,n=c.left+c.width-u,o=c.left+c.width,le.on("mousemove.editor.floatresize",function(e){e=Math.min(n,i+e.pageX-a.pageX);c.left=e,c.width=o-e,g.resizeLayout()});break;case"ne":r=c.top,s=c.top+c.height-u-v,l=c.top+c.height,i=c.width,n=u,le.on("mousemove.editor.floatresize",function(e){var t=Math.min(s,r+e.pageY-a.pageY);c.top=t,c.height=l-t,t=Math.max(n,i+e.pageX-a.pageX),c.width=t,g.resizeLayout()});break;case"nw":r=c.top,s=c.top+c.height-u-v,l=c.top+c.height,i=c.left,n=c.left+c.width-u,o=c.left+c.width,le.on("mousemove.editor.floatresize",function(e){var t=Math.min(s,r+e.pageY-a.pageY);c.top=t,c.height=l-t,t=Math.min(n,i+e.pageX-a.pageX),c.left=t,c.width=o-t,g.resizeLayout()});break;case"se":r=c.height,s=u+v,i=c.width,n=u,le.on("mousemove.editor.floatresize",function(e){var t=Math.max(s,r+e.pageY-a.pageY);c.height=t,t=Math.max(n,i+e.pageX-a.pageX),c.width=t,g.resizeLayout()});break;case"sw":r=c.height,s=u+v,i=c.left,n=c.left+c.width-u,o=c.left+c.width,le.on("mousemove.editor.floatresize",function(e){var t=Math.max(s,r+e.pageY-a.pageY);c.height=t,t=Math.min(n,i+e.pageX-a.pageX),c.left=t,c.width=o-t,g.resizeLayout()});break;case"move":le.on("mousemove.editor.floatresize",function(e){c.left+=e.originalEvent.movementX,c.top+=e.originalEvent.movementY,g.resizeLayout()})}le.on("mouseup.editor.floatresize",function(){U(),g.resizeLayout(),window.safeApply(g)})})}function Q(e){O(),U(),function e(i,t){var n;angular.isObject(i&&i.first)&&angular.isObject(i&&i.second)&&((n=angular.element(document.createElement("div"))).addClass("editorLayoutDrag"),"horizontal"===i.orientation&&n.addClass("horizontal"),i.drag=n,f.append(n),t.push(n),e(i.first,t),e(i.second,t),n.on("mousedown",function(){U(),g.validateSplitPositions(o.background);var a=f.offset();le.on("mousemove.editor.layout",function(e){var t="horizontal"===i.orientation?(t=e.pageX-a.left,n.css({left:t-d}),e.originalEvent.movementX):(t=e.pageY-a.top,n.css({top:t-d}),e.originalEvent.movementY);"end"===i.align?i.position-=t:i.position+=t,angular.isObject(i.second)&&i.second.orientation===i.orientation&&i.align===i.second.align&&(i.second.position-=t),g.resizeLayout(!0),window.safeApply(g)}),le.on("mouseup.editor.layout",function(){U(),g.applyLayout(),window.safeApply(g)})}))}(e.background,c),angular.forEach(e.floating,function(e){var t,a;t=e,a=c,(e=angular.element(document.createElement("div"))).addClass("editorLayoutFloatBackground"),t.background=e,f.append(e),a.push(e),N(t,a,e,"n"),N(t,a,e,"e"),N(t,a,e,"s"),N(t,a,e,"w"),N(t,a,e,"ne"),N(t,a,e,"nw"),N(t,a,e,"se"),N(t,a,e,"sw"),N(t,a,e,"move")})}function K(e,t){var a=f.offset(),i=.5*v;t.overlay.css({left:e.pageX-a.left-i,top:e.pageY-a.top-i}),t.panel.css({left:e.pageX-a.left-i,top:e.pageY-a.top-i+v+4}),x(t.panel,!0)}function Y(e,t){var a=e.offset();return a.w=e.outerWidth(),a.h=e.outerHeight(),!(t.left<a.left||t.left>a.left+a.w||t.top<a.top||t.top>a.top+a.h)}function X(e,a){var t,i;angular.isObject(e)&&(angular.isArray(e.panels)&&0<e.panels.length&&(e.isFloating||((t=angular.element(document.createElement("div"))).addClass("editorLayoutPanelBackground"),e.panelBackground=t,f.prepend(t),a.push(t)),(i=angular.element(document.createElement("div"))).addClass("editorLayoutTitleContainer"),(i[0].split=e).titleContainer=i,f.append(i),a.push(i),angular.forEach(e.panels,function(u){var t,e;u.hidden||(t=g.$new(),k.push(t),e=angular.isFunction(u.panelOptions.closeFunction),F(u,!0,e)(t,function(e){t.panel=u,t.closeWindow=u.panelOptions.closeFunction,e.addClass("editorLayoutTitleCard "+(u.panelOptions&&u.panelOptions.titleClass||"")),i.append(e),e[0].titleContainer=i,a.push(e),(u.title=e)[0].panel=u,"simple"!==g.lLayoutType&&e.on("mousedown",function(){$(u),g.resizeLayout(),q(),_={offset:i.offset(),targetTitleContainer:i},le.on("mousemove.editor.title",function(t){var a,i,n=t.pageX-_.offset.left,e=t.pageY-_.offset.top;if(angular.isObject(_.targetTitleContainer)){var o,r=_.targetTitleContainer.children();angular.forEach(r,function(e){var t=.5*(e=angular.element(e)).outerWidth();e.offset().left-_.offset.left+t<n&&e!==u.title&&(o=e)});var s=_.targetTitleContainer.outerWidth(),l=_.targetTitleContainer.outerHeight(),l=n<0||s<n||e<0||l<e,e=_.targetTitleContainer;if(l)return e[0].split.panels.findAndRemove(u),delete _.targetTitleContainer,u.addClass("editorLayoutDragOverlayContent"),u.css({"z-index":""}),g.applyLayout(),_.overlay=(a=u,(i=angular.element(document.createElement("div"))).addClass("editorLayoutDragOverlay"),D(),m=g.$new(),F(a,!1)(m,function(e){e.addClass("editorLayoutTitleCard "+(a.panelOptions&&a.panelOptions.titleClass||"")),e.css({height:v,display:"inline-block"}),i.append(e)}),i),_.panel=u,f.append(_.overlay),K(t,_),delete _.contentHover,void z();!o&&(r.length<1||r[0]!==u.title)?_.targetTitleContainer.prepend(u.title):o&&u.title.insertAfter(o);var r=e.children(),c=e[0].split;c.panels=[],angular.forEach(r,function(e){c.panels.push(angular.element(e)[0].panel)}),g.resizeLayout()}else{K(t,_);var d,p,r=f.find(".editorLayoutTitleContainer");if(angular.forEach(r,function(e){Y(e=angular.element(e),{left:t.pageX,top:t.pageY})&&(d=e);e=e[0].split.activePanel;e&&Y(e,{left:t.pageX,top:t.pageY})&&(p=e)}),delete _.targetAnchor,angular.forEach(y,function(e){Y(e,{left:t.pageX,top:t.pageY})&&(_.targetAnchor=e)}),!angular.isObject(_.targetAnchor)){if(angular.isObject(d))return G(_),d[0].split.panels.push(u),d[0].split.activePanel=u,g.applyLayout(),_.targetTitleContainer=u.title[0].titleContainer,_.offset=_.targetTitleContainer.offset(),void V();angular.isObject(p)&&_.contentHover!==p&&z(_.contentHover=p)}}window.safeApply(g)}),le.on("mouseup.editor.title",function(){var e,t=!1;_.targetAnchor?(function(e,t){var a=e[0].anchorOptions;if(a.hoverElement&&!a.orientation)return a.hoverElement.split.panels.push(t),a.hoverElement.split.activePanel=t;e={position:300,orientation:"horizontal",first:{panels:[t]},second:o.background},a.hoverElement&&(["n","s"].includes(a.orientation)?e.position=.5*a.hoverElement.innerHeight():e.position=.5*a.hoverElement.innerWidth(),e.second=angular.extend({},a.hoverElement.split)),["n","s"].includes(a.orientation)&&(e.orientation="vertical"),["e","s"].includes(a.orientation)&&(e.align="end",t=e.second,e.second=e.first,e.first=t),a.hoverElement?(M(a.hoverElement.split),angular.extend(a.hoverElement.split,e)):o.background=e}(_.targetAnchor,u),t=!0):_.overlay&&((e=_.overlay.position()).width=u.outerWidth(),e.height=u.outerHeight()+v,e.first={panels:[u]},o.floating.push(e),t=!0),q(),t?g.applyLayout():g.resizeLayout(),window.safeApply(g)})})}))})),X(e.first,a),X(e.second,a))}function J(e,i,t){var n=angular.copy(t);n.top+=v,n.height-=v,n["z-index"]="",i.panelBackground&&i.panelBackground.css(n),angular.forEach(e,function(e){var t,a;e.hidden||(t=angular.copy(n),i.isFloating||(a=4,e.panelOptions&&e.panelOptions.noPadding&&(a=1),t.top+=a,t.left+=a,t.width-=2*a,t.height-=2*a),e.css(t),e===i.activePanel?x(e,!0):x(e,!1),e.title.removeClass("active"))}),i.titleContainer&&((t=angular.copy(t)).height=v+1,i.titleContainer.css(t)),i.activePanel&&i.activePanel.title.addClass("active")}function Z(e){!function e(t,a,i){var n,o,r,s,l,c;angular.isObject(i&&i.first)&&(n=i.first&&i.first.panels,o=i.second&&i.second.panels,angular.isObject(i&&i.second)?(c="horizontal"===(r=i.orientation||"horizontal")?a.width:a.height,s="end"===i.align?c-i.position:i.position,l="horizontal"===r?u:u+v,s=Math.round(Math.max(l,Math.min(c-l,s))),c=angular.copy(a),l=angular.copy(a),"horizontal"===r?(c.width=s-b,l.width=l.width-s-b,l.left+=s+b):(c.height=s-b,l.height=l.height-s-b,l.top+=s+b),J(n,i.first,c),J(o,i.second,l),e(t,c,i.first),e(t,l,i.second),i.drag&&!t&&(c=angular.copy(c),"horizontal"===r?(c.left+=c.width-d+b,c.width=2*d):(c.top+=c.height-d+b,c.height=2*d),i.drag.css(c))):(J(n,i.first,a),e(t,a,i.first)))}(e,{top:0,left:0,width:f.innerWidth(),height:f.innerHeight()},{first:o.background})}function ee(){var e=f.find(".editorLayoutTitleContainer");angular.forEach(e,function(e){e.scrollWidth>e.clientWidth?(e.labelShowMinWidth=e.scrollWidth,angular.element(e).addClass("editorLayoutHideLabelsInTitle")):e.labelShowMinWidth<e.clientWidth&&angular.element(e).removeClass("editorLayoutHideLabelsInTitle")}),se.$broadcast("rzSliderForceRender")}function te(e){var t,a,i;o&&(Z(e),t=10,angular.forEach(o.floating,function(e){!function(e,t){e.width=Math.round(Math.min(e.width,f.innerWidth()-20)),e.height=Math.round(Math.min(e.height,f.innerHeight()-20)),e.left=Math.round(Math.min(f.innerWidth()-40,Math.max(40-e.width,e.left))),e.top=Math.round(Math.min(f.innerHeight()-20,Math.max(0,e.top)));var a={top:e.top,left:e.left,width:e.width,height:e.height};J(e.first.panels,e.first,a),angular.forEach(e.first.panels,function(e){e.css({"z-index":t+2}),e.title&&e.title.css({"z-index":t})}),a.top-=p,a.left-=l,a.width+=2*l,a.height+=l+p,a["z-index"]=t,e.background.css(a),e.first.titleContainer.css({"z-index":t+1})}(e,t),t+=3}),L(),ce(ee),0===w&&angular.isObject(o)&&g.lSavedLayouts&&(n&&(ce.cancel(n),n=void 0),W(a=angular.copy(o)),B(a.background),angular.forEach(a.floating,B),a=angular.fromJson(angular.toJson(a)),i=g.lLayoutType,n=ce(r=function(){g.lSavedLayouts[i]=a},500)))}function ae(e){S((o=angular.copy(e)).background),angular.forEach(o.floating,S)}function ie(e){angular.isObject(e)&&ae(e),angular.forEach(i,function(e){x(e,!1)}),W(o.background),o.floating=o.floating.filter(function(e){return angular.isArray(e&&e.first&&e.first.panels)&&0<e.first.panels.length}),H(o.background),angular.forEach(o.floating,function(e){e.first.isFloating=!0,angular.forEach(e.first.panels,function(e){e.hidden=!1}),H(e.first)}),e=o,I(),R(),X(e.background,t),angular.forEach(e.floating,function(e){X(e.first,t)}),Q(o),te()}function ne(e){var t,a=angular.isArray(e)?e:[e];angular.forEach(a,function(e){f.append(e)}),angular.isArray(o.floating)&&0<o.floating.length?((t=o.floating[o.floating.length-1]).first.panels.push(e),t.first.activePanel=e):(t=f.innerWidth(),e=f.innerHeight(),o.floating.push({left:.1*t,top:.1*e,width:.8*t,height:.8*e,first:{panels:a}}))}function oe(e){o.floating.findAndRemove(e),o.floating.push(e),g.resizeLayout()}function re(t){t.split&&($(t),angular.forEach(o.floating,function(e){e.first&&e.first.panels&&e.first.panels.includes(t)&&oe(e)}),g.resizeLayout())}e=f.find("[layout-panel]"),angular.forEach(e,function(e){var a=g.$parent.$eval(e.attributes["layout-panel"].value);((e=angular.element(e)).panelOptions=a).canClose&&(a.closeFunction=function(){var t;a.hidden?(e.hidden=!0,e.split.isFloating?E(e):(P(t=e,o.background),angular.forEach(o.floating,function(e){P(t,e.first)}))):E(e),g.applyLayout(),angular.isFunction(a.onClose)&&a.onClose()}),i[a.tag]=e}),g.$watch("lLayoutType",function(){n&&r&&(r(),ce.cancel(n),r=n=void 0);var e=g.lLayoutType||"simple",t=(t=g.lSavedLayouts||{})&&t[e]?t:a;++w,ie(t[e]),--w}),g.$watch(function(){return{w:f.innerWidth(),h:f.innerHeight()}},function(){++w,te(),--w},!0),g.applyLayout=ie,g.resizeLayout=te,g.validateSplitPositions=function(e){!function e(t,a){var i,n,o,r;angular.isObject(a&&a.first)&&(angular.isObject(a&&a.second)?(r="horizontal"===(i=a.orientation||"horizontal")?t.width:t.height,n="end"===a.align?r-a.position:a.position,o="horizontal"===i?u:u+v,n=Math.round(Math.max(o,Math.min(r-o,n))),"end"===a.align?a.position=r-n:a.position=n,o=angular.copy(t),r=angular.copy(t),"horizontal"===i?(o.width=n-b,r.width=r.width-n-b,r.left+=n+b):(o.height=n-b,r.height=r.height-n-b,r.top+=n+b),e(o,a.first),e(r,a.second)):e(t,a.first))}({left:0,top:0,width:f.innerWidth(),height:f.innerHeight()},e)},g.activateWindow=re,g.lCtrl.reset=function(){var e=g.lLayoutType||"simple";ae(a[e]),0<s.length&&ne(s.map(function(e){return e.panel})),ie()},g.lCtrl.insertWindow=function(e,t,a){var i=!0;e.panelOptions=a,s.push({panel:e,scope:t}),a&&(a.siblingTag?(e.split=A(a.siblingTag),e.split&&(e.split.panels.push(e),f.append(e))):a.parentTag&&(e.split=T(a.parentTag,a.parentSplitOrientation),e.split&&(e.split.panels.push(e),f.append(e)))),e.split||(i=!1,ne(e)),g.applyLayout(),g.activateWindow(e,i)},g.lCtrl.showBaseWindow=function(e){e.split||(e.panelOptions&&e.panelOptions.siblingTag&&(e.split=A(e.panelOptions.siblingTag),e.split&&e.split.panels.push(e)),e.split||ne(e),g.applyLayout()),g.activateWindow(e)},g.lCtrl.removeWindow=function(t,e){var a=s.find(function(e){return e.panel===t});a?(angular.isFunction(a.scope.onClosed)&&!e&&a.scope.onClosed(),E(t),t.remove(),a.scope.$destroy(),s.findAndRemove(a),g.applyLayout()):t.panelOptions&&t.panelOptions.closeFunction&&(t.panelOptions.closeFunction(),g.applyLayout())},g.lCtrl.removeAllWindows=function(){angular.forEach(s,function(e){E(e.panel),e.panel.remove(),e.scope.$destroy()}),s=[],g.applyLayout()},g.lCtrl.findWindow=function(t){return i[t]||(angular.forEach(s,function(e){e.panel.panelOptions.tag===t&&(a=e.panel)}),a);var a},g.lCtrl.activateWindow=re,g.$on("$destroy",function(){G(_),U(),q(),I(),O(),le.off("mousedown.editor.layoutFocusFloat"),R(),D()}),le.on("mousedown.editor.layoutFocusFloat",function(a){var i;angular.forEach(o.floating,function(e){var t={left:a.pageX,top:a.pageY};!Y(e.background,t)||o.floating.last()===e&&e===i||(i=e)}),i&&oe(i)})}}}]).directive("layoutPanel",function(){return{restrict:"A"}}).directive("layoutClass",function(){return{restrict:"A",link:function(e,a,t){var i=e.$eval(t.layoutClass);a=angular.element(a),e.$watch(function(){return{w:a.innerWidth(),h:a.innerHeight()}},function(t){angular.forEach(i.rules,function(e){angular.isDefined(e.minWidth)&&(t.w<e.minWidth?a.addClass(e.minWidthClass):a.removeClass(e.minWidthClass)),angular.isDefined(e.minHeight)&&(t.h<e.minHeight?a.addClass(e.minHeightClass):a.removeClass(e.minHeightClass))})},!0)}}}),angular.module("wallpaperbrowserApp").directive("codeEditor",["$q","$http","$timeout","$translate","utils","host","skin","contextMenu",function(O,I,R,D,W,B,F,j){return{restrict:"E",templateUrl:"views/templates/codeeditor.html",scope:{ceContent:"=",ceControls:"=",ceClose:"&",ceCancel:"&",ceApply:"&",ceContentType:"=",ceScriptName:"=",ceScriptPropertyName:"=",ceScriptType:"=",ceScriptContextProperties:"=",ceInitialError:"="},link:function(c,e){e=angular.element(e);var s,t,a,i,n="scripterr",o=[],r=e.find("#codeView"),l=angular.element(r[0]),d={w:0,h:0},p=new ResizeObserver(function(e){angular.isArray(e)&&0<e.length&&150<e[0].contentRect.width&&150<e[0].contentRect.height&&s&&(e[0].contentRect.width!==d.w||e[0].contentRect.height!==d.h)&&(d.w=e[0].contentRect.width,d.h=e[0].contentRect.height,R.cancel(t),t=R(function(){150<l.innerWidth()&&150<l.innerHeight()&&s.layout()},50))}),u=O.defer();function g(e){return"/**\n * "+e+"\n */\n"}function f(e){switch(e){case"number":case"slider":case"sliderHighPrecision":case"sliderint":case"knob":return"Number";case"vec2":return"Vec2";case"vec3":case"vec3-slider-z":case"color":return"Vec3";case"vec4":return"Vec4";case"string":case"paragraph":return"String";case"checkbox":case"checkboxbit":case"hiddenbool":return"Boolean"}}function m(e){var t=f(c.ceScriptType);if(t)return g("@param {"+t+"} value - for property '{{key}}'"+(e||"")+"\n * @return {"+t+"} - update current property value").replace("{{key}}",c.ceScriptPropertyName)}function v(){var a;_lastRegisteredPropertyObject&&(_lastRegisteredPropertyObject.dispose(),_lastRegisteredPropertyObject=void 0),c.ceScriptContextProperties&&(_lastRegisteredPropertyObject=monaco.languages.typescript.javascriptDefaults.addExtraLib((a=g("The property object this script is bound to.")+"interface IThisPropertyObject extends IThisPropertyObjectBase {\n",angular.forEach(c.ceScriptContextProperties,function(e){var t=f(e.type);t&&!["locktransforms"].includes(e.key)&&(a+=e.key+": "+t+"\n")}),a+="}\n\n"+g("The property object this script is bound to.")+"declare var thisObject: IThisPropertyObject;"),"Context Object"))}function h(){return s.getModel().getValue(monaco.editor.EndOfLinePreference.LF)}function b(){s.setSelection(s.getModel().getFullModelRange())}function _(e,t){angular.isUndefined(t)&&((t=s.getSelection()).startColumn=t.endColumn=0);t=new monaco.Range(t.startLineNumber,t.startColumn,t.endLineNumber,t.endColumn);s.executeEdits("Snippet",[{identifier:{major:1,minor:1},range:t,text:e,forceMoveMarkers:!0}])}function y(e){return I.get("monaco/snippets/"+e+".js").then(function(e){return e.data||""})}function w(e){var t="import * as "+e+" from '"+e+"';",a="import * as",i=h(),e=i.includes(a);if(!i.includes(t)){var n=1,i="\n";if(e){for(;!s.getModel().getLineContent(n).includes(a);)++n;for(var o=0;s.getModel().getLineContent(n).includes(a);)++n,++o;0<o&&(i="")}else{for(;!s.getModel().getLineContent(n)&&n<s.getModel().getLineCount();)++n;"'use strict';"===s.getModel().getLineContent(n)&&++n}_(i+t+"\n",{startColumn:0,endColumn:0,startLineNumber:n,endLineNumber:n})}}function k(e){_(e,{startColumn:0,endColumn:0,startLineNumber:s.getModel().getLineCount()+1,endLineNumber:s.getModel().getLineCount()+1})}function x(e){y(e).then(function(e){!function(e){var t,a="export var scriptProperties = createScriptProperties()",i="\t.finish();",n=(o=h()).includes(a)&&o.includes(i),o=o.includes("import * as"),r=1;if(n){for(;!s.getModel().getLineContent(r).includes(a);)++r;for(;!s.getModel().getLineContent(r).includes(i);)++r}else{for(;!s.getModel().getLineContent(r)&&r<s.getModel().getLineCount();)++r;if("'use strict';"===s.getModel().getLineContent(r)&&++r,o){for(;!s.getModel().getLineContent(r)&&r<s.getModel().getLineCount();)++r;for(;s.getModel().getLineContent(r).includes("import * as");)++r}_(i+"\n",t={startColumn:0,endColumn:0,startLineNumber:r,endLineNumber:r}),_("\n"+a+"\n",t),r+=2}_(e,t={startColumn:0,endColumn:0,startLineNumber:r,endLineNumber:r})}(e)})}function S(e){e='#include "'+e+'"';if(!h().includes(e)){var t=1;for(s.getModel().getLineContent(t)&&(e="\n"+e);!s.getModel().getLineContent(t)&&t<s.getModel().getLineCount();)++t;for(;s.getModel().getLineContent(t).includes("// [COMBO]");)++t;for(;!s.getModel().getLineContent(t)&&t<s.getModel().getLineCount();)++t;for(;s.getModel().getLineContent(t).includes("#include");)++t;_(e+=t<s.getModel().getLineCount()&&!s.getModel().getLineContent(t)?"\n":"\n\n",{startColumn:0,endColumn:0,startLineNumber:t,endLineNumber:t})}}function C(e,t,a){t="uniform "+e+" "+t+";";if(a&&(t+=" // "+a),!h().includes(t)){var i=1;for(s.getModel().getLineContent(i)&&(t="\n"+t);!s.getModel().getLineContent(i)&&i<s.getModel().getLineCount();)++i;for(;s.getModel().getLineContent(i).includes("// [COMBO]");)++i;for(;!s.getModel().getLineContent(i)&&i<s.getModel().getLineCount();)++i;for(;s.getModel().getLineContent(i).includes("#include");)++i;for(;!s.getModel().getLineContent(i)&&i<s.getModel().getLineCount();)++i;for(;s.getModel().getLineContent(i).includes("uniform");)++i;_(t+=i<s.getModel().getLineCount()&&!s.getModel().getLineContent(i)?"\n":"\n\n",{startColumn:0,endColumn:0,startLineNumber:i,endLineNumber:i})}}function E(e){e="// [COMBO] "+e;if(!h().includes(e)){var t=1;for(s.getModel().getLineContent(t)&&(e="\n"+e);!s.getModel().getLineContent(t)&&t<s.getModel().getLineCount();)++t;for(;s.getModel().getLineContent(t).includes("// [COMBO]");)++t;_(e+=t<s.getModel().getLineCount()&&!s.getModel().getLineContent(t)?"\n":"\n\n",{startColumn:0,endColumn:0,startLineNumber:t,endLineNumber:t})}}function P(e){return y(e).then(function(e){b(),_(e)})}function M(e,t,a){return e.button(a,"fas fa-cog",function(){C(t,a)})}function A(e,t,a){return e.button(t,"fas fa-cog",function(){var t=0,e=[...h().matchAll(/g_Texture(\d+)/g)];angular.forEach(e,function(e){1<e.length&&(t=Math.max(t,parseInt(e[1])+1))}),t<10?C("sampler2D","g_Texture"+t,angular.toJson(a).replace("'",'"')):W.showError(D.instant("ui_editor_shader_error_too_many_samplers",{limit:10}))})}function T(e,t,a,i,n){return e.button(t,"fas fa-wrench",function(){C(a,i,n)})}angular.isDefined(window.require)?u.resolve():((a=document.createElement("script")).type="text/javascript",a.src="monaco/vs/loader.js",document.getElementsByTagName("head")[0].appendChild(a),i=u,a.onload=function(){i.resolve(),window.safeApply(c)},u={promise:O.all([I.get("monaco/autocomplete/lib.es5.d.ts"),I.get("monaco/autocomplete/lib.es2015.collection.d.ts"),I.get("monaco/autocomplete/lib.es2015.core.d.ts"),I.get("monaco/autocomplete/lib.es2015.generator.d.ts"),I.get("monaco/autocomplete/lib.es2015.iterable.d.ts"),I.get("monaco/autocomplete/lib.es2015.promise.d.ts"),I.get("monaco/autocomplete/lib.es2015.proxy.d.ts"),I.get("monaco/autocomplete/lib.es2015.reflect.d.ts"),I.get("monaco/autocomplete/lib.es2015.symbol.d.ts"),I.get("monaco/autocomplete/lib.es2015.symbol.wellknown.d.ts"),I.get("monaco/autocomplete/lib.es2016.array.include.d.ts"),I.get("monaco/autocomplete/lib.es2017.intl.d.ts"),I.get("monaco/autocomplete/lib.es2017.object.d.ts"),I.get("monaco/autocomplete/lib.es2017.sharedmemory.d.ts"),I.get("monaco/autocomplete/lib.es2017.string.d.ts"),I.get("monaco/autocomplete/lib.es2017.typedarrays.d.ts"),I.get("monaco/autocomplete/lib.es2018.asynciterable.d.ts"),I.get("monaco/autocomplete/lib.es2018.intl.d.ts"),I.get("monaco/autocomplete/lib.es2018.promise.d.ts"),I.get("monaco/autocomplete/lib.es2018.regexp.d.ts"),I.get("monaco/autocomplete/lib.es2019.array.d.ts"),I.get("monaco/autocomplete/lib.es2019.string.d.ts"),I.get("monaco/autocomplete/lib.es2019.symbol.d.ts"),I.get("monaco/autocomplete/lib.sceneScript.d.ts"),i.promise])}),u.promise.then(function(o){require.config({paths:{vs:"monaco/vs"}}),require(["vs/editor/editor.main"],function(){if(angular.isArray(o)){monaco.languages.typescript.javascriptDefaults.setCompilerOptions({noLib:!0,allowNonTsExtensions:!0,allowJs:!0});for(var e=0;e<o.length-1;++e){var t=o[e];monaco.languages.typescript.javascriptDefaults.addExtraLib(t.data,t.config.url)}}var a="vs";F.isDarkTheme()&&(a="vs-dark");var i=c.ceContent||(n="'use strict';\n\n"+m(),n+="export function update(value) {\n\t\n\treturn value;\n}\n"),n="js"===c.ceContentType?"javascript":"cpp";(s=monaco.editor.create(r[0],{value:i,language:n,wordWrap:"on",theme:a,renderWhitespace:"boundary",insertSpaces:!1,readOnly:!c.isEditable()})).addCommand(monaco.KeyMod.chord(monaco.KeyMod.CtrlCmd|monaco.KeyCode.KEY_K,monaco.KeyMod.CtrlCmd|monaco.KeyCode.KEY_D),function(){s.getAction("editor.action.formatDocument").run()}),c.isEditable()&&s.getModel().onDidChangeContent(()=>{c.clearEditorErrors()}),c.ceInitialError&&(c.$broadcast("onScriptMessage",c.ceInitialError),angular.isNumber(c.ceInitialError.line)&&0<c.ceInitialError.line&&s.revealLineInCenter(c.ceInitialError.line)),v()})}),p.observe(r[0]),c.$on("$destroy",function(){p.disconnect(),e.off("click.hoverurl")}),e.on("click.hoverurl",function(e){e=angular.element(e.target);e.is("a")&&0<e.closest(".monaco-editor-hover-content").length&&window.ui.shellexecute(e.text())}),c.$on("onScriptMessage",function(e,t){var a;t.name===c.ceScriptName&&0<t.line&&(a={message:t.message,startLineNumber:t.line,startColumn:t.column,endColumn:t.columnEnd||t.column,severity:1===t.errorlevel?monaco.MarkerSeverity.Error:monaco.MarkerSeverity.Info,source:n},t={hoverMessage:t.message,range:new monaco.Range(t.line,t.column,t.line,t.columnEnd||t.column),options:{linesDecorationsClassName:"editorCodeLineDecorationError",inlineClassName:"editorCodeLineDecorationErrorInline"}},monaco.editor.setModelMarkers(s.getModel(),n,[a]),o=s.deltaDecorations(o,[t]))}),c.clearEditorErrors=function(){monaco.editor.setModelMarkers(s.getModel(),n,[]),o=s.deltaDecorations(o,[])},c.close=function(){c.ceClose()},c.cancel=function(){c.ceCancel()},c.apply=function(){c.clearEditorErrors(),c.ceApply({value:h()})},c.isShaderType=function(){return"vert"===c.ceContentType||"frag"===c.ceContentType||"geom"===c.ceContentType},c.isJSType=function(){return"js"===c.ceContentType},c.isEditable=function(){return c.isShaderType()||"js"===c.ceContentType},c.openEditMenu=function(e){if("edit"!==j.getCurrentContextMenuTag()){var t=j.builder().button("ui_editor_filemenu_undo","fas fa-undo",function(){s.trigger("","undo")}).hotkey("CTRL + Z").button("ui_editor_filemenu_redo","fas fa-redo",function(){s.trigger("","redo")}).hotkey("CTRL + Y").divider().button("ui_editor_script_format_document","fas fa-file-alt",function(){s.getAction("editor.action.formatDocument").run()}).hotkey("CTRL + K, D").button("ui_editor_script_comment_selection","far fa-comment-alt-lines",function(){s.getAction("editor.action.addCommentLine").run()}).hotkey("CTRL + K, C").button("ui_editor_script_uncomment_selection","far fa-comment-alt-slash",function(){s.getAction("editor.action.removeCommentLine").run()}).hotkey("CTRL + K, U");switch(c.ceContentType){case"js":t.divider().button("ui_editor_script_documentation","fas fa-books",function(){W.openUrl(W.url.docsSceneScript)});break;case"vert":case"frag":case"geom":t.divider().button("ui_editor_script_documentation","fas fa-books",function(){W.openUrl(W.url.docsSceneShaders)})}t.open(c,e,{tag:"edit",ignoreClearTarget:e.target,placement:{target:e.currentTarget}})}else j.closeCurrentContextMenu()},c.openSnippetMenu=function(e){var t,a,i,n,o;if("snippet"!==j.getCurrentContextMenuTag())switch(c.ceContentType){case"js":t=e,a=j.builder().button("init","fas fa-function",function(){k("\n"+m()+"export function init(value) {\n\treturn value;\n}\n")}).button("update","fas fa-function",function(){k("\n"+m()+"export function update(value) {\n\treturn value;\n}\n")}).button("resizeScreen","fas fa-function",function(){k("\n"+g("@param {Vec2} size")+"export function resizeScreen(size) {\n\t\n}\n")}).button("applyUserProperties","fas fa-function",function(){k("\n"+g("@param {Object} changedUserProperties - only includes user properties that were recently changed!")+"export function applyUserProperties(changedUserProperties) {\n\t\n}\n")}).button("applyGeneralSettings","fas fa-function",function(){k("\n"+g("@param {Object} generalSettings")+"export function applyGeneralSettings(generalSettings) {\n\t\n}\n")}).button("destroy","fas fa-function",function(){k("\nexport function destroy() {\n\t\n}\n")}).button("animationEvent","fas fa-function",function(){k("\n"+m("\n * @param {AnimationEvent} event - info about the event")+"export function animationEvent(event, value) {\n\t\n}\n")}).divider().button("cursorEnter","fas fa-function",function(){k("\n"+g("@param {CursorEvent} event")+"export function cursorEnter(event) {\n\t\n}\n")}).button("cursorLeave","fas fa-function",function(){k("\n"+g("@param {CursorEvent} event")+"export function cursorLeave(event) {\n\t\n}\n")}).button("cursorMove","fas fa-function",function(){k("\n"+g("@param {CursorEvent} event")+"export function cursorMove(event) {\n\t\n}\n")}).button("cursorClick","fas fa-function",function(){k("\n"+g("@param {CursorEvent} event")+"export function cursorClick(event) {\n\t\n}\n")}).button("cursorDown","fas fa-function",function(){k("\n"+g("@param {CursorEvent} event")+"export function cursorDown(event) {\n\t\n}\n")}).button("cursorUp","fas fa-function",function(){k("\n"+g("@param {CursorEvent} event")+"export function cursorUp(event) {\n\t\n}\n")}).divider().button("mediaStatusChanged","fas fa-function",function(){k("\n"+g("@param {MediaStatusEvent} event")+"export function mediaStatusChanged(event) {\n\t\n}\n")}).button("mediaPlaybackChanged","fas fa-function",function(){k("\n"+g("@param {MediaPlaybackEvent} event")+"export function mediaPlaybackChanged(event) {\n\t\n}\n")}).button("mediaPropertiesChanged","fas fa-function",function(){k("\n"+g("@param {MediaPropertiesEvent} event")+"export function mediaPropertiesChanged(event) {\n\t\n}\n")}).button("mediaThumbnailChanged","fas fa-function",function(){k("\n"+g("@param {MediaThumbnailEvent} event")+"export function mediaThumbnailChanged(event) {\n\t\n}\n")}).button("mediaTimelineChanged","fas fa-function",function(){k("\n"+g("@param {MediaTimelineEvent} event")+"export function mediaTimelineChanged(event) {\n\t\n}\n")}),i=j.builder().button("ui_editor_script_insert_property_slider","fas fa-user-cog",function(){x("scriptproperty_slider")}).button("ui_editor_script_insert_property_checkbox","fas fa-user-cog",function(){x("scriptproperty_checkbox")}).button("ui_editor_script_insert_property_text","fas fa-user-cog",function(){x("scriptproperty_text")}).button("ui_editor_script_insert_property_color","fas fa-user-cog",function(){x("scriptproperty_color")}).button("ui_editor_script_insert_property_combo","fas fa-user-cog",function(){x("scriptproperty_combo")}),n=j.builder().button("ui_editor_script_module_color_utilities","fas fa-database",function(){w("WEColor")}).button("ui_editor_script_module_math_utilities","fas fa-database",function(){w("WEMath")}).button("ui_editor_script_module_vector_utilities","fas fa-database",function(){w("WEVector")}),o=j.builder().button("ui_editor_script_snippet_rainbow_color","far fa-stream",function(){P("script_vec3_color_rainbow")}).hotkey("color").button("ui_editor_script_snippet_flicker","far fa-stream",function(){P("script_flicker_value")}).hotkey("number").button("ui_editor_script_snippet_drag_drop","far fa-stream",function(){P("script_origin_drag_drop")}).button("ui_editor_script_snippet_click_play_sound","far fa-stream",function(){P("script_layer_click_to_play")}).button("ui_editor_script_snippet_rotation","far fa-stream",function(){P("script_angles_rotation")}).hotkey("angles").button("ui_editor_script_snippet_rotation_pivot","far fa-stream",function(){P("script_angles_rotation_pivot")}).hotkey("angles").button("ui_editor_script_snippet_screen_bounce","far fa-stream",function(){P("script_origin_reflect")}).hotkey("origin").button("ui_editor_script_snippet_audio_factor","far fa-stream",function(){P("script_factor_audio_response")}).hotkey("number"),j.builder().subMenu("ui_editor_script_insert_function",a).subMenu("ui_editor_script_insert_property",i).subMenu("ui_editor_script_import_base_module",n).subMenu("ui_editor_script_replace_code",o).open(c,t,{tag:"snippet",ignoreClearTarget:t.target,placement:{target:t.currentTarget}});break;case"vert":case"frag":case"geom":!function(e){var t=j.builder().button("ui_editor_shader_snippet_basic_image_vertex","far fa-triangle",function(){P("shader_vert_passthrough")}).hotkey("vert").button("ui_editor_shader_snippet_masked_image_vertex","far fa-triangle",function(){P("shader_vert_passthrough_masked")}).hotkey("vert").divider().button("ui_editor_shader_snippet_basic_image_fragment","fas fa-palette",function(){P("shader_frag_passthrough")}).hotkey("frag").button("ui_editor_shader_snippet_masked_image_fragment","fas fa-palette",function(){P("shader_frag_passthrough_masked")}).hotkey("frag"),a=j.builder().button("common.h","fas fa-file-code",function(){S("common.h")}).button("common_blending.h","fas fa-file-code",function(){S("common_blending.h")}).button("common_fragment.h","fas fa-file-code",function(){S("common_fragment.h")}).button("common_vertex.h","fas fa-file-code",function(){S("common_vertex.h")}),i=j.builder();M(i,"float","g_Alpha"),M(i,"vec3","g_Color"),M(i,"vec4","g_Color4"),M(i,"float","g_Time"),M(i,"float","g_Daytime"),M(i,"vec2","g_PointerPosition"),M(i,"vec2","g_PointerPositionLast"),M(i,"vec2","g_TexelSize"),M(i,"vec2","g_TexelSizeHalf"),M(i,"vec3","g_Screen"),M(i,"vec2","g_ParallaxPosition");var n=j.builder();M(n,"vec3","g_EyePosition"),M(n,"vec3","g_ViewForward"),M(n,"vec3","g_ViewRight"),M(n,"vec3","g_ViewUp"),M(n,"vec3","g_OrientationForward"),M(n,"vec3","g_OrientationRight"),M(n,"vec3","g_OrientationUp"),n.divider(),M(n,"mat4","g_ModelMatrix"),M(n,"mat4","g_ModelMatrixInverse"),M(n,"mat4","g_ViewProjectionMatrix"),M(n,"mat4","g_ModelViewProjectionMatrix"),M(n,"mat4","g_ModelViewProjectionMatrixInverse"),M(n,"mat3","g_NormalModelMatrix"),n.divider(),M(n,"mat4","g_EffectModelMatrix"),M(n,"mat4","g_EffectModelViewProjectionMatrix"),M(n,"mat4","g_EffectModelViewProjectionMatrixInverse"),M(n,"mat4","g_EffectTextureProjectionMatrix"),M(n,"mat4","g_EffectTextureProjectionMatrixInverse"),M(n,"mat4","g_LayerModelMatrix");for(var o=j.builder(),r=0;r<8;++r)M(o,"vec4","g_Texture"+r+"Resolution"),M(o,"vec4","g_Texture"+r+"Rotation"),M(o,"vec2","g_Texture"+r+"Translation");var s=j.builder();A(s,"ui_editor_shader_sampler_basic",{label:"ui_editor_properties_image"}),A(s,"ui_editor_shader_sampler_single",{label:"ui_editor_properties_opacity",mode:"opacitymask",paintdefaultcolor:"0 0 0 1"}),A(s,"ui_editor_shader_sampler_direction",{label:"ui_editor_properties_flow_map",mode:"flowmask",default:"util/noflow"}),A(s,"ui_editor_shader_sampler_uniform_noise",{label:"ui_editor_properties_noise",default:"util/uniform_256"}),A(s,"ui_editor_shader_sampler_perlin_noise",{label:"ui_editor_properties_perlin_noise",default:"util/perlin_256"});var l=j.builder();M(l,"float","g_AudioSpectrum16Left[16]"),M(l,"float","g_AudioSpectrum16Right[16]"),M(l,"float","g_AudioSpectrum32Left[32]"),M(l,"float","g_AudioSpectrum32Right[32]"),M(l,"float","g_AudioSpectrum64Left[64]"),M(l,"float","g_AudioSpectrum64Right[64]"),s=j.builder().subMenu("ui_editor_shader_constants_general",i).subMenu("ui_editor_shader_constants_view",n).subMenu("ui_editor_shader_constants_texture_sampler",s).subMenu("ui_editor_shader_constants_texture_info",o).subMenu("ui_editor_shader_constants_audio",l),T(l=j.builder(),"ui_editor_shader_variable_slider_float","float","u_userNewSlider",'{"material":"My new slider","default":1,"range":[0,1]}'),T(l,"ui_editor_shader_variable_slider_int","float","u_userNewIntSlider",'{"material":"My new slider","int":true,"default":0,"range":[0,10]}'),T(l,"ui_editor_shader_variable_linked_slider","vec2","u_userNewLinkedSliders",'{"material":"My new linked sliders","linked":true,"default":"0.5 0.5","range":[0,1]}'),T(l,"ui_editor_shader_variable_color_picker","vec3","u_userNewColor",'{"material":"My new color","type":"color","default":"1 1 1"}'),T(l,"ui_editor_shader_variable_uv_picker","vec2","u_userNewPosition",'{"material":"My new position","position":true,"default":"0.5 0.5"}'),T(l,"ui_editor_shader_variable_knob","float","u_userNewRotation",'{"material":"My rotation","default":3.14159265358,"direction":true,"conversion":"rad2deg"}'),l.button("ui_editor_shader_combo_checkbox","fas fa-wrench",function(){E('{"material":"My Combo Name","combo":"USERCOMBOIDENTIFIER","type":"options","default":0}')}).button("ui_editor_shader_combo_2_options","fas fa-wrench",function(){E('{"material":"My Combo Name","combo":"USERCOMBOIDENTIFIER","type":"options","default":0,"options":{"Option A":0,"Option B":1}}')}).button("ui_editor_shader_combo_3_options","fas fa-wrench",function(){E('{"material":"My Combo Name","combo":"USERCOMBOIDENTIFIER","type":"options","default":0,"options":{"Option A":0,"Option B":1,"Option C":2}}')}),j.builder().subMenu("ui_editor_shader_replace",t).subMenu("ui_editor_shader_add_include",a).subMenu("ui_editor_shader_constants",s).subMenu("ui_editor_shader_variables",l).open(c,e,{tag:"snippet",ignoreClearTarget:e.target,placement:{target:e.currentTarget}})}(e)}else j.closeCurrentContextMenu()},c.openWorkshopMenu=function(e){var t,a,i;"workshop"!==j.getCurrentContextMenuTag()?(i=c.ceControls.getSubscribedScripts(),t=j.builder(),0===i.length?t.button("ui_editor_script_workshop_browse_empty",W.getProviderIcon(),function(){c.ceControls.openBrowseWorkshop()}):(a=f(c.ceScriptType),angular.forEach(i,function(e){t.button(e.name,"fas fa-file-code",function(){B.callEditor("readJsonFile",e.path).then(function(e){b(),_(e.script)})}),e.assetscripttype&&t.hotkey(e.assetscripttype,e.assetscripttype===a?"ctxHotkeySuccess":"ctxHotkeyDanger")})),i=j.builder().button("ui_editor_script_workshop_browse",W.getProviderIcon(),function(){c.ceControls.openBrowseWorkshop()}).subMenu("ui_editor_script_workshop_replace",t),c.ceControls.shouldShowPublishDialog()&&i.divider().button("ui_editor_script_workshop_publish","glyphicon glyphicon-share-alt",function(){c.ceControls.openScriptPublish(h().toString(),f(c.ceScriptType))}),i.open(c,e,{tag:"workshop",ignoreClearTarget:e.target,placement:{target:e.currentTarget}})):j.closeCurrentContextMenu()},c.hoverMenu=function(e,t){if(j.getCurrentContextMenu()&&j.getCurrentContextMenuTag()!==t)switch(t){case"edit":c.openEditMenu(e);break;case"snippet":c.openSnippetMenu(e);break;case"workshop":c.openWorkshopMenu(e)}},angular.isObject(c.ceControls)&&(c.ceControls.getValue=h),e.focusin(v)}}}]),angular.module("wallpaperbrowserApp").directive("scriptConsole",function(){return{restrict:"E",templateUrl:"views/templates/scriptconsole.html",scope:{scMsgClick:"&",scEditorSettings:"="},link:function(o,e){var i,n=angular.element(e.find(".scriptLogBox")[0]);o.clearLog=function(){n.empty()},o.$on("onScriptMessage",function(e,t){var a;a=t,angular.isObject(i)&&i._message===a.message?(i._msg=a,++i._count,999<i._count&&(i._count=999),i._countNode.text(i._count),i._countNode.css({visibility:"visible"})):(t.clearlog&&o.scEditorSettings.scriptconsoleautoclear?o.clearLog():77<=n[0].childNodes.length&&angular.element(n[0].childNodes[0]).remove(),t=function(e){var t=angular.element(document.createElement("div")),a=angular.element(document.createElement("span")),i=angular.element(document.createElement("span")),n=angular.element(document.createElement("span"));switch(t.addClass("editorScriptLogEntry"),a.addClass("editorScriptLogCount"),i.addClass("label"),n.addClass("editorScriptLogMessage"),e.errorlevel){case 0:t.addClass("info"),i.addClass("label-warning");break;case 1:t.addClass("error"),i.addClass("label-danger");break;case-1:i.addClass("label-default")}return a.css({visibility:"hidden"}),n.text(e.message),a.append(i),t.append(a),t.append(n),angular.isFunction(o.scMsgClick)&&t.click(function(){o.scMsgClick({message:t._msg})}),t._message=e.message,t._msg=e,t._countNode=i,t._count=1,t}(t),i=t,n.append(t),o.scEditorSettings.scriptconsoleautoscroll&&n.scrollTop(n[0].scrollHeight))})}}}),angular.module("wallpaperbrowserApp").directive("workshopRating",["utils",function(e){return{restrict:"E",replace:!0,scope:{wrItem:"=",setUserVote:"=",setFavorited:"="},templateUrl:function(){return e.useRatingStars()?"views/templates/workshopratingstars.html":"views/templates/workshopratingscore.html"}}}]),angular.module("wallpaperbrowserApp").directive("workshopAuthor",["utils",function(e){return{restrict:"E",replace:!0,scope:{waInfos:"=",waItem:"=",waBrowseAuthor:"=",waOpenUserPage:"="},templateUrl:function(){return e.useDynamicWorkshopAuthor()?"views/templates/workshopauthordynamic.html":"views/templates/workshopauthorstatic.html"}}}]),angular.module("wallpaperbrowserApp").directive("knob",["$document","utils",function(p,u){return{templateUrl:"views/templates/knob.html",restrict:"E",replace:!0,require:"ngModel",scope:{model:"=ngModel",kOnStart:"&",kOnEnd:"&",kOffset:"="},link:function(r,s,e,a){var t=(s=angular.element(s)).find(".knobInput"),i=s.find(".knobPointer"),l=angular.isNumber(r.kOffset)?r.kOffset:0;function n(){p.off("mousemove.knob"),p.off("mouseup.knob")}function c(e,t){t=t<0?(t-Math.PI)%(2*Math.PI)+Math.PI:(t+Math.PI)%(2*Math.PI)-Math.PI,e.shiftKey&&(e=.25*Math.PI,(t=Math.round(t/e)*e)<=-Math.PI&&(t+=2*Math.PI)),a.$setViewValue(t)}function o(e){var t=.5*s.innerWidth(),a=.5*s.innerHeight(),i=e.pageY,n=e.pageX,o=s.offset();o.top+=a,o.left+=t;o={top:i-o.top,left:n-o.left},o=Math.atan2(o.left,-o.top);c(e,o-=l*Math.PI),window.safeApply(r)}function d(e,t){t=Math.max(-1,Math.min(1,t)),e.shiftKey&&(t*=45);var a=u.toDegrees(r.model),i=Math.round(a);i.toFixed(5)!==a.toFixed(5)?a=i:a+=t,c(e,u.toRadians(a)),window.safeApply(r)}t.mousedown(function(e){angular.isFunction(r.kOnStart)&&r.kOnStart(),s.addClass("active"),p.on("mousemove.knob",o),p.on("mouseup.knob",function(e){angular.isFunction(r.kOnStart)&&r.kOnEnd(),o(e),n(),s.removeClass("active")}),o(e)}),t.on("mousewheel",function(e){d(e,e.originalEvent.wheelDelta),e.stopPropagation(),e.preventDefault()}),t.keydown(function(e){38===e.which||39===e.which?d(e,1):37!==e.which&&40!==e.which||d(e,-1)}),r.$on("$destroy",n),r.$watch("model",function(e){e=e,e+=Math.PI*(.5+l),i.css({transform:"rotate("+e+"rad)"})})}}}]),angular.module("wallpaperbrowserApp").directive("curveEditor",["$document","$timeout","$translate","contextMenu","skin","modals",function(e,ie,ne,oe,re,se){return{templateUrl:"views/templates/curveeditor.html",restrict:"E",template:"",scope:{ceSourceProperties:"=",ceOptions:"=",ceCtrl:"=",ceEditorSettings:"="},link:function(h,o){o=angular.element(o);var l,b,_={bgActive:"#eee",bgInactive:"#ddd",gridLight:"#ddd",gridDark:"#aaa",timelineDark:"#ccc",timelineText:"#000",timelineEvent:"#f39",selectedFrame:"rgb(224, 183, 0)",wrapLoopFrame:"rgb(0, 183, 224)",curveColors:["#f00","#0f0","#00f"],selectedVertex:"rgb(231, 192, 90)",selectionRectangle:"rgba(122, 193, 255, 0.3)",selectionRectangleBorder:"rgba(84, 141, 255, 0.7)"};const t=["both","left","right","none","magic"];re.isDarkTheme()&&angular.merge(_,{bgActive:"#333",bgInactive:"#292929",gridLight:"#292929",gridDark:"#111",timelineDark:"#1e1e1e",timelineText:"#eee",selectedFrame:"rgb(112, 91, 0)",wrapLoopFrame:"rgb(0, 91, 112)"});var r,s,c,d=20,p=30,u=20,g=20,f=1,m=1,v=.5*d,y=8,w=5,k=3,x=[],a=o.find(".curves")[0],i=angular.element(o.find(".background")[0]),S=a.getContext("2d"),C=u*f,E=g*m;function P(){return h.ceOptions.wraploop&&"loop"===h.ceOptions.mode}function M(){return h.usePropertyGroup}function A(t,e){if(!angular.isArray(t))return A([t],e);angular.forEach(t,function(l){angular.forEach(h.properties,function(e){if(e.parent===l&&angular.isArray(e&&e.keyframes))for(var t=0;t<e.keyframes.length;++t){var a=e.keyframes[t],i=e.keyframes[0<t?t-1:P()?e.keyframes.length-1:0]||a,n=e.keyframes[t+1<e.keyframes.length?t+1:P()?0:e.keyframes.length-1]||a;P()||(t===e.keyframes.length-1?n=i:0===t&&(i=n));var o=n.value-i.value,r=Math.abs(a.frame-i.frame),s=Math.abs(n.frame-a.frame),i=r=0===(r=i.frame>a.frame?a.frame+(h.ceOptions.length-i.frame):r)?1:r,n=(r=i+((s=0===(s=n.frame<a.frame?n.frame+(h.ceOptions.length-a.frame):s)?1:s)-i))/(s=s+(i-s)),r=o,i=o,s=.5,o=.5;1<n?(r/=n,o/=n):n<1&&(i*=n,s*=n),a.back.magic&&(a.back.x=-.5-s,a.back.y=-.1*r),a.front.magic&&(a.front.x=.5+o,a.front.y=.1*i)}})}),0<x.length&&(angular.forEach(x,function(e){t.includes(e)||t.push(e)}),x=[]);var a=[];angular.forEach(t,function(t){angular.forEach(h.properties,function(e){e.parent===t&&a.push({channel:"c"+e.index,channelIndex:e.index,keyframes:e.keyframes,property:t})})}),0<a.length&&h.ceCtrl.savePropertyKeyframes(a),e||h.ceCtrl.setPreviewFrame(h.selected.frame)}function e(){0<x.length&&(A(x,!0),x=[])}function n(){angular.frameTimeout(ie,1,e)}function T(){h.animationOptions.isPlaying&&h.pausePlayback()}function O(){return.15<=f}function I(){return(M()?h.selected.itemGroups:h.selected.items).empty()}function R(t){if(M()){var e=h.groupedProperties.find(function(e){return e.childProperties.includes(t)});return e&&h.selected.itemGroups.includes(e)}return h.selected.items.includes(t)}function D(t){if(M()){var e=h.groupedProperties.find(function(e){return e.childProperties.includes(t)});return!e||!angular.isArray(e.properties)||e.properties.empty()||e.properties[0].value}return!angular.isArray(t.properties)||t.properties.length<1||t.properties[0].value}function W(t){var a;return angular.forEach(h.properties,function(e){e.keyframes.includes(t)&&(a=e)}),a}function B(a){var i=[];return angular.forEach(h.properties,function(e){var t;(a?D(t=e)&&R(t):D(e))&&(i=i.concat(e.keyframes))}),i}function F(){var a=[];return angular.forEach(h.selected.vertices,function(e){var t=W(e);t&&D(t)&&a.push(e)}),a}function j(e,t){return e.frame-t.frame}function V(e){e.sort(j);for(var t=-99999,a=0;a<e.length;++a){for(;e[a].frame<=t;)++e[a].frame;t=e[a].frame}if(P())for(;!e.empty()&&e[e.length-1].frame>=h.ceOptions.length;)e.pop()}function L(e){var t,a,i,n,o,r;l&&(t=-.5,a=1.5,angular.forEach(h.properties,function(e){D(e)&&angular.forEach(e.keyframes,function(e){t=Math.min(t,e.value),a=Math.max(a,e.value)})}),i=l.h-d,n=l.w-p,r=g*(a-t)*1.2,o=u*h.ceOptions.length*1.05,m=i/r,m=Math.max(1e-5,m),r={left:-(p+2),top:v+g*m*(Math.abs(t)-a)*.5},e?s.top=r.top:(f=Math.min(3,n/o),s=r))}h.usePropertyGroup=!1,h.selected={frame:0,previewFrame:0,vertices:[],items:[],itemGroups:[],hoverVertex:void 0},h.properties=[],h.animationOptions={autokeyframe:!angular.isDefined(h.ceEditorSettings.animationoptionsautokeyframe)||h.ceEditorSettings.animationoptionsautokeyframe,beziermode:"magic",locklength:!0,lockangle:!0,isPlaying:!1};var z=1,$=1;function H(){s||L(),b={left:s.left,right:s.left+l.w,top:-(s.top-l.h/2),bottom:-(s.top+l.h/2)},C=u*f,E=g*m,function(){for(var e=1,t=2,a=5,i=1,n=2,o=5,r=1e3<h.ceOptions.length?25:100<h.ceOptions.length?18:15;C*e<r;)e*=10;for(;C*t<r;)t*=10;for(;C*a<r;)a*=10;for(;E*i<15;)i*=10;for(;E*n<15;)n*=10;for(;E*o<15;)o*=10;z=Math.min(e,Math.min(t,a)),$=Math.min(i,Math.min(n,o))}()}function U(t){return function(e){return e.frame===t}}function G(e,t,a,i,n){return Math.pow(1-e,3)*t+3*Math.pow(1-e,2)*e*a+3*(1-e)*Math.pow(e,2)*i+Math.pow(e,3)*n}function q(e,t,a,i){S.beginPath(),S.moveTo(e,t),S.lineTo(a,i),S.stroke()}function N(){var e,t,a,i;!l||E<=0||C<=0||(S.resetTransform(),S.fillStyle=_.bgInactive,S.fillRect(0,0,l.w,l.h),!angular.isObject(h.ceOptions)||!angular.isNumber(h.ceOptions.length)||h.ceOptions.length<1||(S.translate(-b.left,b.top),S.scale(1,-1),function(){S.save(),S.lineWidth=1,S.fillStyle=_.bgActive,S.strokeStyle=_.gridLight,S.fillRect(0,b.top,h.ceOptions.length*C,b.bottom-b.top);for(var e=C,t=E;e<15;)e*=2;for(;t<15;)t*=2;var a=b.left%20;S.setLineDash([10,10]);for(var i=Math.floor(b.bottom/t)*t;i<b.top;i+=t)S.beginPath(),S.moveTo(b.left-a,i),S.lineTo(b.right,i),S.stroke();S.setLineDash([]);for(var n=Math.floor(b.left/e)*e;n<b.right;n+=e)S.beginPath(),S.moveTo(n,b.top),S.lineTo(n,b.bottom),S.stroke();P()&&(S.strokeStyle=_.wrapLoopFrame,S.lineWidth=2,S.beginPath(),S.moveTo(h.ceOptions.length*C,b.top),S.lineTo(h.ceOptions.length*C,b.bottom),S.stroke()),S.strokeStyle=_.gridDark,S.beginPath(),S.moveTo(0,b.top),S.lineTo(0,b.bottom),S.stroke(),S.beginPath(),S.moveTo(b.left,0),S.lineTo(b.right,0),S.stroke(),S.restore()}(),function(){var f=-1;S.lineWidth=1;var m=P(),v=O();angular.forEach(h.properties,function(e){if(++f,angular.isArray(e.keyframes)&&0!==e.keyframes.length&&D(e)){var t,a,i,n,o,r,s,l,c=e.keyframes[0],d=e.keyframes[e.keyframes.length-1];for(S.strokeStyle=_.curveColors[f%3],S.fillStyle=_.curveColors[f%3],S.beginPath(),S.moveTo(b.left,c.value*E),S.lineTo(c.frame*C,c.value*E),S.stroke(),t=0;t<e.keyframes.length-1;++t)g=e.keyframes[t],i=((a=e.keyframes[t+1]).frame-g.frame)/2,n=1,S.beginPath(),S.moveTo(g.frame*C,g.value*E),o=g.front.enabled?g.front.x:0,r=g.front.enabled?g.front.y:0,s=a.back.enabled?a.back.x:0,l=a.back.enabled?a.back.y:0,a.step?S.lineTo(a.frame*C,g.value*E):S.bezierCurveTo((g.frame+o*i)*C,(g.value+r*n)*E,(a.frame+s*i)*C,(a.value+l*n)*E,a.frame*C,a.value*E),S.stroke();for(m?(S.beginPath(),S.moveTo(h.ceOptions.length*C,c.value*E),S.lineTo(b.right,c.value*E),S.stroke(),S.globalAlpha=.25,g=e.keyframes[e.keyframes.length-1],i=(h.ceOptions.length-g.frame)/2,n=1,S.beginPath(),S.moveTo(g.frame*C,g.value*E),o=g.front.enabled?g.front.x:0,r=g.front.enabled?g.front.y:0,s=c.front.enabled?-c.front.x:0,l=c.front.enabled?-c.front.y:0,c.step?S.lineTo(h.ceOptions.length*C,g.value*E):S.bezierCurveTo((g.frame+o*i)*C,(g.value+r*n)*E,(h.ceOptions.length+s*i)*C,(c.value+l*n)*E,h.ceOptions.length*C,c.value*E),S.stroke(),S.globalAlpha=1):(S.beginPath(),S.moveTo(d.frame*C,d.value*E),S.lineTo(b.right,d.value*E),S.stroke()),S.strokeStyle=_.curveColors[f%3],S.fillStyle=_.curveColors[f%3],t=0;t<e.keyframes.length;++t){var p,u,g=e.keyframes[t];h.selected.vertices.includes(g)&&(v&&g.back.enabled&&(u={x:(p={x:g.frame*C,y:g.value*E}).x+g.back.x*k*C,y:p.y+g.back.y*k*E},g.back.magic&&(S.strokeStyle=_.curveColors[f%3]+"7"),q(p.x,p.y,u.x,u.y),S.strokeStyle=_.curveColors[f%3],g.back.magic||(S.fillStyle=h.selected.hoverControlPoint===g.back?_.selectedVertex:_.curveColors[f%3],S.fillRect(u.x-w/2,u.y-w/2,w,w))),v&&g.front.enabled&&(u={x:(p={x:g.frame*C,y:g.value*E}).x+g.front.x*k*C,y:p.y+g.front.y*k*E},g.front.magic&&(S.strokeStyle=_.curveColors[f%3]+"7"),q(p.x,p.y,u.x,u.y),S.strokeStyle=_.curveColors[f%3],g.front.magic||(S.fillStyle=h.selected.hoverControlPoint===g.front?_.selectedVertex:_.curveColors[f%3],S.fillRect(u.x-w/2,u.y-w/2,w,w))))}for(t=0;t<e.keyframes.length;++t)g=e.keyframes[t],S.fillStyle=h.selected.vertices.includes(g)||h.selected.hoverVertex===g?_.selectedVertex:_.curveColors[f%3],S.fillRect(g.frame*C-y/2,g.value*E-y/2,y,y)}})}(),void 0!==c&&(e=Math.min(c.left,c.left2)*C,t=Math.max(c.left,c.left2)*C,a=Math.min(c.top,c.top2)*E,i=Math.max(c.top,c.top2)*E,S.fillStyle=_.selectionRectangle,S.strokeStyle=_.selectionRectangleBorder,S.lineWidth=1,S.fillRect(e,a,t-e,i-a),S.beginPath(),S.moveTo(e,a),S.lineTo(t,a),S.lineTo(t,i),S.lineTo(e,i),S.lineTo(e,a),S.stroke()),S.scale(1,-1),S.translate(0,-b.top),function(){var e,t,a,i=z,n=$,o=angular.isDefined(h.animationOptions.previewFrame)?h.animationOptions.previewFrame:h.selected.frame;S.font="10px sans-serif",S.fillStyle=_.bgInactive,S.strokeStyle=_.timelineDark,S.lineWidth=1,S.fillRect(b.left,0,p,l.h-d-1),S.beginPath(),S.moveTo(b.left+p,0),S.lineTo(b.left+p,l.h-d-1),S.stroke(),S.fillStyle=_.timelineText,S.save(),S.translate(0,b.top);for(var r=Math.floor(b.bottom/(E*n))*E*n;r<b.top;r+=E*n)e=Math.floor(r/E+.5).toString(),t=S.measureText(e),S.fillText(e,b.left+p-t.width-2,3-r);S.restore(),S.fillStyle=_.bgInactive,S.fillRect(b.left,l.h-d,b.right-b.left,d),S.strokeStyle=_.timelineDark,S.lineWidth=1,S.beginPath(),S.moveTo(b.left,l.h-d-.5),S.lineTo(b.right,l.h-d-.5),S.stroke();var s=Math.floor(Math.max(0,Math.floor(b.left/C))/i)*i;for(S.fillStyle=_.timelineText,a=s;;a+=i){if(a>=h.ceOptions.length)a=h.ceOptions.length;else if(a+i>h.ceOptions.length)continue;if(a!==o&&(e=a.toString(),t=S.measureText(e),S.fillText(e,C*a-.5*t.width,l.h-d+8)),a===h.ceOptions.length)break}S.fillStyle=_.timelineEvent,angular.forEach(h.ceOptions.events,function(e){S.beginPath(),S.arc(C*e.frame,l.h-5,3,0,2*Math.PI),S.fill()}),S.fillStyle=_.selectedFrame,S.strokeStyle=_.selectedFrame,S.lineWidth=2,S.beginPath(),S.moveTo(o*C,0),S.lineTo(o*C,l.h),S.stroke(),S.beginPath(),S.moveTo(o*C-10,l.h),S.lineTo(o*C-10,l.h-d/2),S.lineTo(o*C,l.h-d),S.lineTo(o*C+10,l.h-d/2),S.lineTo(o*C+10,l.h),S.fill(),S.fillStyle=_.timelineText,e=Math.round(o).toString(),t=S.measureText(e),S.fillText(e,C*o-.5*t.width,l.h-d+16)}()))}function Q(e){e=Math.round((e.offsetX+b.left)/C),e=Math.max(0,Math.min(h.ceOptions.length,e));P()&&e>=h.ceOptions.length?h.selected.frame=h.ceOptions.length-1:h.selected.frame=e}function K(e){return e.offsetY>=l.h-d&&Math.abs(e.offsetX-h.selected.frame*C+b.left)<4}function Y(e,t){if(!(l.h-e.offsetY<d)){var a=e.offsetX-t.x+b.left,t=-e.offsetY-t.y+b.top;return Math.abs(a)<2*y&&Math.abs(t)<2*y?{dx:a,dy:t}:void 0}}function X(e){var t=e.front,e=e.back;t&&(t.x=Math.max(0,Math.min(2,t.x))),e&&(e.x=Math.max(-2,Math.min(0,e.x)))}function J(e,t){var a,i,n=e.front===t?e.back:e.front;n.enabled&&t.enabled&&(e.lockangle&&e.locklength?(n.x=-t.x,n.y=-t.y):e.lockangle?(a=Math.sqrt(n.x*n.x*u*u+n.y*n.y*E*E)/(E*u),i=Math.sqrt(t.x*t.x*u*u+t.y*t.y*E*E)/(E*u),n.x=-t.x,n.y=-t.y,n.x*=a/i,n.y*=a/i):e.locklength&&(a=Math.sqrt(n.x*n.x*u*u+n.y*n.y*E*E)/(E*u),i=Math.sqrt(t.x*t.x*u*u+t.y*t.y*E*E)/(E*u),n.x*=i/a,n.y*=i/a),X(e))}function Z(e,i){var n;P()&&h.selected.frame>=h.ceOptions.length||(n=[],angular.forEach(h.properties,function(e){var t,a;(D(e)||i)&&(I()||R(e))&&(a=h.ceCtrl.getCurrentPropertyValues(e.parent),t=e.keyframes.find(U(h.selected.frame)),a=a&&e.index<a.length?a[e.index]:function(e,t){for(var a=0;a<=e.keyframes.length;++a){if(0===a&&t<=e.keyframes[a].frame)return e.keyframes[a].value;if(0<a&&a<e.keyframes.length&&t>=e.keyframes[a-1].frame&&t<e.keyframes[a].frame){for(var i=e.keyframes[a-1],n=e.keyframes[a],o=(t-i.frame)/(n.frame-i.frame),r=(n.frame-i.frame)/2,s=1,l=0;l<1e3;++l){var c=G(o,i.frame,i.frame+i.front.x*r,n.frame+n.back.x*r,n.frame);if(Math.abs(c-t)<.01)break;t<c?o-=s*=.99:o+=s*=.99}return G(o,i.value,i.value+i.front.y,n.value+n.back.y,n.value)}if(a===e.keyframes.length&&0<a)return e.keyframes[a-1].value}return 0}(e,h.selected.frame),t?t.value=a:(a={frame:h.selected.frame,value:a,back:{enabled:"magic"===h.animationOptions.beziermode||"both"===h.animationOptions.beziermode||"left"===h.animationOptions.beziermode,magic:"magic"===h.animationOptions.beziermode,x:-1,y:0},front:{enabled:"magic"===h.animationOptions.beziermode||"both"===h.animationOptions.beziermode||"right"===h.animationOptions.beziermode,magic:"magic"===h.animationOptions.beziermode,x:1,y:0},lockangle:h.animationOptions.lockangle,locklength:h.animationOptions.locklength},"step"!==h.animationOptions.beziermode&&"step"!==e.forceMode||(a.step=!0),e.keyframes.push(a),e.keyframes.sort(j),n.includes(e.parent)||n.push(e.parent)))}),A(n,e),N())}function ee(){h.curveTooltip=""}i.on("pointerdown",function(e){b&&(h.animationOptions.isPlaying||(r||(r={left:e.offsetX,top:e.offsetY,which:e.which},i[0].setPointerCapture(e.originalEvent.pointerId),1===e.which&&(h.selected.hoverControlPoint?(r.selectionHandled=!0,r.controlPoint=h.selected.hoverControlPoint,r.controlPointInfo=h.selected.hoverControlPointInfo,r.property=h.selected.hoverControlPointInfo.property,r.modifiedProperties=[h.selected.hoverControlPointInfo.property.parent],r.x=r.controlPoint.x,r.y=r.controlPoint.y):h.selected.hoverVertex?(h.selected.vertices.includes(h.selected.hoverVertex)||(e.shiftKey||e.ctrlKey?h.selected.vertices.push(h.selected.hoverVertex):(h.selected.vertices=[h.selected.hoverVertex],h.selected.hoverVertex.back&&h.selected.hoverVertex.back.magic||h.selected.hoverVertex.front&&h.selected.hoverVertex.front.magic?h.animationOptions.beziermode="magic":h.selected.hoverVertex.back&&h.selected.hoverVertex.back.enabled&&h.selected.hoverVertex.front&&h.selected.hoverVertex.front.enabled?h.animationOptions.beziermode="both":h.selected.hoverVertex.back&&h.selected.hoverVertex.back.enabled?h.animationOptions.beziermode="left":h.selected.hoverVertex.back&&h.selected.hoverVertex.back.enabled?h.animationOptions.beziermode="right":!0===h.selected.hoverVertex.step?h.animationOptions.beziermode="step":h.animationOptions.beziermode="none",h.animationOptions.lockangle=h.selected.hoverVertex.lockangle,h.animationOptions.locklength=h.selected.hoverVertex.locklength),r.selectionHandled=!0),r.vertex=h.selected.hoverVertex,r.property=h.selected.hoverVertexInfo.property,r.vertexInfo=h.selected.hoverVertexInfo,r.allVertices=[],angular.forEach(F(),function(e){r.allVertices.push({vertex:e,property:W(e),frame:e.frame+h.selected.hoverVertexInfo.dx/C,value:e.value,ovalue:e.value})}),N()):e.offsetY>l.h-d||K(e)?(h.selected.hoverVertex=void 0,Q(e),r.timeline=!0,N()):r.selectionRect={top:(-r.top+b.top)/E,left:(r.left+b.left)/C})),window.safeApply(h)))}),i.on("pointerup",function(e){var t,a;b&&(r&&r.which===e.which&&(c?(t=function(e){for(var t=[],a=h.properties.length-1;0<=a;--a){var i=h.properties[a];if(angular.isArray(i.keyframes)&&D(i))for(var n=i.keyframes.length-1;0<=n;--n){var o=i.keyframes[n];o.frame>=e.x0&&o.frame<=e.x1&&o.value>=e.y0&&o.value<=e.y1&&t.push(o)}}return t}({x0:Math.min(c.left,c.left2),x1:Math.max(c.left,c.left2),y0:Math.min(c.top,c.top2),y1:Math.max(c.top,c.top2)}),e.shiftKey?angular.forEach(t,function(e){h.selected.vertices.includes(e)||h.selected.vertices.push(e)}):e.ctrlKey?angular.forEach(t,function(e){h.selected.vertices.includes(e)?h.selected.vertices.findAndRemove(e):h.selected.vertices.push(e)}):h.selected.vertices=t,c=void 0):r.hasMoved||r.vertex||r.controlPoint?r.timeline||(r.vertex&&(angular.forEach(r.allVertices,function(e){V(e.property.keyframes)}),r.controlPoint||r.hasMoved||(e.ctrlKey||e.shiftKey?h.selected.vertices.includes(r.vertex)?e.shiftKey||r.selectionHandled||h.selected.vertices.findAndRemove(r.vertex):h.selected.vertices.push(r.vertex):h.selected.vertices=[r.vertex])),a=r.modifiedProperties||[],angular.forEach(r.allVertices,function(e){a.includes(e.property.parent)||a.push(e.property.parent)}),a.empty()||A(a)):h.selected.vertices=[],r=void 0,i[0].releasePointerCapture(e.originalEvent.pointerId)),N(),window.safeApply(h))}),i.on("pointermove",function(t){var e,a,i,n;b&&(r?(r.hasMoved=!0,r.controlPoint?(r.x+=(t.offsetX-r.left)/C/k,r.y-=(t.offsetY-r.top)/E/k,r.controlPoint.x=r.x,t.shiftKey?r.controlPoint.y=0:r.controlPoint.y=r.y,X(r.controlPointInfo.vertex),J(r.controlPointInfo.vertex,r.controlPoint),X(r.controlPointInfo.vertex)):r.vertex?angular.forEach(r.allVertices,function(e){e.frame+=(t.offsetX-r.left)/C,e.value-=(t.offsetY-r.top)/E,e.vertex.frame=Math.round(e.frame),t.shiftKey?e.vertex.value=e.ovalue:e.vertex.value=e.value,e.property.keyframes.sort(j)}):r.timeline?(i=h.selected.frame,Q(t),i!==h.selected.frame&&window.safeApply(h)):r.selectionRect?(r.selectionRect.top2=(-t.offsetY+b.top)/E,r.selectionRect.left2=(t.offsetX+b.left)/C,c=r.selectionRect):(s.left-=t.offsetX-r.left,s.top-=t.offsetY-r.top,H()),r.left=t.offsetX,r.top=t.offsetY,N(),ee(),window.safeApply(h)):(n=function(e){for(var t,a=Number.MAX_VALUE,i=h.properties.length-1;0<=i;--i){var n=h.properties[i];if(angular.isArray(n.keyframes)&&D(n))for(var o=n.keyframes.length-1;0<=o;--o){var r,s=n.keyframes[o],l=Y(e,{x:s.frame*C,y:s.value*E});!l||(r=l.dx*l.dx+l.dy*l.dy)<a&&(a=r,l.vertex=s,l.property=n,t=l)}}return t}(t),e=function(e){if(O())for(var t=h.properties.length-1;0<=t;--t){var a=h.properties[t];if(angular.isArray(a.keyframes)&&D(a))for(var i=a.keyframes.length-1;0<=i;--i){var n,o=a.keyframes[i];if(h.selected.vertices.includes(o))if(o.back.enabled&&!o.back.magic&&(n=Y(e,{x:(o.frame+o.back.x*k)*C,y:(o.value+o.back.y*k)*E}))&&(n.controlPoint=o.back),!o.front.enabled||o.front.magic||n||(n=Y(e,{x:(o.frame+o.front.x*k)*C,y:(o.value+o.front.y*k)*E}))&&(n.controlPoint=o.front),n)return n.vertex=o,n.property=a,n}}}(t),i=1<(a=F()).length,h.selected.hoverControlPointInfo=e,h.selected.hoverVertexInfo=n,i&&n&&(!e||n!==e.vertex)||(e&&e.controlPoint)===h.selected.hoverControlPoint||a.includes(n)?e&&!i||(n&&n.vertex)!==h.selected.hoverVertex&&(h.selected.hoverVertex=n&&n.vertex,h.selected.hoverControlPoint=void 0,N(),h.selected.hoverVertex?(n=n.property,h.curveTooltip=n.name):ee(),window.safeApply(h)):(h.selected.hoverControlPoint=e&&e.controlPoint,h.selected.hoverVertex=void 0,N(),ee(),window.safeApply(h))),r&&r.timeline||K(t)?o.addClass("dragH"):o.removeClass("dragH"))}),i.on("pointerleave",function(){ee(),window.safeApply(h)}),i.on("wheel",function(e){var t,a,i;e.shiftKey||e.ctrlKey?(t=0<e.originalEvent.deltaY?-1:1,a=m*(1+.1*t),i=e.originalEvent.offsetY-.5*l.h,s.top+=i,s.top*=a/m,s.top-=i,m=a):(t=0<e.originalEvent.deltaY?-1:1,a=f*(1+.1*t),s.left+=e.originalEvent.offsetX,s.left*=a/f,s.left-=e.originalEvent.offsetX,f=a),H(),N()}),h.hasKeyframe=function(a){var i=!0,n=!1;return angular.forEach(h.properties,function(e){var t;D(e)&&(I()||R(e))&&(t=!1,angular.forEach(e.keyframes,function(e){t=t||e.frame===a}),i=i&&t,n=n||e.singleUpdate&&t)}),i||n},h.cycleBezierMode=function(){var e=t.indexOf(h.animationOptions.beziermode);h.animationOptions.beziermode=t[(e+1)%t.length];var a=[];angular.forEach(h.selected.vertices,function(e){var t=W(e);t.forceMode||("step"===h.animationOptions.beziermode?e.step=!0:delete e.step,e.back.enabled="both"===h.animationOptions.beziermode||"left"===h.animationOptions.beziermode,e.front.enabled="both"===h.animationOptions.beziermode||"right"===h.animationOptions.beziermode,"magic"===h.animationOptions.beziermode?(e.front.magic=!0,e.back.magic=!0,e.front.enabled=!0,e.back.enabled=!0):(delete e.front.magic,delete e.back.magic),a.includes(t.parent)||a.push(t.parent))}),A(a),N()},h.insertKeyframes=function(){Z()},h.removeKeyframes=function(){var t;t=[],angular.forEach(h.properties,function(e){D(e)&&(I()||R(e))&&(e.keyframes.empty()||(e.keyframes.findAndRemove(U(h.selected.frame)),t.includes(e.parent)||t.push(e.parent)))}),A(t),N()},h.updateKeyframes=function(){h.hasKeyframe(h.selected.frame)?(T(),Z(!0)):h.insertKeyframes()},h.resetView=function(e){L(e),H(),N()},h.showHelp=function(){se.open("editorAnimationHelp",{data:{}})},h.editAnimationEvents=function(e){h.ceOptions.events=h.ceOptions.events||[],se.open("editorAnimationEvents",{data:{frame:e,events:h.ceOptions.events}}).then(function(e){h.ceOptions.events=e.sort(function(e,t){return e.frame-t.frame}),N(),h.ceCtrl.saveAnimationOptions(h.ceOptions)})},h.toggleLockAngle=function(){h.animationOptions.lockangle=!h.animationOptions.lockangle;var t=[];angular.forEach(F(),function(e){e.lockangle=h.animationOptions.lockangle,e.lockangle&&J(e,e.back),X(e);e=W(e);t.includes(e.parent)||t.push(e.parent)}),A(t),N()},h.toggleLockLength=function(){h.animationOptions.locklength=!h.animationOptions.locklength;var t=[];angular.forEach(F(),function(e){e.locklength=h.animationOptions.locklength,e.locklength&&J(e,e.back),X(e);e=W(e);t.includes(e.parent)||t.push(e.parent)}),A(t),N()},h.resetSelectedVertices=function(){var t=[];angular.forEach(F(),function(e){e.back.x=-1,e.back.y=0,e.front.x=1,e.front.y=0;e=W(e);t.includes(e.parent)||t.push(e.parent)}),A(t),N()},h.listPropertyChanged=function(){N()},h.openAnimationOptions=function(){var e=angular.isFunction(h.ceCtrl.getAnimatedSiblingProperties)&&h.ceCtrl.getAnimatedSiblingProperties();se.open("editorAnimationOptions",{data:{options:angular.copy(h.ceOptions),siblingProperties:e,mode:h.ceCtrl.getMode(),editorSettings:h.ceEditorSettings}}).then(function(e){h.ceOptions.fps=Math.max(1e-5,e.fps),h.ceOptions.length=Math.max(1,e.length),h.ceOptions.mode=e.mode,h.ceOptions.smoothing=e.smoothing,"loop"!==e.mode&&delete e.wraploop,e.parent?h.ceOptions.parent=e.parent:delete h.ceOptions.parent,e.name?h.ceOptions.name=e.name:delete h.ceOptions.name,e.startpaused?h.ceOptions.startpaused=e.startpaused:delete h.ceOptions.startpaused;var a,t=h.ceOptions.wraploop;e.wraploop?h.ceOptions.wraploop=!0:delete h.ceOptions.wraploop,e.wraploop&&(a=[],angular.forEach(h.properties,function(e){for(var t=0;t<e.keyframes.length;++t)e.keyframes[t].frame>=h.ceOptions.length&&(e.keyframes.splice(t,1),--t,a.includes(e.parent)||a.push(e.parent))}),A(a),N()),h.ceCtrl.saveAnimationOptions(h.ceOptions),N(),t!==h.ceOptions.wraploop&&h.ceCtrl.setPreviewFrame(h.selected.frame)})},h.moveToFrame=function(e){T(),h.selected.frame=e?h.ceOptions.length:0,N()},h.startPlayback=function(){h.animationOptions.isPlaying=!0,delete h.animationOptions.previewFrame,h.ceCtrl.setPreviewPlayback(!0)},h.pausePlayback=function(e){e&&angular.isDefined(h.animationOptions.previewFrame)&&(h.selected.frame=Math.round(h.animationOptions.previewFrame)),h.animationOptions.isPlaying=!1,delete h.animationOptions.previewFrame,h.ceCtrl.setPreviewPlayback(!1),N()};var te=0;h.initCurves=function(){T(),h.properties=[],h.groupedProperties=[],angular.forEach(h.ceSourceProperties,function(e){for(var t,a=[],i=0;i<e.channelCount;++i){var n,o={key:e.key,parent:e,forceMode:e.forceMode,singleUpdate:e.singleUpdate,index:i,icon:"fas fa-wave-sine",name:ne.instant(e.name||e.key),properties:[{key:"visible",value:!e.key.startsWith("priorityoffset")}]};a.push(o),1<e.channelCount&&(o.name+=[" x"," y"," z"," w"][i]),e.shortbonename&&(o.name+=" ("+e.shortbonename+")"),angular.isArray(e.animation&&e.animation["c"+i])&&0<e.animation["c"+i].length?o.keyframes=e.animation["c"+i]:1===e.channelCount&&angular.isArray(e.animation)&&0<e.animation.length?o.keyframes=e.animation:(n=h.ceCtrl.getCurrentPropertyValues(e),o.keyframes=[{frame:0,value:n&&n.length>i?n[i]:0,back:{enabled:!0,magic:!0,x:-1,y:0},front:{enabled:!0,magic:!0,x:1,y:0},lockangle:!0,locklength:!0}]),"step"===e.forceMode&&angular.forEach(o.keyframes,function(e){e.step=!0}),V(o.keyframes),h.properties.push(o)}a.empty()||(t={key:e.key,parent:e,icon:1<a.length?"fas fa-waves-sine":"fas fa-wave-sine",name:ne.instant(e.name||e.key),childProperties:a,properties:[{key:"visible",value:!e.key.startsWith("priorityoffset")}]},e.shortbonename&&(t.name+=" ("+e.shortbonename+")"),h.groupedProperties.push(t))}),h.selected.vertices=[],h.selected.items=[],h.selected.hoverVertex=void 0,N(),h.listenForValueChanges&&h.listenForValueChanges(),s&&0===te&&h.resetView(!0)},h.$on("undoRedoBegin",function(){++te}),h.$on("undoRedoPerformed",function(){ie(function(){--te},1e3)}),h.propertyContextMenu=function(e,t,a){var i=oe.builder().button(M()?"ui_editor_properties_ungroup_properties":"ui_editor_properties_group_properties",M()?"fas fa-fw fa-wave-sine":"fas fa-fw fa-waves-sine",function(){I()?(h.selected.items.length=0,h.selected.itemGroups.length=0):h.usePropertyGroup?(h.selected.items.length=0,angular.forEach(h.selected.itemGroups,function(e){angular.forEach(e.childProperties,function(e){h.selected.items.push(e)})})):(h.selected.itemGroups.length=0,angular.forEach(h.selected.items,function(t){var e=h.groupedProperties.find(function(e){return e.childProperties.includes(t)});e&&!h.selected.itemGroups.includes(e)&&h.selected.itemGroups.push(e)})),h.usePropertyGroup?(angular.forEach(h.properties,function(e){angular.isArray(e.properties)&&!e.properties.empty()&&(e.properties[0].value=!1)}),angular.forEach(h.groupedProperties,function(e){var t=!angular.isArray(e.properties)||e.properties.empty()||e.properties[0].value;angular.forEach(e.childProperties,function(e){angular.isArray(e.properties)&&!e.properties.empty()&&(e.properties[0].value=t)})})):(angular.forEach(h.groupedProperties,function(e){angular.isArray(e.properties)&&!e.properties.empty()&&(e.properties[0].value=!1)}),angular.forEach(h.properties,function(t){var e=!angular.isArray(t.properties)||t.properties.empty()||t.properties[0].value,a=h.groupedProperties.find(function(e){return e.childProperties.includes(t)});a&&angular.isArray(a.properties)&&!a.properties.empty()&&(a.properties[0].value=a.properties[0].value||e)})),h.usePropertyGroup=!h.usePropertyGroup,N()}).divider().button("ui_editor_properties_show_single","fas fa-fw fa-angle-right",function(){M()?angular.forEach(h.groupedProperties,function(e){e.properties[0].value=!1}):angular.forEach(h.properties,function(e){e.properties[0].value=!1}),a.properties[0].value=!0,N()}).button("ui_editor_properties_show_all","fas fa-fw fa-angle-double-right",function(){M()?angular.forEach(h.groupedProperties,function(e){e.properties[0].value=!0}):angular.forEach(h.properties,function(e){e.properties[0].value=!0}),N()}).divider().button("ui_editor_properties_select_single","fas fa-fw fa-check",function(){M()?h.selected.itemGroups=[a]:h.selected.items=[a]}).button("ui_editor_properties_select_all","fas fa-fw fa-check-double",function(){M()?angular.forEach(h.groupedProperties,function(e){h.selected.itemGroups.includes(e)||h.selected.itemGroups.push(e)}):angular.forEach(h.properties,function(e){R(e)||h.selected.items.push(e)})}).divider();M()||i.button("ui_editor_properties_copy_channel","far fa-fw fa-copy",function(){var e=a.keyframes;0<e.length&&(_curveFrameCopy=[],angular.forEach(e,function(e){var t;W(e)===a&&(t=_curveFrameCopy[0]||[],_curveFrameCopy[0]=t,e=angular.copy(e),t.push(e))}))}),i.button("ui_editor_properties_copy_selected_channels","fas fa-fw fa-book-copy",function(){var i,e=B(!0);0<e.length&&(_curveFrameCopy=[],i=[],angular.forEach(e,function(e){var t=W(e),a=i.indexOf(t);a<0&&(a=i.length,i.push(t));t=_curveFrameCopy[a]||[];_curveFrameCopy[a]=t,e=angular.copy(e),t.push(e)}))}).divider(),M()||i.button("ui_editor_properties_replace_channel","fas fa-fw fa-clipboard",function(){_curveFrameCopy&&!_curveFrameCopy.empty()&&(a.keyframes.length=0,angular.forEach(_curveFrameCopy[0],function(e){a.keyframes.push(angular.copy(e))}),V(a.keyframes),A(a.parent),N())},void 0,_curveFrameCopy&&!_curveFrameCopy.empty()?"":"fa-disabled"),i.button("ui_editor_properties_replace_selected_channels","fas fa-fw fa-paste",function(){var a,i,n;_curveFrameCopy&&!_curveFrameCopy.empty()&&(a=h.selected.items,M()&&(a=[],angular.forEach(h.selected.itemGroups,function(e){a=a.concat(e.childProperties)})),i=[],n=0,angular.forEach(_curveFrameCopy,function(e){var t;n>=a.length||(t=a[n],++n,t.keyframes.length=0,angular.forEach(e,function(e){t.keyframes.push(angular.copy(e))}),V(t.keyframes),i.includes(t.parent)||i.push(t.parent))}),A(i),N())},void 0,!_curveFrameCopy||_curveFrameCopy.empty()||I()?"fa-disabled":"").open(h,e)},h.$watch("ceSourceProperties",h.initCurves),h.$watch(function(){return{w:Math.round(i.innerWidth()),h:Math.round(i.innerHeight())}},function(e,t){0!==e.w&&0!==e.h&&(e&&t&&e.w===t.w&&e.h===t.h&&b||(l=e,a.width=e.w,a.height=e.h,H(),N()))},!0),h.$watch("selected.items",function(){N()},!0),h.$watch("selected.frame",function(e){angular.isNumber(e)&&(T(),0<x.length?n():h.ceCtrl.setPreviewFrame(h.selected.frame))}),h.$watch("animationOptions.autokeyframe",function(e){h.ceEditorSettings.animationoptionsautokeyframe=e});var ae=[];h.listenForValueChanges=function(){angular.forEach(ae,function(e){e()}),ae=[],angular.forEach(h.ceSourceProperties,function(n){ae.push(h.$watch(function(){return h.ceCtrl.getCurrentPropertyValues(n)},function(e){var t,a,i=h.ceCtrl.getCurrentPreviewValue(n);e&&h.animationOptions.autokeyframe&&!h.ceCtrl.isEditingLocked()&&!function(e,t){if(angular.isArray(e)||(e=[e]),angular.isArray(t)||(t=[t]),e.length===t.length){for(var a=0;a<e.length;++a)if(void 0===e[a]||void 0===t[a]||2e-4<Math.abs(e[a]-t[a]))return;return 1}}(i,e)&&(T(),t=I(),a=n.singleUpdate,i=h.selected.itemGroups.slice(),e=h.selected.items.slice(),t&&(M()?(h.selected.itemGroups.length=0,angular.forEach(h.groupedProperties,function(e){e.parent===n&&h.selected.itemGroups.push(e)})):(h.selected.items.length=0,a?angular.forEach(h.properties,function(e){e.parent===n&&h.selected.items.push(e)}):angular.forEach(h.properties,function(e){e.parent.shortbonename===n.shortbonename&&h.selected.items.push(e)}))),Z(!0,!0),(x=[n]).uniquify(),t&&(M()?(h.selected.itemGroups.length=0,angular.forEach(i,function(e){h.selected.itemGroups.push(e)})):(h.selected.items.length=0,angular.forEach(e,function(e){h.selected.items.push(e)}))))},!0))})},h.$on("$destroy",function(){document.body.removeEventListener("blur",n),document.body.removeEventListener("pointerup",n)}),document.body.addEventListener("blur",n,!0),document.body.addEventListener("pointerup",n,!0),o.keydown(function(e){if(32===e.which)return h.animationOptions.isPlaying?h.pausePlayback(!0):h.startPlayback(),void window.safeApply(h);if(!h.animationOptions.isPlaying){var t,o=[];switch(e.which){case 37:if(e.ctrlKey){for(a=h.selected.frame,t=h.selected.frame-1;0<=t;--t)if(h.hasKeyframe(t)){h.selected.frame=t;break}a===h.selected.frame&&(h.selected.frame=0)}else h.selected.frame=Math.max(0,h.selected.frame-1);N();break;case 39:if(e.ctrlKey){for(a=h.selected.frame,t=h.selected.frame+1;t<=h.ceOptions.length;++t)if(h.hasKeyframe(t)){h.selected.frame=t;break}a===h.selected.frame&&(h.selected.frame=h.ceOptions.length)}else h.selected.frame=Math.min(h.ceOptions.length,h.selected.frame+1);N();break;case 46:angular.forEach(h.properties,function(e){for(;0<e.keyframes.length;){for(var t=!1,a=F(),i=0;i<a.length;++i){var n=e.keyframes.indexOf(a[i]);if(0<=n){e.keyframes.splice(n,1),t=!0,o.includes(e.parent)||o.push(e.parent);break}}if(!t)break}}),A(o),N();break;case 65:h.animationOptions.autokeyframe=!h.animationOptions.autokeyframe;break;case 67:var i,a=F();e.ctrlKey&&0<a.length&&(i=a[0].frame,angular.forEach(a,function(e){i=Math.min(i,e.frame)}),_curveFrameCopy=[],angular.forEach(a,function(e){var t=W(e),a=h.properties.indexOf(t),t=_curveFrameCopy[a]||[];_curveFrameCopy[a]=t,(e=angular.copy(e)).frame-=i,t.push(e)}));break;case 75:h.hasKeyframe(h.selected.frame)?h.removeKeyframes():h.insertKeyframes();break;case 85:h.animationOptions.autokeyframe||h.updateKeyframes();break;case 86:if(e.ctrlKey&&_curveFrameCopy&&0<_curveFrameCopy.length){var n=angular.copy(_curveFrameCopy);angular.forEach(n,function(e){angular.forEach(e,function(e){e.frame+=h.selected.frame})});var r,s,l=[];if(angular.forEach(h.properties,function(e){(I()||R(e))&&l.push(e)}),n.length<=l.length)for(r=0;r<n.length;++r)angular.forEach(n[r],function(e){l[r].keyframes.push(e),o.includes(l[r].parent)||o.push(l[r].parent)}),V(l[r].keyframes);else s=0,angular.forEach(n,function(e){e&&0!==e.length&&(s<l.length&&(angular.forEach(e,function(e){l[s].keyframes.push(e),o.includes(l[s].parent)||o.push(l[s].parent)}),V(l[s].keyframes)),++s)});A(o),N()}}window.safeApply(h)}}),h.ceCtrl.setAnimationPreviewFrame=function(e){h.animationOptions.isPlaying&&(h.animationOptions.previewFrame=e,N(),"single"===h.ceOptions.mode&&Math.abs(e-h.ceOptions.length)<.01&&h.pausePlayback(!1))},h.ceCtrl.openAnimationOptions=h.openAnimationOptions,h.ceCtrl.performSavePendingProperties=e,ie(h.ceCtrl.openCallback)}}}]),angular.module("wallpaperbrowserApp").directive("mobileManager",["$timeout","$translate","modals","utils","host",function(o,e,r,s,l){return{templateUrl:"views/templates/mobilemanager.html",restrict:"E",scope:{mmDevices:"=",mmState:"="},link:function(a){function i(t){return function(e){return e.id===t}}var t;function n(){o.cancel(t),l.callDeferred("browseWallpaperObject","checkFirewall").then(function(e){a.showFirewallWarning=!e,o.cancel(t),e?a.isApplyingFixes=!1:t=o(n,2e3)})}a.mmState.page="",a.qualityPresets=[{label:"ui_browse_mobile_upload_modal_preset_low",value:"low"},{label:"ui_browse_mobile_upload_modal_preset_medium",value:"medium"},{label:"ui_browse_mobile_upload_modal_preset_high",value:"high"}],a.mmState.disableFirewallCheck=function(){o.cancel(t)},a.$on("$destroy",function(){o.cancel(t)}),a.fixFirewall=function(){o.cancel(t),a.isApplyingFixes=!0,l.callDeferred("browseWallpaperObject","fixFirewall").then(function(){o.cancel(t),t=o(n,150)})},a.beginDeviceDiscovery=function(){o.cancel(t),t=o(n,500),a.mmState.page="connect",l.callDeferred("browseWallpaperObject","discoverMobileDevices",!0).then(function(e){a.currentPin=e.pin.split("").join(" ")})},a.cancelDeviceDiscovery=function(){o.cancel(t),a.mmState.page="",l.callDeferred("browseWallpaperObject","discoverMobileDevices")},a.isDeviceConnected=function(e){return a.mmState.connectedDevices.some(i(e))},a.openDownloadFaq=function(){s.openUrl("var_url_mobile_download")},a.removeDevice=function(t){e(["ui_browse_mobile_modal_delete_device_title","ui_browse_mobile_modal_delete_device_message"],{device:t.name}).then(function(e){return r.open("genericConfirm",{data:{title:e.ui_browse_mobile_modal_delete_device_title,message:e.ui_browse_mobile_modal_delete_device_message,okVisible:!0,cancelVisible:!0}}).then(function(){l.callDeferred("browseWallpaperObject","removeMobileDevice",t.id),a.mmDevices.findAndRemove(i(t.id)),a.mmState.connectedDevices.findAndRemove(i(t.id))})})}}}}]),angular.module("wallpaperbrowserApp").directive("drawCanvas",["$document",function(J){return{templateUrl:"views/templates/drawcanvas.html",restrict:"E",scope:{dcConfig:"=",dcMaskAttr:"=",dcPaintCallback:"&"},link:function(m,e){var t=document.createElement("canvas");angular.element(t).addClass("painterOuterCanvas"),e=angular.element(e);var s,v,a=angular.element(e.parent(".painterPan")[0]),i=a.parent(".painter")[0],n=angular.element(i),o=e.find("#draw")[0],l=angular.element(o),r=e.find("#brush")[0],c=angular.element(r);i.appendChild(t),i.appendChild(r);var d,h,p,u,g,f,b,_,y,w,k,x={foreground:"#fff",background:"#000",erase:"rgba(0, 0, 0, 1)",clear:"rgba(0, 0, 0, 0)",polyFill:"rgba(255,255,255,0.51)",polyFillMask:"rgba(255,255,255,1)",pointSelection:"rgb(255, 0, 0)",pointHover:"rgb(255, 255, 0)"},S=!1,C=!1,E=!1,P=!1,M=1,A=1,T=1,O=[],I={zoom:1,left:0,top:0},R={left:0,top:0};function D(e){return 1<e.length&&e.first()===e.last()}function W(e){return e*e}function B(e,t){return W(e.x-t.x)+W(e.y-t.y)}function F(e,t,a){var i={x:a.x-t.x,y:a.y-t.y},n=e.x-t.x,o=e.y-t.y;a=i,e=Math.sqrt(a.x*a.x+a.y*a.y),a.x/=e,a.y/=e;o=i.x*n+i.y*o;return i.x*=o,i.y*=o,i.x+=t.x,i.y+=t.y,i}function j(){var e,t;h&&d&&(e=d.w/d.h,t=h.w/h.h,M=t<e?(R.left=0,R.top=Math.round(.5*(h.h-h.w/e)),l.css({height:Math.round(h.w/e)+"px",width:"100%","margin-top":R.top,"margin-left":0}),A=h.w/400*(d.w/h.w),A=Math.max(1,A),h.w/d.w*A):(R.left=Math.round(.5*(h.w-h.h*e)),R.top=0,l.css({width:Math.round(h.h*e)+"px",height:"100%","margin-left":R.left,"margin-top":R.top}),A=h.h/400*(d.h/h.h),A=Math.max(1,A),h.h/d.h*A))}function V(i){var n,o=16*(A/I.zoom);return O.forEach(e=>{e.forEach(e=>{var t=e.x-i.offsetX,a=e.y-i.offsetY,a=t*t+a*a;a<o&&(n=e,o=a)})}),n}function L(e){var r,s=10*(A/I.zoom),l={x:e.offsetX,y:e.offsetY};return O.forEach(e=>{if(!(e.length<2))for(var t,a,i,n=1;n<e.length;++n){var o=(t=l,o=e[n-1],a=e[n],i=void 0,0===(i=B(o,a))?B(t,o):(i=((t.x-o.x)*(a.x-o.x)+(t.y-o.y)*(a.y-o.y))/i,i=Math.max(0,Math.min(1,i)),B(t,{x:o.x+i*(a.x-o.x),y:o.y+i*(a.y-o.y)})));o<s&&(s=o,r=e[n])}}),r}function z(e){e.x=Math.min(d.w,Math.max(0,Math.round(e.x))),e.y=Math.min(d.h,Math.max(0,Math.round(e.y)))}function $(){j(),s.resetTransform(),s.fillStyle=x.erase,s.globalCompositeOperation="destination-out",s.fillRect(0,0,d.w,d.h),s.globalCompositeOperation="source-over"}function H(){$(),O=[],y=_=_=b=g=f=void 0}function U(e){e.offsetX=e.offsetX*(o.width/l.innerWidth()),e.offsetY=e.offsetY*(o.height/l.innerHeight())}function G(){var e=(w=w||document.createElement("canvas")).getContext("2d");return w.width=o.width,w.height=o.height,e.clearRect(0,0,w.width,w.height),e.drawImage(o,0,0),e.getImageData(0,0,d.w,d.h),w.toDataURL("image/png")}function q(p,u){p.resetTransform(),p.fillStyle=x.erase,p.globalCompositeOperation="destination-out",p.fillRect(0,0,d.w,d.h),p.globalCompositeOperation="source-over",p.lineWidth=1,u&&(v.resetTransform(),v.fillStyle=x.erase,v.globalCompositeOperation="destination-out",v.fillRect(0,0,h.w,h.h),v.globalCompositeOperation="source-over",v.translate((I.left+R.left)*I.zoom-.5*h.w*I.zoom+.5*h.w,(I.top+R.top)*I.zoom-.5*h.h*I.zoom+.5*h.h));var g,f=M/A*I.zoom;O.forEach(e=>{if(2<e.length){if(p.globalCompositeOperation="xor",p.beginPath(),m.dcConfig.maskSmoothing<.1){for(p.moveTo(e[0].x,e[0].y),g=1;g<e.length;++g)p.lineTo(e[g].x,e[g].y);p.closePath()}else{p.moveTo(e[0].x,e[0].y);for(var t=.3*m.dcConfig.maskSmoothing,a=null!==t?t:1,i=D(e)?e.length-1:e.length,n=0;n<i;++n){var o=0<n?e[n-1]:e[i-1],r=e[n%i],s=e[(n+1)%i],l=e[(n+2)%i],c=r.x+(s.x-o.x)/6*a,d=r.y+(s.y-o.y)/6*a,o=s.x-(l.x-r.x)/6*a,r=s.y-(l.y-r.y)/6*a;p.bezierCurveTo(c,d,o,r,s.x,s.y)}}p.fillStyle=u?x.polyFill:x.polyFillMask,p.fill(),p.globalCompositeOperation="source-over"}if(1<e.length&&u){for(v.strokeStyle=x.background,v.beginPath(),v.moveTo(e[0].x*f,e[0].y*f),g=1;g<e.length;++g)y===e[g]?(v.stroke(),v.strokeStyle=x.pointHover,v.beginPath(),v.moveTo(e[g-1].x*f,e[g-1].y*f),v.lineTo(e[g].x*f,e[g].y*f),v.stroke(),v.strokeStyle=x.background,v.beginPath(),v.moveTo(e[g].x*f,e[g].y*f)):v.lineTo(e[g].x*f,e[g].y*f);v.stroke()}})}function N(){q(s,!0);var t=M/A*I.zoom;f&&b&&!_&&!y&&(v.setLineDash([5,5]),v.beginPath(),v.moveTo(f.x*t,f.y*t),v.lineTo(b.x*t,b.y*t),v.strokeStyle=x.background,v.stroke(),v.setLineDash([]));f&&(v.fillStyle=x.pointSelection,v.fillRect(f.x*t-4,f.y*t-4,8,8)),v.fillStyle=x.background,O.forEach(e=>{e.forEach(e=>{v.fillRect(e.x*t-2,e.y*t-2,4,4),_===e&&(v.fillStyle=x.pointHover,v.fillRect(e.x*t-4,e.y*t-4,8,8),v.fillStyle=x.background)})}),!b||_||y||(v.fillStyle=x.pointSelection,v.fillRect(b.x*t-2,b.y*t-2,4,4))}function Q(){var e,t={};switch(m.dcConfig.editMode){case"brush":t.bitmap=G();break;case"polygon":t.bitmap=(e=(w=w||document.createElement("canvas")).getContext("2d"),w.width=o.width,w.height=o.height,q(e,!1),e.getImageData(0,0,d.w,d.h),w.toDataURL("image/png")),t.grabCut=!1,t.polys=angular.copy(O)}m.dcPaintCallback({state:t})}function K(e){e={left:e.pageX-n.offset().left,top:e.pageY-n.offset().top};c.css(e)}function Y(){var e,t;angular.isObject(m.dcConfig)&&(e=200*A,t=(m.dcConfig.brushSize-1)/99,t=Math.pow(t,1.5),t=(T=e*t+1)*M/A*I.zoom,c.css({width:t+"px",height:t+"px"}))}function X(){a.css({transform:"scale("+I.zoom+") translate("+I.left+"px, "+I.top+"px)"}),Y()}n.on("pointerdown",function(n){if(m.dcConfig.enabled){if(m.dcConfig&&!(C||S||P)){if(n.ctrlKey)return P=!0,void(p=n);E=!1,n.offsetX=n.pageX-l.offset().left,n.offsetY=n.pageY-l.offset().top,n.offsetX/=I.zoom,n.offsetY/=I.zoom;var o,e,t=3===n.which||m.dcConfig.readonly;if(t||1!==n.which){if(t)S||(C=!0,p=n);else if(2===n.which&&(U(n),p=n,"polygon"===m.dcConfig.editMode))if(_){for(var a=0;a<O.length;++a){var i=O[a],r=i.indexOf(_);if(0<=r){f===_&&(f=1===i.length?void 0:f===i[0]?i[1]:i[i.length-2]),i.splice(r,1),i.empty()&&(g===i&&(g=void 0),O.splice(a,1));break}}_=void 0,N(),Q()}else y&&(o=!1,O.slice().forEach(e=>{var t=e.indexOf(y);if(0<=t)if(o=!0,D(e)){var a=e.slice(0,t),i=e.slice(t,-1);for(e.length=0;i.length;)e.push(i.shift());for(;a.length;)e.push(a.shift())}else{var n=e.slice(t);e.length=t,e.length<2&&(O.findAndRemove(e),g=f=void 0),1<n.length&&O.push(n)}}),o&&(N(),Q()))}else if(!C&&m.dcMaskAttr.visible)switch(S=!0,U(n),p=n,m.dcConfig.editMode){case"brush":3===n.which||"erase"===m.dcConfig.brush?(s.fillStyle=x.erase,s.lineWidth=T,s.globalCompositeOperation="destination-out"):(s.fillStyle="foreground"===m.dcConfig.brush?x.foreground:x.background,s.lineWidth=T,s.globalCompositeOperation="source-over"),s.strokeStyle=s.fillStyle,T<=1?s.fillRect(Math.round(n.offsetX),Math.round(n.offsetY),1,1):(s.beginPath(),s.arc(n.offsetX,n.offsetY,T/2,0,2*Math.PI),s.fill());break;case"polygon":u=b=void 0,_?_!==f&&f&&(g.includes(_)?O.slice().forEach(e=>{(e.first()===_&&e.last()===f||e.last()===_&&e.first()===f)&&(e.first()===f?e.push(f):e.splice(0,0,f),g=f=_=void 0,N())}):O.slice().forEach(e=>{if((e.first()===_||e.last()===_)&&e!==g){for(O.findAndRemove(e),e.last()===_&&(e=e.reverse());e.length;)g.push(e.shift());f=e.last(),Q(),N()}})):(y?(O.forEach(e=>{var t,a,i=e.indexOf(y);i<0||(t=e[i],a=e[e.length-1],0===i&&t.x===a.x&&t.y===a.y&&(i=e.length-1),_=F({x:n.offsetX,y:n.offsetY},e[i-1],e[i]),e.splice(i,0,_))}),y=void 0):(g||(g=[],O.push(g)),e=f&&1<g.length&&g[0]===f,u={x:n.offsetX,y:n.offsetY},f=u,e?g.splice(0,0,u):g.push(u)),N())}}}else m.dcConfig.drawFailed()}),J.on("pointerup.dcpaint",function(e){var a;1!==e.which&&3!==e.which||(S&&(e.offsetX=e.pageX-l.offset().left,e.offsetY=e.pageY-l.offset().top,e.offsetX/=I.zoom,e.offsetY/=I.zoom,U(e),"polygon"===m.dcConfig.editMode&&(u?(u.x=e.offsetX,u.y=e.offsetY,z(u),u=void 0):_&&E?z(_):E||(a=V(e),f&&f===a?g=f=void 0:a&&O.forEach(e=>{var t;D(e)||(0!==(t=e.indexOf(a))&&t!==e.length-1||(f=a,g=e))})),N()),Q()),P=C=S=!1,p=void 0)}),J.on("pointermove.dcpaint",function(e){if(K(e),e.offsetX=e.pageX-l.offset().left,e.offsetY=e.pageY-l.offset().top,e.offsetX/=I.zoom,e.offsetY/=I.zoom,U(e),E=!0,S){if(p)switch(m.dcConfig.editMode){case"brush":2<T&&(T<=1?s.fillRect(Math.round(e.offsetX),Math.round(e.offsetY),1,1):(s.beginPath(),s.arc(e.offsetX,e.offsetY,T/2,0,2*Math.PI),s.fill())),s.beginPath(),s.moveTo(p.offsetX,p.offsetY),s.lineTo(e.offsetX,e.offsetY),s.stroke();break;case"polygon":u&&(u.x=e.offsetX,u.y=e.offsetY),_&&(_.x+=e.offsetX-p.offsetX,_.y+=e.offsetY-p.offsetY),N()}p=e}else{var t;C?(I.left+=(e.pageX-p.pageX)/I.zoom,I.top+=(e.pageY-p.pageY)/I.zoom,p={pageX:e.pageX,pageY:e.pageY},X(),"polygon"===m.dcConfig.editMode&&N()):P?(t=e.pageX-p.pageX,m.dcConfig.brushSize+=.5*t,m.dcConfig.brushSize=Math.min(100,Math.max(1,m.dcConfig.brushSize)),p=e,window.safeApply(m)):"polygon"===m.dcConfig.editMode&&(y=void 0,b={x:e.offsetX,y:e.offsetY},(_=V(e))||(y=L(e)),N())}}),a.parent().on("mousewheel",function(e){var t=0<e.originalEvent.wheelDelta?1:-1;I.zoom+=.1*I.zoom*t,I.zoom=Math.min(10,Math.max(.1,I.zoom)),X(),K(e),"polygon"===m.dcConfig.editMode&&N()}),m.$watch(function(){return{w:Math.round(e.innerWidth()),h:Math.round(e.innerHeight())}},function(e){h=e,t.width=e.w,t.height=e.h,j(),Y()},!0),m.$watch("dcConfig",function(e){e&&(o.width=e.w,o.height=e.h,s=o.getContext("2d"),v=t.getContext("2d"),d={w:e.w,h:e.h},H(),e.clearImage=H,e.resetMask=function(){H(),Q()},e.loadState=function(e){var t;H(),e.polys?(m.dcConfig.editMode="polygon",f=g=void 0,O=angular.copy(e.polys)||[],N()):(m.dcConfig.editMode="brush",(t=new Image).onload=function(){s.drawImage(this,0,0)},t.src=e.bitmap)},e.resetView=function(){I.zoom=1,I.left=0,I.top=0,X(),"polygon"===m.dcConfig.editMode&&N()})}),m.$watch("dcConfig.brushSize",function(e){e&&Y()}),m.$watch("dcConfig.maskSmoothing",function(e,t){e!==t&&"polygon"===m.dcConfig.editMode&&(Q(),N())}),m.$watch("dcConfig.editMode",function(e,t){if(e!==t)switch("brush"===t&&(k={bitmap:G()}),e){case"brush":var a;$(),k&&((a=new Image).onload=function(){s.drawImage(this,0,0)},a.src=k.bitmap,k=void 0,Q());break;case"polygon":Q(),N()}}),m.$on("$destroy",function(){J.off("pointerup.dcpaint"),J.off("pointermove.dcpaint"),w&&w.remove()})}}}]),angular.module("wallpaperbrowserApp").directive("wpAnim",["utils",function(i){return{restrict:"E",template:"<span></span>",scope:{wpaFile:"@",wpaPlaying:"="},link:function(e,t){var a=i.makeLogoAnimation(angular.element(t).children()[0],e.wpaFile);e.$watch("wpaPlaying",function(e){e?a.play():a.pause()}),e.$on("$destroy",function(){a.destroy()})}}}]),angular.module("wallpaperbrowserApp").directive("physicsconstraints",["utils","host",function(p,u){return{templateUrl:"views/templates/physicsconstraints.html",restrict:"E",scope:{settings:"=",defaults:"=",constraintMode:"=",uiMode:"=",boneId:"=",renderableId:"=",physicsCtrl:"="},link:function(i){var a={none:{se:!(i.is3D=function(){return"3D"===i.uiMode}),re:!1,ik:!1,ikce:!1,ikm:""},bouncyrotation:{se:!0,re:!1,ik:!1,ikce:!1,ikm:"",rs:300,la:!0},bouncyposition:{se:!0,re:!1,ik:!1,ikce:!1,ikm:"",r:!1,t:!0,ts:300},gravityrotation:{se:!1,re:!0,ik:!1,ikce:!1,ikm:"",ge:!0,la:!0,lamin:"0 0 -1.57079632679",lamax:"0 0 1.57079632679"},gravityposition:{se:!1,re:!0,ik:!1,ikce:!1,ikm:"",r:!1,t:!0,ge:!0},dragrotation:{se:!1,re:!0,ik:!1,ikce:!1,ikm:""},dragposition:{se:!1,re:!0,ik:!1,ikce:!1,ikm:"",r:!1,t:!0},ik2limbs:{se:!1,re:!1,ik:!0,ikce:!1,ikm:"",ikd:2},ikconstrained:{se:!1,re:!1,ik:!1,ikce:!0,ikm:""},ikrope4:{se:!1,re:!1,ik:!0,ikce:!1,ikm:"rope",ikd:4,ge:!0}};switch(i.modeDropList=[{value:"",label:"ui_editor_bone_constraints_not_simulated"},{value:"spring",label:"ui_editor_bone_constraints_spring_simulation"},{value:"rigid",label:"ui_editor_bone_constraints_rigid_simulation"},{value:"ik",label:"ui_editor_bone_constraints_ik_simulation"}],i.presetDropList=[{value:"none",label:"ui_editor_bone_constraints_not_simulated"},{value:"bouncyrotation",label:"ui_editor_bone_constraints_preset_bouncy_rotation"},{value:"bouncyposition",label:"ui_editor_bone_constraints_preset_bouncy_position"},{value:"gravityrotation",label:"ui_editor_bone_constraints_preset_gravity_rotation"},{value:"gravityposition",label:"ui_editor_bone_constraints_preset_gravity_position"},{value:"dragrotation",label:"ui_editor_bone_constraints_preset_drag_rotation"},{value:"dragposition",label:"ui_editor_bone_constraints_preset_drag_position"},{value:"ik2limbs",label:"ui_editor_bone_constraints_preset_ik_two_limbs"},{value:"ikrope4",label:"ui_editor_bone_constraints_preset_ik_rope"}],i.ikModeDropList=[{value:"",label:"ui_editor_bone_constraints_ik_simulation_mode_default"},{value:"rope",label:"ui_editor_bone_constraints_ik_simulation_mode_rope"}],i.settings.r?i.settings.presetresponsiveness=(i.settings.rf-5)/45*100:i.settings.t&&(i.settings.presetresponsiveness=(i.settings.tf-5)/45*100),i.settings.presetresponsiveness=Math.max(0,Math.min(100,Math.round(100-i.settings.presetresponsiveness))),i.boneId&&u.callEditor("getBoneInfos",i.renderableId,i.boneId).then(function(e){i.ikContactPointTargets=e}),i.constraintMode){case"ikIntermediate":i.modeDropList=[{value:"",label:"ui_editor_bone_constraints_not_simulated"},{value:"ikc",label:"ui_editor_bone_constraints_ik_constraints"}],i.presetDropList=[{value:"none",label:"ui_editor_bone_constraints_not_simulated"},{value:"ikconstrained",label:"ui_editor_bone_constraints_preset_ik_constrained"}];break;case"noik":i.modeDropList=i.modeDropList.filter(e=>"ik"!==e.value),i.presetDropList=i.presetDropList.filter(e=>!["ik2limbs","ikrope4"].includes(e.value))}function e(e){if(!angular.isString(e))return 0;for(var t=e.split(" ").map(function(e){return parseFloat(e)});t.length<2;)t.push(0);return Math.atan2(-t[1],t[0])}function t(e){return Math.cos(e)+" "+Math.sin(-e)+" 0"}function n(e){if(!angular.isString(e))return 0;for(var t=e.split(" ").map(function(e){return parseFloat(e)});t.length<3;)t.push(0);return Math.round(p.toDegrees(t[2]))}function o(e){return angular.isNumber(e)||(e=0),"0 0 "+p.toRadians(e)}function r(){i.temp={gd:e(i.settings.gd),a:e(i.settings.a),lamin:n(i.settings.lamin),lamax:n(i.settings.lamax),ikrmin:p.toDegrees(i.settings.ikrmin),ikrmax:p.toDegrees(i.settings.ikrmax)},i.settings.se?i.temp.mode="spring":i.settings.re?i.temp.mode="rigid":i.settings.ik?i.temp.mode="ik":i.settings.ikce?i.temp.mode="ikc":i.temp.mode=""}function s(){switch(i.is3D()||(i.settings.gd=t(i.temp.gd),i.settings.a=t(i.temp.a)),i.settings.lamin=o(i.temp.lamin),i.settings.lamax=o(i.temp.lamax),i.settings.ikrmin=p.toRadians(i.temp.ikrmin),i.settings.ikrmax=p.toRadians(i.temp.ikrmax),i.settings.re=!1,i.settings.se=!1,i.settings.ik=!1,i.settings.ikce=!1,i.temp.mode){case"rigid":i.settings.re=!0;break;case"spring":i.settings.se=!0;break;case"ik":i.settings.ik=!0;break;case"ikc":i.settings.ikce=!0}}function l(e){var t=angular.copy(i.defaults);delete t.preset,delete t.layout,angular.extend(i.settings,t),angular.extend(i.settings,a[e]),t=i.settings,e=i.settings.presetresponsiveness,e=Math.max(0,Math.min(1,e/100)),t.r&&(t.rf=Math.round(50-45*e)),t.t&&(t.tf=Math.round(50-45*e)),r()}function c(e){var t=angular.copy(i.temp),a=i.settings.layout;angular.extend(i.settings,e),i.settings.layout=a,r(),i.temp.mode=t.mode}function d(e){"rope"===e?(i.settings.m=600,i.settings.tf=5,i.settings.ikg=!1,i.settings.ikr=!1):(e=angular.copy(i.defaults),i.settings.m=e.m,i.settings.tf=e.tf,i.settings.ikg=e.ikg,i.settings.ikr=e.ikr)}i.$watch("settings",function(e,t){e!==t&&r()}),i.$watch("settings.ikm",function(e,t){angular.isDefined(t)&&angular.isDefined(e)&&e!==t&&("rope"===e?d(e):d())}),i.$watch("temp.mode",function(e,t){angular.isDefined(t)&&angular.isDefined(e)&&e!==t&&("ik"===e&&"rope"===i.settings.ikm?d(i.settings.ikm):d())}),i.$watch("settings.preset",function(e,t){e!==t&&l(e)}),i.$watch("settings.presetresponsiveness",function(e,t){e!==t&&i.settings.preset&&"none"!==i.settings.preset&&"simple"===i.settings.layout&&l(i.settings.preset)}),i.physicsCtrl.updateCurrentSettingsFromTemp=s,i.physicsCtrl.applyTempSettingsFromCurrent=r,i.physicsCtrl.resetSettings=function(){var e=angular.copy(i.defaults);delete e.mode,delete e.layout,delete e.preset,c(e)},i.physicsCtrl.copySettings=function(){s(),_copiedBoneConstraintsSettings=angular.copy(i.settings)},i.physicsCtrl.canPaste=function(){return angular.isObject(_copiedBoneConstraintsSettings)},i.physicsCtrl.pasteSettings=function(){c(_copiedBoneConstraintsSettings)},r(),i.$watch("temp",function(){s()},!0)}}}]),angular.module("wallpaperbrowserApp").controller("SettingsPerApplicationModalCtrl",["$timeout","$scope","$uibModalInstance","utils","host","data",function(t,i,e,a,n,o){var r;var s=function(){n.callDeferred("settingsObject","getApplicationsPlayingAudio").then(function(e){i.applicationsPlayingAudio=e}),r=t(s,1e3)};function l(){t.cancel(r),n.callDeferred("settingsObject","getRunningApplications").then(function(e){return i.applications=e,n.callDeferred("settingsObject","getApplicationsPlayingAudio")}).then(function(e){i.applicationsPlayingAudio=e,i.applications.sort(function(e,t){return i.applicationsPlayingAudio.includes(e.executablename)!==i.applicationsPlayingAudio.includes(t.executablename)?(i.applicationsPlayingAudio.includes(t.executablename)?1:0)-(i.applicationsPlayingAudio.includes(e.executablename)?1:0):angular.isString(e.executablename)&&angular.isString(t.executablename)?e.executablename.localeCompare(t.executablename):0}),r=t(s,1e3)})}i.rules=o.rules,i.newRule={},i.selected={},i.page={name:""},i.conditionOptions=[{label:"ui_settings_playback_condition_is_running",value:"running"},{label:"ui_settings_playback_condition_is_focused",value:"focused"},{label:"ui_settings_playback_condition_is_maximized",value:"maximized"},{label:"ui_settings_playback_condition_is_fullscreen",value:"fullscreen"},{label:"ui_settings_playback_condition_is_playing_audio",value:"playingaudio"}],i.actionLabels={run:"ui_settings_playback_keep_running",pause:o.runtime&&o.runtime.multimonitor?"ui_settings_playback_pause_per_monitor":"ui_settings_playback_pause",pauseall:"ui_settings_playback_pause_all",stop:"ui_settings_playback_stop",stopall:"ui_settings_playback_stop_all",mute:"ui_settings_playback_mute",loadwallpaper:"ui_settings_playback_load_wallpaper",loadplaylist:"ui_settings_playback_load_playlist",loadprofile:"ui_settings_playback_load_profile"},i.conditionLabels={running:"ui_settings_playback_condition_is_running",focused:"ui_settings_playback_condition_is_focused",maximized:"ui_settings_playback_condition_is_maximized",fullscreen:"ui_settings_playback_condition_is_fullscreen",playingaudio:"ui_settings_playback_condition_is_playing_audio"},i.applications=[],i.openSteamWorkshopPage=function(e){a.openUrl(e.workshopurl,{},a.usePlatformBrowser())},i.showCreatePage=function(){i.page.name="create",i.newRule={condition:i.conditionOptions[0].value,action:"pause"},i.oldRule=void 0,l()},i.showEditPage=function(e){i.page.name="edit",i.newRule=angular.copy(e),i.oldRule=e,l()},i.requiresWallpaperSelection=function(){return i.newRule.action&&i.newRule.action.startsWith("load")},i.cancelLoadRule=function(){i.page.name=i.lastPage,delete i.selected.wallpaper,delete i.newRule.file},i.chooseWallpaper=function(){switch(i.lastPage=i.page.name,i.page.name="wallpaper",i.filter={},i.loadItems=[],i.newRule.action){case"loadwallpaper":n.callDeferred("settingsObject","getWallpaperCache").then(function(e){i.loadItems=e.map(function(e){return{label:e.title,value:e}}),i.loadItems=i.loadItems.concat((o.browser.localfiles||[]).map(function(e){return angular.isObject(e)?{label:e.name||(a.isURL(e.file)?e.file:e.file.replace(/^.*[\\\/]/,"")),value:{file:e.file}}:{label:a.isURL(e)?e:e.replace(/^.*[\\\/]/,""),value:{file:e}}})),i.selected.wallpaper=e.find(function(e){return e.file===i.newRule.file}),angular.isObject(i.selected.wallpaper)||delete i.newRule.file});break;case"loadplaylist":i.loadItems=(o.browser.playlists||[]).map(function(e){return{label:e.name,value:{file:e.name}}}),i.selected.wallpaper=o.browser.playlists.find(function(e){return e.name===i.newRule.file}),angular.isObject(i.selected.wallpaper)||delete i.newRule.file;break;case"loadprofile":i.loadItems=(o.browser.profiles||[]).map(function(e){return{label:e.name,value:{file:e.name}}}),i.selected.wallpaper=o.browser.profiles.find(function(e){return e.name===i.newRule.file}),angular.isObject(i.selected.wallpaper)||delete i.newRule.file}},i.selectWallpaper=function(e){i.filter.search=e.label,i.newRule.file=e.value.file,i.selected.wallpaper=e.value},i.clearWallpaperSearch=function(){i.filter.search="",delete i.newRule.file,delete i.selected.wallpaper},i.createRule=function(){var e=i.newRule;i.page.name="",i.oldRule?i.rules.splice(i.rules.indexOf(i.oldRule),1,e):i.rules.unshift(e)},i.close=function(){e.close()},i.$watch("newRule.condition",function(e){var t,a;i.actionOptions=(t=o.runtime&&o.runtime.multimonitor&&"playingaudio"!==e&&"running"!==e,a=[],"running"!==(e=e)&&a.push({label:"ui_settings_playback_keep_running",value:"run"}),a.push({label:"ui_settings_playback_mute",value:"mute"}),t?(a.push({label:"ui_settings_playback_pause_per_monitor",value:"pause"}),a.push({label:"ui_settings_playback_pause_all",value:"pauseall"})):a.push({label:"ui_settings_playback_pause",value:"pause"}),"playingaudio"!==e&&a.push({label:"ui_settings_playback_stop",value:"stop"}),a.push({label:"ui_settings_playback_load_wallpaper",value:"loadwallpaper"}),a.push({label:"ui_settings_playback_load_playlist",value:"loadplaylist"}),a.push({label:"ui_settings_playback_load_profile",value:"loadprofile"}),a),angular.isString(i.newRule.action)||(i.newRule.action=i.actionOptions[0].value)}),i.$on("$destroy",function(){t.cancel(r)})}]),angular.module("wallpaperbrowserApp").controller("SettingsHotkeysModalCtrl",["$scope","$uibModalInstance","utils","host","data",function(i,e,n,t,a){i.hotkeys=a.hotkeys;var o=[];angular.forEach(i.hotkeys,function(e){n.isUserHotkeyAction(e.action)&&o.push(e)}),i.list=[{title:"ui_settings_hotkeys_group_playback",items:[{label:"ui_settings_hotkeys_action_pause",action:"pause"},{label:"ui_settings_hotkeys_action_stop",action:"stop"},{label:"ui_settings_hotkeys_action_mute",action:"mute"},{label:"ui_settings_hotkeys_action_next_wallpaper",action:"nextwallpaper"}]},{title:"ui_settings_hotkeys_group_general",items:[{label:"ui_settings_hotkeys_action_recording",action:"togglerecord"},{label:"ui_settings_hotkeys_action_hide_icons",action:"toggleicons"},{label:"ui_settings_hotkeys_action_take_screenshot",action:"screenshot"},{label:"ui_settings_hotkeys_action_start_screensaver",action:"screensaver"}]},{title:"ui_settings_hotkeys_group_windows",items:[{label:"ui_settings_hotkeys_action_window_browser",action:"windowbrowser"},{label:"ui_settings_hotkeys_action_window_settings",action:"windowsettings"},{label:"ui_settings_hotkeys_action_window_editor",action:"windoweditor"}]},{title:"ui_settings_hotkeys_group_wallpaper",stub:"ui_settings_hotkeys_group_wallpaper_stub",items:o}],n.canTakeScreenshots()||i.list[1].items.splice(2,1),i.findHotkeyList=function(t){return n.isUserHotkeyAction(t.action)?t:(angular.forEach(i.hotkeys,function(e){e.action===t.action&&(a=e)}),angular.isUndefined(a)&&(a={action:t.action,keys:[]},i.hotkeys.push(a)),a);var a},i.close=function(){angular.forEach(i.hotkeys.slice(),function(e){n.isUserHotkeyAction(e.action)&&0===e.keys.length&&i.hotkeys.findAndRemove(e)}),e.close()}}]),angular.module("wallpaperbrowserApp").controller("BrowseAssignHotkeyModalCtrl",["$scope","$uibModalInstance","data",function(e,t,a){e.name=a.name,e.hotkeys=a.hotkeys,e.keys=[],e.ok=function(){t.close(e.keys)},e.cancel=function(){t.dismiss("cancel")}}]),angular.module("wallpaperbrowserApp").controller("BrowseAssignUserShortcutModalCtrl",["$scope","$uibModalInstance","$timeout","host","data",function(a,i,e,t,n){var o,r,s=!1,l=!1,c=!1;function d(a){return t.callDeferred("browseWallpaperObject","getUserShortcutSystemHash").then(function(e){var t="";switch("web"!==a.type||a.path.startsWith("http://")||a.path.startsWith("https://")||a.path.startsWith("www.")||a.path.startsWith("steam://")||(a.path="https://"+a.path),a.type){case"file":case"directory":case"web":case"cmd":t=a.type+":"+e+":",t+=a.path}return"file"===a.type&&a.arguments&&(t+="|"+a.arguments),t=!a.path?void 0:t})}a.name=n.name,a.value=(o=n.value,r={type:"none"},angular.isString(o)&&(o=o.splitTimes(":",2),angular.isArray(o)&&3===o.length&&["file","directory","cmd","web"].includes(o[0])&&6===o[1].length&&(r.type=o[0],r.path=o[2],"file"!==r.type||2===(o=r.path.splitOnFirst("|")).length&&(r.path=o[0],r.arguments=o[1]))),r),a.$watch("value.type",function(e,t){s&&e!==t&&(a.value.path="",delete a.value.argument)}),a.selectFile=function(){var e;l||(e="usershortcutfile","directory"===a.value.type&&(e="directory"),l=!0,t.callDeferred("browseWallpaperObject","selectFileForProperty",e,"").then(function(e){l=!1,a.value.path=e}))},a.test=function(){c||(c=!0,d(a.value).then(function(e){t.callDeferred("browseWallpaperObject","testUserShortcut",e).then(function(){c=!1})}))},a.ok=function(){var t;c||(c=!0,t=!a.value.path,d(a.value).then(function(e){c=!1,i.close(e=t?"":e)}))},a.clear=function(){n.value="",i.close(n.value)},a.cancel=function(){i.dismiss("cancel")},e(function(){s=!0})}]),angular.module("wallpaperbrowserApp").controller("SettingsPluginModalCtrl",["$timeout","$scope","$uibModalInstance","data",function(e,t,a,i){t.plugin=i.plugin,t.pluginSettings=i.pluginSettings;var n=t.$new(!0);t.evalCondition=function(e){return n.$eval(e,t.pluginSettings[t.plugin.key])},t.ok=function(){a.close()},t.$on("$destroy",function(){n.$destroy()}),e(function(){t.$broadcast("rzSliderForceRender")},300)}]),angular.module("wallpaperbrowserApp").controller("SettingsMediaBlocklistCtrl",["$timeout","$scope","$uibModalInstance","host","data",function(t,a,e,i,n){var o;a.blocklist=n.blocklist,a.session={};function r(){i.callDeferred("settingsObject","getCurrentMediaSession").then(function(e){a.session.appid=e,o=t(r,1e3)})}r(),a.addBlock=function(t){t&&!a.blocklist.find(e=>e.appid===t)&&a.blocklist.push({appid:t})},a.close=function(){e.close()},a.$on("$destroy",function(){t.cancel(o)})}]),angular.module("wallpaperbrowserApp").controller("SettingsManageMonitorsCtrl",["$timeout","$translate","$scope","$uibModalInstance","host","data",function(e,t,a,i,n,o){a.monitorMap=o.monitorMap,a.monitorMap.sort((e,t)=>e.readonly!==t.readonly&&(e.readonly?1:-1));var r=0;angular.forEach(a.monitorMap,function(e){r=Math.max(r,e.value),e.oldValue=e.value}),a.monitorOptions=[];for(var s=0;s<=r;++s)a.monitorOptions.push({label:t.instant("settings_manage_monitors_modal_monitor_assoc",{index:s+1}).toString(),value:s});a.onMonitorChanged=function(t){angular.forEach(a.monitorMap,function(e){e!==t&&(e.readonly||e.value===t.value&&(e.value=t.oldValue,e.oldValue=e.value))}),t.oldValue=t.value;var e=a.monitorMap.filter(e=>!e.readonly).map(e=>({location:e.value,device:e.device}));n.callDeferred("settingsObject","updateManagedMonitors",e)},a.ok=function(){i.close()},a.cancel=function(){i.dismiss("cancel")}}]),angular.module("wallpaperbrowserApp").controller("BrowseSetDefaultsModalCtrl",["$scope","$translate","$uibModalInstance","utils","data",function(a,i,e,t,n){var o={};angular.forEach(t.getSharedDefaultProperties(!0),function(e,t){o[t]={value:e,key:t}}),o.rate.disableByDefault=!0,o.schemecolor.disableByDefault=!0,a.data={properties:n.properties,options:[],mode:"updateall"},i("ui_browse_details_properties_apply_to_all_update_selection",{count:n.selectionCount}).then(function(e){a.data.selectionTitle=e.toString()}),a.ok=function(){e.close(a.data)},a.cancel=function(){e.dismiss("cancel")},a.showDefaultValue=function(e){return!angular.isString(e)||0<e.length},a.resetDefaultValues=function(){angular.forEach(a.data.options,function(e){o[e.key]&&(e.value=o[e.key].value)})},a.anyPropertyEnabled=function(){var t=!1;return angular.forEach(a.data.options,function(e){e.enabled&&(t=!0)}),t},angular.forEach(a.data.properties,function(e){var t=o[e.key];t?a.data.options.push({label:i.instant(e.text).toString().replace(/<[^>]+>/gm,""),key:e.key,value:e.value,enabled:!t.disableByDefault}):e.plugin&&a.data.options.push({label:i.instant(e.text).toString().replace(/<[^>]+>/gm,""),key:e.key,value:e.value,enabled:!0})})}]),angular.module("wallpaperbrowserApp").controller("EditorUserPropertyDetailsModalCtrl",["$scope","$timeout","$uibModalInstance","utils","data",function(a,e,t,i,n){function o(e){switch(delete e.min,delete e.max,delete e.mode,delete e.options,delete e.step,delete e.precision,delete e.fraction,e.type){default:e.value="";break;case"directory":e.value="",e.mode="ondemand";break;case"color":e.value="1 0 0";break;case"slider":e.value=1,e.min=0,e.max=1,e.fraction=!0,e.precision=1;break;case"bool":e.value=!0;break;case"combo":e.options=[],e.value=void 0}}function r(){a.property.key.toLowerCase().replace(/\W+/g,"").trim()?(a.property.key=a.property.key.toLowerCase().replace(/\W+/g,""),a.property.key.match(/^\d/g)&&(a.property.key="_"+a.property.key)):a.property.key="newproperty"}"create"===n.mode?(a.title="ui_editor_user_properties_add_property",a.property={text:"New Property"}):(a.title="ui_editor_user_properties_edit_property",a.property=angular.copy(n.property)),"scene"===n.projectData.type?a.typeOptions=[{label:"ui_editor_user_properties_type_color",value:"color"},{label:"ui_editor_user_properties_type_slider",value:"slider"},{label:"ui_editor_user_properties_type_bool",value:"bool"},{label:"ui_editor_user_properties_type_combo",value:"combo"},{label:"ui_editor_user_properties_type_textinput",value:"textinput"},{label:"ui_editor_user_properties_type_scenetexture",value:"scenetexture"},{label:"ui_editor_user_properties_type_usershortcut",value:"usershortcut"},{label:"ui_editor_user_properties_type_group",value:"group"}]:a.typeOptions=[{label:"ui_editor_user_properties_type_color",value:"color"},{label:"ui_editor_user_properties_type_slider",value:"slider"},{label:"ui_editor_user_properties_type_bool",value:"bool"},{label:"ui_editor_user_properties_type_combo",value:"combo"},{label:"ui_editor_user_properties_type_textinput",value:"textinput"},{label:"ui_editor_user_properties_type_directory",value:"directory"},{label:"ui_editor_user_properties_type_file",value:"file"},{label:"ui_editor_user_properties_type_group",value:"group"}],a.fileTypeOptions=[{label:"ui_editor_user_properties_file_type_image",value:"image"},{label:"ui_editor_user_properties_file_type_video",value:"video"}],a.directoryFetchOptions=[{label:"ui_editor_user_properties_fetch_mode_on_demand",value:"ondemand"},{label:"ui_editor_user_properties_fetch_mode_all",value:"fetchall"}],angular.isNumber(a.property.precision)&&--a.property.precision,angular.isArray(n.allowedTypes)&&0<n.allowedTypes.length&&a.typeOptions.findAndRemove(function(e){return!n.allowedTypes.includes(e.value)}),"create"===n.mode&&(a.property.type=a.typeOptions[0].value,o(a.property)),a.colorPickerOptions=i.getColorPickerDefaults(),a.newOption={label:"",value:""},a.isCreatingNew="create"===n.mode,a.viewState={isEditingKey:!1},a.addPropertyOption=function(){a.property.options.push(angular.copy(a.newOption)),a.newOption.label="",a.newOption.value="",e(function(){angular.element("#inputAddComboOptionLabel").focus()})},a.removePropertyOption=function(e){a.property.options.findAndRemove(e)},a.ok=function(){angular.isNumber(a.property.precision)&&++a.property.precision,"slider"===a.property.type?a.property.fraction?(!angular.isNumber(a.property.precision)||a.property.precision<1?a.property.precision=1:4<a.property.precision&&(a.property.precision=4),a.property.step=1===a.property.precision?1:Math.pow(.1,a.property.precision-1)):(delete a.property.step,delete a.property.precision):(delete a.property.step,delete a.property.precision,delete a.property.fraction),r(),"combo"===a.property.type&&(angular.isDefined(a.property.value)&&angular.isDefined(a.property.options&&a.property.options.find(function(e){return e.value===a.property.value}))||(a.property.value=a.property.options[0].value)),t.close(a.property)},a.cancel=function(){t.dismiss("cancel")},a.isOkDisabled=function(){return a.property.key.length<1||!("combo"!==a.property.type||angular.isArray(a.property.options)&&0!==a.property.options.length)},a.$watch("property.type",function(e,t){angular.isString(e)&&angular.isString(t)&&e!==t&&o(a.property)}),"create"===n.mode&&a.$watch("property.text",function(e){a.viewState.isEditingKey||(a.property.key=e,r())})}]),angular.module("wallpaperbrowserApp").controller("EditorUserPropertiesModalCtrl",["$scope","$translate","$uibModalInstance","utils","data",function(a,t,i,e,n){function o(){var e=a.selectedProperty.selected&&angular.isObject(a.project.data.general.properties)&&a.project.data.general.properties[a.selectedProperty.selected];e&&"combo"===e.type&&angular.isArray(e.options)&&0<e.options.length&&e.options.findIndex(function(e){return e.value===a.selectedProperty.condition})<0&&(a.selectedProperty.condition=e.options[0].value)}a.project=n.project,a.types=n.types,a.selectedProperty={selected:angular.isObject(n.selected)?n.selected.name:n.selected,condition:angular.isObject(n.selected)&&n.selected.condition},a.ok=function(){var e=a.selectedProperty.selected,t=angular.isObject(a.project.data.general.properties)&&a.project.data.general.properties[a.selectedProperty.selected];switch(t&&t.type){case"combo":e={name:a.selectedProperty.selected,condition:a.selectedProperty.condition};break;case"usershortcut":e={name:a.selectedProperty.selected,type:"usershortcut"}}i.close(t&&e)},a.getTranslatedTypes=function(e){return e.map(function(e){return t.instant("ui_editor_user_properties_type_"+e)}).join(", ")},a.$watch("selectedProperty.selected",function(e,t){e!==t&&o()}),a.$watch("project.data.general.properties[selectedProperty.selected]",function(e,t){e!==t&&angular.isObject(e)&&"combo"===e.type&&o()},!0)}]),angular.module("wallpaperbrowserApp").controller("EditorWorkshopRulesModalCtrl",["$scope","$uibModalInstance","utils","data",function(e,t,a,i){e.data=i,e.ok=function(){t.close()},e.openWorkshopWebRules=function(){a.openUrl("var_url_providerrules")}}]),angular.module("wallpaperbrowserApp").controller("EditorSelectAssetsModalCtrl",["$uibModalInstance","$q","$scope","data",function(t,e,a,i){a.fnOpenWallpaperPublish=function(){a.cancel(),i.fnOpenWallpaperPublish()},a.assetLayers=i.assets.layers.filter(function(e){return"0"===e.parent}).map(function(e){var t=angular.isArray(e.properties)&&e.properties.find(function(e){return"name"===e.key});return{label:t&&t.value||e.name,icon:e.icon,id:e.id,selected:!1}}),a.assetEffects=i.assets.effects.map(function(e){return{label:e.name,value:e.path}}),a.assetTypes=[{label:"ui_editor_publish_assets_modal_asset_type_layers",value:"layers"},{label:"ui_editor_publish_assets_modal_asset_type_effects",value:"effects"}],a.selected={type:a.assetTypes[0].value,effect:void 0,variantsEnabled:!1},a.$watch("selected.type",function(e){"effects"===e&&0<a.assetEffects.length&&(a.selected.effect=a.assetEffects[0].value)}),a.isAnythingSelected=function(e){switch(a.selected.type){case"layers":return e?a.assetLayers.filter(function(e){return e.selected}).length>=e:angular.isObject(a.assetLayers.find(function(e){return e.selected}));case"effects":return a.selected.effect}},a.cancel=function(){t.dismiss("cancel")},a.ok=function(){switch(a.selected.type){case"layers":var e=a.assetLayers.filter(function(e){return e.selected}).map(function(e){return e.id});t.close({variantsEnabled:a.selected.variantsEnabled&&1<e.length,items:e});break;case"effects":t.close({item:a.selected.effect})}}}]),angular.module("wallpaperbrowserApp").controller("EditorAnimationOptionsModalCtrl",["$scope","$timeout","$uibModalInstance","modals","data",function(t,e,a,i,n){function o(){t.tempSettings.length=t.tempSettings.seconds*t.settings.fps}t.settings=n.options,t.editorSettings=n.editorSettings,t.tempSettings={parent:"",seconds:+(t.settings.length/t.settings.fps).toFixed(3)},t.mode=n.mode,t.hasSmoothingOption=angular.isDefined(t.settings.smoothing),o(),angular.isObject(n.options.parent)&&(t.tempSettings.parent=n.options.parent.id+":"+n.options.parent.key),t.modeOptions=[{label:"ui_editor_animation_modal_loop",value:"loop"},{label:"ui_editor_animation_modal_mirror",value:"mirror"},{label:"ui_editor_animation_modal_single",value:"single"}],t.propertyLinkOptions=[],angular.isArray(n.siblingProperties)&&0<n.siblingProperties.length&&(t.propertyLinkOptions=[{label:"ui_editor_animation_modal_create_new_animation",value:""}].concat(n.siblingProperties)),t.updateFramesFromFPS=o,t.updateFPSFromFrames=function(){t.settings.fps=t.tempSettings.length/t.tempSettings.seconds},t.showGenericHelp=function(e,t,a){e.stopPropagation(),e.preventDefault(),i.open("genericConfirm",{data:{title:t,message:a,okVisible:!0}})},t.ok=function(){var e;t.editorSettings.animationoptionsuseframes?(t.settings.length=Math.max(1,Math.round(t.tempSettings.length)),t.settings.fps=t.settings.length/t.tempSettings.seconds):t.settings.length=t.tempSettings.seconds*t.settings.fps,t.tempSettings.parent?(e=t.tempSettings.parent.split(":"),t.settings.parent={id:e[0],key:e[1]}):delete t.settings.parent,t.settings.name||delete t.settings.name,a.close(t.settings)},e(function(){t.$broadcast("rzSliderForceRender")},250)}]).controller("EditorAnimationEventsModalCtrl",["$scope","$uibModalInstance","data",function(t,e,a){t.events=angular.copy(a.events),t.newEvent={frame:a.frame},t.addEvent=function(){angular.isString(t.newEvent.name)&&0!==t.newEvent.name.trim().length&&(t.newEvent.name=t.newEvent.name.trim(),angular.isNumber(t.newEvent.frame)||(t.newEvent.frame=0),t.events.push(angular.copy(t.newEvent)),delete t.newEvent.name)},t.removeEvent=function(e){t.events.findAndRemove(e)},t.ok=function(){t.addEvent(),t.events=t.events.filter(function(e){return e&&e.name&&0<e.name.trim().length}),e.close(angular.sanitizeObject(angular.copy(t.events)))},t.cancel=function(){e.dismiss("cancel")}}]),angular.module("wallpaperbrowserApp").controller("EditorBoneConstraintsModalCtrl",["$timeout","$scope","$uibModalInstance","host","utils","data",function(e,i,t,a,n,o){i.settings=angular.copy(o.settings),i.defaults=o.defaults,i.constraintMode=o.constraintMode,i.settings=angular.extend(angular.copy(i.defaults),i.settings),i.visGroup={tab:"physics"},i.newBlendTarget={},i.blendrules=[],i.boneId=o.boneId,i.renderableId=o.renderable;var r=!(i.physicsCtrl={});function s(){i.visGroup.bonesAvailable=i.visGroup.bones.filter(function(t){return!angular.isArray(i.blendrules)||!i.blendrules.find(function(e){return e.value===t.value})})}i.ok=function(){r&&(i.blendrules.empty()?delete i.settings.blendrules:i.settings.blendrules=i.blendrules.map(function(e){e=angular.copy(e);return e.target=e.value,delete e.value,delete e.label,e})),i.physicsCtrl.updateCurrentSettingsFromTemp(),t.close(i.settings)},i.cancel=function(){t.dismiss()},i.resetSettings=function(){return i.physicsCtrl.resetSettings()},i.copySettings=function(){return i.physicsCtrl.copySettings()},i.canPaste=function(){return i.physicsCtrl.canPaste&&i.physicsCtrl.canPaste()},i.pasteSettings=function(){return i.physicsCtrl.pasteSettings()},i.changeVisGroup=function(e){"blendrules"===(i.visGroup.tab=e)&&a.callEditor("getBoneInfos",o.renderable,o.boneId).then(function(a){i.visGroup.bones=a,i.blendrules.empty()&&(r=!0,angular.isArray(i.settings.blendrules)&&(i.blendrules=i.settings.blendrules.map(function(e){var t;return angular.isObject(e)?((t=angular.copy(e)).value=t.target,t.label=t.target):angular.isString(e)&&(t={value:e,label:e}),angular.isString(t.mode)||(t.mode="transform"),angular.forEach(a,function(e){e.value===t.value&&(t.label=e.label)}),t}))),s()})},i.ikCpModes=[{label:"ui_editor_properties_origin_angles",value:"transform"},{label:"ui_editor_properties_origin",value:"origin"}],i.addBoneBlendTarget=function(){var t={value:i.newBlendTarget.bone,amin:0,amax:5};angular.forEach(i.visGroup.bones,function(e){e.value===i.newBlendTarget.bone&&(t.label=e.label)}),i.blendrules.push(t),delete i.newBlendTarget.bone,s()},i.removeBoneBlendTarget=function(e){i.blendrules.findAndRemove(e),s()},e(function(){i.$broadcast("rzSliderForceRender")},250)}]),angular.module("wallpaperbrowserApp").controller("QueryWorkshopModalCtrl",["$scope","$uibModalInstance","host","utils","contextMenu","data",function(r,e,a,o,n,i){window.queryWorkshopModalCtrl=this;var s=i.assetBrowserItems,l={text:"",sort:"top_rated",ratingtags:{Mature:!1,Questionable:!1,Everyone:!0},typetags:{},assetgenretags:{},utilitytags:{}},c={current:1,count:1,pages:[],visible:!0},d=1;function p(){if(angular.isArray(r.queryWallpapers)&&angular.isArray(s))for(var e=0;e<r.queryWallpapers.length;++e){var t=r.queryWallpapers[e];if(angular.isString(t.workshopid))for(var a=0;a<s.length;++a){var i=s[a];if(t.workshopid===i.workshopid){t!==i&&"unsubscribed"!==i.status?(r.queryWallpapers.splice(e,1,i),r.currentSelection===t&&(r.currentSelection=i)):angular.merge(t,i);break}}}}r.workshopController=i.workshopController,r.assetBrowserItemsUpdateHandle=i.assetBrowserItemsUpdateHandle,r.providerIcon=o.getProviderIcon(),o.canShowSpecializedBrowseLists()?r.sortOptions=[{value:"top_rated",label:"ui_browse_query_sort_by_votes"},{value:"trend_year",label:"ui_browse_query_sort_by_trend_year"},{value:"trend_month",label:"ui_browse_query_sort_by_trend_last_month"},{value:"trend_week",label:"ui_browse_query_sort_by_trend_last_week"},{value:"trend_today",label:"ui_browse_query_sort_by_trend_today"},{value:"most_recent",label:"ui_browse_query_sort_by_date"},{value:"most_up_votes",label:"ui_browse_query_sort_most_up_votes"},{value:"subscriptions",label:"ui_browse_query_sort_most_subscriptions"}]:r.sortOptions=[{value:"top_rated",label:"ui_browse_query_sort_by_votes"},{value:"most_recent",label:"ui_browse_query_sort_by_date"},{value:"subscriptions",label:"ui_browse_query_sort_most_subscriptions"}],r.callbackResetFilter=function(){r.filter=angular.copy(l),r.pagination=c},r.resetSearchFilter=function(){r.filter.text=""},r.canUseAgeRatingTags=o.canUseAgeRatingTags,r.close=function(){e.dismiss("cancel")},r.unsubscribeWorkshopItem=function(e){r.workshopController.unsubscribeWorkshopItem(e.title,e.workshopid).then(function(){r.currentSelection===e&&(r.currentSelection=void 0)})},r.callbackChangePage=function(e,t){var a;"…"!==e?(a=e,angular.isString(a)&&(a=r.pagination.current,"next"===e?++a:--a),(a=Math.clamp(a,1,r.pagination.count))===r.pagination.current&&!t||(o.updatePagination(r.pagination,a,r.pagination.count),r.refreshQuery())):o.showPaginationPageNumberPrompt(e).then(r.callbackChangePage)},r.callbackToggleGenreFilter=function(e,t){angular.forEach(r.filterAssetGenreTags,function(e){"Unspecified"!==e.value?r.filter.assetgenretags[e.value]=t:r.filter.assetgenretags[e.value]=!1})},r.refreshQuery=function(){function e(){i=n.excludedTags.length}function t(e,t){var a=n.excludedTags.length-i;e<=a&&(n.excludedTags.splice(n.excludedTags.length-a,a),angular.isString(t)&&n.excludedTags.push(t))}var i,n={requiredTags:["Asset"],excludedTags:[],sort:r.filter.sort,text:r.filter.text,page:c.current,token:++d};angular.forEach(r.filter.utilitytags,function(e,t){1===e?n.requiredTags.push(t):2===e&&n.excludedTags.push(t)}),e(),angular.forEach(r.filter.assetgenretags,function(e,t){e||n.excludedTags.push(t)}),t(r.filterAssetGenreTags.length,"Unspecified"),e(),angular.forEach(r.filter.typetags,function(e,t){e||n.excludedTags.push(t)}),t(r.filterTypeTags.length),e(),angular.forEach(r.filter.ratingtags,function(e,t){e||n.excludedTags.push(t)}),t(r.filterRatingTags.length),r.queryActive=!0,r.showErrorInBackground=!1,r.queryWallpapers=[],a.callEditor("queryWorkshop",n).then(function(e){r.queryActive=!1,r.queryNoCache=!1,angular.forEach(e.wallpapers,function(e){e.approved=0<=e.tags.indexOf("Approved"),e.portrait=0<=e.tags.indexOf("Portrait")}),r.originalQueryWallpapers=angular.copy(e.wallpapers),r.queryWallpapers=e.wallpapers,p(),o.updatePagination(c,n.page,e.pagecount)})},r.callbackWallpaperAllMouse=function(e,t,a){switch(a.stopPropagation(),e){case"left":r.currentSelection=t;var i=angular.element(a.target).closest(".browseWallpaperImage")[0];i&&i.scrollIntoView&&i.scrollIntoView({behavior:"smooth",inline:"nearest",block:"nearest"});break;case"right":i=n.builder();angular.isObject(t)&&(t.workshopid&&("downloadable"===t.status?i.button("ui_browse_context_menu_subscribe","fas fa-download",function(){r.workshopController.subscribeWorkshopItem(t.workshopid)}):i.button("ui_browse_context_menu_unsubscribe","fas fa-times",function(){r.unsubscribeWorkshopItem(t)})),t&&(t.workshopid||"installed"===t.status)&&(i.divider(),t.workshopid&&i.button("ui_browse_context_menu_workshop",o.getProviderIcon(),function(){r.workshopController.openSteamWorkshopPage(t)})),i.open(r,a));break;case"dbl":r.workshopController.subscribeWorkshopItem(t.workshopid)}},r.showFilter={visible:!1,sort:"top_rated"},r.filterRatingTags=o.getWallpaperRatingTags(),r.filterTypeTags=o.getAssetTypeTags().map(function(e){return{label:e,value:e}}),r.filterAssetGenreTags=o.getAssetGenreTags().map(function(e){return{label:e,value:e}}),r.filterUtilityTags=o.getAvailableTags(!0).map(function(e){return{label:e,value:e}}),angular.forEach(r.filterTypeTags,function(t){o.translateAssetTypeTag(t.value).then(function(e){t.label=e}),i.assetBrowserSettingsGroup&&o.assetTypeGroups[i.assetBrowserSettingsGroup]?l.typetags[t.value]=o.assetTypeGroups[i.assetBrowserSettingsGroup].includes(t.value):l.typetags[t.value]=!0}),angular.forEach(r.filterUtilityTags,function(t){o.translateTag(t.value).then(function(e){t.label=e})}),angular.forEach(r.filterAssetGenreTags,function(t){o.translateTag(t.value).then(function(e){t.label=e}),l.assetgenretags[t.value]="Unspecified"!==t.value}),r.callbackResetFilter(),angular.isObject(i.assetBrowserSettings.filter)&&angular.merge(r.filter,i.assetBrowserSettings.filter),r.$watch("filter",function(e,t){angular.isObject(e)&&e!==t&&(delete angular.copy(e).text,angular.merge(i.assetBrowserSettings,e),r.refreshQuery())},!0),r.$watch("assetBrowserItemsUpdateHandle.handle",function(e,t){if(angular.isDefined(t)&&e!==t&&r.queryWallpapers){for(var a=0;a<r.queryWallpapers.length;++a){var i=r.queryWallpapers[a];if("unsubscribed"===i.status)for(var n=0;n<r.originalQueryWallpapers.length;++n){var o=r.originalQueryWallpapers[n];o.workshopid===i.workshopid&&angular.merge(i,o)}}p(),r.queryWallpapers=r.queryWallpapers.concat([])}}),r.$watch("currentSelection",function(e){e&&e.authorsteamid&&i.workshopController.requestSteamUserInfo(e.authorsteamid)}),r.refreshQuery()}]);var _lastExportPreset,_pendingAlignmentPreviewImage,_lastShowAdvancedSettings=!1;angular.module("wallpaperbrowserApp").controller("BrowseMobileUploadModalCtrl",["$translate","$timeout","$scope","utils","$uibModalInstance","modals","host","data",function(r,t,d,s,l,c,p,u){(window.browseMobileUploadModalCtrl=d).device=u.device,d.isExporting=u.isExporting;var g=[],f={};d.title=u.wallpapers[0].title,1<u.wallpapers.length&&(d.title+=" + ("+(u.wallpapers.length-1)+")"),d.hostInitialized=!1,d.reductionOptions=[{label:"ui_browse_mobile_upload_modal_texture_reduction_original",value:"high_quality"},{label:"ui_browse_mobile_upload_modal_texture_reduction_x2",value:"reduction_x2"},{label:"ui_browse_mobile_upload_modal_texture_reduction_x4",value:"reduction_x4"}],d.videoOptions=[{label:"ui_browse_mobile_upload_modal_video_preset_2160",value:"4k"},{label:"ui_browse_mobile_upload_modal_video_preset_1080",value:"1080p"}],d.videoUncroppedOptions=[{label:"ui_browse_mobile_upload_modal_video_preset_original",value:"original"},{label:"ui_browse_mobile_upload_modal_video_preset_2160",value:"4k"},{label:"ui_browse_mobile_upload_modal_video_preset_1080",value:"1080p"}],d.videoFPSOptions=[{label:"60",value:"60"},{label:"30",value:"30"}],d.videoCroppingOptions=[{label:"ui_browse_mobile_upload_modal_video_cropping_phone",value:"cropphone"},{label:"ui_browse_mobile_upload_modal_video_cropping_disabled",value:"disabled"}];var m={high:{pixel:{compression:"high_quality",reduction:"high_quality"},normal:{compression:"high_performance",reduction:"high_quality"},uhd:{compression:"high_performance",reduction:"reduction_x2"}},medium:{pixel:{compression:"high_performance",reduction:"high_quality"},normal:{compression:"high_performance",reduction:"reduction_x2"},uhd:{compression:"high_performance",reduction:"reduction_x4"}},low:{pixel:{compression:"high_performance",reduction:"reduction_x2"},normal:{compression:"high_performance",reduction:"reduction_x4"},uhd:{compression:"high_performance",reduction:"reduction_x4"}}};function i(e){angular.isObject(e)&&(delete e.alignment,delete e.alignmentx,delete e.alignmenty,delete e.alignmentz,delete e.alignmentposition,delete e.alignmentfliph,delete e.pluginledextensionsenableleds,delete e.wec_e,delete e.wec_brs,delete e.wec_con,delete e.wec_sat,delete e.wec_hue,delete e.rate)}function v(){return d.show4kHint?"uhd":d.allPixelArt?"pixel":"normal"}d.settings={compression:"high_performance",reduction:"high_quality",videopreset:"1080p",videouncroppedpreset:"original",videofps:"30",videocropping:"cropphone",videoalignment:50},d.tempSettings={pixelart:!1},d.showAdvancedSettings={visible:_lastShowAdvancedSettings},u.isExporting&&(d.device.preset=_lastExportPreset),d.updateCurrentSettingsFromPreset=function(){angular.merge(d.settings,m[d.device.preset][v()]),u.isExporting&&(_lastExportPreset=d.device.preset)},d.arePresetSettingsActive=function(e){return!!angular.isString(e)&&(!!angular.isString(d.device.preset)&&((!d.showAdvancedSettings.visible||"low"===d.device.preset)&&e===d.device.preset))},d.ok=function(){_lastShowAdvancedSettings=d.showAdvancedSettings.visible,d.device.preset&&!_lastShowAdvancedSettings&&d.updateCurrentSettingsFromPreset();var c=u.wallpapers.filter(function(e){return!e.workshopid||!g.includes(e.workshopid)}),e=c.map(function(e){return e.file});p.callDeferred("browseWallpaperObject","requestWallpaperProperties",e,u.location).then(function(e){return angular.isArray(e.properties)?angular.forEach(e.properties,function(e){i(e)}):(i(e.properties),e.properties=[e.properties]),e.properties||[]}).then(function(t){if(u.isExporting){r=angular.copy(d.settings),"low"!==d.device.preset?(delete r.videopreset,delete r.videouncroppedpreset,delete r.videofps,delete r.videocropping):r.videoalignment=100-d.settings.videoalignment;var a=[],i=0;angular.forEach(c,function(e){a.push({file:e.file,properties:t[i++],title:e.workshopid||e.title,mpkgversionoverride:f[e.file]})}),p.callDeferred("browseWallpaperObject","exportMobilePkg",a,r)}else for(var e="high"===d.device.preset,n="medium"===d.device.preset,o=0;o<c.length;++o){var r,s=c[o],l=d.resolutions&&d.resolutions[o];(r=angular.copy(d.settings)).videopreset="",r.videouncroppedpreset="",r.videofps="",r.videocropping="",r.mpkgversionoverride=f[s.file]||0,"low"===d.device.preset?(r.videopreset=d.settings.videopreset,r.videouncroppedpreset=d.settings.videouncroppedpreset,r.videofps=d.settings.videofps,r.videocropping=d.settings.videocropping,r.videoalignment=100-d.settings.videoalignment):1<c.length&&l&&(l=l.width*l.height,d.showPixelArtHint&&l<307200?(r.compression="high_quality",r.reduction=e?"high_quality":"reduction_x2"):l<=2075520&&"high_quality"!==r.reduction&&(e?r.reduction="high_quality":n&&(r.reduction="reduction_x2"))),p.callDeferred("browseWallpaperObject","requestMobileDeviceUpload",d.device,s,r,t[o])}}),t(function(){l.close()})},d.cancel=function(){l.dismiss("cancel")},d.$watch("settings.compression",function(e,t){e!==t&&(d.tempSettings.pixelart="high_quality"===e)}),d.$watch("tempSettings.pixelart",function(e,t){e!==t&&(d.settings.compression=e?"high_quality":"high_performance")});var a=!1;d.$watchGroup(["showVideoAlignment","device.preset"],function(){var e;!a&&d.showVideoAlignment&&"low"===d.device.preset&&(a=!0,0<(e=u.wallpapers.filter(function(e){return"Scene"===e.type})).length&&(_pendingAlignmentPreviewImage?_pendingAlignmentPreviewImage=e[0].file:function t(a){p.callDeferred("browseWallpaperObject","requestWallpaperProperties",a,u.location).then(function(e){(e=e||{}).properties=e.properties||{},i(e.properties),p.callDeferred("browseWallpaperObject","getScenePreviewImage",a,e.properties).then(function(e){_pendingAlignmentPreviewImage===a?(d.videoAlignmentPreviewImg=e.preview,d.videoAspectRatioWidth=e.width/e.height*100-2,_pendingAlignmentPreviewImage=void 0):t(_pendingAlignmentPreviewImage)})})}(_pendingAlignmentPreviewImage=e[0].file)))}),d.$on("$destroy",function(){delete window.browseMobileUploadModalCtrl}),function(){var e;!u.isExporting&&4<d.device.displayWidth&&d.device.displayHeight&&(e=Math.min(d.device.displayWidth,d.device.displayHeight)+" x "+Math.max(d.device.displayWidth,d.device.displayHeight),d.videoOptions.splice(1,0,{label:r.instant("ui_browse_mobile_upload_modal_video_preset_auto",{resolution:e}).toString(),value:"auto"}));var a=s.getResolutionTags(),i=!1,n=-1,o=0;angular.forEach(u.wallpapers,function(e){e=e.tags.split(",");angular.forEach(e,function(e){var t;a.includes(e)&&e.includes(" x ")&&(2===(t=(e=e.replace(/(Ultrawide |Dual |Triple |Portrait )/gi,"")).split(" x ")).length&&(e=parseInt(t[0]),t=parseInt(t[1]),i=i||2075520<e*t,n=Math.max(n,e*t),o=Math.max(o,e/t)))})}),d.show4kHint=i;var t=d.showVideoAlignment=!1;angular.forEach(u.wallpapers,function(e){t=t||e&&"Scene"===e.type}),t?p.callDeferred("browseWallpaperObject","getWallpaperResolutions",u.wallpapers.map(function(e){return e.file})).then(function(e){d.resolutions=e;var a=8294400;return angular.forEach(e,function(e){var t=e&&e.width*e.height;t&&(a=Math.min(a,t),n=Math.max(n,t),o=Math.max(o,e.width/e.height))}),a<307200&&(d.showPixelArtHint=!0,d.allPixelArt=n<307200),d.showVideoAlignment=.7<o,d.videoAspectRatioWidth=100*o,angular.isString(d.device.preset)&&(e=m[d.device.preset][v()],angular.isObject(e)&&angular.merge(d.settings,e)),p.callDeferred("browseWallpaperObject","checkWallpaperPKGVersions",d.device.mpkgsupport||0,u.isExporting||!1,u.wallpapers.map(function(e){return e.file}))}).then(function(e){for(var t=e.status,a=e.versions,i=!1,n=[],o=0;o<u.wallpapers.length;++o){var i=i||!0===t[o],r=u.wallpapers[o];!1===t[o]&&(n.push(r.title||r.workshopid||r.file),g.push(r.workshopid)),0<a[o]&&(f[r.file]=a[o])}i?n.empty()||c.open("genericConfirm",{data:{title:"ui_browse_mobile_upload_modal_outdated_device_warning_title",message:["ui_browse_mobile_upload_modal_outdated_device_warning_message_some","ui_browse_mobile_upload_modal_outdated_device_warning_message_shared","ui_browse_mobile_upload_modal_outdated_device_warning_message_some_ext"],okVisible:!0,okText:"ui_close",listVisible:!0,listItems:n.map(function(e){return{label:e}})}}):(l.close(),c.open("genericConfirm",{data:{title:"ui_browse_mobile_upload_modal_outdated_device_warning_title",message:["ui_browse_mobile_upload_modal_outdated_device_warning_message_all","ui_browse_mobile_upload_modal_outdated_device_warning_message_shared"],okVisible:!0,okText:"ui_close"}})),d.hostInitialized=!0}):d.ok()}()}]);var _cachedTextureGeneratorSettings={};function getTextureGeneratorConfigKey(e,t){return e.toString()+"%"+t}angular.module("wallpaperbrowserApp").controller("EditorCharacterSeparationModalCtrl",["$document","$translate","$timeout","$q","$scope","$uibModalInstance","modals","host","utils","data",function(e,i,t,a,s,n,o,r,l,c){var d,p,u,g=[],f=a.when(),m=0,v=!1,h=!1;function b(){return{filter:13,blur:63,depth:1,threshold:1,detailsblur:21,detailsdepth:1,detailsinvert:!1,exponent:4}}function _(){return{blur:1,outlineCompensation:2,quality:1,autoContrast:!0,invert:!1}}function y(e){return"projects/temp/edit/"+e+"_"+ ++m+".png"}function w(e,t){for(var a=!1,i=e+1;i<s.hierarchy.length;++i){var n=s.hierarchy[i],a=a||n.depth===t;if(n.depth<t)return a}return a}function k(){for(var e=[s.hierarchy[0]],t=1;t<s.hierarchy.length;++t){var a=s.hierarchy[t];a.depth<e.length?a.src=e[a.depth].bg:a.src=a.parent.fg,e.length=a.depth+1,e[a.depth]=a}}function x(){for(var e=1;e<s.hierarchy.length;++e)s.hierarchy[e].tree=function(e){for(var t=s.hierarchy[e],a="",i=1;i<t.depth;++i)w(e,i)?a+="│":a+=" ";return e<s.hierarchy.length-1&&s.hierarchy[e+1].depth,w(e,t.depth)?a+="├":a+="└",a}(e)}function S(){for(s.redoStack=[];30<s.undoStack.length;)s.undoStack.shift()}function C(t){var e=a.defer();return g.findAndRemove(function(e){return e.path===t}),g.push({deferred:e,path:t}),function a(e){(1===g.length||e&&0<g.length)&&(f=f.then(function(){var t=g.shift();if(t)return r.callEditor("getImageDataUrl",t.path).then(function(e){t.deferred.resolve(e),a(!0)})}))}(),e.promise}function E(e){if(!s.isCancellingCompiler){var a=s.selected.limb;if(a.mask&&(a.state=e,!v)){var i={bitmap:e.bitmap,grabCut:e.grabCut};if(angular.isUndefined(d))return d=i,o.setPreventModalClose(!0),r.callEditor("updateCharacterSeparationMask",a.mask,i.bitmap,i.grabCut).then(function(){var e,t;d===i?(h=!(d=void 0),s.isComputingGrabCut=!0,s.blinkAnalyzeOnDemand=!1,e=a.needsInit,r.callEditor("performGrabCut",e,a.src,a.mask,a.bg,a.fg,s.dcConfig.maskBias,s.dcConfig.maskQuality,i.grabCut?s.dcConfig.maskSmoothing:0,s.dcConfig.fillGaps<100,s.dcConfig.fillGaps,!1!==i.grabCut).then(function(){o.setPreventModalClose(!1),s.isComputingGrabCut=!1,s.previewState.cache={},e&&"original"===s.previewState.active&&(s.previewState.active="foreground_original")}),a.needsInit=!1):d&&(t=d,d=void 0,E(t))});d=i}}}function P(){if(!s.isCancellingCompiler){if(angular.isUndefined(d)){var t={};d=t,o.setPreventModalClose(!0);var e=s.selected.limb;return s.isComputingGrabCut=!0,r.callEditor("performGenerateNormalMap",e.src,e.dst,s.normalConfig.filter,s.normalConfig.blur,s.normalConfig.depth,s.normalConfig.threshold,s.normalConfig.detailsblur,s.normalConfig.detailsdepth,s.normalConfig.detailsinvert,s.normalConfig.exponent).then(function(e){d===t?(d=void 0,s.isComputingGrabCut=!1,s.dstPath=e,s.previewState.cache={},s.previewState.active="foreground_original"):(d=void 0,P())})}d={}}}function M(){if(!s.isCancellingCompiler){if(angular.isUndefined(d)){var t={};d=t,o.setPreventModalClose(!0);var e=s.selected.limb;return s.isComputingGrabCut=!0,r.callEditor("performGenerateDepthMap",e.src,e.dst,s.depthConfig.blur,s.depthConfig.outlineCompensation,s.depthConfig.autoContrast,s.depthConfig.invert,s.depthConfig.quality).then(function(e){d===t?(d=void 0,s.isComputingGrabCut=!1,s.dstPath=e,s.previewState.cache={},s.previewState.active="foreground_original"):(d=void 0,M())})}d={}}}function A(){var n,o,e,r,a;s.hasOverlaps=!1,s.isTextureChannels&&(n=angular.element("#cropCanvas")[0],o=n.getContext("2d"),s.hierarchy[0]!==s.selected.limb?(e=angular.element("#bgImage")[0],r=angular.element("#fgImage")[0],n.width=e.naturalWidth,n.height=e.naturalHeight,o.strokeStyle="rgba(255, 0, 0, 64)",o.lineWidth=1,o.clearRect(0,0,n.width,n.height),s.selected.limb&&s.selected.limb.crops?(s.selected.limb.crops.forEach(e=>{var t=e.x0/r.naturalWidth,a=e.x1/r.naturalWidth-t,i=e.y0/r.naturalHeight,e=e.y1/r.naturalHeight-i;o.clearRect(t*n.width,i*n.height,a*n.width,e*n.height),o.drawImage(r,r.naturalWidth*t,r.naturalHeight*i,a*r.naturalWidth,e*r.naturalHeight,t*n.width,i*n.height,a*n.width,e*n.height),o.strokeRect(t*n.width-1,i*n.height-1,a*n.width+2,e*n.height+2)}),a=[],angular.forEach(s.hierarchy,function(e){e!==s.selected.limb&&angular.isArray(e.crops)&&s.selected.limb.crops.forEach(t=>{e.crops.forEach(e=>{t.x1<=e.x0||t.y1<=e.y0||e.x1<=t.x0||e.y1<=t.y0||a.push({x0:Math.max(t.x0,e.x0),y0:Math.max(t.y0,e.y0),x1:Math.min(t.x1,e.x1),y1:Math.min(t.y1,e.y1)})})})}),o.strokeStyle="rgba(0, 0, 255, 64)",s.hasOverlaps=!a.empty(),a.forEach(e=>{var t=e.x0/r.naturalWidth,a=e.x1/r.naturalWidth-t,i=e.y0/r.naturalHeight,e=e.y1/r.naturalHeight-i;o.strokeRect(t*n.width-1,i*n.height-1,a*n.width+2,e*n.height+2)})):o.drawImage(r,0,0,r.naturalWidth,r.naturalHeight,0,0,n.width,n.height)):o.clearRect(0,0,n.width,n.height))}function T(){var e,t;"original"===s.previewState.active?s.previewState.img=s.previewState.bgImgUrl:s.previewState.cache[s.previewState.active]?s.previewState.img=s.previewState.cache[s.previewState.active]:(e=s.selected.limb,e=["foreground","foreground_original"].includes(s.previewState.active)?e.fg:e.bg,t=s.previewState.active,C(e).then(function(e){s.previewState.cache[t]=e,s.previewState.active===t&&(s.previewState.img=e)}))}function O(e,t,a){a=s.getTextureConfigKey(t,a),a=_cachedTextureGeneratorSettings[a];a&&angular.merge(e,a)}s.isGenerator=angular.isObject(c.generator),s.isTextureChannels=angular.isObject(c.textureChannels),s.isCharacterSeparation=angular.isDefined(c.referenceId),s.isNormalMap=s.isGenerator&&"normal"===c.generator.mode,s.isDepthMap=s.isGenerator&&"depth"===c.generator.mode,s.canCancelCompiler=!1,s.isSheet=c.isSheet,s.undoStack=[],s.redoStack=[],s.showHierarchy=s.isSheet||s.isTextureChannels,c.isSheet?(s.title="ui_editor_character_separation_sheet_title",s.hierarchy=[{label:i.instant("ui_editor_character_separation_hierarchy_body").toString(),depth:0,fg:"projects/temp/edit/src.png",needsInit:!0}]):s.isNormalMap?(s.isComputingGrabCut=!0,s.title="ui_editor_character_separation_normalmap_title",s.hierarchy=[{label:i.instant("ui_editor_character_separation_hierarchy_body").toString(),depth:0,src:"projects/temp/edit/src.png",dst:"projects/temp/edit/normal.png",fg:"projects/temp/edit/normal.png"}]):s.isDepthMap?(s.isComputingGrabCut=!0,s.canCancelCompiler=!0,s.title="ui_editor_character_separation_depthmap_title",s.hierarchy=[{label:i.instant("ui_editor_character_separation_hierarchy_body").toString(),depth:0,src:"projects/temp/edit/src.png",dst:"projects/temp/edit/depth.png",fg:"projects/temp/edit/depth.png"}]):s.isTextureChannels?(s.canCancelCompiler=!0,s.title="ui_editor_character_separation_texture_channels_title",s.titleHierarchy="ui_editor_character_separation_channels",s.hierarchyAddLabel="ui_editor_character_separation_add_channel",s.hierarchy=[{label:i.instant("ui_editor_character_separation_hierarchy_puppet").toString(),depth:0,isPuppet:!0}]):(s.title="ui_editor_character_separation_title",s.titleHierarchy="ui_editor_character_separation_hierarchy_title",s.hierarchyAddLabel="ui_editor_character_separation_hierarchy_add_limb",s.hierarchy=[{label:i.instant("ui_editor_character_separation_hierarchy_body").toString(),depth:0,src:"projects/temp/edit/src.png",mask:"projects/temp/edit/mask.png",bg:"projects/temp/edit/bg.png",fg:"projects/temp/edit/fg.png",needsInit:!0}]),s.colorPickerSettings=l.getColorPickerDefaults(),s.selected={limb:s.hierarchy[0]},s.mask={opacity:50,fadeBg:!0,visible:!0},s.view={},t(function(){var e=document.getElementsByClassName("modal-content")[0];s.view.bgColor=window.getComputedStyle(e).getPropertyValue("background-color"),s.view.defaultBGColor=s.view.bgColor,p=angular.element(document.getElementsByClassName("painter")[0]),s.$watch("view.bgColor",function(e){p.css({"background-color":e})}),angular.element(document.getElementsByClassName("editorCharacterSeparationModal")[0]).on("keydown.editor.characterseparation",function(e){switch(e.which){case 77:s.mask.visible=!s.mask.visible,window.cancelEventBubble(e),window.safeApply(s);break;case 82:s.isGenerator||s.rebuildGrabCut()}})}),s.previewState={active:"original",cache:{},bgImgUrl:""},s.normalConfig=b(),s.depthConfig=_(),s.textureChannelConfig={alphaWriting:!0},s.rebuildNormalMapOnDemand=P,s.rebuildDepthMapOnDemand=M,s.performUndo=function(){var e=s.undoStack.pop();s.redoStack.push(s.lastState),e||(s.previewState.cache={}),s.dcConfig.loadState(e),s.lastState=e,E(e)},s.performRedo=function(){var e=s.redoStack.pop();s.undoStack.push(s.lastState),s.dcConfig.loadState(e),s.lastState=e,E(e)},s.performReset=function(){o.open("genericConfirm",{data:{title:"ui_editor_character_separation_modal_reset_title",message:"ui_editor_character_separation_modal_reset_body",leftIcon:"images/warning.png",okVisible:!0,cancelVisible:!0}}).then(function(){s.hasPaintedAnything=!1,s.previewState.cache={},s.selected.limb.needsInit=!0,s.previewState.active="original",s.undoStack.push(s.lastState),S(),v=!0,s.dcConfig.resetMask(),v=!1,s.blinkAnalyzeOnDemand=!1})},s.resetView=function(){s.dcConfig.resetView(),s.mask.opacity=50,s.mask.visible=!0,s.view.bgColor=s.view.defaultBGColor},s.dcPaintCallback=function(e){s.hasPaintedAnything=!0,s.undoStack.push(s.lastState),S(),s.lastState=e,s.dcConfig.autoAnalyze?E(e):s.blinkAnalyzeOnDemand=!0},s.rebuildGrabCut=function(){s.lastState&&E(s.lastState)},s.rebuildGrabCutOnDemand=function(){s.dcConfig.autoAnalyze?s.rebuildGrabCut():s.blinkAnalyzeOnDemand=!0},s.ok=function(){s.isCancellingCompiler||(s.isNormalMap?s.writeConfigToCache(c.generator.material,c.generator.textureIndex):s.isDepthMap&&s.writeConfigToCache(c.generator.renderable),s.isGenerator?n.close({dst:s.dstPath,desiredFilename:s.targetFilename}):o.open("genericConfirm",{data:{title:c.isSheet?"ui_editor_character_separation_modal_confirm_sheet_title":"ui_editor_character_separation_modal_confirm_title",message:c.isSheet?"ui_editor_character_separation_modal_confirm_sheet_body":"ui_editor_character_separation_modal_confirm_body",okVisible:!0,cancelVisible:!0}}).then(function(){if(c.isSheet){var e=function(){for(var e=[],t=[],a=1;a<s.hierarchy.length;++a){var i=s.hierarchy[a],n=s.hierarchy.filter(function(e){return e.parent===i.parent}).last(),o=s.hierarchy.filter(function(e){return e.parent===i}).empty();t.includes(i.parent)||(t.push(i.parent),e.push(n.bg)),o&&e.push(i.fg)}return e}();return s.isGeneratingSheet=!0,r.callEditor("finishCharacterSheetCreation",e,c.dstPath).then(function(e){s.isGeneratingSheet=!1,n.close(e.path)}).catch(function(){s.isGeneratingSheet=!1})}n.close({bg:"projects/temp/edit/bg.png",fg:"projects/temp/edit/fg.png"})}))},s.cancel=function(){var e=a.when();s.isComputingGrabCut&&s.canCancelCompiler&&(s.canCancelCompiler=!1,s.isCancellingCompiler=!0,e=r.callEditor("cancelForegroundCompiler")),e.then(function(){h&&!s.isCancellingCompiler?o.open("genericConfirm",{data:{title:"ui_cancel",message:"ui_editor_character_separation_cancel_editing_body",cancelVisible:!0,okVisible:!0}}).then(function(){n.dismiss()}):n.dismiss()})},s.addLimb=function(){var i={title:"ui_editor_character_separation_hierarchy_add_limb",message:"ui_editor_character_separation_hierarchy_add_limb_body",textinputVisible:!0,textinput:"",textinputRequired:!0,cancelVisible:!0,okVisible:!0};return o.open("genericConfirm",{data:i}).then(function(){for(var e={parent:s.selected.limb,label:i.textinput.trim()||"limb",depth:s.selected.limb.depth+1,bg:y("limb_bg"),fg:y("limb_fb"),mask:y("limb_mask"),needsInit:!0},t=e.depth,a=s.hierarchy.indexOf(s.selected.limb)+1;a<s.hierarchy.length&&!(s.hierarchy[a].depth<t);++a);s.hierarchy.splice(a,0,e),k(),x(),s.selected.limb=e})},s.removeLimb=function(a){s.isSheet&&i(["ui_editor_character_separation_hierarchy_remove_limb_title","ui_editor_character_separation_hierarchy_remove_limb_body"],{name:a.label}).then(function(e){return o.open("genericConfirm",{data:{title:e.ui_editor_character_separation_hierarchy_remove_limb_title,message:e.ui_editor_character_separation_hierarchy_remove_limb_body,cancelVisible:!0,okVisible:!0}})}).then(function(){var e,t=s.hierarchy.indexOf(a);t<0||(s.hierarchy.splice(t,1),(e=function(t){var a=[];angular.forEach(s.hierarchy,function(e){t.includes(e.parent)&&(--e.depth,a.push(e))}),0<a.length&&e(a)})([a]),s.selected.limb=a.parent,k(),x())})},s.isTextureChannels&&(u=function(e){i(["ui_editor_character_separation_texture_channel_import_size_error_title","ui_editor_character_separation_texture_channel_import_size_error_body"],{width:e.puppetwidth,height:e.puppetheight}).then(function(e){return o.open("genericConfirm",{data:{title:e.ui_editor_character_separation_texture_channel_import_size_error_title,message:e.ui_editor_character_separation_texture_channel_import_size_error_body,leftIcon:"images/warning.png",okVisible:!0,okText:"ui_close"}})})},s.addLimb=function(){r.callEditor("genericSceneAction","addTextureChannel",c.textureChannels.renderable).then(function(e){e.error?u(e):(e={id:e.id,parent:s.hierarchy[0],label:e.defaultlabel,name:"",depth:1,fg:e.texture,crops:e.crops},s.hierarchy.push(e),x(),s.selected.limb=e)})},s.removeLimb=function(t){i(["ui_editor_character_separation_hierarchy_remove_channel_title","ui_editor_character_separation_hierarchy_remove_channel_body"],{name:t.label}).then(function(e){return o.open("genericConfirm",{data:{title:e.ui_editor_character_separation_hierarchy_remove_channel_title,message:e.ui_editor_character_separation_hierarchy_remove_channel_body,cancelVisible:!0,okVisible:!0}})}).then(function(){return r.callEditor("genericSceneAction","removeTextureChannel",c.textureChannels.renderable,t.id)}).then(function(){var e=s.hierarchy.indexOf(t);e<0||(s.hierarchy.splice(e,1),s.selected.limb=t.parent,x())})},s.moveChannel=function(e,t){var a=s.hierarchy.indexOf(e);a<=1&&t||a>=s.hierarchy.length-1&&!t||r.callEditor("genericSceneAction","moveTextureChannel",c.textureChannels.renderable,e.id,t).then(function(){s.hierarchy.findAndRemove(e),a+=t?-1:1,s.hierarchy.splice(a,0,e),x()})},s.replaceTexture=function(t){r.callEditor("genericSceneAction","replaceTextureChannel",c.textureChannels.renderable,t.id).then(function(e){e.error?u(e):(t.label=e.defaultlabel,t.fg=e.texture,t.crops=e.crops,t.error=e.error,s.previewState.cache={},T(),A())})},s.ok=function(){r.callEditor("genericSceneAction","finishTextureChannelEditing",c.textureChannels.renderable,s.textureChannelConfig.alphaWriting).then(function(e){e&&e.error?o.open("genericConfirm",{data:{title:"ui_editor_character_separation_texture_channel_saving_error_generic",message:e.error,leftIcon:"images/warning.png",okVisible:!0,okText:"ui_close"}}):n.close()})},s.cancel=function(){r.callEditor("genericSceneAction","cancelTextureChannelEditing",c.textureChannels.renderable),n.dismiss()},s.textureChannelConfig.alphaWriting=c.textureChannels.alphaWriting),s.openHelpURL=function(){l.openUrl(l.url.docsSceneForegroundSeparation)},s.$watch("previewState.active",T),s.$watch("previewState.cache",T),s.isLoading=!0,s.getTextureConfigKey=function(e,t){return angular.isUndefined(t)&&(t=0),(s.isNormalMap?"n:":s.isDepthMap?"d:":"?:")+getTextureGeneratorConfigKey(e,t)},s.writeConfigToCache=function(e,t){var a,e=s.getTextureConfigKey(e,t),i={},t={};s.isNormalMap?(a=s.normalConfig,t=b()):s.isDepthMap&&(a=s.depthConfig,t=_()),angular.forEach(t,function(e,t){angular.isDefined(a[t])&&(i[t]=a[t])}),_cachedTextureGeneratorSettings[e]=i},s.resetSettings=function(){s.isNormalMap?angular.merge(s.normalConfig,b()):s.isDepthMap&&angular.merge(s.depthConfig,_())},s.isCharacterSeparation?(s.changeEditMode=function(e){s.dcConfig.editMode=e},r.callEditor("genericSceneAction","prepareCharacterSeparation",c.referenceId).then(function(e){e.success&&(s.dcConfig={w:e.w,h:e.h,editMode:"polygon",brush:"foreground",brushSize:20,maskBias:-1,maskQuality:1,maskSmoothing:1,fillGaps:c.isSheet?15:100,autoAnalyze:!0,enabled:!1,drawFailed:s.addLimb},s.isLoading=!1,s.$watch("selected.limb",function(t){s.dcConfig.enabled=!1,s.previewState.cache={},s.undoStack=[],s.redoStack=[],C(t.src||t.fg).then(function(e){s.previewState.bgImgUrl=e,T(),s.dcConfig.enabled=!!t.src}),s.dcConfig.loadState&&(t.state?s.dcConfig.loadState(t.state):s.dcConfig.clearImage())}))})):s.isNormalMap?r.callEditor("genericSceneAction","prepareNormapMapGeneration",c.generator.material,c.generator.textureIndex).then(function(e){e.success&&(s.dcConfig={w:e.w,h:e.h,brush:"",brushSize:20,maskBias:-1,maskQuality:1,maskSmoothing:2,fillGaps:15,autoAnalyze:!1,enabled:!0,readonly:!0},O(s.normalConfig,c.generator.material,c.generator.textureIndex),s.isLoading=!1,s.mask.fadeBg=!1,s.targetFilename=e.filename,C(s.selected.limb.src).then(function(e){s.previewState.bgImgUrl=e,T()}),P())}):s.isDepthMap?r.callEditor("genericSceneAction","prepareDepthMapGeneration",c.generator.renderable).then(function(e){e.success&&(s.dcConfig={w:e.w,h:e.h,brush:"",brushSize:20,maskBias:-1,maskQuality:1,maskSmoothing:2,fillGaps:15,autoAnalyze:!1,enabled:!0,readonly:!0},O(s.depthConfig,c.generator.renderable),s.isLoading=!1,s.mask.fadeBg=!1,s.targetFilename=e.filename,C(s.selected.limb.src).then(function(e){s.previewState.bgImgUrl=e,T()}),M())}):s.isTextureChannels&&r.callEditor("genericSceneAction","prepareTextureChannelEditing",c.textureChannels.renderable).then(function(e){e.success&&(s.dcConfig={w:e.width,h:e.height,brush:"",brushSize:20,maskBias:-1,maskQuality:1,maskSmoothing:2,fillGaps:15,autoAnalyze:!1,enabled:!0,readonly:!0},s.isLoading=!1,s.mask.fadeBg=!1,s.previewState.active="foreground_original",angular.element("#fgImage").on("load",function(){A()}),C(e.preview).then(function(e){s.previewState.bgImgUrl=e,T()}),r.callEditor("genericSceneAction","getTextureChannels",c.textureChannels.renderable).then(function(e){angular.isArray(e)&&angular.forEach(e,function(e){e={id:e.id,parent:s.hierarchy[0],label:e.name.trim()||e.defaultlabel,name:e.name,depth:1,fg:e.texture,crops:e.crops,error:e.error};s.hierarchy.push(e),x()})}),s.$watch("selected.limb",function(e){s.previewState.cache={},s.mask.fadeBg=e!==s.hierarchy[0],T(),A()}))}),t(function(){s.$broadcast("rzSliderForceRender")},250),t(function(){s.$broadcast("rzSliderForceRender")},500)}]);var _LastExportSettings={};angular.module("wallpaperbrowserApp").controller("EditorExportModalCtrl",["$q","$scope","$translate","$timeout","$uibModalInstance","modals","utils","skin","host","data",function(t,a,i,n,o,e,r,s,l,c){(window.exportStatusCtrl=a).page="initial",a.exportProgressValue=0;var d,p=i.instant("ui_editor_export_modal_settings_format_external");a.formats=[{label:"MP4 (h.264)",value:"mp4_h264"},{label:"WMV",value:"wmv_3"},{label:"AVI",value:"avi"},{label:"ui_editor_export_modal_settings_format_png",value:"png"},{label:"FFmpeg MP4 h.264 "+p,value:"ffmpeg_mp4_h264"},{label:"FFmpeg MP4 h.265 "+p,value:"ffmpeg_mp4_h265"},{label:"FFmpeg WEBM VP8 "+p,value:"ffmpeg_mp4_vp8"},{label:"FFmpeg WEBM VP9 "+p,value:"ffmpeg_mp4_vp9"},{label:"FFmpeg GIF "+p,value:"ffmpeg_gif"},{label:"FFmpeg AVI RGB24 "+p,value:"ffmpeg_avi_raw"},{label:"FFmpeg AVI YUV 4:2:2 "+p,value:"ffmpeg_avi_yuv422"},{label:"FFmpeg AVI YUV 4:2:0 "+p,value:"ffmpeg_avi_yuv420"}].filter(function(e){return!e.hidden}),a.settings={width:1920,height:1080,fps:30,bitrate:8e6,duration:5,blend:1,format:"mp4_h264"},angular.extend(a.settings,_LastExportSettings),c.project&&c.project.scenegeneraldata&&c.project.scenegeneraldata.orthogonalprojection&&(d=c.project.scenegeneraldata.orthogonalprojection.width,p=c.project.scenegeneraldata.orthogonalprojection.height,d&&p&&(_LastExportSettings.dwidth===d&&_LastExportSettings.dheight===p||(a.settings.width=a.settings.dwidth=d,a.settings.height=a.settings.dheight=p))),a.updateExportStatus=function(e){a.exportProgressValue=e.progress,e.error?(r.showError(i.instant(e.error)),a.page="initial",a.disableCancel=!0):e.complete&&(a.disableCancel=!0,n(function(){o.close()},3e3))},a.startExport=function(){var e=t.when();(e=a.settings.format.startsWith("ffmpeg_")?l.promptExternalApp(c.editorSettings,"externalpathffmpeg","FFmpeg","ffmpeg.exe"):e).then(function(){a.disableCancel=!1,_LastExportSettings=angular.copy(a.settings),a.page="export",l.callEditor("startVideoExport",a.settings).catch(function(){a.disableCancel=!0,a.page="initial"})})},a.cancelExport=function(){a.disableCancel=!0,l.callEditor("cancelVideoExport").then(function(){a.page="initial"})},a.cancel=function(){o.dismiss("cancel")}}]),angular.module("wallpaperbrowserApp").controller("EditorEULAModalCtrl",["$scope","$translate","$timeout","utils","host","$uibModalInstance",function(e,t,a,i,n,o){var r,s=!0;e.waitingAnim="",e.showWaitingAnim=!1;function l(){e.showWaitingAnim=!0,e.waitingAnim+=".",3<e.waitingAnim.length&&(e.waitingAnim=""),r=a(l,1e3)}e.showEULA=function(){a.cancel(r),e.waitingAnim="",r=a(l,1e3),window.ui.shellexecute(i.getWorkshopAgreementURL())},e.cancel=function(){s=!1,o.dismiss("cancel")},e.$on("$destroy",function(){s=!1,a.cancel(r)});function c(){return n.callUI("checkWorkshopAgreementRequired").then(function(e){s&&(e?a(c,3e3):o.close())})}a(c,3e3)}]),angular.module("wallpaperbrowserApp").controller("DLCPromptModalCtrl",["$scope","$timeout","$translate","$uibModalInstance","modals","utils","host","data",function(t,e,a,i,n,o,r,s){var l;function c(){l=e(c,1e3),r.callEditor("getDLCDownloadProgress",s.dlc.id()).then(function(e){e.success&&(t.info.bytesDownloaded=e.downloaded,t.info.bytesTotal=e.total,0<e.total&&(t.info.downloadProgress=Math.round(100*Math.max(0,Math.min(1,e.downloaded/e.total)))),e.finished&&i.close())})}function d(){e.cancel(l),t.info.isDownloading=!0,t.info.messageText="ui_editor_modal_dlc_prompt_message_progress",c()}(s=angular.copy(s)).dlc.name=a.instant(s.dlc.name).toString(),t.data=s,t.info={isDownloading:!1,bytesDownloaded:0,bytesTotal:s.dlc.dlSize,downloadProgress:0},t.supportsDLCManagement=o.supportsDLCManagement(),t.supportsDLCManagement?(t.info.messageText="ui_editor_modal_dlc_prompt_message_ask_download",r.callEditor("isDLCInstalled",s.dlc.id()).then(function(e){e.installed&&d()})):t.info.messageText="ui_editor_modal_dlc_prompt_message_ask_manual",t.formatSize=o.formatSize,t.ok=function(){t.supportsDLCManagement&&!t.info.isDownloading&&(d(),r.callEditor("installDLC",s.dlc.id()))},t.cancel=function(){var e;t.info.isDownloading&&(e=a.instant(s.dlc.name),n.open("genericConfirm",{data:{title:a.instant("ui_editor_modal_dlc_prompt_cancel_download_title",{name:e}),message:a.instant("ui_editor_modal_dlc_prompt_cancel_download_message",{name:e}),cancelVisible:!0,cancelText:"ui_no",okVisible:!0,okText:"ui_yes"}}).then(function(){r.callEditor("uninstallDLC",s.dlc.id())})),i.dismiss("cancel")},t.$on("$destroy",function(){e.cancel(l)})}]),angular.module("wallpaperbrowserApp").controller("EditorCleanProjectModalCtrl",["$scope","$uibModalInstance","utils","host","data",function(t,a,i,n,e){t.data=e,t.ok=function(){var e=t.files.filter(e=>e.checked).map(e=>e.path);e.empty()?a.close():(t.waitingForResponse=!0,n.callEditor("cleanUnusedAssets",e).then(function(){t.waitingForResponse=!1,a.close()}).catch(function(){t.waitingForResponse=!1,a.close()}))},t.cancel=function(){a.dismiss("cancel")},t.navigateToFile=function(e){n.callEditor("navigateToFile",e)},t.waitingForResponse=!0,t.files=[],n.callEditor("getUnusedAssets").then(function(e){t.waitingForResponse=!1,angular.forEach(e,function(e){e.checked=!0,e.filesizelabel=i.formatSize(e.size,!0)}),t.files=e}).catch(function(){t.waitingForResponse=!1})}]),angular.module("wallpaperbrowserApp").controller("EditorSystemResourcesModalCtrl",["$scope","$uibModalInstance","data",function(e,t,a){e.systemTextures=[{label:"ui_editor_system_resource_modal_texture_media_thumbnail",value:"$mediaThumbnail"},{label:"ui_editor_system_resource_modal_texture_media_thumbnail_previous",value:"$mediaPreviousThumbnail"}],e.selected={item:a.item||e.systemTextures[0].value},e.ok=function(){t.close(e.selected.item)},e.cancel=function(){t.dismiss("cancel")}}]),angular.module("wallpaperbrowserApp").controller("EditorExpressionMatrixModalCtrl",["$scope","$translate","$timeout","data","utils","host","$uibModalInstance",function(e,t,a,i,n,o,r){e.data={dimensions:1,modifydefault:!1,xmin:0,xmax:1,ymin:0,ymax:1},angular.extend(e.data,i||{}),e.optionsDimensions=[{label:"1",value:1},{label:"2",value:2}],e.ok=function(){e.data.xmax<=e.data.xmin&&(e.data.xmax=1),e.data.ymax<=e.data.ymin&&(e.data.ymax=1),r.close(e.data)},a(function(){e.$broadcast("rzSliderForceRender")},250)}]),angular.module("wallpaperbrowserApp").controller("EditorBlendShapeSettingsModalCtrl",["$scope","$translate","$timeout","data","utils","host","$uibModalInstance",function(e,t,a,i,n,o,r){e.data={settings:{modifierbone:"",modifiermode:"point",modifierstartdistance:200,modifierenddistance:150}},angular.extend(e.data.settings,i.settings||{}),e.optionsBones=angular.copy(i.bones),e.optionsBones.unshift({value:"",label:"ui_editor_properties_none"}),e.optionsMode=[{value:"point",label:"ui_editor_properties_point"},{value:"axis",label:"ui_editor_properties_axis"}],e.ok=function(){r.close(e.data.settings)},a(function(){e.$broadcast("rzSliderForceRender")},250)}]),angular.module("wallpaperbrowserApp").run(["$templateCache",function(e){e.put("views/ci/changelog.html",'<div><div class="changelogHeadline">REV 4251</div> <pre class="changelogBody">- Android kotlin garbage brokenness.\n- Fixed cloudmotion effect on ogl.\n- Hide particle normal map texture without lighting/refraction.\n- Fixed particle collision not rendering in particle editor.\n</pre><div class="changelogHeadline">REV 4250</div> <pre class="changelogBody">- Stupid arbitrary google play native compile requirement.\n- Fixed snackbar inset in preview activity due to stupid enforced edge to edge totally buggy UI framework behavior.\n- Added clamp uvs option to texture import window.\n- More work on voronoi texture helper.\n- Fixed SIMD utils not initializing on android.\n- Added new fire gradient.\n</pre><div class="changelogHeadline">REV 4249</div> <pre class="changelogBody">- Prevented wallpaper cache write if parse thread was interrupted.\n- Disabled voronoi utilities in release mode.\n</pre><div class="changelogHeadline">REV 4248</div> <pre class="changelogBody">- Version bump.\n- Added neutral lut.\n- More voronoi generation utilities.\n- Fixed user shortcut test button for the script callback.\n</pre><div class="changelogHeadline">REV 4247</div> <pre class="changelogBody">- Improved icon thumbnail rendering.\n- Added experimental compiler puppet animations post smoothing.\n- Added user property editor test buttons for user textures and user shortcuts.\n- Improved editor click selection priority for complex measures where floating point imprecision leads to unexpected sorting.\n</pre><div class="changelogHeadline">REV 4246</div> <pre class="changelogBody">- Lock font-family for tree view box elements without icons in all languages.\n</pre><div class="changelogHeadline">REV 4245</div> <pre class="changelogBody">- Fixed editor model dialog crashing during model recompile.\n</pre><div class="changelogHeadline">REV 4244</div> <pre class="changelogBody">- Added new g_LayerModelMatrix constant to access unmodified model transform in effects.\n</pre><div class="changelogHeadline">REV 4243</div> <pre class="changelogBody">- Improved parallelism of steam subscription list query and subscription cache writing.\n</pre><div class="changelogHeadline">REV 4242</div> <pre class="changelogBody">- Another insane special function to **manually** parse the custom icon from a .url file because the Win API doesn\'t just FRIGGIN do it.\n- Further fixes for hierarchy dragging with multiple collapsed items.\n</pre><div class="changelogHeadline">REV 4241</div> <pre class="changelogBody">- Locked media thumbnail generator to 256 cause with higher requests it will screw up potential fallback icons that it still outputs.\n- Added default favicon path as a fallback to web shortcut loader.\n</pre><div class="changelogHeadline">REV 4240</div> <pre class="changelogBody">- Fixed uninitialized variable in thumbnail cache.\n</pre><div class="changelogHeadline">REV 4239</div> <pre class="changelogBody">- Added async loader support to dirty material refresh process.\n- Reduced general settings callback to language only.\n- Added **INSANE BS** to manually resolve .lnk files in 32-bit and do STUPID STRING operations to check for the 64-bit path which cannot be simply resolved by Windows in a clean way.\n- Added **MORE INSANE BS** to load an icon from all image lists and do a pixel by pixel comparison to realize when Windows is using a SMALLER THAN REQUESTED icon but "scales" it up in a useless way by putting it into the top left of an EMPTY BITMAP. And not a single Windows API function returns the true size of an icon, not. a. single. one. of like a DOZEN different APIs that I ALL had to test.\n</pre><div class="changelogHeadline">REV 4238</div> <pre class="changelogBody">- Fixed scene hierarchy drag & drop with collapsed elements in the list.\n- Fixed workshop effect list not collapsing in gallery view.\n</pre><div class="changelogHeadline">REV 4237</div> <pre class="changelogBody">- Fixed handling of gif shortcut textures.\n- Android studio update nonsense.\n</pre><div class="changelogHeadline">REV 4236</div> <pre class="changelogBody">- Fixed effect layer shared render target collisions with parents that use prerendering.\n</pre><div class="changelogHeadline">REV 4235</div> <pre class="changelogBody">- Fixed user shortcuts leading to video files being interpreted as user video textures.\n- Added known folder support to shell icon thumbnails.\n</pre><div class="changelogHeadline">REV 4234</div> <pre class="changelogBody">- Forced default icon to folder if path is recognized as a directory but icon cannot be read.\n</pre><div class="changelogHeadline">REV 4233</div> <pre class="changelogBody">- Fixed web url not being adjusted on save.\n</pre><div class="changelogHeadline">REV 4232</div> <pre class="changelogBody">- Added search path to shell icon loader.\n- Properly cleared invalid shortcut value so textures get reset.\n- Added resize and cropping to web icons for bad touch icons that have arbitrary dimensions.\n</pre><div class="changelogHeadline">REV 4231</div> <pre class="changelogBody">- Fixed relative url icon loader not respecting redirect of original request.\n- Made UI add url protocol automatically if missing so short urls will be accepted.\n</pre><div class="changelogHeadline">REV 4230</div> <pre class="changelogBody">- Moved thumbnail cache into separate file.\n- Fixed click interactions being registered on top level list views.\n</pre><div class="changelogHeadline">REV 4229</div> <pre class="changelogBody">- Made user shortcut properties selectable for texture bindings.\n- Added uri thumbnail loading to media system.\n- Added custom thumbnail file cache for shell thumbnail texture loading.\n- Changed ico loading from unknown to always load largest integrated bitmap.\n</pre><div class="changelogHeadline">REV 4228</div> <pre class="changelogBody">- Updated locales.\n</pre><div class="changelogHeadline">REV 4227</div> <pre class="changelogBody">- Fixed selection rect for world space particles.\n</pre><div class="changelogHeadline">REV 4226</div> <pre class="changelogBody">- Added doc button to particle editor.\n- Removed blendmode option from blend effects when writing alpha.\n- Fixed command args not being split properly from user shortcut.\n- Added file member to user shortcut info in scenescript.\n</pre><div class="changelogHeadline">REV 4225</div> <pre class="changelogBody">- Changed write alpha function in blend effects to perform proper alpha and color transition.\n</pre><div class="changelogHeadline">REV 4224</div> <pre class="changelogBody">- Fixed HSV init random UI being black due to garbage web builder scripts.\n- Added disable click propagation button to image, text and model layers.\n- Implemented disable click propagation and 3D click sorting.\n- Added default angles for control points.\n</pre><div class="changelogHeadline">REV 4223</div> <pre class="changelogBody">- Added token for disable interaction propagation.\n</pre><div class="changelogHeadline">REV 4222</div> <pre class="changelogBody">- Prevented deletion of custom effect source files in project clean dialog.\n</pre><div class="changelogHeadline">REV 4221</div> <pre class="changelogBody">- Fixed some translation issues.\n</pre><div class="changelogHeadline">REV 4220</div> <pre class="changelogBody">- Simpler description for sprite trail renderer.\n</pre><div class="changelogHeadline">REV 4219</div> <pre class="changelogBody">- Added generic hint to user shortcut modal.\n</pre><div class="changelogHeadline">REV 4218</div> <pre class="changelogBody">- Removed user shortcut properties from json sharing.\n- Fixed hierarchy not closing in editor anymore.\n- Fixed blend transform not being scaled with texture reduction.\n</pre><div class="changelogHeadline">REV 4217</div> <pre class="changelogBody">- Added unique system id to user shortcut config.\n- Check variant names when filtering effect groups.\n- Remember effect modal view in editor session.\n- Fixed long user property labels breaking user property tab in editor.\n- Added ability to set custom property order for shader parameters in editor.\n- Added proper default values for size random initializer in 2D scenes.\n- Fixed user shortcut script scope closing too early when hitting multiple layers.\n</pre><div class="changelogHeadline">REV 4216</div> <pre class="changelogBody">- Renamed system command modal.\n</pre><div class="changelogHeadline">REV 4215</div> <pre class="changelogBody">- Don\'t show preset publish options when there are only user shortcut properties.\n</pre><div class="changelogHeadline">REV 4214</div> <pre class="changelogBody">- Fixed user shortcut workshop tag support.\n</pre><div class="changelogHeadline">REV 4213</div> <pre class="changelogBody">- Renamed system command workshop tag to user shortcut\n</pre><div class="changelogHeadline">REV 4212</div> <pre class="changelogBody">- Renamed system command to user shortcut. engine.openUserShortcut for scripts and changed property type to usershortcut.\n</pre><div class="changelogHeadline">REV 4211</div> <pre class="changelogBody">- Removed dome template.\n- Made sorting of Workshop assets alphabetical.\n- Added sort by last date modified to open wallpaper modal in editor.\n</pre><div class="changelogHeadline">REV 4210</div> <pre class="changelogBody">- Fixed minimode/restore window behavior.\n- Improved system command window layout in minimode.\n</pre><div class="changelogHeadline">REV 4209</div> <pre class="changelogBody">- Added fixed script system command types visible to creators.\n</pre><div class="changelogHeadline">REV 4208</div> <pre class="changelogBody">- Added test button for user system commands.\n</pre><div class="changelogHeadline">REV 4207</div> <pre class="changelogBody">- Added security warning to text inputs for system commands.\n</pre><div class="changelogHeadline">REV 4206</div> <pre class="changelogBody">- Added system command user property to open custom files/application/websites from a scene wallpaper.\n</pre><div class="changelogHeadline">REV 4205</div> <pre class="changelogBody">- Made asset layer publishing process consider child layer types of transform parent layers.\n- Added hardware compression padding to texture sheets.\n</pre><div class="changelogHeadline">REV 4204</div> <pre class="changelogBody">- Fixed error texture for invalid external texture reference not being marked as missing anymore.\n</pre><div class="changelogHeadline">REV 4203</div> <pre class="changelogBody">- Fixed effect list modal not setting droplist index when changing items in gallery view to a workshop asset.\n</pre><div class="changelogHeadline">REV 4202</div> <pre class="changelogBody">- Fixed hierarchy transform code in client again.\n- Improved general settings scene event.\n</pre><div class="changelogHeadline">REV 4201</div> <pre class="changelogBody">- Android development continues to be absolute garbage.\n</pre><div class="changelogHeadline">REV 4200</div> <pre class="changelogBody">- Added option to disable LUT back.\n</pre><div class="changelogHeadline">REV 4199</div> <pre class="changelogBody">- Added LUT materials.\n</pre><div class="changelogHeadline">REV 4198</div> <pre class="changelogBody">- Added LUT materials.\n</pre><div class="changelogHeadline">REV 4197</div> <pre class="changelogBody">- Added final LUTs.\n</pre><div class="changelogHeadline">REV 4196</div> <pre class="changelogBody">- Fixed lut options not being part of wallpaper defaults.\n</pre><div class="changelogHeadline">REV 4195</div> <pre class="changelogBody">- Fixed collision behavior not being applied through new template path for rotation controls.\n- Disabled collision rotation behavior if there is no rotation used by the particle format.\n</pre><div class="changelogHeadline">REV 4194</div> <pre class="changelogBody">- Added applyGeneralSettings script callback to read a couple of general settings in scene wallpaper scripts.\n</pre><div class="changelogHeadline">REV 4193</div> <pre class="changelogBody">- Fixed layer pivot translate optimization.\n</pre><div class="changelogHeadline">REV 4192</div> <pre class="changelogBody">- Added gt, le, lt condition operators to passes etc.\n</pre><div class="changelogHeadline">REV 4191</div> <pre class="changelogBody">- Added complex condition support to shader passes, FBOs, bindings (only supporting ge operator for now).\n</pre><div class="changelogHeadline">REV 4190</div> <pre class="changelogBody">- Improved ember large preset and added ember beam preset.\n- Added Belarusian as custom language.\n</pre><div class="changelogHeadline">REV 4189</div> <pre class="changelogBody">- New ember preview videos.\n</pre><div class="changelogHeadline">REV 4188</div> <pre class="changelogBody">- Fixed plane collision visualization when control point is world space but system isn\'t.\n</pre><div class="changelogHeadline">REV 4187</div> <pre class="changelogBody">- Fixed scene hierarchy vis toggles getting off sync with state on tree rebuild.\n- Changed project and fullscreen layers on preset/workshop import to not apply shared camera center.\n</pre><div class="changelogHeadline">REV 4186</div> <pre class="changelogBody">- Adding preview videos back.\n</pre><div class="changelogHeadline">REV 4185</div> <pre class="changelogBody">- Trying to move preview videos to lfs.\n</pre><div class="changelogHeadline">REV 4184</div> <pre class="changelogBody">- Fixed new midas call structure.\n</pre><div class="changelogHeadline">REV 4183</div> <pre class="changelogBody">- Updated pymidas.\n</pre><div class="changelogHeadline">REV 4182</div> <pre class="changelogBody">- Added element preview videos.\n</pre><div class="changelogHeadline">REV 4181</div> <pre class="changelogBody">- Added video previews for all element add dialogs.\n- Added basic static model particle collision based on geometry bounds.\n</pre><div class="changelogHeadline">REV 4180</div> <pre class="changelogBody">- Adding water preset previews.\n</pre><div class="changelogHeadline">REV 4179</div> <pre class="changelogBody">- Adding more particle element previews.\n</pre><div class="changelogHeadline">REV 4178</div> <pre class="changelogBody">- Disabled particle color override in hierarchy if root system doesn\'t apply override.\n- Made particle cache and materials reload on preset import.\n</pre><div class="changelogHeadline">REV 4177</div> <pre class="changelogBody">- Only load puppet ref if file exists on global file system.\n</pre><div class="changelogHeadline">REV 4176</div> <pre class="changelogBody">- Added texture stubs to non-compiled texture loads.\n</pre><div class="changelogHeadline">REV 4175</div> <pre class="changelogBody">- Added stop rotation on collision flag.\n</pre><div class="changelogHeadline">REV 4174</div> <pre class="changelogBody">- Updated Android to API 35.\n- Fixed event particle restarting emission on inherited property change.\n- Reverted playlist duration preference to built-in duration time picker because Google has fixed the crash half a year ago, after it having being known for TWO YEARS.\n- Fixed cpu downsampled read for RGB devices.\n- Fixed crash when using video player script functions on non-video layer.\n- Fixed planar reflection rendering.\n- Made editor recognize video assets from precached asset list.\n- Changed light limit errors to only be shown once during project open time.\n</pre><div class="changelogHeadline">REV 4173</div> <pre class="changelogBody">- Made new particle system code compatible with Android compilation.\n</pre><div class="changelogHeadline">REV 4172</div> <pre class="changelogBody">- Updated new stock particle sizes and added more variations.\n</pre><div class="changelogHeadline">REV 4171</div> <pre class="changelogBody">- Added rain screen stock particle.\n- Added min length to sprite trail renderer.\n- Added clamp output value to remap elements.\n- Limited framebuffer updates to one per particle system.\n- Added random seed to remap noise transforms.\n</pre><div class="changelogHeadline">REV 4170</div> <pre class="changelogBody">- Added more stock particle textures.\n- Added new stock effects: vortex orb, color sparkle, rain splashes, water dripping/faucet/impact/droplets.\n- Made it possible to duplicate particle elements in editor.\n- Improved particle cutout shader option.\n- Added particle movement operator option to apply gravity in worldspace.\n</pre><div class="changelogHeadline">REV 4169</div> <pre class="changelogBody">- Built additional stock particle textures.\n</pre><div class="changelogHeadline">REV 4168</div> <pre class="changelogBody">- Added lock distance to control point operator.\n</pre><div class="changelogHeadline">REV 4167</div> <pre class="changelogBody">- Added sound spatialization params.\n</pre><div class="changelogHeadline">REV 4166</div> <pre class="changelogBody">- Implemented sound spatialization.\n</pre><div class="changelogHeadline">REV 4165</div> <pre class="changelogBody">- Finished rope trail renderer alpha/size fade.\n</pre><div class="changelogHeadline">REV 4164</div> <pre class="changelogBody">- Refactored particle sprite VBO update.\n</pre><div class="changelogHeadline">REV 4163</div> <pre class="changelogBody">- Began adding rope trail alpha and size fading for scrolling UVs.\n- Began working on sound spatialization.\n</pre><div class="changelogHeadline">REV 4162</div> <pre class="changelogBody">- Fixed vortex maintain distance with infinite axis.\n</pre><div class="changelogHeadline">REV 4161</div> <pre class="changelogBody">- Improved sphere emitter cone control.\n</pre><div class="changelogHeadline">REV 4160</div> <pre class="changelogBody">- Changed color correction to happen after basic color settings.\n</pre><div class="changelogHeadline">REV 4159</div> <pre class="changelogBody">- Fixed vortex operator infinite axis buffer setup.\n</pre><div class="changelogHeadline">REV 4158</div> <pre class="changelogBody">- Made luts compress to PNG to save space.\n</pre><div class="changelogHeadline">REV 4157</div> <pre class="changelogBody">- Added color correction user option to scenes.\n</pre><div class="changelogHeadline">REV 4156</div> <pre class="changelogBody">- Added 3d texture support to dxgi renderer.\n- Made texture browser fullscreen.\n- Added lut color correction to user post process image settings.\n- Made gizmo plane rotate with gizmo when x/y angles are unchanged.\n</pre><div class="changelogHeadline">REV 4155</div> <pre class="changelogBody">- Updated fontawesome to 6.7.2.\n</pre><div class="changelogHeadline">REV 4154</div> <pre class="changelogBody">- Added option to hide control point gizmo in editor.\n- Added stubs to make depth buffer readable in shaders.\n- Changed 2D multi gizmo to lock XY plane tool on world axes.\n</pre><div class="changelogHeadline">REV 4153</div> <pre class="changelogBody">- Added rotation support to control points.\n- Made emitters, vortex and map sequence around control point dependent on control point angles if applicable.\n- Made collision plane and quad dependent on cp angles.\n- Added inherit value from event initializer and operator.\n</pre><div class="changelogHeadline">REV 4152</div> <pre class="changelogBody">- Fixed child edit button in particle editor not connecting properly to new renderable.\n- Added prototype for inherit event value initializer/operator.\n- Changed boids speed cap to allow higher velocity if it was previously above cap.\n</pre><div class="changelogHeadline">REV 4151</div> <pre class="changelogBody">- Changed example 3D particles to use translucent but not additive blending.\n</pre><div class="changelogHeadline">REV 4150</div> <pre class="changelogBody">- Improved vortex operator with ring shape, pull and maintain distance.\n</pre><div class="changelogHeadline">REV 4149</div> <pre class="changelogBody">- Added cutout options to particle shaders.\n</pre><div class="changelogHeadline">REV 4148</div> <pre class="changelogBody">- Added refraction support to rope renderer.\n</pre><div class="changelogHeadline">REV 4147</div> <pre class="changelogBody">- Fixed tangent space of sprite trail renderer.\n- Added uv scrolling option and uv multiplier to rope renderer.\n- Sorted shader combo options for UI with dependencies in mind.\n- Removed unmodified control points from particle config.\n- Fixed particle emission stopping when rate becomes 0 due to instance multiplier.\n- Made particle editor show correct material options when only a rope renderer is active.\n</pre><div class="changelogHeadline">REV 4146</div> <pre class="changelogBody">- Fixed caustics effect on android.\n</pre><div class="changelogHeadline">REV 4145</div> <pre class="changelogBody">- Changed swap chain mode to flip sequential.\n</pre><div class="changelogHeadline">REV 4144</div> <pre class="changelogBody">- Added normal mapping support to particle rope.\n</pre><div class="changelogHeadline">REV 4143</div> <pre class="changelogBody">- Added particle instance control for color list initializer.\n- Added normal map for one smoke stock texture.\n</pre><div class="changelogHeadline">REV 4142</div> <pre class="changelogBody">- Added color list initializer.\n</pre><div class="changelogHeadline">REV 4141</div> <pre class="changelogBody">- Changed scene init DXGI factory to a more modern version.\n- Sort particle names in particle editor properly.\n- Added edit button to particle children.\n- Right align particle child entries to discern them better.\n- Made control points of presets import relative to layer origin.\n- Fixed z shadow projection switch for reverse depth in cascaded shadow maps.\n- Made gizmos render with multisampling.\n- Made periodic emission limit scale with particle instance count.\n- Added a flag to scale map initializers to scale with particle instance count.\n</pre><div class="changelogHeadline">REV 4140</div> <pre class="changelogBody">- Added glow to thunderbolt.\n- More fixes for child particle transforms.\n</pre><div class="changelogHeadline">REV 4139</div> <pre class="changelogBody">- Added lighting support for particles.\n- Added two new basic particle normal maps for lighting.\n- Fixed getWallpaper command line not processing monitor/location.\n</pre><div class="changelogHeadline">REV 4138</div> <pre class="changelogBody">- Added remap operator blending support.\n</pre><div class="changelogHeadline">REV 4137</div> <pre class="changelogBody">- Added min/max to remap vector component selection.\n</pre><div class="changelogHeadline">REV 4136</div> <pre class="changelogBody">- Finished remap operator.\n</pre><div class="changelogHeadline">REV 4135</div> <pre class="changelogBody">- Moving SSE utilities into separate library.\n- Replacing SSE constants with aligned arrays.\n</pre><div class="changelogHeadline">REV 4134</div> <pre class="changelogBody">- Began implementing remap operator.\n- New 2D simplex SSE noise generator.\n- Added remap transform functions.\n- Added global variables to remap elements.\n</pre><div class="changelogHeadline">REV 4133</div> <pre class="changelogBody">- Reverting Windows sdk to 22621 for testing.\n</pre><div class="changelogHeadline">REV 4132</div> <pre class="changelogBody">- Finished remap initial value element.\n</pre><div class="changelogHeadline">REV 4131</div> <pre class="changelogBody">- Progress on remap initial value.\n</pre><div class="changelogHeadline">REV 4130</div> <pre class="changelogBody">- Added new thunderbolt preset.\n- Continued work on remap initial value element.\n</pre><div class="changelogHeadline">REV 4129</div> <pre class="changelogBody">- Progress on particle attribute remap initializer.\n- Updated JSONcpp to 1.9.6.\n</pre><div class="changelogHeadline">REV 4128</div> <pre class="changelogBody">- Stubs for remap initial value element.\n</pre><div class="changelogHeadline">REV 4127</div> <pre class="changelogBody">- Changed command buffer structure and relaxed alignment requirement for buffers without vector instructions.\n</pre><div class="changelogHeadline">REV 4126</div> <pre class="changelogBody">- Added more options to disable various instance overrides for child particles.\n- Improved/fixed more child particle transform issues.\n- Added option to inherit control point from parent system\n</pre><div class="changelogHeadline">REV 4125</div> <pre class="changelogBody">- Added fbm position offset initializer.\n- Made it possible to control clamp uvs and no interp for render targets when bound to a different material.\n</pre><div class="changelogHeadline">REV 4124</div> <pre class="changelogBody">- Added maintain distance between two control points and reduce movement near control point operators.\n- Made periodic emission reset instant particles.\n- Added option to limit periodic emission count for each period when rate emission is used.\n- Disabled uv smoothing on rope particles that emit more particles than expected each frame.\n- Changed map sequence initializers to match their number with instant emission count.\n</pre><div class="changelogHeadline">REV 4123</div> <pre class="changelogBody">- Made rope uv scroll assume that emitter rate is limited to FPS when deciding if max length is reached.\n</pre><div class="changelogHeadline">REV 4122</div> <pre class="changelogBody">- Improvements to dynamic rope uv offset.\n</pre><div class="changelogHeadline">REV 4121</div> <pre class="changelogBody">- Fixed some specific child transform cases.\n</pre><div class="changelogHeadline">REV 4120</div> <pre class="changelogBody">- Fixed child materials not reloading in main editor.\n</pre><div class="changelogHeadline">REV 4119</div> <pre class="changelogBody">- Fixed particle static child init not taking parent object transform into account.\n- Added automatic uv offset to rope particle when its possible to predict a total, constant rope length for smoother rope rendering.\n</pre><div class="changelogHeadline">REV 4118</div> <pre class="changelogBody">- Added child particle precaching.\n</pre><div class="changelogHeadline">REV 4117</div> <pre class="changelogBody">- Fixed particle editor reload memory leak.\n</pre><div class="changelogHeadline">REV 4116</div> <pre class="changelogBody">- Disabled particle brightness inheritance when color modification is off.\n- Updated some particle preview scenes.\n- Fixed 3D cursor scene script position.\n- Improved particle child transforms.\n- Made color modification re-evaluate for each child particle.\n</pre><div class="changelogHeadline">REV 4115</div> <pre class="changelogBody">- Reduced default model collision bounce.\n</pre><div class="changelogHeadline">REV 4114</div> <pre class="changelogBody">- Made HSV color initializer dependent on instance color.\n</pre><div class="changelogHeadline">REV 4113</div> <pre class="changelogBody">- Changed instance update to be applied to all allocated children and not dormant particles on revival.\n- Fixed emitter duration not decaying when max particle count is hit.\n</pre><div class="changelogHeadline">REV 4112</div> <pre class="changelogBody">- Fixes for instance particle color and brightness.\n</pre><div class="changelogHeadline">REV 4111</div> <pre class="changelogBody">- Progress on particle refactor.\n</pre><div class="changelogHeadline">REV 4110</div> <pre class="changelogBody">- Progress on particle refactor.\n</pre><div class="changelogHeadline">REV 4109</div> <pre class="changelogBody">- Progress on particle refactor.\n</pre><div class="changelogHeadline">REV 4108</div> <pre class="changelogBody">- Progress on particle refactor.\n</pre><div class="changelogHeadline">REV 4107</div> <pre class="changelogBody">- Fixed kinematics rope simulation not applying constraints in correct space to maintain lengths.\n- Fixed particle editor element IDs.\n</pre><div class="changelogHeadline">REV 4106</div> <pre class="changelogBody">- Progress on particle refactor.\n</pre><div class="changelogHeadline">REV 4105</div> <pre class="changelogBody">- More progress on particle system refactor.\n</pre><div class="changelogHeadline">REV 4104</div> <pre class="changelogBody">- More progress on particle system refactor.\n</pre><div class="changelogHeadline">REV 4103</div> <pre class="changelogBody">- More progress on particle system refactor.\n</pre><div class="changelogHeadline">REV 4102</div> <pre class="changelogBody">- Changed new child config structure.\n</pre><div class="changelogHeadline">REV 4101</div> <pre class="changelogBody">- Began refactoring particle system classes to reduce JSON parsing and make child particles more lightweight.\n</pre><div class="changelogHeadline">REV 4100</div> <pre class="changelogBody">- Fixed layer transformation optimization.\n- Changed particle rope renderer to use indices instead of moving data in vertex buffer around.\n</pre><div class="changelogHeadline">REV 4099</div> <pre class="changelogBody">- Removed unused particle layer dependencies from UI and json.\n</pre><div class="changelogHeadline">REV 4098</div> <pre class="changelogBody">- New particle default values for 3D scenes.\n</pre><div class="changelogHeadline">REV 4097</div> <pre class="changelogBody">- Added simulation skipping to boids and capsule collision operators to improve performance.\n- Added pivot camera to particle editor in 3D scenes.\n- Added capsule debug rendering to puppets.\n</pre><div class="changelogHeadline">REV 4096</div> <pre class="changelogBody">- Moved some assertions into debug only.\n</pre><div class="changelogHeadline">REV 4095</div> <pre class="changelogBody">- Added model capsule collider.\n- Fixed model hitbox transforms.\n- Fixed model match loop angle precision due to faulty quaternion conversion in GLM.\n- Added cap velocity operator.\n- Added operator blending to angular movement, oscillate pos, oscillate size, control point attract, turbulence, vortex.\n</pre><div class="changelogHeadline">REV 4094</div> <pre class="changelogBody">- Fixed model hitbox transforms.\n</pre><div class="changelogHeadline">REV 4093</div> <pre class="changelogBody">- Updating SSE2NEON to 1.8.0.\n</pre><div class="changelogHeadline">REV 4092</div> <pre class="changelogBody">- Added particle format system to improve performance by skipping unneeded particle components.\n</pre><div class="changelogHeadline">REV 4091</div> <pre class="changelogBody">- Improved control point attract deletion to be a bit more resilient for fast particles.\n</pre><div class="changelogHeadline">REV 4090</div> <pre class="changelogBody">- Fixed active emitter count underflow.\n- Caching finished child particles for re-emission instead of creating new instances.\n- Use modern random generator everywhere to improve rng perf.\n- Made some vec3 code compatible with SIMD alignment.\n</pre><div class="changelogHeadline">REV 4089</div> <pre class="changelogBody">- Updated GLM to 10.1.\n</pre><div class="changelogHeadline">REV 4088</div> <pre class="changelogBody">- Removed some json copies from child particle instantiation.\n- Improved performance of renderable buildtransform.\n- Skip inactive control points in update functions.\n</pre><div class="changelogHeadline">REV 4087</div> <pre class="changelogBody">- Added inherit control point velocity initializer.\n</pre><div class="changelogHeadline">REV 4086</div> <pre class="changelogBody">- Added hsv color random preview.\n</pre><div class="changelogHeadline">REV 4085</div> <pre class="changelogBody">- Fixed hdr brightness particle instance value sometimes not being applied on particle creation.\n- Added random HSV color initializer.\n</pre><div class="changelogHeadline">REV 4084</div> <pre class="changelogBody">- Added offset and random velocity to layer image emitter.\n</pre><div class="changelogHeadline">REV 4083</div> <pre class="changelogBody">- Added inherit layer motion to image emitter.\n</pre><div class="changelogHeadline">REV 4082</div> <pre class="changelogBody">- Made image emitter work for child particles.\n- Added memory and simulation time info to particle editor.\n- Fixed model editor commands overlapping so certain actions would be missing a response in the UI.\n- Merged data cache classes in engine context.\n- Added shared mdldata system for 3D models to save memory.\n</pre><div class="changelogHeadline">REV 4081</div> <pre class="changelogBody">- Progress on image emitter.\n- Added hitbox debug draw to puppets.\n- Changed UI checkbox visibility dependencies to allow for more complex setups.\n- Made model bind pose available for image emitter.\n</pre><div class="changelogHeadline">REV 4080</div> <pre class="changelogBody">- Progress on image emitter.\n</pre><div class="changelogHeadline">REV 4079</div> <pre class="changelogBody">- Added emission mask to layer image emitter.\n</pre><div class="changelogHeadline">REV 4078</div> <pre class="changelogBody">- Progress on effect layer particle emitter.\n- Allow nameless FBO creation without insertion in map.\n</pre><div class="changelogHeadline">REV 4077</div> <pre class="changelogBody">- Added undo for particle system file change on layer.\n- Moved particle system file select button to top next to drop down UI.\n</pre><div class="changelogHeadline">REV 4076</div> <pre class="changelogBody">- Changed sphere emitter coords to allow cone angle adjustment along x axis.\n- Added lock to control point bindings to most particle collision operators.\n</pre><div class="changelogHeadline">REV 4075</div> <pre class="changelogBody">- Added control point visualization option.\n</pre><div class="changelogHeadline">REV 4074</div> <pre class="changelogBody">- Fixed collision quad preview.\n</pre><div class="changelogHeadline">REV 4073</div> <pre class="changelogBody">- Updated particle collision sphere vis.\n</pre><div class="changelogHeadline">REV 4072</div> <pre class="changelogBody">- Fixed geometry shader rope particle triangle winding.\n- Added particle collider and control point debug view options.\n- Added particle collider rendering.\n- Moved editor specific graphics flags into its own variable.\n</pre><div class="changelogHeadline">REV 4071</div> <pre class="changelogBody">- Made it possible to customize labels of 2D vector input property.\n</pre><div class="changelogHeadline">REV 4070</div> <pre class="changelogBody">- Implemented collision quad operator.\n</pre><div class="changelogHeadline">REV 4069</div> <pre class="changelogBody">- Added bounds collision operator.\n</pre><div class="changelogHeadline">REV 4068</div> <pre class="changelogBody">- Added particle sphere collision operator.\n- Added additional collision operator stubs.\n- Enabled reverse Z depth buffer on desktop.\n</pre><div class="changelogHeadline">REV 4067</div> <pre class="changelogBody">- Implemented multiple collision behaviors.\n</pre><div class="changelogHeadline">REV 4066</div> <pre class="changelogBody">- Added basic plane collision operator for particles.\n</pre><div class="changelogHeadline">REV 4065</div> <pre class="changelogBody">- Added particle initial emission delay.\n- Added particle emitter random periodic emission settings.\n- Fixed particle emission duration only decreasing on emission frames.\n- Added boids operator preview.\n</pre><div class="changelogHeadline">REV 4064</div> <pre class="changelogBody">- Implemented particle boids operator with SIMD instructions.\n</pre><div class="changelogHeadline">REV 4063</div> <pre class="changelogBody">- Particle boids operator prototype without SIMD support.\n</pre><div class="changelogHeadline">REV 4062</div> <pre class="changelogBody">- Added control point auto deletion option when particle close to CP.\n- Added captions and tags to particle element selector.\n</pre><div class="changelogHeadline">REV 4061</div> <pre class="changelogBody">- Added realtime preview to particle child selection.\n</pre><div class="changelogHeadline">REV 4060</div> <pre class="changelogBody">- Added arc and dampening to map particle between control points operator.\n- Improved discharge particle and added arc discharge.\n- Added preview support to particle element selection.\n- Fixed sprite renderer not working when sprite trail renderer has been added too.\n- Fixed playlist transition not starting when loading playlist from command line.\n</pre><div class="changelogHeadline">REV 4059</div> <pre class="changelogBody">- Added steelseries capture service to diagnostics because it interferes with basic directx rendering.\n</pre><div class="changelogHeadline">REV 4058</div> <pre class="changelogBody">- Fixed permission prompt showing up multiple times on android.\n- Upgraded node-sass.\n- Fixed rope particle screen orientation per rope segment.\n- Finished implementing reverse z depth buffer compiler toggle.\n- Fixed sprite occlusion test primitive not being hidden.\n- Fixed variant conditions with combos not triggering texture reload based on current value.\n- Fixed clean project function deleting texture variants.\n- Fixed on video ended playlist trigger not starting fade window sequence.\n</pre><div class="changelogHeadline">REV 4057</div> <pre class="changelogBody">- Removed beta warning from editor.\n</pre><div class="changelogHeadline">REV 4056</div> <pre class="changelogBody">- Fixed blend rules not saving.\n- Fixed blend rules on generic kinematics bone chains.\n</pre><div class="changelogHeadline">REV 4055</div> <pre class="changelogBody">- Optimized clipping mask alpha borders.\n</pre><div class="changelogHeadline">REV 4054</div> <pre class="changelogBody">- Added switch for experimental reverse z full float depth buffer for DXGI to fix z fighting on large 3D scenes.\n</pre><div class="changelogHeadline">REV 4053</div> <pre class="changelogBody">- Fixed clipping mask range index collection.\n- Fixed clipping mask self overlay inside single mask pass.\n</pre><div class="changelogHeadline">REV 4052</div> <pre class="changelogBody">- Updated some bone constraint related translation tokens.\n</pre><div class="changelogHeadline">REV 4051</div> <pre class="changelogBody">- Added stubs for additional depth formats.\n</pre><div class="changelogHeadline">REV 4050</div> <pre class="changelogBody">- Changed rope physics slider min/max values.\n</pre><div class="changelogHeadline">REV 4049</div> <pre class="changelogBody">- Added best of 2025 query.\n</pre><div class="changelogHeadline">REV 4048</div> <pre class="changelogBody">- Fixed wind acceleration scaling.\n</pre><div class="changelogHeadline">REV 4047</div> <pre class="changelogBody">- Fixed preset publish.\n- Removed vdesktop support on Windows 11 because it breaks with every Windows update due to lack of official support by Microsoft.\n- Fixed a buffer overflow.\n</pre><div class="changelogHeadline">REV 4046</div> <pre class="changelogBody">- Reverted particle system child preload attempt again.\n</pre><div class="changelogHeadline">REV 4045</div> <pre class="changelogBody">- FFS.\n</pre><div class="changelogHeadline">REV 4044</div> <pre class="changelogBody">- Fixed texture variant not triggering reload when used with combos.\n</pre><div class="changelogHeadline">REV 4043</div> <pre class="changelogBody">- Fixed long platform tags not being replaced by script.\n</pre><div class="changelogHeadline">REV 4042</div> <pre class="changelogBody">- Updated texture optimization publish URL.\n</pre><div class="changelogHeadline">REV 4041</div> <pre class="changelogBody">- Updated water flow again.\n</pre><div class="changelogHeadline">REV 4040</div> <pre class="changelogBody">- Updated water flow effect.\n</pre><div class="changelogHeadline">REV 4039</div> <pre class="changelogBody">- Fixed move to position for parent elements.\n- Cloud motion min values.\n- Potentially fixed flipped rendering of complex composition setups.\n</pre><div class="changelogHeadline">REV 4038</div> <pre class="changelogBody">- Version bump.\n</pre><div class="changelogHeadline">REV 4037</div> <pre class="changelogBody">- Locales.\n</pre><div class="changelogHeadline">REV 4036</div> <pre class="changelogBody">- Added clipping mask pass count to stats.\n</pre><div class="changelogHeadline">REV 4035</div> <pre class="changelogBody">- Reverted Android SDK to version 34 because 35 is a super huge pain and we wasted enough time on that.\n- Added nested clipping mask rendering support for OGL.\n</pre><div class="changelogHeadline">REV 4034</div> <pre class="changelogBody">- Added edge to edge opt-out for insane android garbage.\n</pre><div class="changelogHeadline">REV 4033</div> <pre class="changelogBody">- Fixed bone physics last world transform being invalid on first frame after refactor.\n</pre><div class="changelogHeadline">REV 4032</div> <pre class="changelogBody">- Fixed editor script labels.\n</pre><div class="changelogHeadline">REV 4031</div> <pre class="changelogBody">- Android updates.\n</pre><div class="changelogHeadline">REV 4030</div> <pre class="changelogBody">- Fixed DNA wallpaper not rendering on OGL.\n</pre><div class="changelogHeadline">REV 4029</div> <pre class="changelogBody">- Made rope simulation set initial simulation positions after first animation frame.\n</pre><div class="changelogHeadline">REV 4028</div> <pre class="changelogBody">- Added a snippet to generate new bokeh kernels.\n</pre><div class="changelogHeadline">REV 4027</div> <pre class="changelogBody">- Improved nested clipping mask rendering order.\n- Changed clipping mask error to only display with nested configurations that don\'t resolve to a single clipping mask.\n</pre><div class="changelogHeadline">REV 4026</div> <pre class="changelogBody">- Added support for nested clipping masks.\n</pre><div class="changelogHeadline">REV 4025</div> <pre class="changelogBody">- Added a2c rendering to mask prerender.\n</pre><div class="changelogHeadline">REV 4024</div> <pre class="changelogBody">- Sorted texture compression hints by file size.\n</pre><div class="changelogHeadline">REV 4023</div> <pre class="changelogBody">- Added warning dialog when deleting user property.\n</pre><div class="changelogHeadline">REV 4022</div> <pre class="changelogBody">- Fixed wind 2d/depth vector construction.\n</pre><div class="changelogHeadline">REV 4021</div> <pre class="changelogBody">- Finished IK rope simulation.\n</pre><div class="changelogHeadline">REV 4020</div> <pre class="changelogBody">- Added error message when importing invalid variant texture.\n- Progress on IK rope sim.\n- Added global scene gravity and wind settings.\n- Fixed anim buffer not resizing properly after scene change.\n</pre><div class="changelogHeadline">REV 4019</div> <pre class="changelogBody">- Added rope IK simulation implementation.\n- Fixed light cookie texture being deleted while in use when media integration triggers a texture flush.\n</pre><div class="changelogHeadline">REV 4018</div> <pre class="changelogBody">- Fixed glitter aspect ratio scaling.\n- Fixed cloud motion angle.\n</pre><div class="changelogHeadline">REV 4017</div> <pre class="changelogBody">- Made it possible to rename texture variant groups.\n</pre><div class="changelogHeadline">REV 4016</div> <pre class="changelogBody">- Changed texture variants using their original compression to allow transparency even when base image is stored as jpeg etc.\n- Added origin only blend rule support.\n- Improved some effect value ranges.\n- Fixed memory leak in new undo system.\n</pre><div class="changelogHeadline">REV 4015</div> <pre class="changelogBody">- Experimental additional IK settings.\n</pre><div class="changelogHeadline">REV 4014</div> <pre class="changelogBody">- Updated shimmer and caustics effects.\n</pre><div class="changelogHeadline">REV 4013</div> <pre class="changelogBody">- Improved water caustics effect.\n</pre><div class="changelogHeadline">REV 4012</div> <pre class="changelogBody">- Added water caustics effect.\n</pre><div class="changelogHeadline">REV 4011</div> <pre class="changelogBody">- Added new shimmer and cloud motion effects.\n</pre><div class="changelogHeadline">REV 4010</div> <pre class="changelogBody">- Added puppet reference overlay offset position.\n</pre><div class="changelogHeadline">REV 4009</div> <pre class="changelogBody">- Added vertex edit gizmos to puppet geometry edit modes.\n- Added blend shape bone point and axis modulation.\n- Added local storage re-write on shutdown if any blocks got changed while writing was still occurring.\n- Changed animation state buffer to only reallocate if required animation state data is larger than available buffer.\n</pre><div class="changelogHeadline">REV 4008</div> <pre class="changelogBody">- Changed IK axis locking when chain doesn\'t use axis alignment.\n</pre><div class="changelogHeadline">REV 4007</div> <pre class="changelogBody">- Added material src exclude.\n</pre><div class="changelogHeadline">REV 4006</div> <pre class="changelogBody">- Added UI for additional vertex editing tools.\n</pre><div class="changelogHeadline">REV 4005</div> <pre class="changelogBody">- Progress on additional IK blend rules.\n</pre><div class="changelogHeadline">REV 4004</div> <pre class="changelogBody">- Progress on additional IK blend rules.\n</pre><div class="changelogHeadline">REV 4003</div> <pre class="changelogBody">- Implemented support for multiple blend targets within a single expression.\n- Fixed particle child prerender coordinate system for world particles.\n</pre><div class="changelogHeadline">REV 4002</div> <pre class="changelogBody">- Updated china apk disclaimers based on current requests.\n</pre><div class="changelogHeadline">REV 4001</div> <pre class="changelogBody">- Made inverted masked puppet geometry draw in depth-order without pulling it down to the mask.\n</pre><div class="changelogHeadline">REV 4000</div> <pre class="changelogBody">- Added vram and genre hints to upload dialog.\n</pre><div class="changelogHeadline">REV 3999</div> <pre class="changelogBody">- Locale fix.\n</pre><div class="changelogHeadline">REV 3998</div> <pre class="changelogBody">- Added spinlock back to fade window because windows must be doing some side effect in peekmessage.\n</pre><div class="changelogHeadline">REV 3997</div> <pre class="changelogBody">- Removed hack for transition window fixes to check whether the other fix solved all problems.\n- Changed light limit behavior to allow adding more lights and choosing light count and features based on distance.\n- Fixed layer move to bottom behavior with parent layers.\n</pre><div class="changelogHeadline">REV 3996</div> <pre class="changelogBody">- Added button to remove clipping mask from a limb.\n- Added analysis for incorrect clipping mask setups and an alert box.\n</pre><div class="changelogHeadline">REV 3995</div> <pre class="changelogBody">- Fixed certain HSV blend modes in HDR.\n- Added render target layer name to texture input.\n</pre><div class="changelogHeadline">REV 3994</div> <pre class="changelogBody">- Disabled some material settings when they are incompatible with the other current options.\n- Fixed glitter on ogl.\n- Added sub index buffers to ogl.\n- Added new blend modes to ogl.\n</pre><div class="changelogHeadline">REV 3993</div> <pre class="changelogBody">- Disabled variant blend mode dropdown if format is unsupported.\n</pre><div class="changelogHeadline">REV 3992</div> <pre class="changelogBody">- Potential fixes for strange explorer interaction during fade window synchronization.\n</pre><div class="changelogHeadline">REV 3991</div> <pre class="changelogBody">- Fixed puppet index range depth priority calculation during animation.\n- Added video texture support to texture variant system.\n- Added texture replace function to texture variant UI.\n- Fixed bone depth controls in UI lists that put IDs into key names.\n- Added texture size on disk to texture info list.\n- Fixed auto recompile not triggering for video textures due to missing extension recognition.\n</pre><div class="changelogHeadline">REV 3990</div> <pre class="changelogBody">- Fixed new wheel/key events being processed by inactive elements.\n</pre><div class="changelogHeadline">REV 3989</div> <pre class="changelogBody">- Progress on texture variant blending.\n</pre><div class="changelogHeadline">REV 3988</div> <pre class="changelogBody">- Fixed ref pose bone depth edit.\n- Changed curve animation editor to also set keys for invisible objects changed from gizmos/controls (not the curve editor itself).\n- Fixed scene script storage to use absolute path for hash from virtual file system instead of local path.\n</pre><div class="changelogHeadline">REV 3987</div> <pre class="changelogBody">- Progress on texture variant implementation.\n</pre><div class="changelogHeadline">REV 3986</div> <pre class="changelogBody">- Continued work on texture variants.\n- Doubled z render range for orthogonal projection to fix old wallpapers that were relying on incorrect eye z pos on older builds.\n</pre><div class="changelogHeadline">REV 3985</div> <pre class="changelogBody">- Fixed default obj bone animation state when bones are scaled.\n- Added 64 bit compiler.\n- Began working on texture variants.\n- Fixed sprite trail fps length adjustment.\n- Fixed eye dropper picker window having an invisible border when it shouldn\'t.\n</pre><div class="changelogHeadline">REV 3984</div> <pre class="changelogBody">- Added JSON cache to improve child particle system instantiation time.\n</pre><div class="changelogHeadline">REV 3983</div> <pre class="changelogBody">- Added some clipping mask rendering options.\n- Removed light limit and changed light system to render the closest lights only if light limit is reached.\n</pre><div class="changelogHeadline">REV 3982</div> <pre class="changelogBody">- Added localization for blend modes.\n</pre><div class="changelogHeadline">REV 3981</div> <pre class="changelogBody">- added glitter effect.\n- Added masked default shader snippet to shader editor.\n- Added sampler generator to shader editor.\n- Added new perlin and uniform default textures.\n- Added diffuse light blend mode to shader blend modes.\n</pre><div class="changelogHeadline">REV 3980</div> <pre class="changelogBody">- Updated LZ4.\n</pre><div class="changelogHeadline">REV 3979</div> <pre class="changelogBody">- Fixed crash from morph texture passthrough for clipping mask render path.\n- Added depth factor to auto depth deformation generation.\n</pre><div class="changelogHeadline">REV 3978</div> <pre class="changelogBody">- Fixed topology editor and vertex cursor dragging when layer scale is non-uniform.\n</pre><div class="changelogHeadline">REV 3977</div> <pre class="changelogBody">- Fixed a puppet model compiler crash.\n</pre><div class="changelogHeadline">REV 3976</div> <pre class="changelogBody">- Added some verbose debug messages for testing purposes.\n</pre><div class="changelogHeadline">REV 3975</div> <pre class="changelogBody">- Added different clipping mask compose system for testing purposes.\n</pre><div class="changelogHeadline">REV 3974</div> <pre class="changelogBody">- Fixing some clipping mask render issues and material crash.\n</pre><div class="changelogHeadline">REV 3973</div> <pre class="changelogBody">- Added puppet depth auto generation using SDF.\n</pre><div class="changelogHeadline">REV 3972</div> <pre class="changelogBody">- Improved clipping mask range sorting.\n- Fixed clipping mask render not using skinning.\n</pre><div class="changelogHeadline">REV 3971</div> <pre class="changelogBody">- Fixed sprite trail length fps compensation.\n</pre><div class="changelogHeadline">REV 3970</div> <pre class="changelogBody">- Moved shader bone animation data into separate buffer to only require single upload for entire model/puppet per frame.\n</pre><div class="changelogHeadline">REV 3969</div> <pre class="changelogBody">- Added low FPS preview option to editor.\n</pre><div class="changelogHeadline">REV 3968</div> <pre class="changelogBody">- Added additive blending option to clipping mask compositor.\n</pre><div class="changelogHeadline">REV 3967</div> <pre class="changelogBody">- Clipping mask implementation.\n- Changed acceleration/deceleration in particle operators to use dampened dt for more consistent behavior with low fps.\n- Fixed particle drag becoming to large and inverting velocity under low fps.\n- Fixed default wallpaper properties being possible to be manipulated by pre-declaring them as user properties.\n</pre><div class="changelogHeadline">REV 3966</div> <pre class="changelogBody">- Fixed puppet compiler crash when model is missing initial weight initialization.\n- Fixed puppet texture blending texture scale correction for non-lighting pre-render case.\n- Began working on puppet clipping mask support.\n- Added fix to avoid applying particle user color override to initial color when any operators/initializers would already multiply the color. Only enabled for new wallpapers.\n- Changed general puppet warp undo/redo system to use json object copies instead of serialization.\n</pre><div class="changelogHeadline">REV 3965</div> <pre class="changelogBody">- Updated Steamworks.\n- Added puppet island visibility toggles to weight editor.\n- Fixed paint message dead lock when importing multiple videos in editor.\n- Replaced all empty paint messages with a full paint init/teardown because that seems to be the only safe thing.\n</pre><div class="changelogHeadline">REV 3964</div> <pre class="changelogBody">- Changed async loader to block low priority tasks until scene main loader has processed all layers.\n- Changed mip map streamer to load third detail level first.\n</pre><div class="changelogHeadline">REV 3963</div> <pre class="changelogBody">- Disabled compose layer children alpha writing on compose layers with background copy.\n</pre><div class="changelogHeadline">REV 3962</div> <pre class="changelogBody">- Fixed precomposed children not rendering last effect pass with alpha writing enabled.\n</pre><div class="changelogHeadline">REV 3961</div> <pre class="changelogBody">- Hide parallax settings on child layers since the parent element controls parallax in this case.\n</pre><div class="changelogHeadline">REV 3960</div> <pre class="changelogBody">- Fixed compose layer condition to disable puppet support on them.\n</pre><div class="changelogHeadline">REV 3959</div> <pre class="changelogBody">- Fixed compose layer without effects not rendering transparently with copy background disabled and children pre-rendered.\n</pre><div class="changelogHeadline">REV 3958</div> <pre class="changelogBody">- Fixed particle instance config not being applied on particle reload in editor.\n</pre><div class="changelogHeadline">REV 3957</div> <pre class="changelogBody">- Fixed VHS effect mask.\n- Added custom key/wheel handler for number inputs because the stock behavior is terrible.\n</pre><div class="changelogHeadline">REV 3956</div> <pre class="changelogBody">- Fixed visible property in asset packs losing meta data when filtering.\n</pre><div class="changelogHeadline">REV 3955</div> <pre class="changelogBody">- Disabled color override on fireworks refract particle to fix background tinting.\n</pre><div class="changelogHeadline">REV 3954</div> <pre class="changelogBody">- Fixed degree conversion to work without rounding too.\n- Enabled degree conversion rounding for generic properties and physics constraints.\n</pre><div class="changelogHeadline">REV 3953</div> <pre class="changelogBody">- Added missing user property main panel reload on inline binding change.\n</pre><div class="changelogHeadline">REV 3952</div> <pre class="changelogBody">- Progress on faster puppet anim editor undo.\n</pre><div class="changelogHeadline">REV 3951</div> <pre class="changelogBody">- Work on faster animation editor undo.\n</pre><div class="changelogHeadline">REV 3950</div> <pre class="changelogBody">- Save all puppet anims on animation edit (temporarily).\n</pre><div class="changelogHeadline">REV 3949</div> <pre class="changelogBody">- Fixed clone transitions being created in single wallpaper mode.\n</pre><div class="changelogHeadline">REV 3948</div> <pre class="changelogBody">- Changed clone cropping logic to hopefully cover all use cases now.\n</pre><div class="changelogHeadline">REV 3947</div> <pre class="changelogBody">- Updating pac man wallpaper for HDR and colorization support.\n- Fixed some issues with particle color inheritance.\n- Added ability to disable color overrides on child particles.\n- Added missing interpolation filter initialization for layers without reference texture.\n</pre><div class="changelogHeadline">REV 3946</div> <pre class="changelogBody">- Fixed general transition random selection height.\n</pre><div class="changelogHeadline">REV 3945</div> <pre class="changelogBody">- Added general wallpaper select transition option.\n</pre><div class="changelogHeadline">REV 3944</div> <pre class="changelogBody">- Android locale.\n</pre><div class="changelogHeadline">REV 3943</div> <pre class="changelogBody">- Adding round option to degree binding converter and replaced dir brush model conversion.\n</pre><div class="changelogHeadline">REV 3942</div> <pre class="changelogBody">- Changed lockscreen crop to use 0, 0 reference monitor instead of user configured primary monitor.\n- Prepared transition system to support running during manual wallpaper selection/preview.\n</pre></div> '),e.put("views/includes/browseruserproperties.html",'<div> <div class="settingsWallpaperProperty" ng-repeat="property in properties track by $index" ng-if="!property.condition || evalCondition(property.condition)"> <div ng-if="isPropertyLabelVisible(property)" ng-click="callbackPropertyLabelClicked(property)" ng-class="\'pLabel\' + property.type"> <span ng-if="property.icon" class="fas fa-fw propertyIcon" ng-class="property.icon"></span> <span class="browsePropertyLabel" translate="{{property.text | san}}"></span> </div> <div ng-if="property.type===\'color\'"> <spectrum-colorpicker vec-color-converter options="colorPickerOptions" ng-model="property.value" on-change="callbackWallpaperPropertyChanged(property.key, property)" on-show-options="{update:false}"></spectrum-colorpicker> </div> <div ng-if="property.type==\'bool\'"> <checkbox cb-checked="property.value" cb-changed="callbackWallpaperPropertyChanged(property.key, property)"></checkbox> </div> <div ng-if="property.type==\'textinput\'"> <input type="text" ng-model="property.value" ng-change="callbackWallpaperPropertyChanged(property.key, property)"> </div> <div ng-if="property.type==\'slider\'"> <rzslider rz-slider-model="property.value" rz-slider-options="{ceil:property.max, floor:property.min, enforceStep:false, onChange:callbackWallpaperPropertyChangedSlider(property.key, property),step:property.step||1,precision:property.precision||1}"></rzslider> <span class="sliderValue"> <span ng-if="!property.editable"> <span class="labelElement" ng-click="makeLabelEditable($event, property)">{{property.value | truncateFloat}}</span> <input class="inputElement" type="number"> </span> <input ng-if="property.editable" class="fullWidth" type="number" ng-model="property.value"> </span> </div> <div ng-if="property.type==\'volume\' && isVolumeEnabled(selectedMonitor.location)"> <rzslider rz-slider-model="property.value" rz-slider-options="{ceil:property.max, floor:property.min, enforceStep:false, onChange:callbackWallpaperPropertyChangedSlider(property.key, property),step:property.step||1,precision:property.precision||1}"></rzslider> <span class="sliderValue"> <span ng-if="!property.editable">{{property.value}}</span> <input ng-if="property.editable" class="fullWidth" type="number" ng-model="property.value"> </span> </div> <div ng-if="property.type==\'volume\' && !isVolumeEnabled(selectedMonitor.location)" ng-click="openMuteHelper(selectedMonitor.location)" class="propertyVolumeDisabled" tabindex="0"> <span class="fas fa-volume-mute propertyIcon dangerText"></span> <span>{{getVolumeDisabledText(selectedMonitor.location)|translate}}</span> </div> <div ng-if="property.type==\'combo\'" class="smallDropList"> <droplist dp-options="property.options" dp-selected="property.value" dp-change="callbackWallpaperPropertyChanged(property.key, property)"></droplist> </div> <div ng-if="property.type==\'combolutfilters\'" class="smallDropList"> <droplist dp-options="lutFilterOptions" dp-selected="property.value" dp-change="callbackWallpaperPropertyChanged(property.key, property)"></droplist> </div> <div ng-if="property.type==\'directory\'" class="userImport"> <div class="importPath">{{(property.value || \'ui_browse_details_properties_nothing_imported\') | filename | translate}}</div> <div> <a class="btn btn-default" ng-click="callbackSelectFileForProperty(property, \'directory\')"> <span class="glyphicon glyphicon-import" aria-hidden="true"></span> <span ng-if="!isPropertyFileValueSet(property, currentSelection.defaultproperties[property.key])" class="userImportBtn" translate="ui_browse_details_properties_select_directory"></span> </a> <span ng-if="isPropertyFileValueSet(property, currentSelection.defaultproperties[property.key])"> <a class="btn btn-default" ng-click="callbackOpenDirectory(property.value)"> <span class="glyphicon glyphicon-folder-open" aria-hidden="true"></span> </a> <a class="btn btn-danger" ng-click="callbackRemoveFileForProperty(property, currentSelection.defaultproperties[property.key])"> <span class="fas fa-fw fa-times" aria-hidden="true"></span> </a> </span> </div> </div> <div ng-if="property.type==\'file\'" class="userImport"> <div class="importPath">{{(property.value || \'ui_browse_details_properties_nothing_imported\') | filename | translate}}</div> <div> <a class="btn btn-default" ng-click="callbackSelectFileForProperty(property, \'file\')"> <span class="glyphicon glyphicon-import" aria-hidden="true"></span> <span ng-if="!isPropertyFileValueSet(property, currentSelection.defaultproperties[property.key])" class="userImportBtn" translate="ui_browse_details_properties_select_file"></span> </a> <span ng-if="isPropertyFileValueSet(property, currentSelection.defaultproperties[property.key])"> <a class="btn btn-default" ng-click="callbackOpenDirectory(property.value)"> <span class="glyphicon glyphicon-folder-open" aria-hidden="true"></span> </a> <a class="btn btn-danger" ng-click="callbackRemoveFileForProperty(property, currentSelection.defaultproperties[property.key])"> <span class="fas fa-fw fa-times" aria-hidden="true"></span> </a> </span> </div> </div> <div ng-if="property.type==\'scenetexture\'" class="userImport"> <div class="importPath">{{(property.value || \'ui_browse_details_properties_nothing_imported\') | filename | translate}}</div> <div> <a class="btn btn-default" ng-click="callbackSelectFileForProperty(property, \'scenetexture\')"> <span class="glyphicon glyphicon-import" aria-hidden="true"></span> <span ng-if="!isPropertyFileValueSet(property, currentSelection.defaultproperties[property.key])" class="userImportBtn" translate="ui_browse_details_properties_select_file"></span> </a> <span ng-if="isPropertyFileValueSet(property, currentSelection.defaultproperties[property.key])"> <a class="btn btn-default" ng-click="callbackOpenDirectory(property.value)"> <span class="glyphicon glyphicon-folder-open" aria-hidden="true"></span> </a> <a class="btn btn-danger" ng-click="callbackRemoveFileForProperty(property, currentSelection.defaultproperties[property.key])"> <span class="fas fa-fw fa-times" aria-hidden="true"></span> </a> </span> </div> </div> <div ng-if="property.type==\'usershortcut\'" class="userImport"> <div class="importPath">{{(property.value || \'ui_browse_details_properties_nothing_bound\') | usershortcut | filename | translate}}</div> <div> <a class="btn btn-default" ng-click="callbackSelectFileForProperty(property, \'usershortcut\')"> <span class="fas fa-square-up-right" aria-hidden="true"></span> <span ng-if="!isPropertyFileValueSet(property, currentSelection.defaultproperties[property.key])" class="userImportBtn" translate="ui_browse_details_properties_assign_shortcut"></span> </a> <span ng-if="isPropertyFileValueSet(property, currentSelection.defaultproperties[property.key])"> \x3c!-- \t\t\t\t\t<a class="btn btn-default" ng-click="callbackOpenDirectory(property.value)">\r\n\t\t\t\t\t\t<span class="glyphicon glyphicon-folder-open" aria-hidden="true"></span>\r\n\t\t\t\t\t</a> --\x3e <a class="btn btn-danger" ng-click="callbackRemoveFileForProperty(property, currentSelection.defaultproperties[property.key])"> <span class="fas fa-fw fa-times" aria-hidden="true"></span> </a> </span> </div> </div> <div ng-if="property.type==\'divider\'"> <hr class="fullWidth"> </div> </div> </div> '),e.put("views/includes/browseruserpropertiesgroup.html",'<div class="browserUserPropertyGroup" ng-class="{\'closed\':!open}" ng-show="!groupProperty.condition || evalCondition(groupProperty.condition)"> <div class="browserUserPropertyGroupTitle" ng-click="toggleGroupVisibility()"> <div class="browserUserPropertyGroupTitleText">{{groupProperty.text|translate}}</div> <span class="fas fa-fw fa-circle-chevron-down browserUserPropertyGroupTitleIcon"></span> </div> <div class="browserUserPropertyGroupFold" id="GroupFoldParent"></div> </div> '),e.put("views/includes/thirdpartynotices.html",'<div class="settingsThirdpartyBox"> <div> <div class="crdHeader">Assets</div> <pre class="crdPre">Ricepod model by Eyaura - <a onclick="window.ui.shellexecute(\'http://www.moddb.com/mods/g-string\')">G String Mod</a>\r\nFoliage by bart (rescaled, <a onclick="window.ui.shellexecute(\'https://creativecommons.org/licenses/by/3.0/\')">CC-BY 3.0</a>)\r\nFree Brushes by <a onclick="window.ui.shellexecute(\'https://brusheezy.com\')">Brusheezy.com</a>\r\nDino sprites by Arks <a onclick="window.ui.shellexecute(\'https://twitter.com/ScissorMarks\')">@ScissorMarks</a>\r\nBackground art by <a onclick="window.ui.shellexecute(\'https://www.freepik.com/free-photos-vectors/party\')">www.freepik.com</a> <a href="https://www.vecteezy.com/free-vector/snow">www.vecteezy.com</a></pre> </div> <div> <div class="crdHeader">Community Translators</div> <pre class="crdPre">Abeson\r\nafterl1ght\r\nAkiraTenchi\r\nakoskovacs1012\r\nAlixey\r\nAljaž Božičko\r\nAmin3435\r\nandi257\r\nAndr\r\nAndraz Span\r\nAnfia\r\nangrystar170\r\nANL\r\nAronpoiss\r\nASiMKA\r\nAteshM\r\nAteX01\r\nAudition-CSBlock\r\naustin-chang\r\nbadpixel13\r\nBehnam Ka\r\nBigBoi ( ͡° ͜ʖ ͡°)\r\nBlack4Killer\r\nBlackMorento\r\nBLVCK\r\nCai Ning\r\nChairman Meow\r\nCharlesChou73\r\nChings\r\nChristiandiSama\r\nclmfkilu\r\nCosminPerRam\r\nCrbakc\r\nCronic185\r\nDaYWhiTe\r\ndimateos\r\nDimOkGamer\r\nDoc\r\nDr. HaZaRd\r\nDushesS01\r\nE4RU\r\neduardo989\r\nEnesmirac\r\nEoun\r\neyal100\r\nEyON\r\nFIndustries\r\nfractal\r\nGaboik\r\ngabrielrou1\r\nGalmadus\r\nGiasko\r\nGriffin\r\nGuan\r\nGustav\r\nHaoJun0823\r\nhdts-adam\r\nHish\r\nImranDoet\r\nis984\r\nitskiru\r\nivandwijaya\r\nIvanSix\r\nJaxxxon\r\nJpF4E\r\nkalebC\r\nKamiAso\r\nKanarias\r\nkillingbeta\r\nkorobot\r\nKozara\r\nKukiMukis\r\nlagseeing\r\nLagSeeN\r\nLeecanIt\r\nlennythecat\r\nLittleWind404\r\nLluisCS\r\nLoesna\r\nLosna\r\nlucapierobon\r\nLukelis357\r\nLusTerCsI\r\nlysinelai\r\nLyvelion\r\nM.ArdA\r\nMagicWizardGuy\r\nMagVI\r\nMaksilos\r\nManfre98\r\nmarci010101\r\nMArdA88\r\nMariolinXD\r\nMaximuel\r\nmaxlefou\r\nmeatturtle\r\nmeowside\r\nMiKaiLosA\r\nminimax4233\r\nMogician0123\r\nMonika-Ananieva\r\nMornwind\r\nMrGoldDoge\r\nMrKingMichael\r\nMöyhönen\r\nNaufal-FR\r\nneirock\r\nnguyenvancaokys\r\nNguyễn Văn Cao Kỳ\r\nnightparty\r\nNobleEnmsnu\r\nnocryset\r\nonikidokuz\r\nosmantuna\r\npapin97\r\nPatr1xUs\r\npaulo9mv\r\npiccho[JP]\r\nQR Code\r\nRasin\r\nrawpety\r\nREDO\r\nRegnander\r\nRinpen\r\nRiooKaaa\r\nrjs4902\r\nromeoxp777\r\nSakuRabi\r\nsebinus\r\nSenpaiWithDiabetes\r\nsergeitarsaus\r\nshaart\r\nShiro\r\nshwaeki\r\nSigmaTheFox\r\nSkriep\r\nSouk\r\nSpritBall\r\nstorym94374\r\nSumrid.Studio\r\nsunbeams001\r\nsuperuser590\r\nSwiftpaws\r\nTaavi\r\nTark\r\nThadah\r\nThe bear123\r\ntheMarcPower\r\ntpxxn\r\nVitA$42$Yakamoz\r\nwhhungbill\r\nWiNCHaN\r\nxfluffydestroy\r\nxlydsg\r\nYanstory\r\nycanCHKN\r\nYoti\r\nZamekaze\r\nZEBAS204\r\nzhs852\r\n.FeTaK: Kokain\r\n[TW]Frank\r\n| extRme_sPortS |\r\n| Minkster <3\r\nαz\r\nジュラ紀\r\n伊织\r\n古丁丁\r\n다이나믹\r\n선진입후판단</pre> </div> <div> <div class="crdHeader" translate="ui_settings_thirdparty_licenses"></div> <pre class="crdPre"><a onclick="window.ui.openhtmlexternally(\'./licenses/licenses_main.html\')" translate="ui_settings_thirdparty_main_app"></a>\r\n<a onclick="window.ui.openhtmlexternally(\'./licenses/licenses_editor_extensions.html\')" translate="ui_settings_thirdparty_dlc_editor_extensions"></a></pre> </div> </div> '),e.put("views/modals/agegatemodal.html",'<div class="modalContainer"> <div class="modal-header"> <h4 class="modal-title" translate="ui_browse_age_gate_modal_header"></h4> </div> <div class="modal-body"> <div> <div translate="ui_browse_age_gate_modal_body"> </div> </div> <div class="ageGateModalBody"> <div> <span class="dateHeader" translate="ui_browse_age_gate_modal_day"></span> <span class="dateHeader" translate="ui_browse_age_gate_modal_month"></span> <span class="dateHeader" translate="ui_browse_age_gate_modal_year"></span> </div> <div> <droplist dp-options="days" dp-selected="date.day"></droplist> <droplist dp-options="months" dp-selected="date.month"></droplist> <droplist dp-options="years" dp-selected="date.year"></droplist> </div> </div> <div class="ageGateModalSubText" translate="ui_browse_age_gate_modal_sub"> </div> </div> <div class="modal-footer" style="display: flex"> <div> </div> \x3c!-- <div ng-if="data.customFooter" style="display:flex;flex-direction:column">\r\n <div style="margin-bottom:5px; text-align: left">{{data.customFooterText | translate}}</div>\r\n <div>\r\n <button class="btn btn-primary" uib-btn-checkbox ng-model="data.customFooterModel" translate="ui_workshop_tags_anime"></button>\r\n </div>\r\n </div> --\x3e <div style="flex-grow: 1"> <a class="btn btn-primary" ng-click="ok()" translate="ui_ok"></a> <a class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></a> </div> </div> </div> '),e.put("views/modals/browseassignhotkey.html",'<div class="modalContainer"> <div class="modal-header"> \x3c!-- TODO: Make title dynamic when/if this is used for different use cases --\x3e <h4 class="modal-title" translate="ui_browse_modal_hotkey_assign_wallpaper" translate-values="{name:name}"></h4> </div> <div class="modal-body"> <form class="form-horizontal"> <div class="form-group" style="margin-bottom:0px"> <label class="col-sm-4 control-label" translate="ui_browse_modal_hotkey_enter_hotkey"></label> <div class="col-sm-8"> <hotkeyinput hk-keys="keys" hk-pool="hotkeys"></hotkeyinput> </div> </div> </form> </div> <div class="modal-footer"> <div> <button class="btn btn-primary" ng-click="ok()" ng-disabled="keys.length===0" translate="ui_ok"></button> <a class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></a> </div> </div> </div> '),e.put("views/modals/browseassignusershortcut.html",'<div class="modalContainer"> <div class="modal-header"> <h4 class="modal-title" translate="ui_browse_modal_user_shortcut" translate-values="{name:name}"></h4> </div> <div class="modal-body"> <form class="form-horizontal"> <div class="form-group" style="margin-bottom:20px"> <div class="col-sm-12"> <div class="fullWidth btn-group browseUserShortcutGroup"> <button class="btn browseUserShortcutBtn" ng-class="{\'btn-primary\':value.type==\'file\',\'btn-default\':value.type!=\'file\'}" ng-click="value.type=\'file\'"> <span class="fa fa-file icon"></span><span class="caption" translate="ui_browse_modal_user_shortcut_type_file"></span> </button> <button class="btn browseUserShortcutBtn" ng-class="{\'btn-primary\':value.type==\'directory\',\'btn-default\':value.type!=\'directory\'}" ng-click="value.type=\'directory\'"> <span class="fa fa-folder-open icon"></span><span class="caption" translate="ui_browse_modal_user_shortcut_type_directory"></span> </button> <button class="btn browseUserShortcutBtn" ng-class="{\'btn-primary\':value.type==\'web\',\'btn-default\':value.type!=\'web\'}" ng-click="value.type=\'web\'"> <span class="fa fa-globe icon"></span><span class="caption" translate="ui_browse_modal_user_shortcut_type_web"></span> </button> <button class="btn browseUserShortcutBtn" ng-class="{\'btn-primary\':value.type==\'cmd\',\'btn-default\':value.type!=\'cmd\'}" ng-click="value.type=\'cmd\'"> <span class="fa fa-square-terminal icon"></span><span class="caption" translate="ui_browse_modal_user_shortcut_type_command"></span> </button> </div> </div> </div> <div class="form-group" style="margin-bottom:0" ng-if="value.type===\'none\'"> <div class="col-sm-12"> <div class="alert" translate="ui_browse_modal_user_shortcut_usage_hint"></div> </div> </div> <div ng-if="value.type===\'file\' || value.type===\'directory\'"> <div class="form-group" style="margin-bottom:0" ng-if="value.type===\'file\'"> <div class="col-sm-12"> <div class="alert alert-danger" translate="ui_browse_modal_user_shortcut_paste_warning"></div> </div> </div> <div class="form-group formRowVerticalCenter" style="margin-bottom:0px"> <div class="col-sm-4"> <span class="control-label" translate="ui_browse_modal_user_shortcut_path"></span> </div> <div class="col-sm-8"> <button class="btn btn-default fullWidth" ng-click="selectFile()" style="height:34px"> <span class="glyphicon glyphicon-import" aria-hidden="true"></span> {{value.type===\'file\'?\'ui_browse_details_properties_select_file\':\'ui_browse_details_properties_select_directory\'|translate}} </button> </div> </div> <div class="form-group formRowVerticalCenter" style="margin-top:10px;opacity:0.8"> <div class="col-sm-12" style="word-break: break-all;"> {{value.path}} </div> </div> </div> <div ng-if="value.type===\'file\'"> <div class="form-group"> <div class="col-sm-4"> <span class="control-label" translate="ui_browse_modal_user_shortcut_arguments"></span> </div> <div class="col-sm-8"> <textarea class="form-control ignoreModalFocus" ng-model="value.arguments" maxlength="512" style="resize: none;height: 60px;width:100%;padding-right:40px;"></textarea> <button ng-if="value.arguments" class="btn btn-danger textAreaClearHelper" ng-click="value.arguments=\'\'"> <i class="glyphicon glyphicon-remove"></i> </button> </div> </div> </div> <div ng-if="value.type===\'cmd\'"> <div class="form-group" style="margin-bottom:0"> <div class="col-sm-12"> <div class="alert alert-danger" translate="ui_browse_modal_user_shortcut_paste_warning"></div> </div> </div> <div class="form-group"> <div class="col-sm-4"> <span class="control-label" translate="ui_browse_modal_user_shortcut_command"></span> </div> <div class="col-sm-8"> <textarea class="form-control ignoreModalFocus" ng-model="value.path" maxlength="512" style="resize: none;height: 160px;width:100%;padding-right:40px;"></textarea> <button ng-if="value.path" class="btn btn-danger textAreaClearHelper" ng-click="value.path=\'\'"> <i class="glyphicon glyphicon-remove"></i> </button> </div> </div> </div> <div ng-if="value.type===\'web\'"> <div class="form-group" style="margin-bottom:0"> <div class="col-sm-12"> <div class="alert alert-danger" translate="ui_browse_modal_user_shortcut_paste_warning"></div> </div> </div> <div class="form-group formRowVerticalCenter"> <div class="col-sm-4"> <span class="control-label" translate="ui_browse_modal_user_shortcut_url"></span> </div> <div class="col-sm-8"> <div class="input-group" style="width:100%"> <input type="text" class="form-control ignoreModalFocus" ng-model="value.path"> <div class="input-group-btn"> <button ng-if="value.path" class="btn btn-danger" ng-click="value.path=\'\'"> <i class="glyphicon glyphicon-remove"></i> </button> </div> </div> </div> </div> </div> </form> </div> <div class="modal-footer modal-footer-twosided"> <div> <button class="btn btn-danger" ng-click="clear()" translate="ui_clear"></button> <button class="btn btn-default" ng-click="test()" translate="ui_browse_modal_user_shortcut_test_command"></button> </div> <div> <button class="btn btn-primary" ng-click="ok()" translate="ui_apply"></button> </div> </div> </div> '),e.put("views/modals/browsecollectionsmodal.html",'<div class="modalContainer browseWallpaperCollectionModal"> <div class="modal-header"> <h4 class="modal-title" translate="{{type.labelHeader}}"></h4> </div> <div class="modal-body"> <div ng-if="data.isSaving"> <form class="form-horizontal"> <div class="form-group"> <label for="inputURL" class="col-sm-2 control-label" translate="{{type.labelSave}}"></label> <div class="col-sm-10"> <input type="text" class="form-control ignoreModalFocus" ng-model="data.collectionItem.name" id="inputURL" autofocus> <div translate="{{type.labelSaveDescription}}"></div> </div> </div> <div class="form-group" style="margin-bottom:0px" ng-if="type.hotkeyAction"> <label class="col-sm-2 control-label" translate="ui_browse_context_menu_hotkey"></label> <div class="col-sm-10"> <hotkeyinput hk-keys="context.hotkey" hk-pool="data.hotkeys"></hotkeyinput> </div> </div> </form> </div> <div ng-if="!data.isSaving"> <div class="btn-group-vertical verticalRadioButtonList"> <button class="btn btn-default ignoreModalFocus" type="button" ng-repeat="p in data.collection track by $index" ng-model="context.currentSelection" ng-dblclick="ok()" uib-btn-radio="p">{{p.name}}</button> <div ng-if="data.collection.length==0 && type.labelEmpty" class="emptyCollections" translate="{{type.labelEmpty}}"></div> </div> <form class="form-horizontal"> <div class="form-group" style="margin-top:10px" ng-if="type.hotkeyAction"> <label class="col-sm-2 control-label" translate="ui_browse_context_menu_hotkey"></label> <div class="col-sm-10"> <hotkeyinput hk-keys="context.hotkey" hk-pool="data.hotkeys"></hotkeyinput> </div> </div> </form> </div> </div> <div class="modal-footer"> <div> <button class="btn btn-danger" ng-if="!data.isSaving" ng-disabled="!context.currentSelection" ng-click="deleteCollectionItem(context.currentSelection)"> <span class="fas fa-trash"></span> {{\'ui_browse_playlist_modal_delete\' | translate}} </button> </div> <div ng-if="data.canCloseOnly"> <button class="btn btn-default" ng-click="ok()" translate="ui_close"></button> </div> <div ng-if="!data.canCloseOnly"> <button ng-if="data.onCreateNew" class="btn btn-info" ng-click="createNew()" translate="ui_create_new"></button> <button class="btn btn-primary" ng-disabled="data.isSaving ? data.collectionItem.name.length < 1 : !context.currentSelection" ng-click="ok()" translate="ui_ok"></button> <button class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></button> </div> </div> </div> '),e.put("views/modals/browseexplorecreatequerymodal.html",'<div class="modalContainer browseWallpaperReportModal"> <div class="modal-header"> <h4 class="modal-title" translate="{{data.isEditing ? \'ui_browse_explore_create_query_modal_header_edit\' : \'ui_browse_explore_create_query_modal_header_new\'}}"></h4> </div> <div class="modal-body"> <div class="container-fluid"> <div class="row"> <label class="col-sm-4 control-label" translate="ui_browse_explore_create_query_modal_category"></label> <div class="col-sm-8"> <droplist class="ignoreModalFocus" dp-selected="data.query.category" dp-options="categoryOptions"></droplist> </div> </div> <div class="row" ng-if="data.query.category!=\'collection\'"> <label class="col-sm-4 control-label" translate="ui_browse_explore_create_query_modal_type"></label> <div class="col-sm-8"> <droplist class="ignoreModalFocus" dp-selected="data.query.querytype" dp-options="queryTypeOptions"></droplist> </div> </div> <div class="row" ng-if="data.query.category==\'keyword\'"> <label class="col-sm-4 control-label" translate="ui_browse_explore_create_query_modal_keyword"></label> <div class="col-sm-8"> <input id="queryInputKeyword" type="text" class="form-control ignoreModalFocus" ng-model="data.query.keyword" autofocus> </div> </div> <div class="row" ng-if="data.query.category==\'creator\'"> <label class="col-sm-4 control-label" translate="ui_browse_explore_create_query_modal_user_steam_id"></label> <div class="col-sm-8"> <input type="text" class="form-control ignoreModalFocus" ng-model="data.query.itemid"> </div> </div> <div class="row" ng-if="data.query.category==\'collection\'"> <label class="col-sm-4 control-label" translate="ui_browse_explore_create_query_modal_collection_id"></label> <div class="col-sm-8"> <input type="text" class="form-control ignoreModalFocus" ng-model="data.query.itemid"> </div> </div> </div> </div> <div class="modal-footer"> <div> <button class="btn btn-primary" ng-class="data.okClass" ng-disabled="!validateQuery()" ng-click="ok()" translate="ui_ok"></button> <button class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></button> </div> </div> </div> '),e.put("views/modals/browsemobilepermissionsmissing.html",'<div class="modalContainer"> <div class="modal-header" ng-if="data.title"> <h4 class="modal-title" translate="{{data.title}}" translate-values="data.labelValues"></h4> </div> <div class="modal-body modalGenericConfirmBody"> <div ng-if="data.leftIcon || data.message"> <div style="display:flex;flex-direction:column;"> <div translate="{{data.message}}" translate-values="data.labelValues"></div> </div> </div> <div class="fullWidth" style="margin-top: 15px;"> <form class="fullWidth"> <div class="form-group input-group has-feedback"> <input id="genericConfirmTextInput" type="text" class="form-control ignoreModalFocus" ng-model="data.textinput"> <div class="input-group-btn"> <button class="btn btn-primary" ng-click="copyToClipboard(data.textinput)"> <span class="fas fa-fw fa-copy"></span> </button> </div> </div> </form> </div> <div style="overflow-y:scroll;max-height:200px;display:block;" ng-if="data.listWallpapers.length > 1"> <div ng-repeat="wp in data.listWallpapers" style="display:flex;flex-direction: row;align-items: center;margin: 0 5px 5px 0;"> <span class="fas fa-image" style="margin-right: 10px;"></span><span style="flex:1;white-space: nowrap;word-break: break-all;overflow: hidden;text-overflow: ellipsis;">{{wp.title}}</span> <a class="btn btn-info" ng-click="data.openWorkshop(wp)" translate="ui_browse_mobile_modal_author_permission_missing_open_workshop"></a> </div> </div> <div ng-if="data.selectionVisible" class="modalGenericConfirmSelectionRoot"> <div> <a class="editorEffectModalItem activeBackHighlight" ng-repeat="item in data.selectionItems" ng-click="data.selectedItem = item" ng-dblclick="data.selectedItem = item;ok()" ng-class="{\'active\':data.selectedItem == item}" translate="{{item.label}}"></a> </div> </div> <div ng-if="data.alert" style="margin-top:15px;"> <uib-alert type="info"> <div ng-bind-html="data.alert | translate"></div> </uib-alert> </div> </div> <div class="modal-footer" style="display:flex"> <div style="text-align:left"> <a class="btn" ng-if="data.leftVisible" ng-class="data.leftClass" ng-click="leftClicked()"><img ng-if="data.leftImg" ng-src="{{data.leftImg}}"> {{data.leftText|translate}}</a> <a class="btn" ng-if="data.left2Visible" ng-class="data.left2Class" ng-click="left2Clicked()"><img ng-if="data.left2Img" ng-src="{{data.left2Img}}"> {{data.left2Text|translate}}</a> <checkbox ng-if="data.checkboxLowVisible" cb-checked="data.checkboxChecked" cb-title="data.checkboxTitle"></checkbox> </div> \x3c!-- <div ng-if="data.customFooter" style="display:flex;flex-direction:column">\r\n <div style="margin-bottom:5px; text-align: left">{{data.customFooterText | translate}}</div>\r\n <div>\r\n <button class="btn btn-primary" uib-btn-checkbox ng-model="data.customFooterModel" translate="ui_workshop_tags_anime"></button>\r\n </div>\r\n </div> --\x3e <div style="flex-grow: 1"> <a class="btn btn-primary" ng-if="data.okVisible" ng-class="data.okClass" ng-disabled="data.okDisabled || (data.textinputVisible && data.textinputRequired && !(data.textinput&&data.textinput.trim()))" ng-click="ok()">{{data.okText || \'ui_ok\' | translate}}</a> <a class="btn btn-default" ng-if="data.cancelVisible" ng-click="cancel()">{{data.cancelText || \'ui_cancel\' | translate}}</a> </div> </div> </div> '),e.put("views/modals/browsemobileuploadmodal.html",'<div class="modalContainer browseMobileUploadModal"> <div class="modal-header"> <h4 class="modal-title" translate="{{isExporting?\'ui_browse_mobile_upload_modal_title_export\':\'ui_browse_mobile_upload_modal_title\'}}" translate-values="{title: title, device: device.name}"></h4> </div> <div class="modal-body browseMobileUploadModalPages"> <div class="page"> <div class="mmHint" ng-bind-html="\'ui_browse_mobile_upload_modal_hint\'|translate"> </div> <uib-alert class="mmHint" ng-if="isExporting" type="info"> <div ng-bind-html="\'ui_browse_mobile_upload_modal_export_info\'|translate"></div> </uib-alert> <uib-alert class="mmHint" ng-if="show4kHint"> <div translate="ui_browse_mobile_upload_modal_high_res_info"></div> </uib-alert> <uib-alert class="mmHint" ng-if="showPixelArtHint" type="info"> <div translate="ui_browse_mobile_upload_modal_pixel_art_info"></div> </uib-alert> <div class="mmQualityPresetsLarge"> <div class="mmQualitySection"> <div class="mmQualitySectionTitle" translate="ui_browse_mobile_upload_modal_preset_section_live"></div> <a class="btn presetBtn" ng-class="{\'btn-default\':!arePresetSettingsActive(\'high\'),\'btn-primary\':arePresetSettingsActive(\'high\')}" ng-click="device.preset=\'high\';updateCurrentSettingsFromPreset()"> <div class="presetNameOuter"> <div class="presetName" translate="ui_browse_mobile_upload_modal_preset_high"></div> </div> <span class="fas fa-tachometer-alt-fastest presetIcon"></span> </a> <a class="btn presetBtn" ng-class="{\'btn-default\':!arePresetSettingsActive(\'medium\'),\'btn-primary\':arePresetSettingsActive(\'medium\')}" ng-click="device.preset=\'medium\';updateCurrentSettingsFromPreset()"> <div class="presetNameOuter"> <div class="presetName" translate="ui_browse_mobile_upload_modal_preset_medium"></div> </div> <span class="fas fa-tachometer-alt-average presetIcon"></span> </a> </div> <div class="mmQualitySection"> <div class="mmQualitySectionTitle" translate="ui_browse_mobile_upload_modal_preset_section_pre_rendered"></div> <a class="btn presetBtn" ng-class="{\'btn-default\':!arePresetSettingsActive(\'low\'),\'btn-primary\':arePresetSettingsActive(\'low\')}" ng-click="device.preset=\'low\';updateCurrentSettingsFromPreset()"> <div class="presetNameOuter"> <div class="presetName" translate="ui_browse_mobile_upload_modal_preset_low"></div> </div> <span class="fas fa-film presetIcon"></span> </a> </div> </div> <div class="mmHint" ng-if="device.preset==\'low\'"> <div translate="ui_browse_mobile_upload_modal_video_info"></div> </div> \x3c!-- <uib-alert class="mmHint" ng-if="device.preset==\'low\'" type="info">\r\n <div translate="ui_browse_mobile_upload_modal_video_info"></div>\r\n</uib-alert>\r\n --\x3e <div class="container-fluid" ng-if="device.preset"> <div class="row centerText" style="justify-content: center;" ng-if="device.preset!=\'low\'"> <checkbox cb-checked="showAdvancedSettings.visible" cb-title="\'ui_browse_mobile_upload_modal_show_advanced_settings\'"></checkbox> </div> <div ng-if="showAdvancedSettings.visible"> <div ng-if="device.preset!=\'low\'"> <div class="row"> <label class="col-xs-3 control-label" translate="ui_browse_properties_pixel_art_optimization" ng-click="tempSettings.pixelart=!tempSettings.pixelart"></label> <div class="col-xs-9"> <checkbox cb-checked="tempSettings.pixelart"></checkbox> </div> </div> <div class="row"> <label class="col-xs-3 control-label" translate="ui_browse_mobile_upload_modal_texture_reduction"></label> <div class="col-xs-9"> <droplist class="dropup" dp-options="reductionOptions" dp-selected="settings.reduction"></droplist> </div> </div> </div> </div> <div ng-if="device.preset==\'low\'"> <div class="row"> <label class="col-xs-3 control-label" translate="ui_browse_mobile_upload_modal_video_cropping"></label> <div class="col-xs-9"> <droplist class="dropup" dp-options="videoCroppingOptions" dp-selected="settings.videocropping"></droplist> </div> </div> <div ng-if="settings.videocropping!=\'disabled\'" class="row"> <label class="col-xs-3 control-label" translate="ui_browse_mobile_upload_modal_video_preset"></label> <div class="col-xs-9"> <droplist class="dropup" dp-options="videoOptions" dp-selected="settings.videopreset"></droplist> </div> </div> <div ng-if="settings.videocropping==\'disabled\'" class="row"> <label class="col-xs-3 control-label" translate="ui_browse_mobile_upload_modal_video_preset"></label> <div class="col-xs-9"> <droplist class="dropup" dp-options="videoUncroppedOptions" dp-selected="settings.videouncroppedpreset"></droplist> </div> </div> <div class="row"> <label class="col-xs-3 control-label" translate="ui_browse_mobile_upload_modal_video_fps"></label> <div class="col-xs-9"> <droplist class="dropup" dp-options="videoFPSOptions" dp-selected="settings.videofps"></droplist> </div> </div> <div ng-if="settings.videocropping!=\'disabled\' && showVideoAlignment"> <div class="row"> <div class="col-xs-3"></div> <div class="col-xs-9 mmVideoAlignment"> <div ng-if="videoAlignmentPreviewImg" class="mmVideoAlignmentBg" style="pointer-events:none;"> <img class="mmVideoAlignmentImage" ng-src="{{videoAlignmentPreviewImg}}"> <span class="mmVideoAlignmentFg" ng-attr-style="left: {{(settings.videoalignment / 100) * (videoAspectRatioWidth - 56)}}px"></span> </div> <div ng-if="!videoAlignmentPreviewImg" class="mmVideoAlignmentBg" ng-attr-style="width: {{videoAspectRatioWidth}}px"> <span class="mmVideoAlignmentFg" ng-attr-style="left: {{(settings.videoalignment / 100) * (videoAspectRatioWidth - 56)}}px"></span> </div> </div> </div> <div class="row"> <label class="col-xs-3 control-label" translate="ui_editor_properties_alignment"></label> <div class="col-xs-9"> <rzslider rz-slider-model="settings.videoalignment" rz-slider-options="{ceil:100, floor:0}"></rzslider> </div> </div> </div> </div> </div> </div> </div> <div class="modal-footer"> <div> </div> <div> <button class="btn btn-primary" ng-disabled="!device.preset||!hostInitialized" ng-click="ok()" translate="ui_ok"></button> <a class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></a> </div> </div> </div> '),e.put("views/modals/browseplaylistsettingsmodal.html",'<div class="modalContainer browseWallpaperPlaylistSettingsModal"> <div class="modal-header"> <h4 class="modal-title" translate="ui_browse_playlist_modal_settings_header"></h4> </div> <div class="modal-body"> <div class="container-fluid verticalLabels"> <div class="row"> <label for="inputTiming" class="col-sm-7 control-label" translate="ui_browse_playlist_modal_settings_timing_label"></label> <div class="col-sm-5"> <droplist id="inputTiming" dp-options="timingOptions" dp-selected="settings.mode"></droplist> </div> </div> <div ng-if="settings.mode == \'timer\'"> <div class="row"> <label class="col-sm-7 control-label"></label> <div class="col-sm-5"> <div class="row visible-sm visible-md visible-lg"> <div class="col-sm-6" translate="ui_browse_playlist_modal_settings_timing_hours"></div> <div class="col-sm-6" translate="ui_browse_playlist_modal_settings_timing_minutes"></div> </div> <div class="row"> <div class="col-sm-6"> <div class="visible-xs" translate="ui_browse_playlist_modal_settings_timing_hours"></div> <input type="number" class="form-control" ng-model="tempSettings.timerhours" placeholder="00" onclick="this.select()"> </div> <div class="col-sm-6"> <div class="visible-xs" translate="ui_browse_playlist_modal_settings_timing_minutes"></div> <input type="number" class="form-control" ng-model="tempSettings.timerminutes" placeholder="00" onclick="this.select()"> </div> </div> </div> </div> </div> <div class="row" ng-if="settings.mode == \'timer\' || settings.mode == \'logon\' || settings.mode == \'never\'"> <label for="inputOrder" class="col-sm-7 control-label" translate="ui_browse_playlist_modal_settings_order_label"></label> <div class="col-sm-5"> <droplist id="inputOrder" dp-disabled="settings.mode == \'daytime\'" dp-options="orderOptions" dp-selected="settings.order"></droplist> </div> </div> <div class="row"> <label for="inputTransition" class="col-sm-7 control-label" translate="ui_browse_playlist_modal_settings_transition_enabled"></label> <div class="col-sm-5"> \x3c!-- <checkbox id="inputTransition" cb-checked="settings.transition"></checkbox> --\x3e <droplist id="inputTransition" dp-options="transitionOptions" dp-selected="settings.transition"></droplist> </div> </div> <div class="row" ng-if="settings.transition === \'random\'"> <div class="col-sm-12 browseWallpaperPlaylistSettingsTransitions"> <a class="btn btn-default fullWidth browseWallpaperPlaylistSettingsTransitionBtn" ng-click="transitionSelectAll(true)" translate="ui_browse_playlist_modal_settings_transition_enable_all"></a> <a class="btn btn-default fullWidth browseWallpaperPlaylistSettingsTransitionBtn" ng-click="transitionSelectAll(false)" translate="ui_browse_playlist_modal_settings_transition_disable_all"></a> </div> </div> <div class="row" ng-if="settings.transition === \'random\'"> \x3c!-- <div class="col-sm-2"></div> --\x3e <div class="col-sm-12 browseWallpaperPlaylistSettingsTransitions"> <div ng-repeat="info in transitionOptionsButtons" class="browseWallpaperPlaylistSettingsTransitionBtn"> <a class="btn fullWidth" ng-class="{\'btn-default\':settings.transitionpool&&settings.transitionpool.indexOf(info.value)===-1,\'btn-primary\':!settings.transitionpool||settings.transitionpool.indexOf(info.value)>=0}" ng-click="transitionToggleSingle(info.value)">{{info.label|translate}}</a> </div> </div> </div> <div class="row" ng-if="settings.transition !== \'none\' && settings.transition !== \'-2\'"> <label for="inputTransitionTime" class="col-sm-7 control-label" translate="ui_browse_playlist_modal_settings_transition_time"></label> <div class="col-sm-3"> <rzslider id="inputTransitionTime" rz-slider-model="settings.transitiontime" rz-slider-options="transitionTimeSlider"></rzslider> </div> <div class="col-sm-2"> {{settings.transitiontime}} ms </div> </div> <div class="row" ng-if="settings.mode == \'timer\'"> <label ng-click="toggleVideoSequence()" for="inputVideoSequence" class="col-sm-7 control-label" translate="ui_browse_playlist_modal_settings_video_sequence"></label> <div class="col-sm-5"> <checkbox id="inputVideoSequence" cb-disabled="settings.mode != \'timer\'" cb-checked="settings.videosequence"></checkbox> </div> </div> <div class="row" ng-if="settings.mode == \'timer\'"> <label ng-click="toggleUpdateOnPause()" for="inputUpdateOnPause" class="col-sm-7 control-label" translate="ui_browse_playlist_modal_settings_update_on_pause"></label> <div class="col-sm-5"> <checkbox id="inputUpdateOnPause" cb-disabled="settings.mode != \'timer\'" cb-checked="settings.updateonpause"></checkbox> </div> </div> <div class="row" ng-if="settings.mode == \'timer\'"> <label ng-click="toggleBeginFirst()" for="inputBeginFirst" class="col-sm-7 control-label" translate="ui_browse_playlist_modal_settings_begin_first_wallpaper"></label> <div class="col-sm-5"> <checkbox id="inputBeginFirst" cb-disabled="settings.mode != \'timer\'" cb-checked="settings.beginfirst"></checkbox> </div> </div> <div class="row" ng-if="settings.mode == \'timer\'"> <div class="col-sm-1"></div> <label ng-click="togglePlayIntro()" ng-attr-style="opacity: {{(settings.mode != \'timer\' || !settings.beginfirst)?0.7:1.0}}" for="inputPlayIntro" class="col-sm-6 control-label" translate="ui_browse_playlist_modal_settings_intro_wallpaper"></label> <div class="col-sm-5"> <checkbox id="inputPlayIntro" cb-disabled="settings.mode != \'timer\' || !settings.beginfirst" cb-checked="settings.playintro"></checkbox> </div> </div> </div> </div> <div class="modal-footer"> \x3c!-- <div>\r\n <a class="btn btn-default" ng-click="resetSettings()" translate="ui_browse_playlist_modal_settings_reset"></a>\r\n </div> --\x3e <div></div> <div> <button class="btn btn-primary" ng-click="ok()" translate="ui_ok"></button> </div> </div> </div> '),e.put("views/modals/browsereportmodal.html",'<div class="modalContainer browseWallpaperReportModal"> <div class="modal-header"> <h4 class="modal-title">{{\'ui_browse_report_modal_header\' | translate}} {{data.title}}</h4> </div> <div class="modal-body"> <div class="container-fluid"> <div class="row"> <label class="col-sm-6 control-label" translate="ui_browse_report_modal_category_label"></label> <div class="col-sm-6"> <droplist dp-options="categories" dp-selected="context.category"></droplist> </div> </div> <div class="row"> <div class="col-sm-12" translate="{{\'ui_browse_report_modal_category_\' + context.category + \'_description\'}}"></div> </div> <div class="row" ng-if="context.category === \'violation\' || context.category === \'rating\'"> <div class="col-sm-12"> <rating-table highlight="context.category === \'rating\' ? context.suggestedrating : \'Ban\'"></rating-table> </div> </div> <div class="row" ng-if="context.category === \'genre\'"> <label class="col-sm-6 control-label" translate="ui_browse_report_modal_genre_current"></label> <div class="col-sm-6"> {{translatedCurrentTags}} </div> </div> <div class="row" ng-if="context.category === \'genre\'"> <label class="col-sm-6 control-label" translate="ui_browse_report_modal_genre_label"></label> <div class="col-sm-6"> <droplist class="editorTagDropDown" dp-options="genres" dp-empty-text="..." dp-selected="context.suggestedgenre"></droplist> </div> </div> <div class="row" ng-if="context.category === \'rating\' || context.category === \'violation\'"> <label class="col-sm-6 control-label" translate="ui_browse_report_modal_rating_current"></label> <div class="col-sm-6"> {{translatedCurrentRatingTags || (\'ui_workshop_tags_rating_everyone\' | translate)}} </div> </div> <div class="row" ng-if="context.category === \'rating\'"> <label class="col-sm-6 control-label" translate="ui_browse_report_modal_rating_label"></label> <div class="col-sm-6"> <droplist class="editorTagDropDown" dp-options="ratings" dp-empty-text="..." dp-selected="context.suggestedrating"></droplist> </div> </div> <div class="row" ng-if="context.category !== \'copyright\'"> <label class="col-sm-12 control-label" translate="ui_browse_report_modal_notes"></label> </div> <div class="row" ng-if="context.category !== \'copyright\'"> <div class="col-sm-12"> <textarea ng-model="context.note" maxlength="256" style="resize: none;height: 160px;width:100%"></textarea> </div> </div> <div class="row" ng-if="context.category === \'copyright\'"> <div class="col-xs-12"> <input type="text" style="width:100%;" value="{{\'http://steamcommunity.com/sharedfiles/filedetails/?id=\' + data.workshopid}}"> </div> </div> <div class="row" ng-if="context.category === \'copyright\'"> <div class="col-xs-12"> <a class="btn btn-primary fullWidth" ng-click="openDMCA()" translate="ui_browse_report_modal_copyright_dispute"></a> </div> </div> </div> </div> <div class="modal-footer"> <div></div> <div> <button class="btn btn-danger" ng-disabled="isReportDisabled() || reportInProgress" ng-click="ok()" translate="ui_browse_report_modal_submit"></button> <button class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></button> </div> </div> </div> '),e.put("views/modals/browseresolutionsettingsmodal.html",'<div class="modalContainer"> <div class="modal-header"> <h4 class="modal-title" translate="ui_browse_resolution_settings"></h4> </div> <div class="modal-body"> <div class="modalAdvertiseWorkshopBody"> <div translate="ui_browse_modal_resolution_settings_body"></div> <br> <div translate="ui_browse_modal_resolution_settings_pixel_art_hint"></div> <div class="modalAdvertiseWorkshopFilterConfig"> <a class="btn btn-lg" ng-class="{\'btn-default\':filterConfig.recommendedresolution!==true,\'btn-success\':filterConfig.recommendedresolution===true}" translate="ui_browse_modal_resolution_settings_recommended" ng-click="filterConfig.recommendedresolution=true"></a> <a class="btn btn-lg" ng-class="{\'btn-default\':filterConfig.recommendedresolution!==false,\'btn-warning\':filterConfig.recommendedresolution===false}" translate="ui_browse_modal_resolution_settings_all" ng-click="filterConfig.recommendedresolution=false"></a> </div> <br> <div style="text-align:center;"> <checkbox cb-checked="filterConfig.showotherresolution" cb-title="\'ui_browse_modal_resolution_settings_show_other_resolution\'"></checkbox> <div style="font-style:italic;margin-top:10px" translate="ui_browse_modal_resolution_settings_show_other_resolution_hint"></div> </div> </div> </div> <div class="modal-footer browseWorkshopAdvertiseFooter"> <div class="browseWorkshopAdvertiseFooterOkayButton"> <button class="btn btn-primary" ng-click="ok()" translate="ui_ok"></button> <button class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></button> </div> </div> </div> '),e.put("views/modals/browsesetdefaultsmodal.html",'<div class="modalContainer"> <div class="modal-header"> <h4 class="modal-title" translate="ui_browse_details_properties_apply_to_all_wallpapers_header"></h4> </div> <div class="modal-body"> <div> <div translate="ui_browse_details_properties_apply_to_all_instructions"> </div> <div style="padding: 10px"> <div ng-repeat="option in data.options" style="padding: 5px"> <checkbox cb-checked="option.enabled" cb-title="option.label"></checkbox> <span ng-click="option.enabled=!option.enabled" ng-if="showDefaultValue(option.value)">({{option.value}})</span> </div> <div style="padding: 5px"> <a class="btn btn-default" translate="ui_browse_details_properties_apply_to_all_restore_defaults" ng-click="resetDefaultValues()"></a> </div> </div> </div> </div> <div class="modal-footer" style="display: flex"> <div style="display: flex;flex-direction: column;align-items: flex-start;"> <radiobutton ng-model="data.mode" rb-value="\'updateall\'" rb-title="\'ui_browse_details_properties_apply_to_all_update_all_and_default\'" style="margin-bottom:10px;"></radiobutton> <radiobutton ng-model="data.mode" rb-value="\'selection\'" rb-title="data.selectionTitle"></radiobutton> </div> <div style="flex: 1 0 auto;display: flex;align-items: flex-end;"> <div style="flex:1 0 auto"></div> <button class="btn btn-primary" ng-click="ok()" translate="ui_ok" ng-disabled="!anyPropertyEnabled()"></button> <button class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></button> </div> </div> </div> '),e.put("views/modals/browsesplitmonitormodal.html",'<div class="modalContainer"> <div class="modal-header"> <h4 class="modal-title" translate="ui_browse_monitors_split_monitor" translate-values="settings"></h4> </div> <div class="modal-body"> <div class="container-fluid"> <div class="row" style="margin-bottom: 10px"> <label class="col-sm-7 control-label" translate="ui_browse_monitors_direction"></label> <div class="col-sm-5"> <droplist dp-options="directionOptions" dp-change="resetPosition()" dp-selected="settings.config.direction"></droplist> </div> </div> <div class="row"> <label class="col-sm-7 control-label" translate="ui_browse_monitors_posititon"></label> <div class="col-sm-5"> <input class="form-control ignoreModalFocus" type="number" min="0" ng-model="settings.config.position"> </div> </div> </div> </div> <div class="modal-footer"> <div> <button class="btn btn-primary" ng-click="ok()" translate="ui_ok"></button> <button class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></button> </div> </div> </div> '),e.put("views/modals/browsewallpapersharepresetmodal.html",'<div class="modalContainer browseWallpaperSharePresetModal"> <div class="modal-header"> <h4 class="modal-title" translate="ui_browse_preset_modal_share_header"></h4> </div> <div class="modal-body"> <div> \x3c!-- <form ng-submit="ok()" class="form-horizontal">\r\n <div class="form-group" style="margin-bottom:0px">\r\n <label for="inputURL" class="col-sm-2 control-label" translate="ui_browse_preset_modal_save_name"></label>\r\n <div class="col-sm-10">\r\n <input type="text" class="form-control" ng-model="data.name" id="inputURL" autofocus>\r\n </div>\r\n </div>\r\n </form> --\x3e <textarea id="jsonTextArea" style="resize:none;width:100%;" spellcheck="false" rows="20" ng-model="data.preset"></textarea> <textarea id="jsonTextAreaTmp" class="hiddenTextArea" spellcheck="false"></textarea> <div class="jsonError" ng-if="jsonError.length > 0">{{jsonLine}} {{jsonError}}</div> </div> </div> <div class="modal-footer"> <div> <div class="base64Label"> Base64 </div> <div class="base64Buttons"> <a class="btn btn-default" ng-click="copyPreset()"> <span class="fas fa-copy"></span> {{\'ui_browse_preset_modal_copy\' | translate}} </a> <a class="btn btn-default" ng-click="pastePreset()"> <span class="far fa-clipboard"></span> {{\'ui_browse_preset_modal_paste\' | translate}} </a> </div> </div> <div> <button class="btn btn-primary" ng-disabled="!isJsonValid" ng-click="ok()" translate="ui_ok"></button> <button class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></button> </div> </div> </div> '),e.put("views/modals/browsewallpaperworkshopinfomodal.html",'<div class="modalContainer"> <div class="modal-header"> <h4 class="modal-title" translate="ui_browse_modal_advertise_workshop_header"></h4> </div> <div class="modal-body"> <div class="modalAdvertiseWorkshopBody"> <div translate="ui_browse_modal_advertise_workshop_body"></div> <hr class="fullWidth"> <div translate="ui_browse_modal_advertise_workshop_anime_question"></div> <div class="modalAdvertiseWorkshopFilterConfig"> <a class="btn btn-lg" ng-class="{\'btn-default\':filterConfig.Anime===false||filterConfig.Anime===undefined,\'btn-success\':filterConfig.Anime===true}" translate="ui_browse_modal_advertise_workshop_anime_button_show" ng-click="filterConfig.Anime=true"></a> <a class="btn btn-lg" ng-class="{\'btn-default\':filterConfig.Anime===true||filterConfig.Anime===undefined,\'btn-warning\':filterConfig.Anime===false}" translate="ui_browse_modal_advertise_workshop_anime_button_hide" ng-click="filterConfig.Anime=false"></a> </div> <div translate="ui_browse_modal_advertise_workshop_anime_hint"></div> </div> </div> <div class="modal-footer browseWorkshopAdvertiseFooter"> \x3c!-- \t\t<div class="browseWorkshopAdvertiseFooterTags">\r\n\t\t\t<div style="margin-bottom:5px; text-align: left" translate="ui_browse_modal_advertise_workshop_footer"></div>\r\n\t\t\t<div class="browseWorkshopAdvertiseFooterTagsContainer">\r\n\t\t\t\t<button ng-repeat="genre in genreList" class="btn browseWorkshopAdvertiseFooterTagBtn" ng-class="{\'btn-success\':genres[genre.value],\'btn-default\':!genres[genre.value]}" uib-btn-checkbox ng-model="genres[genre.value]" translate="{{genre.label}}"></button>\r\n\t\t\t</div>\r\n\t\t</div> --\x3e <div class="browseWorkshopAdvertiseFooterOkayButton"> <button class="btn btn-primary" ng-disabled="!isDefaultFilterSelect()" ng-click="ok()" translate="ui_ok"></button> <button class="btn btn-default" ng-if="data.canCancel" ng-click="cancel()" translate="ui_cancel"></button> </div> </div> </div> '),e.put("views/modals/dlcpromptmodal.html",'<div class="modalContainer"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_modal_dlc_prompt_title"></h4> </div> <div class="modal-body"> <div translate="{{info.messageText}}" translate-values="data.dlc"> </div> <div ng-if="info.isDownloading"> <br> <div translate="ui_editor_modal_dlc_prompt_message_progress_info" translate-values="{sizeDownloaded:formatSize(info.bytesDownloaded), sizeTotal:formatSize(info.bytesTotal)}"></div> <br> <uib-progressbar class="progress-striped active" max="100" value="info.downloadProgress"><i>{{info.downloadProgress}}%</i></uib-progressbar> </div> \x3c!-- <div style="display:flex;align-items: center;">\r\n <div style="font-size: 80px;">\r\n <span class="fab fa-steam"></span>\r\n </div>\r\n <div style="flex:1;padding:0 20px">\r\n <div translate="ui_editor_workshop_eula_body"></div>\r\n </div>\r\n </div>\r\n <div>\r\n <a class="btn btn-primary btn-lg fullWidth" translate="ui_editor_workshop_eula_button" ng-click="showEULA()"></a>\r\n </div>\r\n <div class="fullWidth" ng-if="showWaitingAnim" style="display:flex;justify-content: center;padding: 20px 0 10px 0;">\r\n <span translate="ui_editor_workshop_eula_waiting_hint"></span> <span class="min-width: 20px;display: inline-block;">{{waitingAnim}}</span>\r\n </div> --\x3e </div> <div class="modal-footer" style="display:flex"> <div style="text-align:left"> \x3c!-- <a class="btn btn-info" ng-click="openDLCStorePage()" translate="ui_modal_trial_version_start_open_store_page"></a> --\x3e </div> <div style="flex-grow: 1"> <a ng-if="supportsDLCManagement && !info.isDownloading" class="btn btn-primary" ng-click="ok()" translate="ui_ok"></a> <a class="btn btn-default" ng-click="cancel()" translate="ui_close"></a> </div> </div> </div> '),e.put("views/modals/editoranimationeventsmodal.html",'<div class="modalContainer editorAnimationOptionsModal"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_animation_events_modal_header"></h4> </div> <div class="modal-body"> <div class="container-fluid"> <div class="row"> <h4 translate="ui_editor_animation_events_modal_events"></h4> </div> <div class="row"> <label class="col-sm-6 control-label" translate="ui_editor_animation_events_modal_name"></label> <label class="col-sm-5 control-label" translate="ui_editor_animation_events_modal_frame"></label> <div class="col-sm-1"></div> </div> <div class="row form-group" ng-repeat="event in events"> <div class="col-sm-6"> <input type="text" class="form-control" ng-model="event.name" placeholder="{{\'ui_editor_animation_events_modal_name\'|translate}}"> </div> <div class="col-sm-5"> <input type="number" class="form-control" ng-model="event.frame" placeholder="{{\'ui_editor_animation_events_modal_frame\'|translate}}"> </div> <div class="col-sm-1"> <button class="btn btn-danger" ng-click="removeEvent(event)"><span class="fas fa-fw fa-times"></span></button> </div> </div> <div class="row form-group"> <div class="col-sm-6"> <input type="text" class="form-control" ng-model="newEvent.name" placeholder="{{\'ui_editor_animation_events_modal_name\'|translate}}" autofocus> </div> <div class="col-sm-5"> <input type="number" class="form-control" ng-model="newEvent.frame" placeholder="{{\'ui_editor_animation_events_modal_frame\'|translate}}"> </div> <div class="col-sm-1"> <button ng-disabled="!newEvent.name" class="btn btn-success" ng-click="addEvent()"><span class="fas fa-fw fa-plus"></span></button> </div> </div> </div> </div> <div class="modal-footer"> <div> </div> <div> <a class="btn btn-primary" ng-click="ok()" translate="ui_ok"></a> \x3c!-- <a class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></a> --\x3e </div> </div> </div> '),e.put("views/modals/editoranimationhelpmodal.html",'<div class="modalContainer editorAnimationOptionsModal"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_animation_help_modal_header"></h4> </div> <div class="modal-body"> <div class="container-fluid"> <div class="row form-group"> <h3 translate="ui_editor_animation_help_modal_keyframes"></h3> </div> <div class="row form-group"> <label class="col-sm-4 control-label" translate="ui_editor_animation_help_modal_shift_drag"></label> <div class="col-sm-8" translate="ui_editor_animation_help_modal_lock_point_vertically"></div> </div> <div class="row form-group"> <label class="col-sm-4 control-label" translate="ui_editor_animation_help_modal_shift_ctrl_wheel"></label> <div class="col-sm-8" translate="ui_editor_animation_help_modal_zoom"></div> </div> <div class="row form-group"> <label class="col-sm-4 control-label" translate="ui_editor_animation_help_modal_shift_ctrl_click"></label> <div class="col-sm-8" translate="ui_editor_animation_help_modal_select_points"></div> </div> <div class="row form-group"> <label class="col-sm-4 control-label" translate="ui_editor_animation_help_modal_ctrl_c_v"></label> <div class="col-sm-8" translate="ui_editor_animation_help_modal_copy_paste"></div> </div> <div class="row form-group"> <label class="col-sm-4 control-label" translate="ui_editor_animation_help_modal_del"></label> <div class="col-sm-8" translate="ui_editor_animation_help_modal_delete"></div> </div> <div class="row form-group"> <label class="col-sm-4 control-label">A</label> <div class="col-sm-8" translate="ui_editor_animation_help_modal_autokeyframe"></div> </div> <div class="row form-group"> <label class="col-sm-4 control-label">K</label> <div class="col-sm-8" translate="ui_editor_animation_help_modal_keyframe"></div> </div> <div class="row form-group"> <label class="col-sm-4 control-label">U</label> <div class="col-sm-8" translate="ui_editor_animation_help_modal_update_keyframe"></div> </div> <div class="row form-group"> <h3 translate="ui_editor_animation_help_modal_playback"></h3> </div> <div class="row form-group"> <label class="col-sm-4 control-label" translate="ui_editor_animation_help_modal_left_right"></label> <div class="col-sm-8" translate="ui_editor_animation_help_modal_jump_frame"></div> </div> <div class="row form-group"> <label class="col-sm-4 control-label" translate="ui_editor_animation_help_modal_ctrl_left_right"></label> <div class="col-sm-8" translate="ui_editor_animation_help_modal_jump_keyframe"></div> </div> <div class="row form-group"> <label class="col-sm-4 control-label" translate="ui_editor_animation_help_modal_space"></label> <div class="col-sm-8" translate="ui_editor_animation_help_modal_play_pause"></div> </div> </div> </div> <div class="modal-footer"> <div> </div> <div> <button class="btn btn-primary" ng-click="ok()" translate="ui_ok"></button> </div> </div> </div> '),e.put("views/modals/editoranimationoptionsmodal.html",'<div class="modalContainer editorAnimationOptionsModal"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_animation_modal_header"></h4> </div> <div class="modal-body"> <div class="container-fluid"> <div class="row form-group" ng-if="propertyLinkOptions.length > 0"> <label class="col-sm-7 control-label" translate="ui_editor_animation_modal_combine_property_animation"></label> <div class="col-sm-5"> <droplist dp-options="propertyLinkOptions" dp-selected="tempSettings.parent"></droplist> </div> </div> <div ng-if="!tempSettings.parent"> <div class="row form-group"> <label class="col-sm-7 control-label" translate="ui_editor_animation_modal_mode"></label> <div class="col-sm-5"> <droplist dp-options="modeOptions" dp-selected="settings.mode"></droplist> </div> </div> <div class="row form-group"> <label class="col-sm-7 control-label" translate="ui_editor_animation_modal_seconds"></label> <div class="col-sm-5"> <input type="number" class="form-control" ng-model="tempSettings.seconds" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group" ng-if="!editorSettings.animationoptionsuseframes"> <label class="col-sm-7 control-label switchRow"> <span class="switchLabel" translate="ui_editor_animation_modal_fps"></span> <a class="switchButton" translate="ui_editor_animation_modal_switch_to_frames" ng-click="updateFramesFromFPS();editorSettings.animationoptionsuseframes=true"></a> </label> <div class="col-sm-5"> <input type="number" class="form-control" ng-model="settings.fps" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group" ng-if="editorSettings.animationoptionsuseframes"> <label class="col-sm-7 control-label switchRow"> <span class="switchLabel" translate="ui_editor_animation_modal_frames"></span> <a class="switchButton" translate="ui_editor_animation_modal_switch_to_fps" ng-click="updateFPSFromFrames();editorSettings.animationoptionsuseframes=false"></a> </label> <div class="col-sm-5"> <input type="number" class="form-control" ng-model="tempSettings.length" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group" ng-if="mode === \'property\'"> <label class="col-sm-7 control-label" translate="ui_editor_animation_modal_name"></label> <div class="col-sm-5"> <input type="text" class="form-control" ng-model="settings.name" onclick="this.select()"> </div> </div> <div class="row form-group" ng-if="hasSmoothingOption"> <label class="col-sm-7 control-label" translate="ui_editor_properties_smoothness"></label> <div class="col-sm-4"> <rzslider rz-slider-model="settings.smoothing" rz-slider-options="{ceil:0.9, floor:0, enforceStep:true,step:0.1,precision:2}"></rzslider> </div> <div class="col-sm-1"> {{settings.smoothing | truncateFloat}} </div> </div> <div class="row form-group" class="row form-group" ng-if="mode === \'property\'"> <label class="col-sm-7 control-label" translate="ui_editor_animation_modal_start_paused" ng-click="settings.startpaused=!settings.startpaused"></label> <div class="col-sm-5"> <checkbox cb-checked="settings.startpaused"></checkbox> </div> </div> <div class="row form-group" class="row form-group" ng-if="settings.mode === \'loop\'"> <label class="col-sm-7 control-label"> <span translate="ui_editor_animation_modal_loop_wrap" ng-click="settings.wraploop=!settings.wraploop"></span> <a class="pull-right infoTableHint" ng-click="showGenericHelp($event, \'ui_editor_animation_modal_loop_wrap_help_title\', \'ui_editor_animation_modal_loop_wrap_help_body\')"><span class="fas fa-question"></span></a> </label> <div class="col-sm-5"> <checkbox cb-checked="settings.wraploop"></checkbox> </div> </div> </div> </div> </div> <div class="modal-footer"> <div> </div> <div> <button class="btn btn-primary" ng-click="ok()" translate="ui_ok"></button> </div> </div> </div> '),e.put("views/modals/editorblendshapesettingsmodal.html",'<div class="modalContainer editorPropertiesModalTable"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_blend_shape_settings_title"></h4> </div> <div class="modal-body" style="min-height:230px"> <div class="container-fluid"> <div class="row form-group"> <label class="col-sm-5 control-label" translate="ui_editor_properties_modifier_bone"></label> <div class="col-sm-7"> <droplist class="editorBoneConstraintsDropList" dp-options="optionsBones" dp-selected="data.settings.modifierbone"></droplist> </div> </div> <div ng-if="data.settings.modifierbone"> <div class="row form-group"> <label class="col-sm-5 control-label" translate="ui_editor_properties_modifier_mode"></label> <div class="col-sm-7"> <droplist class="editorBoneConstraintsDropList" dp-options="optionsMode" dp-selected="data.settings.modifiermode"></droplist> </div> </div> <div class="row form-group"> <label class="col-sm-5 control-label" translate="ui_editor_properties_modifier_start_distance"></label> <div class="col-sm-5"> <rzslider rz-slider-model="data.settings.modifierstartdistance" rz-slider-options="{ceil:500, floor:0, enforceStep:false}"></rzslider> </div> <div class="col-sm-2"> <input type="number" class="form-control" ng-model="data.settings.modifierstartdistance" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group"> <label class="col-sm-5 control-label" translate="ui_editor_properties_modifier_end_distance"></label> <div class="col-sm-5"> <rzslider rz-slider-model="data.settings.modifierenddistance" rz-slider-options="{ceil:500, floor:0, enforceStep:false}"></rzslider> </div> <div class="col-sm-2"> <input type="number" class="form-control" ng-model="data.settings.modifierenddistance" placeholder="0" onclick="this.select()"> </div> </div> </div> </div> </div> <div class="modal-footer"> <div> </div> <div> <button class="btn btn-primary" ng-click="ok()" translate="ui_ok"></button> \x3c!-- <button class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></button> --\x3e </div> </div> </div> '),e.put("views/modals/editorboneconstraintsmodal.html",'<div class="modalContainer editorBoneConstraintsModal"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_bone_constraints_modal_header"></h4> </div> <div class="modal-body"> <div class="editorBoneConstraintsTabs"> <div class="editorBoneConstraintsTab" translate="ui_editor_bone_constraints_modal_tab_physics" ng-class="{active:visGroup.tab==\'physics\'}" ng-click="changeVisGroup(\'physics\')"></div> <div class="editorBoneConstraintsTab" translate="ui_editor_bone_constraints_modal_tab_blending" ng-class="{active:visGroup.tab==\'blendrules\'}" ng-click="changeVisGroup(\'blendrules\')"></div> \x3c!-- <div class="editorBoneConstraintsTab" translate="ui_editor_bone_constraints_modal_tab_script" ng-class="{active:visGroup.tab==\'script\'}" ng-click="changeVisGroup(\'script\')"></div> --\x3e </div> <div class="container-fluid containerParent" ng-if="visGroup.tab==\'physics\'"> <physicsconstraints class="editorBoneConstraintsPhysicsSettings" renderable-id="renderableId" bone-id="boneId" settings="settings" defaults="defaults" constraint-mode="constraintMode" physics-ctrl="physicsCtrl"></physicsconstraints> </div> <div class="container-fluid containerParent" ng-if="visGroup.tab==\'blendrules\'" style="overflow-y: auto;"> <div class="row form-group"> <label class="col-sm-4 control-label" translate="ui_editor_bone_constraints_blending_add"></label> <div class="col-sm-8" style="display:flex"> <droplist class="editorBoneConstraintsBlendDropList" dp-options="visGroup.bonesAvailable" dp-selected="newBlendTarget.bone" dp-empty-text="ui_editor_bone_constraints_blending_add_empty"></droplist> <button ng-disabled="!newBlendTarget.bone" class="btn btn-success" ng-click="addBoneBlendTarget()"><span class="fas fa-fw fa-plus"></span></button> </div> </div> <div class="row form-group" ng-if="blendrules.length > 0"> <label class="col-sm-4 control-label" translate="ui_editor_bone_constraints_blending_blend_list"> </label> </div> <div ng-repeat="rule in blendrules track by $index"> <div class="row form-group" style="height:34px"> <label class="col-sm-5 control-label"></label> <div class="col-sm-7"> <div style="display:flex;align-items: center"> <span style="flex:1">{{rule.label}}</span> <button class="btn btn-danger" ng-click="removeBoneBlendTarget(rule)" style="height:34px"><span class="fas fa-fw fa-times"></span></button> </div> </div> </div> <div ng-if="settings.ik"> <div class="row form-group"> <div class="col-sm-1"></div> <label class="col-sm-4 control-label" translate="ui_editor_properties_mode"></label> <div class="col-sm-7"> <droplist class="editorBoneConstraintsBlendDropList" dp-options="ikCpModes" dp-selected="rule.mode"></droplist> </div> </div> <div ng-if="rule.mode===\'axis\'"> <div class="row form-group"> <div class="col-sm-1"></div> <label class="col-sm-4 control-label" translate="ui_editor_bone_constraints_ik_align_chain_with_axis" ng-click="rule.chainalignaxis=!rule.chainalignaxis"></label> <div class="col-sm-7"> <checkbox cb-checked="rule.chainalignaxis"></checkbox> </div> </div> <div class="row form-group"> <div class="col-sm-1"></div> <label class="col-sm-4 control-label" translate="ui_editor_properties_axis_min"></label> <div class="col-sm-5"> <rzslider rz-slider-model="rule.amin" rz-slider-options="{ceil:200, floor:0, enforceStep:false}"></rzslider> </div> <div class="col-sm-2"> <input type="number" class="form-control" ng-model="rule.amin" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group"> <div class="col-sm-1"></div> <label class="col-sm-4 control-label" translate="ui_editor_properties_axis_max"></label> <div class="col-sm-5"> <rzslider rz-slider-model="rule.amax" rz-slider-options="{ceil:200, floor:0, enforceStep:false}"></rzslider> </div> <div class="col-sm-2"> <input type="number" class="form-control" ng-model="rule.amax" placeholder="0" onclick="this.select()"> </div> </div> </div> </div> </div> </div> \x3c!-- <div class="container-fluid containerParent" ng-if="visGroup.tab==\'script\'">\r\n </div> --\x3e </div> <div class="modal-footer"> <div> <button class="btn btn-danger" ng-click="resetSettings()" translate="ui_editor_bone_constraints_reset"></button> <button class="btn btn-default" ng-click="copySettings()"> <span class="fas fa-copy"></span> {{\'ui_browse_preset_modal_copy\' | translate}} </button> <button class="btn btn-default" ng-click="pasteSettings()" ng-disabled="!canPaste()"> <span class="far fa-clipboard"></span> {{\'ui_browse_preset_modal_paste\' | translate}} </button> </div> <div> <button class="btn btn-primary" ng-click="ok()" translate="ui_ok"></button> <button class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></button> </div> </div> </div> '),e.put("views/modals/editorcharacterseparationmodal.html",'<div class="modalContainer editorCharacterSeparationModal" tabindex="0"> <div class="modal-header"> <h4 class="modal-title">{{title|translate}}</h4> </div> <div class="modal-body"> <div class="fixHeight drawParent"> <div class="controls" ng-show="showHierarchy"> <div class="sheetMenu"> <a class="btn btn-primary controlsBtn" ng-click="addLimb()"><span class="fas fa-plus"></span> <span>{{hierarchyAddLabel|translate}}</span></a> <div class="controlsTitle">{{titleHierarchy|translate}}</div> <div class="hierarchy"> \x3c!-- ng-attr-style="padding-left:{{getLimbPadding(limb)}}px" --\x3e <div class="hierarchyLimb" ng-repeat="limb in hierarchy track by $index" ng-class="{selected:limb===selected.limb,canDelete:limb.depth>0}" ng-click="selected.limb = limb"> <span class="tree">{{limb.tree}}</span> <span ng-if="limb.error" class="fas fa-exclamation-triangle warningText" style="margin-right: 10px;"></span> <span class="lbl ellipsis">{{limb.label}}</span> <a class="btn btn-danger delete" ng-click="removeLimb(limb)"> <span class="fas fa-times"></span> </a> </div> </div> </div> </div> <div class="controls" ng-show="isCharacterSeparation"> <div class="scroll"> <div class="controlsUndoRedo"> <button class="btn btn-primary controlsUndoRedoBtn" ng-disabled="undoStack.length < 1" ng-click="performUndo()"><span class="fas fa-fw fa-undo"></span></button> <button class="btn btn-primary controlsUndoRedoBtn" ng-disabled="redoStack.length < 1" ng-click="performRedo()"><span class="fas fa-fw fa-redo"></span></button> </div> <div class="controlsTitle" translate="ui_editor_character_separation_editing_title"></div> <div style="width:100%;display:flex;"> <a class="btn" style="flex:1" ng-class="{\'btn-primary\':dcConfig.editMode==\'polygon\', \'btn-default\':dcConfig.editMode!=\'polygon\'}" tooltip="ui_editor_character_separation_polygon_title" ng-click="changeEditMode(\'polygon\')"><span class="fas fa-fw fa-vector-polygon"></span></a> <a class="btn" style="flex:1" ng-class="{\'btn-primary\':dcConfig.editMode==\'brush\', \'btn-default\':dcConfig.editMode!=\'brush\'}" tooltip="ui_editor_character_separation_brush_title" ng-click="changeEditMode(\'brush\')"><span class="fas fa-fw fa-paintbrush"></span></a> </div> <a ng-if="dcConfig.editMode==\'brush\'" class="btn controlsBtn" ng-class="{\'btn-default\':dcConfig.brush!==\'foreground\',\'btn-primary\':dcConfig.brush===\'foreground\'}" translate="ui_editor_character_separation_brush_mark_foreground" ng-click="dcConfig.brush=\'foreground\'"></a> <a ng-if="dcConfig.editMode==\'brush\'" class="btn controlsBtn" ng-class="{\'btn-default\':dcConfig.brush!==\'background\',\'btn-primary\':dcConfig.brush===\'background\'}" translate="ui_editor_character_separation_brush_mark_background" ng-click="dcConfig.brush=\'background\'"></a> <a ng-if="dcConfig.editMode==\'brush\'" class="btn controlsBtn" ng-class="{\'btn-default\':dcConfig.brush!==\'erase\',\'btn-primary\':dcConfig.brush===\'erase\'}" translate="ui_editor_character_separation_brush_erase" ng-click="dcConfig.brush=\'erase\'"></a> <div ng-if="dcConfig.editMode==\'brush\'" class="controlsSliderTitle" translate="ui_editor_character_separation_brush_size"></div> <div ng-if="dcConfig.editMode==\'brush\'" class="controlsSlider"> <rzslider rz-slider-model="dcConfig.brushSize" rz-slider-options="{ceil:100, floor:1, enforceStep:false}"></rzslider> <span class="controlsSliderValue">{{dcConfig.brushSize}}</span>% </div> <a class="btn btn-danger controlsBtn" translate="ui_editor_character_separation_brush_clear" ng-click="performReset()"></a> <hr class="controlsDivider"> <div class="controlsTitle" translate="ui_editor_character_separation_analyzer_title"></div> <div> <div class="controlsSliderTitle" translate="ui_editor_character_separation_analyzer_fill_gaps"></div> <div class="controlsSlider"> <rzslider rz-slider-model="dcConfig.fillGaps" rz-slider-options="{ceil:100, floor:0, onEnd:rebuildGrabCutOnDemand}"></rzslider> <span class="controlsSliderValue">{{dcConfig.fillGaps}}</span> </div> </div> <div class="controlsSliderTitle" translate="ui_editor_character_separation_analyzer_tolerance"></div> <div class="controlsSlider"> <rzslider rz-slider-model="dcConfig.maskBias" rz-slider-options="{ceil:20, floor:-20, onEnd:rebuildGrabCutOnDemand}"></rzslider> <span class="controlsSliderValue">{{dcConfig.maskBias}}</span> </div> <div class="controlsSliderTitle" translate="ui_editor_character_separation_analyzer_smoothing"></div> <div class="controlsSlider"> <rzslider rz-slider-model="dcConfig.maskSmoothing" rz-slider-options="{ceil:5, floor:0, onEnd:rebuildGrabCutOnDemand}"></rzslider> <span class="controlsSliderValue">{{dcConfig.maskSmoothing}}</span> </div> <hr class="controlsDivider"> <div class="controlsSliderTitle" translate="ui_editor_character_separation_analyzer_quality"></div> <div class="controlsSlider"> <rzslider rz-slider-model="dcConfig.maskQuality" rz-slider-options="{ceil:2, floor:0, onEnd:rebuildGrabCutOnDemand}"></rzslider> <span class="controlsSliderValue">{{dcConfig.maskQuality}}</span> </div> <div translate="ui_editor_character_separation_analyzer_quality_hint" style="font-size:90%"></div> </div> <div class="disableOverlay" ng-if="isSheet && !(selected.limb && selected.limb.src) || isLoading"></div> </div> <div class="controls" ng-show="isNormalMap"> <div class="scroll"> <a class="btn btn-primary controlsBtn" translate="ui_editor_character_separation_view_reset" ng-click="resetView()"></a> <hr class="controlsDivider"> <a class="btn btn-primary controlsBtn" translate="ui_editor_bone_constraints_reset" ng-click="resetSettings()"></a> <div class="controlsTitle" translate="ui_editor_character_separation_shape"></div> \x3c!-- <div class="controlsSliderTitle" translate="ui_editor_character_separation_filter_size"></div>\r\n <div class="controlsSlider">\r\n <rzslider rz-slider-model="normalConfig.filter" rz-slider-options="{ceil:31, floor:3,step:2, onEnd:rebuildNormalMapOnDemand}"></rzslider>\r\n <span class="controlsSliderValue">{{normalConfig.filter}}</span>\r\n </div> --\x3e <div class="controlsSliderTitle" translate="ui_editor_character_separation_blur"></div> <div class="controlsSlider"> <rzslider rz-slider-model="normalConfig.blur" rz-slider-options="{ceil:63, floor:1,step:2, onEnd:rebuildNormalMapOnDemand}"></rzslider> <span class="controlsSliderValue">{{normalConfig.blur}}</span> </div> <div class="controlsSliderTitle" translate="ui_editor_character_separation_depth"></div> <div class="controlsSlider"> <rzslider rz-slider-model="normalConfig.depth" rz-slider-options="{ceil:1, floor:0, precision:3,step:0.01, onEnd:rebuildNormalMapOnDemand}"></rzslider> <span class="controlsSliderValue">{{normalConfig.depth}}</span> </div> <div class="controlsSliderTitle" translate="ui_editor_character_separation_exponent"></div> <div class="controlsSlider"> <rzslider rz-slider-model="normalConfig.exponent" rz-slider-options="{ceil:8, floor:1, precision:2,step:0.1, onEnd:rebuildNormalMapOnDemand}"></rzslider> <span class="controlsSliderValue">{{normalConfig.exponent}}</span> </div> <div class="controlsSliderTitle" translate="ui_editor_character_separation_threshold"></div> <div class="controlsSlider"> <rzslider rz-slider-model="normalConfig.threshold" rz-slider-options="{ceil:1, floor:0, precision:2,step:0.1, onEnd:rebuildNormalMapOnDemand}"></rzslider> <span class="controlsSliderValue">{{normalConfig.threshold}}</span> </div> <hr class="controlsDivider"> <div class="controlsTitle" translate="ui_editor_character_separation_details"></div> <div class="controlsSliderTitle" translate="ui_editor_character_separation_blur"></div> <div class="controlsSlider"> <rzslider rz-slider-model="normalConfig.detailsblur" rz-slider-options="{ceil:255, floor:1,step:2, onEnd:rebuildNormalMapOnDemand}"></rzslider> <span class="controlsSliderValue">{{normalConfig.detailsblur}}</span> </div> <div class="controlsSliderTitle" translate="ui_editor_character_separation_depth"></div> <div class="controlsSlider"> <rzslider rz-slider-model="normalConfig.detailsdepth" rz-slider-options="{ceil:1, floor:0, precision:3,step:0.01, onEnd:rebuildNormalMapOnDemand}"></rzslider> <span class="controlsSliderValue">{{normalConfig.detailsdepth}}</span> </div> <checkbox style="margin-top:10px" cb-changed="rebuildNormalMapOnDemand()" cb-checked="normalConfig.detailsinvert" cb-title="\'ui_editor_character_separation_invert\'"></checkbox> </div> </div> <div class="controls" ng-show="isDepthMap"> <div class="scroll"> <a class="btn btn-primary controlsBtn" translate="ui_editor_character_separation_view_reset" ng-click="resetView()"></a> <hr class="controlsDivider"> <a class="btn btn-primary controlsBtn" translate="ui_editor_bone_constraints_reset" ng-click="resetSettings()"></a> <div class="controlsSliderTitle" translate="ui_editor_character_separation_blur"></div> <div class="controlsSlider"> <rzslider rz-slider-model="depthConfig.blur" rz-slider-options="{ceil:63, floor:1,step:2, onEnd:rebuildDepthMapOnDemand}"></rzslider> <span class="controlsSliderValue">{{depthConfig.blur}}</span> </div> \x3c!-- <div class="controlsSliderTitle" translate="ui_editor_character_separation_analyzer_quality"></div>\r\n <div class="controlsSlider">\r\n <rzslider rz-slider-model="depthConfig.quality" rz-slider-options="{ceil:2, floor:0, onEnd:rebuildDepthMapOnDemand}"></rzslider>\r\n <span class="controlsSliderValue">{{depthConfig.quality}}</span>\r\n </div> --\x3e <checkbox style="margin-top:10px" cb-changed="rebuildDepthMapOnDemand()" cb-checked="depthConfig.autoContrast" cb-title="\'ui_editor_character_separation_auto_contrast\'"></checkbox> <checkbox style="margin-top:10px" cb-changed="rebuildDepthMapOnDemand()" cb-checked="depthConfig.invert" cb-title="\'ui_editor_character_separation_invert\'"></checkbox> <hr class="controlsDivider"> <div class="controlsSliderTitle" translate="ui_editor_character_separation_outline_compensation"></div> <div class="controlsSlider"> <rzslider rz-slider-model="depthConfig.outlineCompensation" rz-slider-options="{ceil:50, floor:0, onEnd:rebuildDepthMapOnDemand}"></rzslider> <span class="controlsSliderValue">{{depthConfig.outlineCompensation}}</span> </div> <div translate="ui_editor_character_separation_outline_compensation_hint" style="font-size:90%"></div> </div> </div> <div class="controls channelControls" ng-show="isTextureChannels"> <div class="scroll"> <div class="controlsTitle" translate="ui_editor_character_separation_channel" style="margin-top:0"></div> <a class="btn btn-primary controlsBtn" translate="ui_editor_character_separation_move_up" ng-click="moveChannel(selected.limb, true)" ng-disabled="selected.limb.isPuppet"></a> <a class="btn btn-primary controlsBtn" translate="ui_editor_character_separation_move_down" ng-click="moveChannel(selected.limb, false)" ng-disabled="selected.limb.isPuppet"></a> <hr class="controlsDivider"> <a class="btn btn-primary controlsBtn" translate="ui_editor_character_separation_replace_texture" ng-click="replaceTexture(selected.limb)" ng-disabled="selected.limb.isPuppet" style="margin-top:0"></a> <div class="controlsTitle" translate="ui_editor_character_separation_puppet"></div> <checkbox style="margin-top:10px" cb-checked="textureChannelConfig.alphaWriting" cb-title="\'ui_editor_character_separation_alpha_writing\'"></checkbox> <div translate="ui_editor_character_separation_alpha_writing_hint" style="font-size:90%;margin-top:10px;"></div> <div class="overlappingWarning" ng-if="textureChannelConfig.alphaWriting && hasOverlaps" translate="ui_editor_character_separation_alpha_writing_warning"></div> </div> </div> <div class="painterColumn"> <div class="painterTopControls" ng-show="isCharacterSeparation"> <span style="display:flex;align-items:center;"> <span style="flex:1;margin-right:5px" translate="ui_editor_properties_background_color"></span> <spectrum-colorpicker options="colorPickerSettings" ng-model="view.bgColor"></spectrum-colorpicker> </span> <span style="display:flex;align-items:center;"> <span style="margin-right:5px" translate="ui_editor_character_separation_view_title"></span> <button class="btn" ng-class="{\'btn-default\':previewState.active!==\'original\', \'btn-primary\':previewState.active===\'original\'}" tooltip="ui_editor_character_separation_view_original" ng-click="previewState.active=\'original\'" style="border-radius: 5px 0 0 5px;"><span class="fas fa-fw fa-child"></span></button> <button ng-disabled="selected.limb.needsInit||isComputingGrabCut" class="btn" ng-class="{\'btn-default\':previewState.active!==\'foreground_original\', \'btn-primary\':previewState.active===\'foreground_original\'}" tooltip="ui_editor_character_separation_view_foreground_and_original" ng-click="previewState.active=\'foreground_original\'"><span class="fas fa-fw fa-layer-group"></span></button> <button ng-disabled="selected.limb.needsInit||isComputingGrabCut" class="btn" ng-class="{\'btn-default\':previewState.active!==\'foreground\', \'btn-primary\':previewState.active===\'foreground\'}" tooltip="ui_editor_character_separation_view_foreground" ng-click="previewState.active=\'foreground\'"><span class="fas fa-fw fa-bring-forward"></span></button> <button ng-disabled="selected.limb.needsInit||isComputingGrabCut" class="btn" ng-class="{\'btn-default\':previewState.active!==\'background\', \'btn-primary\':previewState.active===\'background\'}" ng-click="previewState.active=\'background\'" tooltip="ui_editor_character_separation_view_background" style="border-radius: 0 5px 5px 0;"><span class="fas fa-fw fa-send-backward"></span></button> <span class="painterTopControlsPopOutParent" style="margin:0 5px"> <button style="height:100%;" class="btn" ng-class="{\'btn-default\':!mask.visible, \'btn-primary\':mask.visible}" ng-click="mask.visible=!mask.visible" tooltip="ui_editor_character_separation_view_mask" t-values="{key:\'M\'}"><span class="fas fa-fw fa-circle-dashed"></span></button> <div class="painterTopControlsPopOut"> <checkbox style="margin-top:10px" cb-checked="mask.fadeBg" cb-title="\'ui_editor_character_separation_view_improve_visiblity\'"></checkbox> <div class="controlsSliderTitle" translate="ui_editor_character_separation_mask_opacity"></div> <div class="controlsSlider"> <rzslider rz-slider-model="mask.opacity" rz-slider-options="{ceil:100, floor:10, enforceStep:false}"></rzslider> <span class="controlsSliderValue">{{mask.opacity}}</span> </div> </div> </span> <a class="btn btn-primary" tooltip="ui_editor_character_separation_view_reset" ng-click="resetView()"><span class="fas fa-fw fa-arrows-rotate"></span></a> </span> </div> <div class="painter" ng-class="{painterPolygon:dcConfig.editMode==\'polygon\'}"> <div class="painterPan"> <img id="bgImage" class="bgImg" ng-if="previewState.active===\'foreground_original\'" ng-class="{faded:mask.fadeBg,trans:isCharacterSeparation}" ng-src="{{previewState.bgImgUrl}}"> <img ng-show="!isTextureChannels" id="fgImage" class="bgImg" ng-class="{faded:mask.fadeBg}" ng-src="{{previewState.img}}"> <canvas ng-if="isTextureChannels" id="cropCanvas" class="cropCanvas"></canvas> <draw-canvas ng-class="{hidemask:!mask.visible}" dc-config="dcConfig" dc-mask-attr="mask" dc-paint-callback="dcPaintCallback(state)" class="fixHeight"></draw-canvas> </div> </div> </div> </div> <div class="cutProgress"> <uib-progressbar ng-attr-style="opacity:{{isComputingGrabCut ? 1.0 : 0.0}}" class="progress-striped active" max="100" value="100"></uib-progressbar> <div style="position:absolute;width:100%;height:100%;top:0;left:0;" ng-show="isCharacterSeparation && !isComputingGrabCut && dcConfig.editMode==\'brush\'" translate="ui_editor_character_separation_hint"></div> </div> </div> <div class="modal-footer"> <div> \x3c!-- <button class="btn btn-danger" ng-click="resetSettings()" translate="ui_editor_bone_constraints_reset"></button>\r\n <button class="btn btn-default" ng-click="copySettings()">\r\n <span class="fas fa-copy"></span> {{\'ui_browse_preset_modal_copy\' | translate}}\r\n </button>\r\n <button class="btn btn-default" ng-click="pasteSettings()" ng-disabled="!canPaste()">\r\n <span class="far fa-clipboard"></span> {{\'ui_browse_preset_modal_paste\' | translate}}\r\n </button> --\x3e <div ng-if="isCharacterSeparation"> <button ng-disabled="!blinkAnalyzeOnDemand" class="btn btn-primary" translate="ui_editor_character_separation_analyzer_recalculate" ng-click="rebuildGrabCut()" ng-class="{editorCharacterSeparationModalRefineButtonBlink:blinkAnalyzeOnDemand}" tooltip="ui_hotkey" t-values="{key:\'R\'}"></button> <button class="btn" ng-class="{\'btn-primary\':dcConfig.autoAnalyze,\'btn-default\':!dcConfig.autoAnalyze}" translate="ui_editor_character_separation_analyzer_auto" ng-click="dcConfig.autoAnalyze=!dcConfig.autoAnalyze"></button> <button class="btn btn-info" translate="ui_editor_filemenu_help" ng-click="openHelpURL()"></button> </div> </div> <div> <button ng-disabled="isComputingGrabCut || (!hasPaintedAnything && (!isGenerator || !dstPath) && !isTextureChannels)" class="btn btn-primary" ng-click="ok()" translate="ui_ok"></button> <button ng-disabled="!canCancelCompiler && isComputingGrabCut" class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></button> </div> </div> <div class="editorCharacterSeparationModalBusyOverlay" ng-if="isGeneratingSheet"> <div class="editorCharacterSeparationModalBusyOverlayCenter"> <span class="editorCharacterSeparationModalBusyOverlayMsg" translate="ui_editor_character_separation_modal_confirm_sheet_busy"></span> <div class="editorCharacterSeparationModalBusyOverlayProgress"> <uib-progressbar class="progress-striped active" max="100" value="100"></uib-progressbar> </div> </div> </div> </div> '),e.put("views/modals/editorcleanproject.html",'<div class="modalContainer"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_clean_project_modal_header"></h4> </div> <div class="modal-body"> <div class="container-fluid"> \x3c!-- <div class="row form-group">\r\n <label class="col-sm-12 control-label" translate="ui_editor_animation_modal_combine_property_animation"></label>\r\n <div class="col-sm-5">\r\n <droplist dp-options="propertyLinkOptions" dp-selected="tempSettings.parent"></droplist>\r\n </div>\r\n </div> --\x3e <div class="row" translate="ui_editor_clean_project_modal_hint" style="margin-bottom:20px"></div> <div class="row"> <uib-alert type="info"> <div translate="ui_editor_clean_project_modal_info"></div> </uib-alert> </div> <div class="row"> <div ng-if="!waitingForResponse && files.length === 0" translate="ui_editor_clean_project_modal_hint_empty"></div> </div> <div class="row editorCleanProjectFiles" ng-if="files.length > 0"> <div ng-repeat="file in files track by $index" class="editorCleanProjectFile"> <checkbox cb-checked="file.checked"></checkbox> <span class="name" ng-click="file.checked=!file.checked">{{file.relative}}</span> <span style="width:100px">{{file.directory ? \'DIR\' : file.filesizelabel}}</span> <a class="btn btn-primary" ng-click="navigateToFile(file.path)"><span class="fas fa-folder-open"></span></a> </div> </div> </div> </div> <div class="modal-footer"> <div> </div> <div> <button ng-disabled="waitingForResponse || !files || files.length === 0" class="btn btn-primary" ng-click="ok()" translate="ui_editor_clean_project_modal_confirm"></button> <button ng-disabled="waitingForResponse" class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></button> </div> </div> </div> '),e.put("views/modals/editordeleteuploadsmodal.html",'<div class="modalContainer editorOpenWallpaperRoot"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_modal_delete_published_wallpapers_header"></h4> </div> <div class="modal-body"> <div> \x3c!-- <div class="form-group has-feedback">\r\n <div ng-class="{\'input-group\':filter.text}">\r\n <input id="WallpaperSearchFilter" type="text" class="form-control" placeholder="{{\'ui_browse_search_placeholder\' | translate}}" ng-model="filter.text" ng-model-options="{debounce:100}" maxlength="40" autofocus>\r\n <span class="glyphicon glyphicon-search form-control-feedback" aria-hidden="true"></span>\r\n <div class="input-group-btn">\r\n <button ng-if="filter.text" class="btn btn-danger" ng-click="filter.text=\'\'">\r\n <i class="glyphicon glyphicon-remove"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div> --\x3e <uib-alert type="danger"> <span translate="ui_editor_modal_delete_published_wallpapers_danger_alert"></span> </uib-alert> </div> <div class="editorOpenWallpaperGallery"> <wallpaper-thumbnail class="wallpaperBrowseInner" wt-wallpapers="wallpapers" wt-selection="currentSelection" wt-mousecallback="callbackWallpaperAllMouse(btn, context, $event)"></wallpaper-thumbnail> </div> </div> <div class="modal-footer"> <div> <a class="btn btn-danger" ng-disabled="!currentSelection" ng-click="deleteUpload(currentSelection)"> <span class="fas fa-trash"></span> {{\'ui_editor_modal_delete_published_wallpapers_button\' | translate}} </a> </div> <div> <a class="btn btn-default" ng-click="cancel()" translate="ui_close"></a> </div> </div> </div> '),e.put("views/modals/editoreffectlistmodal.html",'<div class="modalContainer" modalmove> <div> <div class="modal-header"> <h4 class="modal-title">{{title | translate}}</h4> </div> <div class="modal-body editorEffectModalBody"> <div style="height: 100%;"> <div class="editorEffectModalTreeRoot"> <div ng-if="dataUI.caption"> <span>{{dataUI.caption | translate}}</span> </div> <div ng-show="!disableGallery" class="btn-group editorEffectModalGallerySwitch"> <button class="btn editorEffectModalGallerySwitchButton" ng-class="{\'btn-primary\':galleryMode==\'gallery\',\'btn-default\':galleryMode!=\'gallery\'}" ng-click="galleryMode=\'gallery\'"><span class="fa fa-images"></span> {{\'ui_editor_properties_gallery\' | translate}}</button> <button class="btn editorEffectModalGallerySwitchButton" ng-class="{\'btn-primary\':galleryMode==\'list\',\'btn-default\':galleryMode!=\'list\'}" ng-click="galleryMode=\'list\'"><span class="fa fa-list"></span> {{\'ui_editor_properties_list\' | translate}}</button> \x3c!-- <button class="btn btn-warning" ng-click="rebuildGalleryPreviews()">Rebuild previews</button> --\x3e </div> <div class="input-group"> <input type="text" class="form-control" ng-model="search.text" placeholder="{{\'ui_browse_search_placeholder\'|translate}}"> <div class="input-group-btn"> <button ng-if="search.text" class="btn btn-danger" ng-click="search.text=\'\'"> <i class="glyphicon glyphicon-remove"></i> </button> </div> </div> <div class="editorEffectModalTreeScroll"> <div ng-repeat="group in groupList" ng-show="group.visible && !group.filtered"> <a ng-click="group.open = !group.open" style="display: block;" ng-if="group.name"> <span style="width:20px" class="fa" ng-class="{\'fa-chevron-right\': !group.open, \'fa-chevron-down\': group.open}"></span> {{group.name | translate}} </a> <div ng-if="galleryMode==\'list\'||group.nogallery"> <a ng-if="group.open" class="editorEffectModalItem activeBackHighlight" ng-repeat="item in group.items" ng-click="selected.item = item" ng-class="{\'active\':selected.item == item}" ng-dblclick="selected.item = item;ok()" translate="{{item.name}}" ng-show="!item.filtered"></a> <div ng-repeat="nestedgroup in group.nestedGroupList" ng-if="group.open" ng-show="!nestedgroup.filtered"> <a ng-click="nestedgroup.open = !nestedgroup.open" style="display:block;padding-left:35px;"> <span style="width:20px" class="fa" ng-class="{\'fa-chevron-right\': !nestedgroup.open, \'fa-chevron-down\': nestedgroup.open}"></span> {{nestedgroup.name}} </a> <a class="editorEffectModalItem editorEffectModalItemNested activeBackHighlight" ng-if="nestedgroup.open" ng-repeat="item in nestedgroup.items" ng-click="selected.item = item" ng-class="{\'active\':selected.item == item}" ng-dblclick="selected.item = item;ok()" translate="{{item.name}}" ng-show="!item.filtered"></a> </div> </div> <div ng-if="galleryMode!=\'list\'&&!group.nogallery"> \x3c!-- <a ng-if="group.open" class="editorEffectModalItem activeBackHighlight" ng-repeat="item in group.items" ng-click="selected.item = item" ng-class="{\'active\':selected.item == item}" ng-dblclick="selected.item = item;ok()" translate="{{item.name}}" ng-show="!item.filtered"></a> --\x3e <div ng-if="group.open"> \x3c!-- this has to iterate variants too --\x3e <div ng-if="group.gallerycombineitems"> \x3c!-- <div class="editorOpenEffectGallery">\r\n <wallpaper-thumbnail class="wallpaperBrowseInner" wt-wallpapers="group.items" wt-selection="currentSelection" wt-mousecallback="callbackGalleryAllMouse(btn, context, $event)" wt-config="wallpaperThumbnailConfig"></wallpaper-thumbnail>\r\n </div> --\x3e <span class="editorOpenEffectGallery" ng-repeat="item in group.items" ng-show="!item.filtered" style="display: inline-block;"> <wallpaper-thumbnail class="wallpaperBrowseInner" wt-wallpapers="[item]" wt-selection="currentSelection" wt-mousecallback="callbackGalleryAllMouse(btn, context, $event)" wt-config="wallpaperThumbnailConfig"></wallpaper-thumbnail> </span> </div> <div ng-if="!group.gallerycombineitems"> <div ng-repeat="item in group.items" ng-show="!item.filtered"> <span class="editorEffectModalItem editorEffectModalItemGallery" translate="{{item.name}}"></span> <div ng-if="!item.variants"> \x3c!-- item {{item.videopreview || \'missing\'}} --\x3e <div class="editorOpenEffectGallery"> \x3c!-- Single variant not supported in gallery! --\x3e <wallpaper-thumbnail class="wallpaperBrowseInner" wt-wallpapers="[item]" wt-selection="currentSelection" wt-mousecallback="callbackGalleryAllMouse(btn, context, $event)" wt-config="wallpaperThumbnailConfig"></wallpaper-thumbnail> </div> </div> <div ng-if="item.variants"> <div class="editorOpenEffectGallery"> <wallpaper-thumbnail class="wallpaperBrowseInner" wt-wallpapers="item.variants" wt-selection="currentSelection" wt-mousecallback="callbackGalleryAllMouse(btn, context, $event)" wt-config="wallpaperThumbnailConfig"></wallpaper-thumbnail> </div> \x3c!-- <div ng-repeat="variant in item.variants">\r\n variant {{variant.videopreview || \'missing\'}}\r\n </div> --\x3e </div> </div> </div> <div ng-repeat="nestedgroup in group.nestedGroupList" ng-show="!nestedgroup.filtered"> \x3c!-- ng-click="nestedgroup.open = !nestedgroup.open" --\x3e <span class="editorEffectModalItemGallery" style="display:block;"> \x3c!-- <span style="width:20px" class="fa" ng-class="{\'fa-chevron-right\': !nestedgroup.open, \'fa-chevron-down\': nestedgroup.open}"></span> --\x3e {{nestedgroup.name}} </span> \x3c!-- <a class="editorEffectModalItem editorEffectModalItemNested activeBackHighlight" ng-if="nestedgroup.open" ng-repeat="item in nestedgroup.items" ng-click="selected.item = item" ng-class="{\'active\':selected.item == item}" ng-dblclick="selected.item = item;ok()" translate="{{item.name}}" ng-show="!item.filtered"></a> --\x3e \x3c!-- <div ng-if="nestedgroup.open"> --\x3e <div> \x3c!-- these are workshop lists, don\'t iterate variants, only show main preview image, no video --\x3e \x3c!-- <div ng-repeat="item in nestedgroup.items">{{item.videopreview || \'missing\'}}</div> --\x3e \x3c!-- <wallpaper-thumbnail class="wallpaperBrowseInner" wt-wallpapers="nestedgroup.items" wt-selection="currentSelection" wt-mousecallback="callbackGalleryAllMouse(btn, context, $event)"></wallpaper-thumbnail> --\x3e <span class="editorOpenEffectGallery" ng-repeat="item in nestedgroup.items" ng-show="!item.filtered" style="display: inline-block;"> <wallpaper-thumbnail class="wallpaperBrowseInner" wt-wallpapers="[item]" wt-selection="currentSelection" wt-mousecallback="callbackGalleryAllMouse(btn, context, $event)" wt-config="wallpaperThumbnailConfig"></wallpaper-thumbnail> </span> </div> </div> </div> </div> </div> </div> </div> <div class="editorEffectModalSelectionContainer"> <div style="display:flex;align-items: center;"> <h4 translate="{{(galleryMode === \'gallery\' && selected.item.variants[selected.item.options.droplistSelected].name) || selected.item.name}}" style="flex:1"></h4> <span class="editorEffectModalSelectionTags"> <span ng-if="selected.item.pill" class="perfWarning perfInfo" tooltip="{{selected.item.tagtip}}">{{selected.item.pill | translate}}</span> <span ng-if="selected.item.performance" class="perfWarning" ng-class="{perfDanger:selected.item.performance==\'veryexpensive\'}">{{(selected.item.performance == \'veryexpensive\') ? \'ui_editor_effects_modal_performance_warning_very_expensive\' : \'ui_editor_effects_modal_performance_warning_expensive\' | translate}}</span> </span> </div> <div style="display:flex;flex-direction:column;height:100%;"> <div class="editorEffectModalTopRow"> <div> <div class="editorEffectModalPreviewContainer" ng-show="selected.item.preview || selected.item.variants[selected.item.options.droplistSelected].preview"> <preview p-options="{tag:\'effect\', ctrl:\'previewEffectCtrl\', defaultColor:\'0\'}"></preview> </div> <div class="editorEffectModalPreviewContainerWorkshop" ng-show="selected.item.previewimg || selected.item.variants[selected.item.options.droplistSelected].previewimg"> <img ng-src="{{selected.item.previewimg || selected.item.variants[selected.item.options.droplistSelected].previewimg}}"> </div> </div> <div class="editorEffectModalTopRowRight" ng-if="selected.item.workshopid"> <div> <span class="editorEffectModalTopRowLabel" translate="ui_browse_details_rating"></span> <workshop-rating wr-item="selected.item" set-user-vote="workshopController.setUserVote" set-favorited="workshopController.setFavorited"></workshop-rating> </div> <div ng-if="selected.item.authorsteamid"> <span class="editorEffectModalTopRowLabel" translate="ui_browse_details_author"></span> <workshop-author wa-item="selected.item" wa-infos="workshopController.steamUserInfos" wa-open-user-page="openSteamUserPage"></workshop-author> </div> <div ng-if="selected.item.assettypeslabel"> <span class="editorEffectModalTopRowLabel" translate="ui_browse_details_type"></span> <span>{{selected.item.assettypeslabel}}</span> </div> <div ng-if="selected.item.filesizelabel"> <span class="editorEffectModalTopRowLabel" translate="ui_browse_details_filesize"></span> <span>{{selected.item.filesizelabel}}</span> </div> <div class="detailButtons" ng-if="selected.item.workshopid"> <div class="editorEffectModalWorkshopControls"> <a ng-if="selected.item.status !== \'downloadable\'" ng-click="unsubscribeWorkshopItem(selected.item)" class="btn btn-danger"> <span class="fas fa-times" aria-hidden="true"></span> {{\'ui_browse_details_btn_unsubscribe\' | translate}} </a> <a ng-click="openSteamWorkshopPage(selected.item)" class="btn btn-default" tooltip="ui_browse_details_btn_workshop" t-align-right="true"> <span ng-class="providerIcon" aria-hidden="true"></span> {{\'ui_browse_details_btn_comment\' | translate}} </a> </div> </div> </div> </div> <div ng-if="selected.item.options.droplistOptions && (galleryMode !== \'gallery\' || selected.item.nogallery || selected.item.nogalleryvariantexpansion)" class="selectionWithMargin"> <droplist class="fullWidth editorEffectModalDropDownLimit" dp-options="selected.item.options.droplistOptions" dp-selected="selected.item.options.droplistSelected"></droplist> </div> <pre translate="{{selected.item.description}}" class="selectionWithMargin resetPre"></pre> <div ng-if="selected.item.options.nameVisible" class="selectionWithMargin"> <h4 translate="ui_editor_project_settings_modal_name"></h4> <div class="fullWidth"> <input type="text" class="form-control" ng-model="selected.item.options.name" placeholder="Name"> </div> </div> <div ng-if="selected.item.options.resolution" class="selectionWithMargin"> <h4 translate="ui_editor_project_settings_modal_resolution"></h4> <div class="fullWidth text-left editorResolutionParent"> <input type="number" class="form-control" onclick="this.select()" ng-model="selected.item.options.resolution.width" placeholder="Width"> <div>X</div> <input type="number" class="form-control" onclick="this.select()" ng-model="selected.item.options.resolution.height" placeholder="Height"> </div> </div> <div ng-if="selected.item.options.color" class="selectionWithMargin"> <h4>{{selected.item.options.colorLabel || \'ui_editor_project_settings_modal_clear_color\' | translate}}</h4> <div class="fullWidth text-left editorResolutionParent"> <spectrum-colorpicker options="colorPickerOptions" ng-model="selected.item.options.color" vec-color-converter on-show-options="{update:false}"></spectrum-colorpicker> </div> </div> <div ng-if="fnDelete && selected.item.editable"> <div class="fullWidth"> <button class="btn btn-danger fullWidth" translate="Remove" ng-click="deleteItem(selected.item)"></button> </div> </div> </div> </div> </div> </div> <div class="modal-footer modal-footer-dual-buttons"> <div class="left"> <button ng-if="workshopController" class="btn btn-success" ng-click="browseWorkshop()" translate="ui_editor_effect_list_modal_browse_workshop"></button> <button ng-if="showAssetCreation && fnCreateNew" class="btn btn-default" ng-click="createNew()"> {{\'ui_editor_effect_list_modal_create_new\'|translate}} </button> <button ng-if="showAssetCreation && fnCreateNew" class="btn btn-default" ng-click="createNew(selected.item)" ng-disabled="!selected.item"> {{\'ui_editor_effect_list_modal_create_duplicate\'|translate}} </button> <button ng-if="dataUI.infoLink" class="btn btn-info" ng-click="openInfoLinkPage()">{{dataUI.infoLinkText|translate}}</button> </div> <div class="right"> <button class="btn btn-primary" ng-click="ok()" translate="ui_ok" ng-disabled="!selected.item"></button> <button class="btn btn-default" ng-click="close()" translate="ui_cancel"></button> </div> </div> </div> </div> '),e.put("views/modals/editoreulamodal.html",'<div class="modalContainer"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_workshop_eula_title"></h4> </div> <div class="modal-body modalGenericConfirmBody"> <div style="display:flex;align-items: center;"> <div style="font-size: 80px;"> <span class="fab fa-steam"></span> </div> <div style="flex:1;padding:0 20px"> <div translate="ui_editor_workshop_eula_body"></div> </div> </div> <div> <a class="btn btn-primary btn-lg fullWidth" translate="ui_editor_workshop_eula_button" ng-click="showEULA()"></a> </div> <div class="fullWidth" ng-if="showWaitingAnim" style="display:flex;justify-content: center;padding: 20px 0 10px 0;"> <span translate="ui_editor_workshop_eula_waiting_hint"></span> <span class="min-width: 20px;display: inline-block;">{{waitingAnim}}</span> </div> </div> <div class="modal-footer" style="display:flex"> <div style="text-align:left"> </div> <div style="flex-grow: 1"> <a class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></a> </div> </div> </div> '),e.put("views/modals/editorexportmodal.html",'<div class="modalContainer editorExportModal" modalmove> <div class="page" ng-class="{\'past\': page && page != \'initial\'}"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_export_modal_header"></h4> </div> <div class="modal-body"> <uib-alert> <span translate="ui_editor_export_modal_audio_hint"></span> </uib-alert> <div class="container-fluid"> <div class="row form-group"> <label class="col-sm-6 control-label" translate="ui_editor_export_modal_settings_format"></label> <div class="col-sm-6"> <droplist class="editorExportModalFormats" dp-options="formats" dp-selected="settings.format"></droplist> </div> </div> <div class="row form-group"> <label class="col-sm-6 control-label" translate="ui_editor_export_modal_settings_width"></label> <div class="col-sm-6"> <input type="number" class="form-control" ng-model="settings.width" onclick="this.select()"> </div> </div> <div class="row form-group"> <label class="col-sm-6 control-label" translate="ui_editor_export_modal_settings_height"></label> <div class="col-sm-6"> <input type="number" class="form-control" ng-model="settings.height" onclick="this.select()"> </div> </div> <div class="row form-group"> <label class="col-sm-6 control-label" translate="ui_editor_export_modal_settings_fps"></label> <div class="col-sm-6"> <input type="number" class="form-control" ng-model="settings.fps" onclick="this.select()"> </div> </div> <div class="row form-group" ng-if="settings.format != \'ffmpeg_avi_raw\' && settings.format != \'ffmpeg_avi_yuv422\' && settings.format != \'ffmpeg_avi_yuv420\' && settings.format != \'ffmpeg_gif\'"> <label class="col-sm-6 control-label" translate="ui_editor_export_modal_settings_bitrate"></label> <div class="col-sm-6"> <input type="number" class="form-control" ng-model="settings.bitrate" onclick="this.select()"> </div> </div> <div class="row form-group"> <label class="col-sm-6 control-label" translate="ui_editor_export_modal_settings_duration"></label> <div class="col-sm-6"> <input type="number" class="form-control" ng-model="settings.duration" onclick="this.select()"> </div> </div> <div class="row form-group"> <label class="col-sm-6 control-label" translate="ui_editor_export_modal_settings_blend_time"></label> <div class="col-sm-6"> <input type="number" class="form-control" ng-model="settings.blend" onclick="this.select()"> </div> </div> </div> </div> <div class="modal-footer"> <div> <button class="btn btn-primary" ng-class="{\'btn-wide\':projectData.workshopid}" ng-click="startExport()" translate="ui_editor_export_modal_export"></button> <a class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></a> </div> </div> </div> <div class="page" ng-class="{\'future\': page == \'export\'}"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_export_modal_header"></h4> </div> <div class="modal-body"> <div> <div class="editorSteamPublishStateLabel" translate="ui_editor_export_modal_export_progress_hint"></div> <uib-progressbar class="progress-striped active" max="100" value="exportProgressValue"><i>{{exportProgressValue}}%</i></uib-progressbar> </div> </div> <div class="modal-footer"> <button class="btn btn-default" ng-disabled="disableCancel" ng-click="cancelExport()" translate="ui_cancel"></button> </div> </div> </div> '),e.put("views/modals/editorexpressionmatrixmodal.html",'<div class="modalContainer editorPropertiesModalTable"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_expression_blend_matrix_modal_title"></h4> </div> <div class="modal-body"> <div class="container-fluid"> <div class="row form-group"> <label class="col-sm-5 control-label" translate="ui_editor_properties_max_value"></label> <div class="col-sm-4 removePadding editorExpressionSliderDisabled"> </div> <div class="col-sm-2 removePadding"> <rzslider rz-slider-model="data.xmax" rz-slider-options="{ceil:2, floor:1, enforceStep:true, precision:1, step:1}"></rzslider> </div> <div class="col-sm-1"> {{ data.xmax }} </div> </div> <div class="row form-group"> <label class="col-sm-5 control-label" translate="ui_editor_properties_min_value"></label> <div class="col-sm-3 removePadding"> <rzslider rz-slider-model="data.xmin" rz-slider-options="{ceil:0, floor:-2, enforceStep:true, precision:1, step:1}"></rzslider> </div> <div class="col-sm-3 removePadding editorExpressionSliderDisabled"> </div> <div class="col-sm-1"> {{ data.xmin }} </div> </div> <div class="row form-group"> <label ng-click="data.modifydefault=!data.modifydefault" class="col-sm-5 control-label" translate="ui_editor_properties_modify_default_expression"></label> <div class="col-sm-7"> <checkbox cb-checked="data.modifydefault"> </checkbox></div> </div> </div> </div> <div class="modal-footer"> <div> </div> <div> <button class="btn btn-primary" ng-click="ok()" translate="ui_ok"></button> \x3c!-- <button class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></button> --\x3e </div> </div> </div> '),e.put("views/modals/editorimportmodelmodal.html",'<div class="modalContainer" modalmove> <div> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_importer_title" translate-values="{\'type\':objInfo.config.title,\'file\':objInfo.name}"></h4> </div> <div class="modal-body editorImportModelModal"> <div ng-if="objInfo.instantImport"> <div translate="ui_editor_importer_please_wait"></div> </div> <div class="editorImportModelModalMaterialList" ng-if="!objInfo.instantImport"> <div> <div> <b translate="ui_editor_importer_material_name"></b> </div> <div> <b translate="ui_editor_importer_settings"></b> </div> </div> <div ng-repeat="material in objInfo.materials"> <div style="word-break: break-all;padding-right:10px;position: relative;"> <div ng-if="!objInfo.config.importAsImageSequence">{{material.name}}</div> <div ng-if="objInfo.config.importAsImageSequence"> <div ng-repeat="name in objInfo.config.imageListLabels|limitTo:5">{{name}}</div> <div ng-if="objInfo.config.imageListLabels.length > 5">...</div> </div> <img class="editorImportModelModalPreviewImg" ng-src="{{material.previewUrl}}" native-drop-target="selectTexture(material, droppedFiles[0])" ndt-extension-tag="\'texture\'" ndt-desired-modal-depth="1"> <crop-overlay co-general="objInfo" co-config="objInfo.config" co-material="material.config"></crop-overlay> <div ng-if="material.normalmap" style="margin-top:5px"> <div>{{material.normalmapname}}</div> <img class="editorImportModelModalPreviewImg" ng-src="{{material.previewUrlNormalMap}}" native-drop-target="selectNormalMap(material, droppedFiles[0])" ndt-extension-tag="\'texture\'" ndt-desired-modal-depth="1"> </div> <div ng-if="material.showimportoptions && (objInfo.ismodel || objInfo.ismodeltexture)"> <div class="editorImportModelModalImgActionButton"> <button class="btn btn-primary fullWidth" ng-click="selectTexture(material)" translate="ui_editor_importer_select_texture"></button> </div> <div class="editorImportModelModalImgActionButton"> <button class="btn btn-primary fullWidth" ng-click="selectNormalMap(material)" translate="ui_editor_importer_select_normal_map"></button> </div> <div class="editorImportModelModalImgActionButton" ng-if="material.normalmap"> <button class="btn btn-danger fullWidth" ng-click="removeNormalMap(material)" translate="ui_editor_importer_remove_normal_map"></button> </div> </div> </div> <div class="editorImportModelModalMaterialListProperties"> \x3c!-- <div style="font-style: italic;">Shader: {{material.shaderpreset.value}}</div> --\x3e <div class="paddedElement formatSelection" ng-if="material.showimportoptions"> <a class="importInfoBtn" ng-click="openTextureFormatFAQ()"><span class="fas fa-question"></span></a> <droplist class="fullWidth" dp-options="material.formats" dp-selected="material.config.format"></droplist> </div> <div class="paddedElement"> <checkbox cb-checked="material.config.nointerpolation" cb-title="\'ui_editor_importer_pixel_art_optimization\'"></checkbox> </div> <div class="paddedElement" ng-if="material.showimportoptions"> <checkbox cb-checked="material.config.nomip" cb-title="\'ui_editor_properties_no_mip_maps\'"></checkbox> </div> <div class="paddedElement" ng-if="material.showimportoptions"> <checkbox cb-checked="material.config.clampuvs" cb-title="\'ui_editor_properties_clamp_uvs\'"></checkbox> </div> \x3c!-- <div class="paddedElement">\r\n <checkbox cb-checked="material.config.clampuvs" cb-title="\'ui_editor_properties_clamp_uvs\'"></checkbox>\r\n </div> --\x3e <div class="paddedElement" ng-if="material.showimportoptions && objInfo.isImage && !objInfo.config.importAsImageSequence"> <checkbox cb-checked="material.config.spritesheet" cb-title="\'ui_editor_properties_sprite_sheet\'"></checkbox> <div ng-if="material.config.spritesheet" class="paddedElement"> <div ng-repeat="sequence in material.config.spritesheetsequences" class="editorImportModelModalSpritesheetSequence"> <div> <span translate="ui_editor_properties_width"></span> <span translate="ui_editor_properties_height"></span> <span translate="ui_editor_properties_frames"></span> <span translate="ui_editor_properties_duration"></span> </div> <div> <span><input onclick="this.select()" type="number" ng-model="sequence.width"></span> <span><input onclick="this.select()" type="number" ng-model="sequence.height"></span> <span><input onclick="this.select()" type="number" ng-model="sequence.frames"></span> <span><input onclick="this.select()" type="number" ng-model="sequence.duration"></span> </div> </div> </div> </div> <div class="paddedElement" ng-show="material.showimportoptions && objInfo.config.importAsImageSequence && !material.config.spritesheet"> <span translate="ui_editor_properties_frame_duration"></span> <span><input type="number" ng-model="objInfo.config.imageListDuration"></span> <span translate="ui_editor_properties_seconds"></span> </div> <div class="paddedElement" ng-if="material.showimportoptions && objInfo.isImage && objInfo.config.canCropTransparency && !material.config.spritesheet"> <checkbox cb-checked="objInfo.config.croptransparent" cb-title="\'ui_editor_properties_crop_transparent_area\'"></checkbox> <div ng-if="objInfo.config.croptransparent" class="paddedElement editorImportModelModalPadding"> <span translate="ui_editor_properties_padding"></span> <input onclick="this.select()" type="number" ng-model="objInfo.config.croppadding"> </div> <div ng-if="objInfo.config.croptransparent"> <div class="paddedElement" translate="ui_editor_importer_crop_transparency_help"></div> <div class="paddedElement dangerText" ng-if="objInfo.config.showCropTransparencyWarning || objInfo.config.croppaddingold && objInfo.config.croppaddingold != objInfo.config.croppadding" translate="ui_editor_importer_crop_transparency_warning"></div> </div> </div> </div> </div> </div> </div> <div class="modal-footer" style="display:flex;"> <div ng-if="project.scene.is2d && objInfo.isImage && !objInfo.instantImport"> <checkbox cb-checked="objInfo.shouldAdjustProjection" cb-title="\'ui_editor_import_adjust_projection_center\'"></checkbox> </div> \x3c!-- --\x3e \x3c!-- renderableCount --\x3e <div style="flex-grow:1;text-align:right"> <button class="btn btn-primary" ng-disabled="waitingForResponse" ng-click="ok()">{{okButtonLabel}}</button> <button class="btn btn-default" ng-disabled="waitingForResponse" ng-click="close()">Close</button> </div> </div> </div> <div class="editorImportModelCompileOverlay ng-hide" ng-show="compileCtrl.active || compileCtrl.success"> <div class="modal-header"> <h4 class="modal-title">{{\'ui_editor_importer_compiling_assets_for\' | translate}} {{objInfo.name}}</h4> </div> <div class="modal-body"> <compiler-progress compile-ctrl="compileCtrl"></compiler-progress> </div> </div> </div> '),e.put("views/modals/editormaterialsmodal.html",'<div class="modalContainer editorMaterialBrowser"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_select_texture"></h4> </div> <div class="modal-body"> <div> <input id="searchTextureFilter" type="text" class="form-control" ng-model="textureFilter" placeholder="{{\'ui_browse_search_placeholder\' | translate}}" ng-model-options="{debounce: 250}" autofocus> </div> <div class="editorMaterialBrowserList"> <div class="editorMaterialBrowserListItem" ng-repeat="texture in visibleMaterials" tooltip="{{texture.local}}" ng-click="selected.item=texture" ng-dblclick="selected.item=texture;ok()" ng-class="{active:selected.item===texture}"> <img class="editorMaterialBrowserImg" ng-src="{{texturePreviews[texture.local]}}"> <div>{{texture.file}}</div> </div> </div> </div> <div class="modal-footer"> <div class="pull-left"> {{selected.item.path}} </div> <div> <button class="btn btn-primary" ng-click="ok()" translate="ui_ok" ng-disabled="!selected.item"></button> <button class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></button> </div> </div> </div> '),e.put("views/modals/editormodeleditormodal.html",'<div class="modalContainer"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_model_editor"></h4> </div> <div class="modal-body editorModelEditorBody"> <div class="editorModelEditorBodyHeader"> \x3c!-- <span translate="ui_editor_particle_selected"></span>\r\n <span class="particleList">\r\n <droplist dp-options="data.existingParticles" dp-selected="data.particle"></droplist>\r\n </span>\r\n <button class="btn btn-default" ng-click="newParticle()"><span class="far fa-file"></span></button>\r\n <button class="btn btn-default" ng-disabled="!data.particle" ng-click="duplicateParticle(data.particle)"><span class="fas fa-copy"></span></button>\r\n <button class="btn btn-danger" ng-disabled="!data.particle" ng-click="deleteParticle(data.particle)"><span class="fas fa-trash"></span></button> --\x3e </div> <div class="editorModelEditorBodyControls"> <div style="flex:2;"> <uib-tabset class="tab-animation" active="tabInfo.activeIndex"> <uib-tab index="0" heading="{{\'ui_editor_model_editor_tab_animation\' | translate}}"> <div class="editorModelTab"> <div class="editorModelElements editorModelColumnBorder"> <div class="editorModelElementGroupColumn"> <div class="editorModelElementGroupTreeView" style="flex:0.5"> <h4 translate="ui_editor_model_editor_animations"></h4> <tree-view class="treeViewRoot" tv-data="objectProperties.staticanimations" tv-mode="\'scene\'" tv-selected-item="selectedAnimation"></tree-view> <div class="editorModelElementGroupActions"> <button class="btn btn-primary editorModelElementGroupBtn" ng-disabled="!objectProperties.staticanimations.includes(selectedAnimation.item)" ng-click="addClip(selectedAnimation.item.id)" translate="ui_editor_model_editor_add_clip"></button> </div> </div> <div class="editorModelElementGroupTreeView" style="flex:0.5"> <h4 translate="ui_editor_model_editor_add_fbx_file"></h4> <tree-view class="treeViewRoot" tv-data="objectProperties.additionalfiles" tv-mode="\'scene\'" tv-selected-item="selectedFBX" tv-remove-clicked="onFBXRemoved(item)"></tree-view> <div class="editorModelElementGroupActions"> <button class="btn btn-primary editorModelElementGroupBtn" ng-click="addFBXFile()" translate="ui_editor_model_editor_add_fbx_file"></button> </div> </div> </div> </div> <div class="editorModelProperties editorModelColumnBorder"> <div class="editorModelElementGroupColumn"> <div class="editorModelElementGroupTreeView" style="flex:0.5"> <h4 translate="ui_editor_model_editor_clips"></h4> <tree-view class="treeViewRoot" tv-data="objectProperties.clips" tv-mode="\'scene\'" tv-selected-item="selectedAnimation" tv-remove-clicked="onClipRemoved(item)"></tree-view> </div> <div class="editorModelElementGroupTreeView" style="flex:0.5"> <h4 translate="ui_editor_model_editor_clip_options"></h4> <property-list p-list="selectedAnimation.item.properties" p-ctrl="propertyControl" p-owner="selectedAnimation.item" p-modal-depth="1"></property-list> </div> </div> </div> </div> </uib-tab> <uib-tab index="1" heading="{{\'ui_editor_model_editor_tab_attachments\' | translate}}"> <div class="editorModelTab"> <div class="editorModelElements editorModelColumnBorder"> <div class="editorModelElementGroupColumn"> <div class="editorModelElementGroupTreeView" style="flex:1"> <h4 translate="ui_editor_model_editor_tab_attachments"></h4> <div class="editorModelElementGroupActions"> <button class="btn btn-primary editorModelElementGroupBtn" ng-click="addAttachment()" translate="ui_editor_model_editor_add_attachment"></button> </div> <tree-view class="treeViewRoot" tv-data="objectProperties.attachments" tv-mode="\'scene\'" tv-selected-item="selectedAttachment" tv-remove-clicked="onAttachmentRemoved(item)"></tree-view> </div> </div> </div> <div class="editorModelProperties editorModelColumnBorder"> <div class="editorModelElementGroupColumn"> <div class="editorModelElementGroupTreeView"> <h4 translate="ui_editor_model_editor_attachment_options"></h4> <property-list p-list="selectedAttachment.item.properties" p-ctrl="propertyControl" p-owner="selectedAttachment.item" p-modal-depth="1"></property-list> </div> </div> </div> </div> </uib-tab> <uib-tab index="2" heading="{{\'ui_editor_model_editor_tab_events\' | translate}}"> <div class="editorModelTab"> <div class="editorModelElements editorModelColumnBorder"> <div class="editorModelElementGroupColumn"> <div class="editorModelElementGroupTreeView" style="flex:1"> <h4 translate="ui_editor_model_editor_animations"></h4> <div class="editorModelElementGroupActions"> <button class="btn btn-primary editorModelElementGroupBtn" ng-click="addEvent(selectedAnimation.item)" ng-disabled="!objectProperties.animations.includes(selectedAnimation.item)" translate="ui_editor_model_editor_add_event"></button> </div> <tree-view class="treeViewRoot" tv-data="objectProperties.animations" tv-mode="\'scene\'" tv-selected-item="selectedAnimation"></tree-view> </div> </div> </div> <div class="editorModelProperties editorModelColumnBorder"> <div class="editorModelElementGroupColumn"> <div class="editorModelElementGroupTreeView" style="flex:0.5"> <h4 translate="ui_editor_model_editor_events"></h4> <tree-view class="treeViewRoot" tv-data="temp.events" tv-mode="\'scene\'" tv-selected-item="selectedAnimation" tv-remove-clicked="onEventRemoved(item)"></tree-view> </div> <div class="editorModelElementGroupTreeView" style="flex:0.5"> <h4 translate="ui_editor_model_editor_event_options"></h4> <property-list p-list="selectedAnimation.item.properties" p-ctrl="propertyControl" p-owner="selectedAnimation.item" p-modal-depth="1"></property-list> </div> </div> </div> </div> </uib-tab> <uib-tab index="3" heading="{{\'ui_editor_model_editor_tab_constraints\' | translate}}"> <div class="editorModelTab"> <div class="editorModelElements editorModelColumnBorder"> <div class="editorModelElementGroupColumn"> <div class="editorModelElementGroupTreeView" style="flex:1"> <h4 translate="ui_editor_model_editor_tab_bones"></h4> <tree-view class="treeViewRoot" tv-data="boneConstraints" tv-mode="\'scene\'" tv-selected-item="selectedConstraint"></tree-view> </div> </div> </div> <div class="editorModelProperties editorModelColumnBorder"> <div class="editorModelElementGroupColumn"> <div class="editorModelElementGroupTreeView" style="flex:0.7"> <h4 translate="ui_editor_model_editor_constraint_options"></h4> <physicsconstraints ng-if="selectedConstraint.item" class="editorBoneConstraintsPhysicsSettings" settings="selectedConstraint.item.constraints" defaults="constraintDefaults" constraint-mode="constraintMode" physics-ctrl="physicsCtrl" ui-mode="\'3D\'"></physicsconstraints> <div class="editorModelElementGroupActions" ng-if="selectedConstraint.item"> <button class="btn btn-danger editorModelElementGroupBtn" ng-click="resetConstraintSettings()" translate="ui_editor_bone_constraints_reset"></button> <button class="btn btn-default editorModelElementGroupBtn" ng-click="copyConstraintSettings()"> <span class="fas fa-copy"></span> {{\'ui_browse_preset_modal_copy\' | translate}} </button> <button class="btn btn-default editorModelElementGroupBtn" ng-click="pasteConstraintSettings()" ng-disabled="!canConstraintPaste()"> <span class="far fa-clipboard"></span> {{\'ui_browse_preset_modal_paste\' | translate}} </button> </div> </div> <div class="editorModelElementGroupTreeView" style="flex:0.3"> <h4 translate="ui_editor_model_editor_animations"></h4> <tree-view class="treeViewRoot" tv-data="objectProperties.previewAnimations" tv-mode="\'scene\'" tv-selected-item="selectedAnimation"></tree-view> </div> </div> </div> </div> </uib-tab> \x3c!-- <uib-tab heading="{{\'ui_editor_model_editor_tab_blend_layers\' | translate}}">\r\n <div class="editorModelTab">\r\n <div class="editorModelElements editorModelColumnBorder">\r\n <div class="editorModelElementGroupColumn">\r\n </div>\r\n </div>\r\n <div class="editorModelProperties editorModelColumnBorder">\r\n </div>\r\n </div>\r\n </uib-tab> --\x3e \x3c!-- <uib-tab heading="{{\'ui_editor_model_editor_tab_transitions\' | translate}}">\r\n <div class="editorModelTab">\r\n <div class="editorModelElements editorModelColumnBorder">\r\n <div class="editorModelElementGroupColumn">\r\n </div>\r\n </div>\r\n <div class="editorModelProperties editorModelColumnBorder">\r\n </div>\r\n </div>\r\n </uib-tab> --\x3e </uib-tabset> </div> <div class="editorModelPreview"> \x3c!-- <div class="editorSceneStatsOverlay" ng-if="particleeditorsettings.showstats"> --\x3e \x3c!-- <div><span translate="ui_editor_stats_particle_count"></span><span>{{particleStats.count + \' / \' + particleStats.maxcount}}</span></div> --\x3e \x3c!-- </div> --\x3e <preview p-options="{tag:\'model\', ctrl:\'previewModelCtrl\', interactive:true}"></preview> </div> </div> </div> <div class="modal-footer"> <div> <a class="btn btn-primary" ng-click="ok()" translate="ui_ok"></a> \x3c!-- <a class="btn btn-default" ng-click="cancel()" translate="ui_close"></a> --\x3e </div> </div> </div> '),e.put("views/modals/editoropenwallpapermodal.html",'<div class="modalContainer editorOpenWallpaperRoot"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_open_modal_header"></h4> </div> <div class="modal-body"> <div style="display:flex;gap:10px"> <div class="form-group has-feedback" style="flex:1"> <div ng-class="{\'input-group\':filter.text}" style="width: 100%;"> <input id="WallpaperSearchFilter" type="text" class="form-control" placeholder="{{\'ui_browse_search_placeholder\' | translate}}" ng-model="filter.text" ng-model-options="{debounce:100}" maxlength="40" autofocus> <span class="glyphicon glyphicon-search form-control-feedback" aria-hidden="true"></span> <div class="input-group-btn"> <button ng-if="filter.text" class="btn btn-danger" ng-click="filter.text=\'\'"> <i class="glyphicon glyphicon-remove"></i> </button> </div> </div> </div> <div class="form-group" style="min-width:200px"> <droplist dp-options="sortOptions" dp-selected="filter.sort"></droplist> </div> </div> <div class="editorOpenWallpaperGallery"> <wallpaper-thumbnail class="wallpaperBrowseInner" wt-wallpapers="wallpapers" wt-selection="currentSelection" wt-mousecallback="callbackWallpaperAllMouse(btn, context, $event)"></wallpaper-thumbnail> </div> </div> <div class="modal-footer" style="gap: 10px;"> <div style="display:flex;flex:1;min-width: 0;gap: 10px;align-items: center;"> <a class="btn btn-danger" ng-disabled="!currentSelection" ng-click="deleteProject(currentSelection)"> <span class="fas fa-trash"></span> {{\'ui_editor_open_modal_delete\' | translate}} </a> <span class="ellipsis" style="direction: rtl;text-align: left;">{{currentSelection.file}}</span> </div> <div style="flex: 0 1 auto;"> <a class="btn btn-primary" ng-disabled="!currentSelection" ng-click="ok()" translate="ui_ok"></a> <a class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></a> </div> </div> </div> '),e.put("views/modals/editorparticleeditormodal.html",'<div class="modalContainer"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_particle_editor"></h4> </div> <div class="modal-body editorParticleEditorBody"> <div class="editorParticleEditorBodyHeader"> <span class="particleList"> <droplist dp-options="data.existingParticles" dp-selected="data.particle"></droplist> </span> <button class="btn btn-default" ng-click="newParticle()"><span class="far fa-file"></span></button> <button class="btn btn-default" ng-disabled="!data.particle" ng-click="duplicateParticle(data.particle)"><span class="fas fa-copy"></span></button> <button class="btn btn-danger" ng-disabled="!data.particle" ng-click="deleteParticle(data.particle)"><span class="fas fa-trash"></span></button> <button class="btn btn-primary" style="min-width:100px" ng-click="ok()" translate="ui_apply"></button> </div> <div class="editorParticleEditorBodyControls"> <div class="editorParticleElements editorParticleColumnBorder"> <div ng-repeat="elementGroup in elementGroups"> <div class="editorParticleElementGroup" ng-class="{\'editorParticleElementGroupDivider\':elementGroup.divider}"> <a ng-click="elementGroup.open = !elementGroup.open" class="groupHeader" style="text-decoration: none !important;"> <span style="width:20px" class="fas" ng-class="{\'fa-chevron-right\': !elementGroup.open, \'fa-chevron-down\': elementGroup.open}"></span> {{elementGroup.name | translate}} </a> <a ng-if="elementGroup.canadd" class="btn btn-sm btn-success" ng-click="addElement(elementGroup, elementGroup.tag)"> <span class="fas fa-plus"></span> </a> </div> <div ng-if="elementGroup.open && !elementGroup.canadd"> <a class="editorEffectModalItem editorEffectModalItemPadding activeBackHighlight" ng-repeat="item in elementGroup.items" ng-click="selected.item = item" ng-class="{\'active\':selected.item == item}"> {{item.name | translate}} </a> </div> <div ng-if="elementGroup.open && elementGroup.canadd && elementGroup.items.length > 0" ng-class="{\'editorParticleElementGroupRTLItems\':elementGroup.rtlalign}"> <div class="editorParticleElementGroupTreeView"> <tree-view class="treeViewRoot" tv-drag-drop-tag="{{elementGroup.tag}}" tv-drag-drop-enabled="true" tv-data="elementGroup.items" tv-mode="\'scene\'" tv-selected-item="selected" tv-remove-clicked="onElementRemoved(elementGroup.items, item, elementGroup.tag)" tv-element-dragged="onElementDragged(from, to, elementGroup.tag)" tv-context-menu="elementContextMenu($event, elementGroup, item)"></tree-view> </div> </div> </div> </div> <div class="editorParticleProperties editorParticleColumnBorder"> <property-list p-list="selected.item.properties" p-ctrl="selected.item.viewport ? viewportControl : propertyControl" p-owner="selected.item" p-modal-depth="1"></property-list> </div> <div class="editorParticlePreview"> <div class="editorSceneStatsOverlay" ng-if="particleeditorsettings.showstats"> <div><span translate="ui_editor_stats_particle_count"></span><span>{{particleStats.count + \' / \' + particleStats.maxcount}}</span></div> <div><span translate="ui_editor_stats_particle_memory"></span><span>{{particleStats.particlememory | number : 2}}</span></div> <div><span translate="ui_editor_stats_particle_simulation_time"></span><span>{{particleStats.particlesimulationtime.toFixed(3)}}</span></div> </div> <preview p-options="{tag:\'particle\', ctrl:\'previewParticleCtrl\', interactive:true}"></preview> </div> </div> </div> <div class="modal-footer modal-footer-dual-buttons"> <div class="left"> <button class="btn btn-info" ng-click="openInfoLinkPage()" translate="ui_editor_particle_add_element_documentation"></button> </div> <div class="right"> <a class="btn btn-default" ng-click="cancel()" translate="ui_close"></a> </div> </div> </div> '),e.put("views/modals/editorprojectsettingsmodal.html",'<div class="modalContainer" modalmove> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_project_settings_modal_header"></h4> </div> <div class="modal-body editorProjectSettingsProperties"> <div class="row"> <div class="col-xs-12"> <h4 translate="ui_editor_project_settings_modal_header_general"></h4> </div> </div> <div class="row"> <div class="col-xs-11 col-xs-offset-1"> <div class="row"> <div class="col-xs-6"> <label for="inputProjectName" class="control-label" translate="ui_editor_project_settings_modal_title"></label> </div> <div class="col-xs-6 text-left"> <input type="text" class="form-control" ng-model="project.data.title" id="inputProjectName" placeholder="Project name"> </div> </div> <div class="row"> <div class="col-xs-6"> <label class="control-label" translate="ui_editor_project_settings_modal_scheme_color"></label> </div> <div class="col-xs-6 text-left"> <spectrum-colorpicker options="colorPickerOptions" ng-model="project.data.general.properties.schemecolor.value" vec-color-converter on-show-options="{update:false}"></spectrum-colorpicker> </div> </div> <div class="row"> <div class="col-xs-4"> <label class="control-label" translate="ui_editor_workshop_options_preview_image"></label> </div> <div class="col-xs-2"> <div class="text-center editorWorkshopDetailsPreviewImage editorWorkshopDetailsPreviewImageGeneral"> <div ng-if="!previewRefreshUrl" translate="ui_editor_workshop_options_missing"></div> <img ng-if="previewRefreshUrl" ng-src="{{previewRefreshUrl}}"> </div> </div> <div class="col-xs-6 editorWorkshopDetailsPreviewImageControls"> <button class="btn btn-primary fullWidth" ng-disabled="project.data.type.toLowerCase()==\'application\'" ng-click="takeSnapshot()" translate="ui_editor_workshop_options_preview_take_snapshot"></button> <button class="btn btn-primary fullWidth" ng-click="importSnapshot()" translate="ui_editor_workshop_options_preview_import_file"></button> </div> </div> </div> </div> <div class="editorProjectSettingsProperties" ng-if="project.data.type===\'scene\' && project.scenegeneraldata.orthogonalprojection"> <div class="row"> <div class="col-xs-12"> <h4 translate="ui_editor_project_settings_modal_scene"></h4> </div> </div> <div class="row"> <div class="col-xs-11 col-xs-offset-1"> <div class="row"> <div class="col-xs-6"> <label class="control-label" translate="ui_editor_project_settings_modal_resolution"></label> </div> <div class="col-xs-6 text-left editorResolutionParent"> <input type="number" class="form-control" ng-model="project.scenegeneraldata.orthogonalprojection.width" placeholder="Width" onclick="this.select()"> <div>X</div> <input type="number" class="form-control" ng-model="project.scenegeneraldata.orthogonalprojection.height" placeholder="Height" onclick="this.select()"> </div> </div> </div> </div> </div> <div class="editorProjectSettingsProperties" ng-if="project.data.type===\'scene\' || project.data.type===\'web\'"> <div class="row"> <div class="col-xs-12"> <h4 translate="ui_editor_project_settings_modal_user_properties"></h4> </div> </div> <div class="row"> <div class="col-xs-11 col-xs-offset-1"> <user-properties up-properties="project.data.general.properties" up-project-data="project.data"></user-properties> </div> </div> </div> </div> <div class="modal-footer"> <div> <a class="btn btn-primary" ng-click="close()" translate="ui_ok"></a> </div> </div> </div> '),e.put("views/modals/editorratingmodal.html",'<div class="modalContainer editorRatingModal"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_workshop_modal_rating_header"></h4> </div> <div class="modal-body"> <div class="container-fluid"> \x3c!-- <div class="row">\r\n <div class="col-xs-12">\r\n <div translate="ui_editor_workshop_modal_rating_body"></div>\r\n </div>\r\n </div>\r\n <div class="row">\r\n <div class="col-xs-12">\r\n <rating-table highlight="highlight.contentrating"></rating-table>\r\n </div>\r\n </div> --\x3e <div class="row"> <div class="col-xs-12"> <div translate="ui_editor_workshop_modal_rating_body_steam_rules"></div> </div> </div> \x3c!-- <div class="row">\r\n <div class="col-xs-12">\r\n <div translate="ui_editor_workshop_modal_rating_body_instructions"></div>\r\n </div>\r\n </div> --\x3e <div class="row"> <div class="col-xs-12"> <h4 translate="ui_editor_workshop_modal_rating_header_violence"></h4> </div> </div> <div class="row"> <div class="col-xs-12"> <b> <div translate="ui_editor_workshop_modal_rating_body_violence_warning"></div> </b> </div> <div class="col-xs-12"> <div translate="ui_editor_workshop_modal_rating_body_violence_rating"></div> </div> <div class="col-xs-12"> <div class="btn-group ratingButtonRow"> <a class="btn ratingButton" ng-class="{\'btn-primary\':data.ratingviolence==\'none\',\'btn-default\':data.ratingviolence!=\'none\'}" ng-click="data.ratingviolence=\'none\'" translate="ui_editor_workshop_modal_rating_button_violence_none"></a> <a class="btn ratingButton" ng-class="{\'btn-primary\':data.ratingviolence==\'included\',\'btn-default\':data.ratingviolence!=\'included\'}" ng-click="data.ratingviolence=\'included\'" translate="ui_editor_workshop_modal_rating_button_violence_included"></a> </div> </div> </div> <div class="modal-divider"></div> <div class="row"> <div class="col-xs-12"> <h4 translate="ui_editor_workshop_modal_rating_header_sexual_content"></h4> </div> </div> <div class="row"> <div class="col-xs-12"> <b> <div translate="ui_editor_workshop_modal_rating_body_sexual_content_warning"></div> </b> </div> <div class="col-xs-12"> <div translate="ui_editor_workshop_modal_rating_body_sexual_content_rating"></div> </div> <div class="col-xs-12"> <div class="btn-group ratingButtonRow"> <a class="btn ratingButton" ng-class="{\'btn-primary\':data.ratingsex==\'none\',\'btn-default\':data.ratingsex!=\'none\'}" ng-click="data.ratingsex=\'none\'" translate="ui_editor_workshop_modal_rating_button_sexual_content_none"></a> <a class="btn btn-default ratingButton" ng-class="{\'btn-primary\':data.ratingsex==\'mild\',\'btn-default\':data.ratingsex!=\'mild\'}" ng-click="data.ratingsex=\'mild\'" translate="ui_editor_workshop_modal_rating_button_sexual_content_mild"></a> <a class="btn btn-default ratingButton" ng-class="{\'btn-primary\':data.ratingsex==\'full\',\'btn-default\':data.ratingsex!=\'full\'}" ng-click="data.ratingsex=\'full\'" translate="ui_editor_workshop_modal_rating_button_sexual_content_full"></a> <a class="btn btn-default ratingButton" ng-class="{\'btn-primary\':data.ratingsex==\'adult\',\'btn-default\':data.ratingsex!=\'adult\'}" ng-click="data.ratingsex=\'adult\'" translate="ui_editor_workshop_modal_rating_button_sexual_content_adult_only"></a> </div> </div> </div> <div class="modal-divider"></div> <div class="row"> <div class="col-xs-12"> <h4 translate="ui_editor_workshop_modal_rating_header_suggested_rating"></h4> </div> </div> <div class="row"> <div class="col-xs-12"> <div class="btn-group ratingButtonRow"> <button class="btn ratingButton" ng-class="{\'btn-primary\':data.contentrating==\'Everyone\',\'btn-default\':data.contentrating!=\'Everyone\'}" ng-click="data.contentrating=\'Everyone\'" translate="ui_workshop_tags_rating_everyone" ng-disabled="data.ratingsex==\'mild\'||data.ratingsex==\'full\'||data.ratingsex==\'adult\'"></button> <button class="btn btn-default ratingButton" ng-class="{\'ratingButtonQuestionable\':data.contentrating==\'Questionable\',\'btn-default\':data.contentrating!=\'Questionable\'}" ng-click="data.contentrating=\'Questionable\'" translate="ui_workshop_tags_rating_questionable" ng-disabled="data.ratingsex==\'full\'||data.ratingsex==\'adult\'"></button> <button class="btn btn-default ratingButton" ng-class="{\'ratingButtonMature\':data.contentrating==\'Mature\',\'btn-default\':data.contentrating!=\'Mature\'}" ng-click="data.contentrating=\'Mature\'" translate="ui_workshop_tags_rating_mature"></button> </div> </div> </div> </div> </div> <div class="modal-footer"> <div> </div> <div> <button class="btn btn-primary" ng-click="ok()" translate="ui_ok" ng-disabled="!data.ratingviolence || !data.ratingsex || !data.contentrating"></button> <button class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></button> </div> </div> </div> '),e.put("views/modals/editorselectassetsmodal.html",'<div class="modalContainer" modalmove> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_publish_assets_modal_header"></h4> </div> <div class="modal-body editorProjectSettingsProperties"> <uib-alert ng-click="fnOpenWallpaperPublish()" style="cursor:pointer;" class="editorPublishAssetsModalSuperObvious"><div translate="ui_editor_publish_assets_modal_header_alert"></div></uib-alert> <div class="editorPublishAssetsModalDescription" translate="ui_editor_publish_assets_modal_select_asset_type"></div> <div> <droplist class="fullWidth" dp-options="assetTypes" dp-selected="selected.type"></droplist> </div> <div ng-if="selected.type === \'layers\'"> <div ng-if="assetLayers.length === 0"> <div class="editorPublishAssetsModalDescriptionLower" translate="ui_editor_publish_assets_modal_select_layers_empty"></div> </div> <div ng-if="assetLayers.length > 0"> <div class="editorPublishAssetsModalDescriptionLower" translate="ui_editor_publish_assets_modal_select_layers"></div> <div class="editorPublishAssetsModalLayers"> <div ng-repeat="asset in assetLayers" class="asset"> <checkbox cb-checked="asset.selected" class="check"></checkbox> <span ng-click="asset.selected=!asset.selected"> <span ng-class="asset.icon"></span> <span>{{asset.label}}</span> </span> </div> </div> </div> <div ng-if="isAnythingSelected(2)" style="margin-top:20px;"> <checkbox cb-checked="selected.variantsEnabled" cb-title="\'ui_editor_publish_assets_modal_select_asset_share_variants\'"></checkbox> </div> </div> <div ng-if="selected.type === \'effects\'"> <div ng-if="assetEffects.length === 0"> <div class="editorPublishAssetsModalDescriptionLower" translate="ui_editor_publish_assets_modal_select_effect_empty"></div> </div> <div ng-if="assetEffects.length > 0"> <div class="editorPublishAssetsModalDescriptionLower" translate="ui_editor_publish_assets_modal_select_effect"></div> <div class=""> <droplist class="fullWidth dropup editorPublishAssetsListEffects" dp-options="assetEffects" dp-selected="selected.effect"></droplist> </div> </div> </div> </div> <div class="modal-footer"> <div> <button class="btn btn-primary" ng-disabled="!isAnythingSelected()" ng-click="ok()" translate="ui_ok"></button> <button class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></button> </div> </div> </div> '),e.put("views/modals/editorsettingsmodal.html",'<div class="modalContainer editorSettingsModal"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_filemenu_editor_settings"></h4> </div> <div class="modal-body"> <div class="container-fluid"> <div> <div class="row form-group"> <label class="col-sm-6 control-label" translate="ui_editor_settings_auto_saving" ng-click="settings.autosavingenabled=!settings.autosavingenabled"></label> <div class="col-sm-6"> <checkbox cb-checked="settings.autosavingenabled"></checkbox> </div> </div> <uib-alert ng-if="!settings.autosavingenabled"> <span translate="ui_editor_settings_auto_saving_hint"></span> </uib-alert> <div class="row form-group"> <label class="col-sm-6 control-label" translate="ui_editor_settings_suggest_import_resolution" ng-click="settings.suggestimportresolution=!settings.suggestimportresolution"></label> <div class="col-sm-6"> <checkbox cb-checked="settings.suggestimportresolution"></checkbox> </div> </div> \x3c!-- <div class="row form-group">\r\n <label class="col-sm-6 control-label" translate="ui_editor_settings_path_ffmpeg"></label>\r\n <div class="col-sm-2">\r\n <a class="btn btn-default" translate="ui_editor_settings_path_select" ng-click="selectExternalApp(\'ffmpeg.exe\', \'externalpathffmpeg\')"></a>\r\n </div>\r\n <div class="col-sm-4 editorSettingsModalExternal">\r\n {{settings.externalpathffmpeg || \'ui_editor_settings_path_not_selected\' | translate}}\r\n </div>\r\n </div> --\x3e \x3c!-- <div class="row form-group">\r\n <label class="col-sm-6 control-label" translate="ui_editor_settings_path_photoshop"></label>\r\n <div class="col-sm-2">\r\n <a class="btn btn-default" translate="ui_editor_settings_path_select" ng-click="selectExternalApp(\'photoshop.exe\', \'externalpathphotoshop\')"></a>\r\n </div>\r\n <div class="col-sm-4 editorSettingsModalExternal">\r\n {{settings.externalpathphotoshop || \'ui_editor_settings_path_not_selected\' | translate}}\r\n </div>\r\n </div>\r\n <div class="row form-group">\r\n <label class="col-sm-6 control-label" translate="ui_editor_settings_path_gimp"></label>\r\n <div class="col-sm-2">\r\n <a class="btn btn-default" translate="ui_editor_settings_path_select" ng-click="selectExternalApp(\'gimp.exe\', \'externalpathgimp\')"></a>\r\n </div>\r\n <div class="col-sm-4 editorSettingsModalExternal">\r\n {{settings.externalpathgimp || \'ui_editor_settings_path_not_selected\' | translate}}\r\n </div>\r\n </div> --\x3e <div class="row form-group"> <label class="col-sm-6 control-label" translate="ui_editor_settings_path_custom_image_editor"></label> <div class="col-sm-2"> <a class="btn btn-default" translate="ui_editor_settings_path_select" ng-click="selectExternalApp(\'.exe\', \'externalpathimageeditor\')"></a> </div> <div class="col-sm-4 editorSettingsModalExternal"> {{settings.externalpathimageeditor || \'ui_editor_settings_path_not_selected\' | translate}} </div> </div> <div class="row form-group"> <label class="col-sm-6 control-label" translate="ui_editor_settings_camera_cursor_speed_2D"></label> <div class="col-sm-6"> <input class="fullWidth" truncate-float type="number" onclick="this.select()" ng-model="settings.cameracursorspeed2d"> </div> </div> <div class="row form-group"> <label class="col-sm-6 control-label" translate="ui_editor_settings_camera_cursor_speed_3D"></label> <div class="col-sm-6"> <input class="fullWidth" truncate-float type="number" onclick="this.select()" ng-model="settings.cameracursorspeed3d"> </div> </div> </div> </div> </div> <div class="modal-footer"> <div> <button class="btn btn-primary" ng-click="ok()" translate="ui_ok"></button> <button class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></button> </div> </div> </div> '),e.put("views/modals/editorsteampublishmodal.html",'<div class="modalContainer editorSteamPublishModalRoot" modalmove> <div class="editorSteamPublishModalMove" ng-class="{\'future\': page == \'publish\'}"> <div class="publishPage"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_publish_modal_header"></h4> </div> <div class="modal-body"> <workshop-details wd-project-data="projectData" wd-editor-settings="editorSettings"></workshop-details> <div class="container-fluid" ng-if="vramAlertMessage"> <div class="row"> <div class="col-xs-12"> <label style="margin-bottom:5px" for="workshopTitle" translate="ui_editor_publish_modal_hint_title"></label> <uib-alert type="warning"> <div ng-bind-html="vramAlertMessage"></div> </uib-alert> </div> </div> </div> </div> <div class="modal-footer"> <div> <button class="btn btn-primary" ng-class="{\'btn-wide\':projectData.workshopid}" ng-disabled="isPublishDisabled()" ng-click="startPublish()">{{getPublishButtonText() | translate}}</button> <a class="btn btn-default" ng-click="close()" translate="ui_close"></a> </div> </div> </div> <div class="publishPage"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_publish_modal_header_upload"></h4> </div> <div class="modal-body"> <div ng-if="publishPage==\'progress\'"> <div class="editorSteamPublishStateLabel">{{publishProgressMessage | translate}}</div> <uib-progressbar class="progress-striped active" max="100" value="publishProgressValue"><i>{{publishProgressValue}}%</i></uib-progressbar> </div> <div ng-if="publishPage==\'error\'"> <div class="editorSteamPublishErrorLabel" translate="ui_editor_publish_modal_steam_error" translate-values="{\'error\':publishProgressError}"></div> </div> <div ng-if="publishPage==\'success\'"> <div class="editorSteamPublishStateLabel" ng-attr-style="margin-top: {{needsToAcceptAgreement?80:120}}px" translate="ui_editor_publish_modal_publish_successful"></div> <div ng-if="needsToAcceptAgreement" class="alert alert-danger" translate="ui_editor_publish_modal_publish_prompt_agreement"></div> <a class="btn btn-primary fullWidth" ng-click="openItemInWorkshop()" ng-if="canOpenWallpaperDetailsOnPlatform"><span ng-class="providerIcon"></span> {{successText | translate}}</a> <a class="btn btn-default fullWidth" ng-click="copyItemWorkshopURL()" ng-if="canOpenWallpaperDetailsOnWeb && projectData.workshopid" style="margin-top:5px"><span class="fas fa-clipboard"></span> {{\'ui_editor_filemenu_copy_workshop_url\' | translate}}</a> <div class="fullWidth" style="text-align:center;padding-top:20px" ng-if="canOpenWallpaperDetailsOnPlatform && editorSettings.category === \'asset\'"> <a class="btn btn-lg btn-success" ng-click="editorSettings.subscribeItem(itemId);publishSubscriptionStatus=true"><span ng-if="publishSubscriptionStatus" class="fas fa-check"></span> {{\'ui_browse_details_btn_download\' | translate}}</a> </div> </div> </div> <div class="modal-footer"> <a class="btn btn-primary" ng-if="publishPage==\'error\'" ng-click="startPublish()" translate="ui_retry"></a> <button class="btn btn-default" ng-if="publishPage!=\'success\'" ng-disabled="publishPreventCancel" ng-click="cancelPublish()" translate="ui_cancel"></button> <a class="btn btn-default" ng-if="publishPage==\'success\'" ng-click="close()" translate="ui_close"></a> </div> </div> </div> </div> '),e.put("views/modals/editorsystemresourcesmodal.html",'<div class="modalContainer editorSystemResourcesModal"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_system_resource_modal"></h4> </div> <div class="modal-body"> <div class="container-fluid"> <div class="row"> <label class="col-sm-4 control-label" translate="ui_editor_system_resource_modal_texture"></label> <droplist class="col-sm-8" dp-options="systemTextures" dp-selected="selected.item"></droplist> </div> </div> </div> <div class="modal-footer"> <div> </div> <div> <a class="btn btn-primary" ng-click="ok()" translate="ui_ok"></a> <a class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></a> </div> </div> </div> '),e.put("views/modals/editortemplatewizardmodal.html",'<div class="modalContainer" modalmove> <div class="editorTemplateWizardModalRoot"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_template_wizard_header"></h4> </div> <div class="modal-body"> <div class="row"> <div class="col-xs-4"> <h5 translate="ui_editor_template_wizard_select_option"></h5> <div class="btn-group-vertical verticalRadioButtonList"> <button ng-repeat="option in templateoptions" ng-model="selectedOption.value" uib-btn-radio="option" class="btn btn-default">{{option.name}} <span class="glyphicon pull-right" ng-class="{\'glyphicon-warning-sign warnIcon\':!option.configured}"></span></button> \x3c!-- \'glyphicon-ok\':option.configured --\x3e </div> </div> <div class="col-xs-8" ng-if="selectedOption.value"> <h5 translate="ui_editor_template_wizard_details"></h5> <div class="fullWidth" ng-bind-html="selectedOption.value.description"> </div> <div ng-if="selectedOption.value.options.length > 0" class="templateOptionProperties"> <div ng-repeat="option in selectedOption.value.options"> <checkbox ng-if="option.type === \'checkbox\'" cb-checked="option.value" cb-title="option.label"></checkbox> <div ng-if="option.type === \'slider\'"> <span>{{option.label}}</span> <rzslider rz-slider-model="option.value" rz-slider-options="{ceil:option.max, floor:option.min}"></rzslider> <span>{{option.value}}</span> </div> </div> </div> <div ng-switch on="selectedOption.value.type"> <div ng-switch-when="replacetexture"> <div class="fullWidth wordBreakAll" ng-if="selectedOption.value.last"> <br>{{\'ui_editor_template_wizard_last_import\' | translate}} {{selectedOption.value.last}} </div> <div class="editButton"> <a class="btn btn-default fullWidth" ng-click="replaceTexture(selectedOption.value)"><span class="far fa-image"></span> {{\'ui_editor_template_wizard_import_image\' | translate}}</a> </div> </div> <div ng-switch-when="userpropertycolor"> <br> <spectrum-colorpicker class="sp-flat-nobtn" options="colorPickerOptions" ng-model="generalProperties[selectedOption.value.key].value" vec-color-converter on-show-options="{update:false}" on-change="setOptionConfigured(selectedOption.value)"></spectrum-colorpicker> </div> </div> </div> </div> </div> <div class="modal-footer"> <div> <button class="btn btn-primary" ng-click="ok()" translate="ui_ok"></button> </div> </div> </div> <div class="editorImportModelCompileOverlay ng-hide" ng-show="compileCtrl.active || compileCtrl.success"> <div class="modal-header"> <h4 class="modal-title"> {{\'ui_editor_importer_compiling_assets_for\' | translate}} {{currentTemplateOptionName}}</h4> </div> <div class="modal-body"> <compiler-progress compile-ctrl="compileCtrl"></compiler-progress> </div> </div> </div> '),e.put("views/modals/editoruserpropertiesmodal.html",'<div class="modalContainer" modalmove> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_project_settings_modal_user_properties"></h4> </div> <div class="modal-body editorProjectSettingsProperties"> <div class="row" style="margin-bottom: 10px"> <div class="col-xs-12"> <div translate="ui_editor_user_properties_select_info" translate-values="{types:getTranslatedTypes(types)}"></div> </div> </div> <div class="row"> <div class="col-xs-12"> <user-properties up-properties="project.data.general.properties" up-project-data="project.data" up-selected-property="selectedProperty" up-visible-types="types"></user-properties> </div> </div> <div ng-if="project.data.general.properties[selectedProperty.selected].type === \'combo\'" style="margin: 20px 0 0 0; padding: 0 0 0 50px"> <div translate="ui_editor_user_properties_combo_value"></div> <div> <droplist class="fullWidth dropup" dp-options="project.data.general.properties[selectedProperty.selected].options" dp-selected="selectedProperty.condition"></droplist> </div> </div> </div> <div class="modal-footer"> <div> <a class="btn btn-primary" ng-click="ok()" translate="ui_ok"></a> </div> </div> </div> '),e.put("views/modals/editoruserpropertydetailsmodal.html",'<div class="modalContainer" modalmove> <div class="modal-header"> <h4 class="modal-title">{{title | translate}}</h4> </div> <div class="modal-body"> <div class="container-fluid editorUserPropertyDetailsModalBody"> <div class="row"> <label class="col-sm-5 control-label" translate="ui_editor_user_properties_type"></label> <div class="col-sm-7"> <droplist class="form-control-droplist editorUserPropertyTypeDropDown" dp-options="typeOptions" dp-selected="property.type"></droplist> </div> </div> <div class="row"> <label class="col-sm-5 control-label" translate="ui_editor_user_properties_title"></label> <div class="col-sm-7"> <input type="text" class="form-control" ng-model="property.text"> </div> </div> <div class="row"> <label class="col-sm-5 control-label" translate="ui_editor_user_properties_key"></label> <div class="col-sm-7"> <span ng-if="!viewState.isEditingKey" class="faintText">{{property.key}}</span> <input ng-if="viewState.isEditingKey" type="text" class="form-control" ng-model="property.key"> <a class="btn btn-default pull-right" ng-if="isCreatingNew && !viewState.isEditingKey" ng-click="viewState.isEditingKey=!viewState.isEditingKey"><span class="fas fa-edit"></span></a> </div> </div> <div class="row" ng-if="property.type === \'color\'"> <label class="col-sm-5 control-label" translate="ui_editor_user_properties_value"></label> <div class="col-sm-7"> <spectrum-colorpicker options="colorPickerOptions" ng-model="property.value" vec-color-converter on-show-options="{update:false}"></spectrum-colorpicker> </div> </div> <div ng-if="property.type === \'slider\'"> <div class="row"> <label class="col-sm-5 control-label" translate="ui_editor_user_properties_value"></label> <div class="col-sm-7"> <input type="number" class="form-control" ng-model="property.value"> </div> </div> <div class="row"> <label class="col-sm-5 control-label" translate="ui_editor_user_properties_min_value"></label> <div class="col-sm-7"> <input type="number" class="form-control" ng-model="property.min"> </div> </div> <div class="row"> <label class="col-sm-5 control-label" translate="ui_editor_user_properties_max_value"></label> <div class="col-sm-7"> <input type="number" class="form-control" ng-model="property.max"> </div> </div> <div class="row"> <label class="col-sm-5 control-label" translate="ui_editor_user_properties_fraction"></label> <div class="col-sm-7"> <checkbox cb-checked="property.fraction"></checkbox> </div> </div> <div class="row" ng-if="property.fraction"> <label class="col-sm-5 control-label" translate="ui_editor_user_properties_precision"></label> <div class="col-sm-7"> <input type="number" class="form-control" ng-model="property.precision"> </div> </div> \x3c!-- <div class="row">\r\n <label class="col-sm-5 control-label" translate="ui_editor_user_properties_editable"></label>\r\n <div class="col-sm-7">\r\n <input type="number" class="form-control" ng-model="property.editable">\r\n </div>\r\n </div> --\x3e </div> <div class="row" ng-if="property.type === \'bool\'"> <label class="col-sm-5 control-label" translate="ui_editor_user_properties_value"></label> <div class="col-sm-7"> <checkbox cb-checked="property.value"></checkbox> </div> </div> <div ng-if="property.type === \'combo\'"> <div class="row"> <label class="col-sm-5 control-label" style="padding-top: 5px;" translate="ui_editor_user_properties_value"></label> <div class="col-sm-7"> <droplist class="form-control-droplist editorUserPropertyTypeDropDown" dp-options="property.options" dp-selected="property.value"></droplist> </div> </div> <div class="row" style="align-items:start"> <label class="col-sm-5 control-label" translate="ui_editor_user_properties_options"></label> <div class="col-sm-7"> <div ng-repeat="option in property.options" class="editorUserPropertyDetailsModalOptionRow"> <input type="text" class="form-control" ng-model="option.label" placeholder="{{\'ui_editor_user_properties_options_label\'|translate}}"> <input type="text" class="form-control" ng-model="option.value" placeholder="{{\'ui_editor_user_properties_options_value\'|translate}}"> <a class="btn btn-danger" ng-click="removePropertyOption(option)"><span class="fas fa-fw fa-times"></span></a> </div> <div class="editorUserPropertyDetailsModalOptionRow"> <input id="inputAddComboOptionLabel" type="text" class="form-control" ng-model="newOption.label" placeholder="{{\'ui_editor_user_properties_options_label\'|translate}}"> <input type="text" class="form-control" ng-model="newOption.value" placeholder="{{\'ui_editor_user_properties_options_value\'|translate}}"> <button class="btn btn-primary" ng-disabled="newOption.label.length < 1 || newOption.value.length < 1" ng-click="addPropertyOption()"><span class="fas fa-fw fa-plus"></span></button> </div> </div> </div> </div> <div class="row" ng-if="property.type === \'textinput\'"> <label class="col-sm-5 control-label" translate="ui_editor_user_properties_value"></label> <div class="col-sm-7"> <input type="text" class="form-control" ng-model="property.value"> </div> </div> <div class="row" ng-if="property.type === \'file\'||property.type === \'directory\'"> <label class="col-sm-5 control-label" translate="ui_editor_user_properties_file_type"></label> <div class="col-sm-7"> <droplist class="form-control-droplist editorUserPropertyTypeDropDown" dp-options="fileTypeOptions" dp-selected="property.fileType"></droplist> </div> </div> <div class="row" ng-if="property.type === \'directory\'"> <label class="col-sm-5 control-label" translate="ui_editor_user_properties_fetch_mode"></label> <div class="col-sm-7"> <droplist class="form-control-droplist editorUserPropertyTypeDropDown" dp-options="directoryFetchOptions" dp-selected="property.mode"></droplist> </div> </div> <div class="row"> <label class="col-sm-5 control-label" translate="ui_editor_user_properties_condition"></label> <div class="col-sm-7"> <input onkeypress="window.keyPressSanitize(event)" onpaste="window.pasteSanitize(event)" type="text" class="form-control" ng-model="property.condition" placeholder="{{\'ui_editor_user_properties_condition_placeholder\'|translate}}"> </div> </div> </div> </div> <div class="modal-footer"> <div> <button class="btn btn-primary" ng-click="ok()" ng-disabled="isOkDisabled()" translate="ui_ok"></button> <button class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></button> </div> </div> </div> '),e.put("views/modals/editorwelcomemodal.html",'<div class="modalContainer editorWelcomeModalRoot" modalmove> <div class="editorWelcomeModalPage" ng-class="{past:page}"> <div class="modal-header"> <h4 class="modal-title">{{title | translate}}</h4> </div> <div class="modal-body"> <div class="editorWelcomeContent"> <div style="display: flex;flex-direction: column;"> <a class="btn btn-primary editorWelcomeWallpaperNewBtn" native-drop-target="fileDropped(droppedFiles[0])" ndt-extension-tag="\'editorNewWallpaper\'" ndt-desired-modal-depth="1" ndt-enabled="!page" ng-click="importFile()"> <span class="fas fa-fw fa-file editorWelcomeWallpaperNewBtnFile"></span> <div class="title" translate="ui_editor_welcome_modal_create_wallpaper"></div> <div> <div class="subtitle" translate="ui_editor_welcome_modal_drop_background_file"></div> <div class="subtitle"> {{\'ui_editor_welcome_modal_supported_file_types\' | translate}} {{supportedFileTypes}} </div> </div> </a> <div style="flex:1"></div> <a class="btn btn-default editorWelcomeWallpaperTemplateBtn" ng-click="openPage(\'templates\')"> <div class="title" translate="ui_editor_welcome_modal_use_a_template"></div> </a> </div> <div style="flex: 0.1"> </div> <div style="display: flex;flex-direction: column;"> <div translate="ui_editor_welcome_modal_edit_recent_wallpaper"></div> <div class="editorWelcomeWallpaperNoRecent" ng-if="!editorScope.editorSettings.recentfiles || editorScope.editorSettings.recentfiles.length == 0" translate="ui_editor_welcome_modal_edit_recent_no_wallpapers"></div> <div ng-if="recentFileDetails.length > 0" style="height: 220px;overflow: hidden;flex:1"> <a ng-repeat="file in recentFileDetails track by $index" ng-click="openRecent(file)" class="btn btn-primary editorRecentFileBtn"> {{file.title}} <span>{{file.file}}</span> </a> </div> <a class="btn btn-default editorWelcomeWallpaperTemplateBtn" ng-if="showOpenBtn" ng-click="openProjects()"> <div class="title" translate="ui_editor_welcome_modal_view_all_projects"></div> </a> </div> </div> </div> <div class="modal-footer"> <div class="editorWelcomeModalHints"> <div class="designerHint" translate="ui_editor_welcome_modal_hint_text"></div> <a class="btn btn-primary btn-lg designerBtn" ng-click="openWiki()"><span class="fas fa-books"></span> <span translate="ui_editor_welcome_modal_documentation"></span></a> </div> <div> <div style="float:left;text-align:left" translate="ui_editor_welcome_modal_hint_backup_text"></div> <div> <a class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></a> </div> </div> </div> </div> <div class="editorWelcomeModalPage editorWelcomeModalPageDynamic future" ng-class="{future:!page || page==\'templates\'}"> <div class="modal-header"> <h4 class="modal-title"><span ng-class="pageIcon"></span> {{newTitle | translate}}</h4> </div> <div class="modal-body"> <form class="form-horizontal"> <div class="form-group"> <label for="inputProjectName" class="col-sm-3 control-label" translate="ui_editor_welcome_modal_file"></label> <div class="control-label col-sm-9 editorWelcomeModalFilePath"> {{project.file}} </div> </div> <div class="form-group"> <label for="inputProjectName" class="col-sm-3 control-label" translate="ui_editor_welcome_modal_project_name"></label> <div class="col-sm-9"> <input type="text" class="form-control ignoreModalFocus" ng-model="project.title" id="inputProjectName" placeholder="New project"> </div> </div> <div class="form-group" ng-if="page==\'scene\'||page==\'video\'"> <label class="col-sm-3 control-label" translate="ui_editor_project_settings_modal_scheme_color"></label> <div class="col-xs-9 text-left"> <spectrum-colorpicker options="colorPickerOptions" ng-model="project.schemecolor" vec-color-converter on-show-options="{update:false}"></spectrum-colorpicker> </div> </div> <div ng-if="page==\'scene\' && resize.visible"> <div class="form-group"> <label class="col-sm-3 control-label" translate="ui_editor_welcome_modal_resize_toggle_label" ng-click="resize.enabled=!resize.enabled"></label> <div class="col-xs-9 text-left"> <checkbox style="padding:8px 0 8px 0" cb-checked="resize.enabled"></checkbox> <div class="alert" ng-class="resize.hintClass" style="margin-bottom:0;padding:5px 20px;" ng-if="resize.showHint" translate="{{resize.hint}}" translate-values="resizeHintValues"></div> </div> </div> <div class="form-group" ng-if="resize.enabled"> <label class="col-sm-3 control-label" translate="ui_editor_welcome_modal_resize_resolution_label"></label> <div class="col-xs-9 text-left"> <droplist class="fullWidth editorWelcomeResolutionDropDown" dp-options="resizeOptions" dp-selected="resize.selected"></droplist> </div> </div> </div> <div class="form-group" ng-if="page==\'web\'||page==\'application\'"> <label for="inputWallpaperFile" class="col-sm-3 control-label" translate="ui_editor_welcome_modal_imported_files"></label> <div class="col-sm-9"> <div class="importFileList"> <div ng-repeat="entry in project.filelist track by $index"> <span class="glyphicon" ng-class="{\'glyphicon-file\':!entry.isdirectory,\'glyphicon-folder-close\':entry.isdirectory}"></span> {{entry.label}} </div> </div> </div> </div> </form> </div> <div class="modal-footer"> <div style="float:left;"> <a class="btn btn-default" ng-click="page=\'\'"><span class="fas fa-arrow-left"></span> {{\'ui_back\' | translate}}</a> </div> <div> <button class="btn btn-primary" ng-disabled="!project.file || !project.title" ng-click="ok()" translate="ui_ok"></button> <a class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></a> </div> </div> </div> <div class="editorWelcomeModalPage editorWelcomeModalPageDynamic future2" ng-class="{past: page && page !== \'templates\', future2:page!==\'templates\'}"> <div class="modal-header"> <h4 class="modal-title"><span ng-class="pageIcon"></span> {{newTitle | translate}}</h4> </div> <div class="modal-body"> <form class="form-horizontal"> <div class="form-group"> <label for="inputProjectName" class="col-sm-3 control-label" translate="ui_editor_welcome_modal_project_name"></label> <div class="col-sm-9"> <input type="text" class="form-control ignoreModalFocus" ng-model="project.title" id="inputProjectName" placeholder="New project"> </div> </div> <div class="form-group"> <label class="col-sm-3 control-label" translate="ui_editor_welcome_modal_template"></label> <div class="col-sm-9"> <div class="btn-group-vertical verticalRadioButtonList" style="width:50%;height:200px;"> <button class="btn btn-default" type="button" ng-repeat="template in templates" ng-model="project.template" uib-btn-radio="template">{{template.name}}</button> </div> <img class="editorWelcomeModalTemplateImg" ng-src="{{currentPreview || \'images/blueprint.png\'}}"> </div> </div> <div class="form-group" ng-if="project.template.value==\'empty2d\'"> <label class="col-sm-3 control-label" translate="ui_editor_project_settings_modal_resolution"></label> <div class="col-xs-9 text-left editorResolutionParent"> <input type="number" class="form-control ignoreModalFocus" ng-model="project.resolution.width" placeholder="Width"> <div>X</div> <input type="number" class="form-control ignoreModalFocus" ng-model="project.resolution.height" placeholder="Height"> </div> </div> </form> </div> <div class="modal-footer"> <div style="float:left;"> <a class="btn btn-default" ng-click="page=\'\'"><span class="fas fa-arrow-left"></span> {{\'ui_back\' | translate}}</a> </div> <div> <button class="btn btn-primary" ng-disabled="!project.title || !project.template" ng-click="ok()" translate="ui_ok"></button> <a class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></a> </div> </div> </div> </div> '),e.put("views/modals/editorworkshoprules.html",'<div class="modalContainer"> <div class="modal-header"> <h4 class="modal-title" translate="ui_editor_workshop_rules_modal_title"></h4> </div> <div class="modal-body editorWorkshopRulesBody"> <div> <span translate="ui_editor_workshop_rules_modal_body"></span> <a ng-click="openWorkshopWebRules()" translate="var_url_providerrules"></a> </div> <br> <div translate="ui_editor_workshop_rules_modal_list_header"></div> <ul> <li translate="ui_editor_workshop_rules_modal_rule_nudity"></li> <li translate="ui_editor_workshop_rules_modal_rule_offensive"></li> <li translate="ui_editor_workshop_rules_modal_rule_copyright"></li> <li translate="ui_editor_workshop_rules_modal_rule_ads"></li> <li translate="ui_editor_workshop_rules_modal_rule_misleading"></li> </ul> </div> <div class="modal-footer"> <div> <a class="btn btn-primary" translate="ui_ok" ng-click="ok()"></a> </div> </div> </div> '),e.put("views/modals/genericconfirmmodal.html",'<div class="modalContainer"> <div class="modal-header" ng-if="data.title"> <h4 class="modal-title" translate="{{data.title}}" translate-values="data.labelValues"></h4> </div> <div class="modal-body modalGenericConfirmBody" ng-class="{\'modalGenericConfirmBodyDropMinSize\':data.droplistVisible}"> <div ng-if="data.leftIcon || data.message"> <div ng-if="data.leftIcon" class="confirmIcon"> <img ng-src="{{data.leftIcon}}"> </div> <div style="display:flex;flex-direction:column;"> <div translate="{{data.message}}" translate-values="data.labelValues"></div> <div ng-if="data.checkboxCenterVisible" style="margin-top: 15px;white-space:initial;"> <checkbox cb-checked="data.checkboxChecked" cb-title="data.checkboxTitle"></checkbox> </div> </div> </div> <div ng-if="data.checkboxVisible" style="margin-top: 15px;"> <checkbox cb-checked="data.checkboxChecked" cb-title="data.checkboxTitle"></checkbox> </div> <div ng-if="data.droplistVisible" style="margin-top: 15px;"> <droplist class="fullWidth editorTagDropDown" dp-options="data.droplistOptions" dp-selected="data.droplistSelected"></droplist> </div> <div ng-if="data.textinputVisible" class="fullWidth" style="margin-top: 15px;"> <form class="fullWidth"> <input id="genericConfirmTextInput" type="text" class="form-control ignoreModalFocus" ng-model="data.textinput" autofocus> </form> </div> <div ng-if="data.numberInputVisible" class="fullWidth" style="margin-top: 15px;"> <form class="fullWidth"> <input id="genericConfirmNumberInput" type="number" class="form-control ignoreModalFocus" ng-model="data.numberinput" autofocus> </form> </div> <div ng-if="data.selectionVisible" class="modalGenericConfirmSelectionRoot"> <div> <a class="editorEffectModalItem activeBackHighlight" ng-repeat="item in data.selectionItems" ng-click="data.selectedItem = item" ng-dblclick="data.selectedItem = item;ok()" ng-class="{\'active\':data.selectedItem == item}" translate="{{item.label}}"></a> </div> </div> <div ng-if="data.alert" style="margin-top:15px;"> <uib-alert type="info" style="width:100%"> <div ng-bind-html="data.alert | translate"></div> </uib-alert> </div> <div ng-if="data.listVisible" class="modalGenericConfirmItemList"> <div ng-repeat="item in data.listItems"> <div translate="{{item.label}}"></div> </div> </div> </div> <div class="modal-footer" style="display:flex"> <div style="text-align:left"> <a class="btn" ng-if="data.leftVisible" ng-class="data.leftClass" ng-click="leftClicked()"><img ng-if="data.leftImg" ng-src="{{data.leftImg}}"> {{data.leftText|translate}}</a> <a class="btn" ng-if="data.left2Visible" ng-class="data.left2Class" ng-click="left2Clicked()"><img ng-if="data.left2Img" ng-src="{{data.left2Img}}"> {{data.left2Text|translate}}</a> <checkbox ng-if="data.checkboxLowVisible" cb-checked="data.checkboxChecked" cb-title="data.checkboxTitle"></checkbox> </div> \x3c!-- <div ng-if="data.customFooter" style="display:flex;flex-direction:column">\r\n <div style="margin-bottom:5px; text-align: left">{{data.customFooterText | translate}}</div>\r\n <div>\r\n <button class="btn btn-primary" uib-btn-checkbox ng-model="data.customFooterModel" translate="ui_workshop_tags_anime"></button>\r\n </div>\r\n </div> --\x3e <div style="flex-grow: 1"> <a class="btn btn-primary" ng-if="data.okVisible" ng-class="data.okClass" ng-disabled="data.okDisabled || (data.textinputVisible && data.textinputRequired && !(data.textinput&&data.textinput.trim()))" ng-click="ok()"><img ng-if="data.okUAC" src="images/uac_small.png" style="height: 18px;"> {{data.okText || \'ui_ok\' | translate}}</a> <a class="btn btn-default" ng-if="data.cancelVisible" ng-click="cancel()">{{data.cancelText || \'ui_cancel\' | translate}}</a> </div> </div> </div> '),e.put("views/modals/openfromurlmodal.html",'<div class="modalContainer"> <div class="modal-header"> <h4 class="modal-title" translate="ui_browse_open_url_header"></h4> </div> <div class="modal-body"> <form class="form-horizontal"> <div class="form-group"> <label for="inputURL" class="col-sm-4 control-label">URL</label> <div class="col-sm-8"> <input type="text" class="form-control ignoreModalFocus" ng-model="url" id="inputURL" placeholder="http://" autofocus> </div> </div> <div class="form-group" style="margin-bottom:0px"> <label for="inputURL" class="col-sm-4 control-label" translate="ui_browse_open_url_name"></label> <div class="col-sm-8"> <input type="text" class="form-control ignoreModalFocus" ng-model="name" id="inputURL" autofocus> </div> </div> <div style="padding: 40px 10px 10px 10px;" translate="ui_browse_open_url_hotkey_info"></div> <div class="form-group" style="margin-bottom:0px"> <label class="col-sm-4 control-label" translate="ui_settings_hotkeys_action_hide_icons"></label> <div class="col-sm-8"> <hotkeyinput hk-item="hideIconsKey" hk-keys="findHotkeyList(hideIconsKey).keys" hk-pool="hotkeys"></hotkeyinput> </div> </div> <div style="padding: 40px 10px 10px 10px;" translate="ui_browse_open_url_livestream_info"></div> \x3c!-- <div>\r\n <button class="btn btn-primary fullWidth" translate="ui_browse_open_url_livestream_download_button"></button>\r\n </div> --\x3e <div class="form-group" style="margin-top: 10px;margin-bottom:0px;display:flex;align-items: center;"> <label class="col-sm-4 control-label" style="padding-top:0;" ng-click="temp.useEdge=!temp.useEdge" translate="ui_browse_open_url_livestream_checkbox"></label> <div class="col-sm-8"> <checkbox cb-checked="temp.useEdge"></checkbox> </div> </div> <div style="margin-top:10px"> <div class="browseAlert ng-hide" ng-show="temp.useEdge"> <uib-alert> <div translate="ui_browse_open_url_livestream_warning"></div> </uib-alert> </div> </div> </form> </div> <div class="modal-footer"> <div> <button class="btn btn-primary" ng-disabled="!url" ng-click="ok()" translate="ui_ok"></button> <a class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></a> </div> </div> </div> '),e.put("views/modals/queryworkshopmodal.html",'<div class="modalContainer editorQueryAssetModal"> <div class="modal-header"> <h4 class="modal-title" translate="ui_query_workshop_modal_header_assets" translate-values="settings"></h4> </div> <div class="modal-body editorQueryAssetModalLayout"> <div class="left"> <div class="browseWallpaperSearchContainer"> <div class="form-group has-feedback browseWallpaperSearchContainerSearchField"> <div ng-class="{\'input-group\':filter.text}"> <input id="browseSearchFilterText" type="text" class="form-control" placeholder="{{\'ui_browse_search_placeholder\' | translate}}" ng-model="filter.text" ng-model-options="{debounce:100}"> <span class="glyphicon glyphicon-search form-control-feedback" aria-hidden="true"></span> <div class="input-group-btn"> <button ng-if="filter.text" class="btn btn-danger" ng-click="resetSearchFilter()"> <i class="glyphicon glyphicon-remove"></i> </button> </div> </div> </div> <div> <a ng-click="showFilter.visible=!showFilter.visible" class="btn btn-primary filterBtn"> <span class="fas fa-tasks filterIcon"></span> <span class="filterLabel" translate="ui_browse_filter_results"></span> <span ng-if="showFilter.counts && sourceIsWorkshop && (steamWorkshopStatus.complete || steamWorkshopStatus.error)" class="browseFilterActiveClass" translate="ui_browse_filter_results_filtered"></span> </a> </div> <div class="browseWallpaperSearchContainerFill"> </div> <div class="browseWallpaperSearchContainerSort"> <droplist ng-class="sortOptionsClass" dp-options="sortOptions" dp-selected="filter.sort"></droplist> </div> </div> <div class="browseWallpaperGridParent"> <div class="browseWallpaperGridContainerParent"> <div class="browseWallpaperFilter ng-hide" ng-show="showFilter.visible && !sourceIsExplore"> <div> <div class="browseFilterTopBar"> <span> <a ng-click="callbackResetFilter()" class="btn btn-primary iconInfo"> <span class="fas fa-sync-alt"></span> <span translate="ui_browse_filter_reset"></span> </a> </span> </div> \x3c!-- TYPES --\x3e <div ng-if="!filterPreset.workshopid"> <div class="filterHeader browseFilterToggle" ng-click="filterHideTypes=!filterHideTypes"> <span ng-if="filterHideTypes" class="fas fa-fw fa-caret-down"></span> <span ng-if="!filterHideTypes" class="fas fa-fw fa-caret-right"></span> <span translate="ui_browse_filter_type"></span> \x3c!-- <span ng-if="filterStatus.type" class="browseFilterActiveClass" translate="ui_browse_filter_results_filtered"></span> --\x3e </div> <div class="browseFilterHide" ng-show="filterHideTypes"> <div class="filterItem" ng-repeat="tag in filterTypeTags"> <checkbox cb-checked="filter.typetags[tag.value]" cb-title="tag.label"></checkbox> </div> <div class="browseFilterBottomPadding"></div> </div> </div> \x3c!-- RATING --\x3e <div ng-if="canUseAgeRatingTags()"> <div class="filterHeader browseFilterToggle" ng-click="filterHideRating=!filterHideRating"> <span ng-if="filterHideRating" class="fas fa-fw fa-caret-down"></span> <span ng-if="!filterHideRating" class="fas fa-fw fa-caret-right"></span> <span translate="ui_workshop_workshop_tags_rating"></span> \x3c!-- <span ng-if="filterStatus.rating" class="browseFilterActiveClass" translate="ui_browse_filter_results_filtered"></span> --\x3e </div> <div class="browseFilterHide" ng-show="filterHideRating"> <div class="filterItem" ng-repeat="tag in filterRatingTags"> <checkbox cb-checked="filter.ratingtags[tag.value]" cb-title="tag.label"></checkbox> </div> <div class="browseFilterBottomPadding"></div> </div> </div> \x3c!-- GENRES --\x3e <div class="filterHeader browseFilterToggle" ng-click="filterHideGenres=!filterHideGenres"> <span ng-if="!filterHideGenres" class="fas fa-fw fa-caret-down"></span> <span ng-if="filterHideGenres" class="fas fa-fw fa-caret-right"></span> <span class="filterHeader" translate="ui_browse_filter_tags"></span> \x3c!-- <span ng-if="filterStatus.tags" class="browseFilterActiveClass" translate="ui_browse_filter_results_filtered"></span> --\x3e </div> <div class="browseFilterHide" ng-hide="filterHideGenres"> <div class="filterItem" ng-repeat="tag in filterUtilityTags"> <checkbox cb-type="tag" cb-checked="filter.utilitytags[tag.value]" cb-title="tag.label"></checkbox> <span ng-if="tag.value==\'Approved\'" class="fas fa-trophy browseWallpaperApproved"></span> </div> <div class="filterDivider"></div> <div class="filterItem filterMultiButtons"> <a class="filterMultiBtn" ng-click="callbackToggleGenreFilter($event, true)"><span translate="ui_browse_filter_all"></span></a> <a class="filterMultiBtn" ng-click="callbackToggleGenreFilter($event, false)"><span translate="ui_browse_filter_none"></span></a> </div> <div class="filterItem" ng-repeat="tag in filterAssetGenreTags"> <checkbox cb-checked="filter.assetgenretags[tag.value]" cb-title="tag.label"></checkbox> </div> </div> </div> </div> <div class="browseWallpaperGridAndNavigationView"> <div class="browseWallpaperGridView"> <div ng-if="queryWallpapers.length == 0" class="emptyGrid"> <span ng-class="{\'emptyGridDanger\':showErrorInBackground}" ng-bind-html="queryActive ? \'ui_browse_grid_no_results_refreshing\' : showErrorInBackground ? \'ui_browse_no_service_body\' : \'ui_browse_grid_no_results_generic\' | translate"></span> <div ng-if="!queryActive && showErrorInBackground" style="margin-top:20px;"> <a class="btn btn-default btn-lg" ng-click="callbackChangePage(currentPage, true)"><span class="fas fa-sync-alt"></span> <span translate="ui_browse_reload"></span></a> </div> <wp-anim class="wpAnimQuery" wpa-file="anims/logo_white.json"></wp-anim> </div> <wallpaper-thumbnail class="wallpaperBrowseInner" wt-wallpapers="queryWallpapers" wt-selection="currentSelection" wt-mousecallback="callbackWallpaperAllMouse(btn, context, $event)" ng-class="\'browseViewSizemedium\'" id="BrowseAssetGrid" wt-tag="\'assetworkshop\'"></wallpaper-thumbnail> </div> </div> </div> <div class="browseWallpaperPagination" ng-show="pagination.visible"> <div> <span><a class="fas fa-angle-double-left paginationIcon" ng-click="callbackChangePage(\'prev\')"></a></span> <span ng-repeat="page in pagination.pages"><a class="paginationIcon pageItem" ng-click="callbackChangePage(page.label)" ng-class="{\'{{page.class}}\':true, \'linkOverrideActive\':page.label==pagination.current}">{{page.label}}</a></span> <span><a class="fas fa-angle-double-right paginationIcon" ng-click="callbackChangePage(\'next\')"></a></span> </div> </div> </div> </div> <div class="browseWallpaperDetailView right"> <div ng-if="!currentSelection" class="placeholder details"> <div translate="ui_browse_select_prompt_asset"></div> </div> <div ng-if="currentSelection" class="details"> <div class="previewContainer"> <div> <img ng-src="{{currentSelection.preview}}" class="previewImage" style="object-fit: contain;width:100%;"> </div> </div> <div class="info"> <div class="content-title"> {{currentSelection.title}} </div> <div class="infoRow center" ng-if="!currentSelection.local"> <workshop-author wa-item="currentSelection" wa-infos="workshopController.steamUserInfos" wa-open-user-page="openSteamUserPage"></workshop-author> </div> <div class="infoRow center" ng-if="currentSelection.assettypeslabel"> <div>{{currentSelection.assettypeslabel}}</div> </div> <div class="infoRow center" ng-if="currentSelection.filesizelabel"> <div>{{\'ui_browse_details_filesize\'|translate}} {{currentSelection.filesizelabel}}</div> </div> <div ng-if="currentSelection.hasrating" class="infoRow browseWallpaperDetailsWorkshopRateRow"> <workshop-rating wr-item="currentSelection" set-user-vote="workshopController.setUserVote" set-favorited="workshopController.setFavorited"></workshop-rating> </div> </div> <div class="detailButtons" ng-if="currentSelection.workshopid"> <div class="browseWallpaperDetailsWorkshopControls"> <a ng-if="currentSelection.status !== \'downloadable\'" ng-click="unsubscribeWorkshopItem(currentSelection)" class="btn btn-danger"> <span class="fas fa-times" aria-hidden="true"></span> {{\'ui_browse_details_btn_unsubscribe\' | translate}} </a> <a ng-if="currentSelection.status === \'downloadable\'" ng-click="workshopController.subscribeWorkshopItem(currentSelection.workshopid)" class="btn btn-success"> <span class="fas fa-download" aria-hidden="true"></span> {{\'ui_browse_details_btn_download\' | translate}} </a> <a ng-click="workshopController.openSteamWorkshopPage(currentSelection)" class="btn btn-default" tooltip="ui_browse_details_btn_workshop" t-align-right="true"> <span ng-class="providerIcon" aria-hidden="true"></span> {{\'ui_browse_details_btn_comment\' | translate}} </a> </div> </div> <div class="info" ng-if="currentSelection.description"> <pre class="resetPre" style="margin-top:10px">{{currentSelection.description}}</pre> </div> </div> </div> </div> <div class="modal-footer"> <div> \x3c!-- <button class="btn btn-primary" ng-click="ok()" translate="ui_ok"></button> --\x3e <button class="btn btn-default" ng-click="close()" translate="ui_close"></button> </div> </div> </div> '),e.put("views/modals/settingschangelogmodal.html",'<div class="modalContainer"> <div class="modal-header"> <h4 class="modal-title" translate="ui_settings_about_changelog"></h4> </div> <div class="modal-body changelogBody"> <ng-include src="\'views/ci/changelog.html\'"></ng-include> </div> <div class="modal-footer"> <div> <a class="btn btn-primary" ng-click="close()" translate="ui_ok"></a> </div> </div> </div> '),e.put("views/modals/settingshotkeysmodal.html",'<div class="modalContainer"> <div class="modal-header"> <h4 class="modal-title" translate="ui_settings_hotkeys_header"></h4> </div> <div class="modal-body perApplicationModalBody"> <div class="hotkeyTable fullList"> <div translate="ui_settings_hotkeys_example" class="faintText" style="padding-bottom:10px"> </div> <div ng-repeat="group in list"> <div class="hotkeyHeader"> <div translate="{{group.title}}"></div> </div> <div ng-repeat="item in group.items"> <div class="hotkeyRow"> <div class="title" translate="{{item.label || \'ui_settings_hotkeys_action_user_\' + item.action}}"> </div> <hotkeyinput hk-keys="findHotkeyList(item).keys" hk-item="item" hk-pool="hotkeys"></hotkeyinput> </div> <div class="hotkeyValue"> {{item.title || item.value}} </div> </div> <div class="hotkeyRow" ng-if="group.items.length === 0"> <div class="stub" translate="{{group.stub}}"></div> </div> </div> </div> </div> <div class="modal-footer"> <div> <a class="btn btn-primary" ng-click="close()" translate="ui_ok"></a> </div> </div> </div> '),e.put("views/modals/settingsmanagemonitorsmodal.html",'<div class="modalContainer"> <div class="modal-header"> <h4 class="modal-title" translate="settings_manage_monitors_modal_title"></h4> </div> <div class="perApplicationModal"> <div class="modal-body settingsManageMonitorsModal"> <div class="monitorList"> <div ng-repeat="monitor in monitorMap track by $index" class="perApplicationRule" style="margin-top: 10px"> <div class="ruleInfo"> <div class="ruleTitle" ng-class="{halfOpacity:monitor.readonly}">{{monitor.name || monitor.device}}</div> \x3c!-- halfOpacity --\x3e <div style="font-size:85%" ng-if="monitor.readonly" class="halfOpacity" translate="settings_manage_monitors_modal_disconnected"></div> <div style="font-size:85%;word-break: break-all;" ng-if="!monitor.readonly && monitor.name" class="halfOpacity">{{monitor.device}}</div> </div> <div style="min-width:140px;margin-left:10px"> <droplist ng-if="!monitor.readonly" class="settingsManageMonitorsModalDroplist" dp-options="monitorOptions" dp-selected="monitor.value" dp-change="onMonitorChanged(monitor)"></droplist> <div style="text-align:right" ng-if="monitor.readonly" class="halfOpacity" translate="settings_manage_monitors_modal_monitor_assoc" translate-values="{index:(monitor.value + 1)}"></div> </div> </div> </div> </div> <div class="modal-footer"> <div> <a class="btn btn-primary" ng-click="ok()" translate="ui_ok"></a> <a class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></a> </div> </div> </div> </div> '),e.put("views/modals/settingsmediablocklistmodal.html",'<div class="modalContainer"> <div class="modal-header"> <h4 class="modal-title" translate="settings_media_blocklist_title"></h4> </div> <div class="perApplicationModal"> <div class="modal-body settingsMediaBlocklistModal"> <div class="blockEntry"> \x3c!-- <a ng-click="showCreatePage()" class="btn btn-default fullWidth" translate="ui_settings_playback_new_rule"></a> --\x3e <span class="blockEntryInfo"> <div translate="settings_media_blocklist_current_session" style="margin-bottom:5px"></div> <div ng-if="!session.appid" class="halfOpacity" translate="settings_media_blocklist_none"></div> <div ng-if="session.appid" class="halfOpacity">{{session.appid}}</div> </span> <span style="align-self: end;"> <button style="min-width:100px;" ng-disabled="!session.appid" class="btn btn-primary" translate="settings_media_blocklist_block" ng-click="addBlock(session.appid)"></button> </span> </div> <div class="blocklist"> <div ng-repeat="block in blocklist" class="perApplicationRule"> <div class="ruleInfo"> <div class="ruleTitle">{{block.appid}}</div> </div> <div> <button class="btn btn-danger" ng-click="blocklist.findAndRemove(block)" tooltip="ui_settings_playback_rule_remove" t-align-right="true"><span class="fas fa-trash"></span></button> </div> </div> </div> </div> <div class="modal-footer"> <div> <a class="btn btn-primary" ng-click="close()" translate="ui_ok"></a> </div> </div> </div> </div> '),e.put("views/modals/settingsperapplicationmodal.html",'<div class="modalContainer"> <div class="modal-header"> <h4 class="modal-title" translate="ui_settings_playback_application_rules_header"></h4> </div> <div style="white-space: nowrap;"> <div class="perApplicationModal" ng-class="{\'showPage1\':page.name,\'showPage2\':page.name==\'wallpaper\'}"> <div class="modal-body perApplicationModalBody"> <div> <a ng-click="showCreatePage()" class="btn btn-default fullWidth" translate="ui_settings_playback_new_rule"></a> </div> <div class="ruleList"> <div ng-repeat="rule in rules" class="perApplicationRule"> <div class="ruleInfo"> <div class="ruleTitle">{{rule.executable}}</div> <div class="extra"> <div class="names"> <div translate="ui_settings_playback_new_rule_condition"></div> <div translate="ui_settings_playback_new_rule_action"></div> </div> <div> <div>{{conditionLabels[rule.condition] | translate}}</div> <div>{{actionLabels[rule.action] | translate}}</div> </div> </div> </div> <div> <button class="btn btn-default" ng-click="showEditPage(rule)" tooltip="ui_settings_playback_rule_edit" t-align-right="true"><span class="fas fa-edit"></span></button> <button class="btn btn-danger" ng-click="rules.findAndRemove(rule)" tooltip="ui_settings_playback_rule_remove" t-align-right="true"><span class="fas fa-trash"></span></button> </div> </div> </div> </div> <div class="modal-footer"> <div> <a class="btn btn-primary" ng-click="close()" translate="ui_ok"></a> </div> </div> </div> <div class="perApplicationModal" ng-class="{\'showPage1\':page.name,\'showPage2\':page.name==\'wallpaper\'}"> <div class="modal-body perApplicationModalBody"> <div> <form class="form-horizontal"> <div class="perApplicationList"> <a ng-repeat="app in applications | filter:newRule.executable" class="settingsApplicationRow" ng-click="newRule.executable = app.executablename"> <img ng-if="app.icon" ng-src="{{app.icon}}" class="settingsApplicationIcon item"> <span ng-if="!app.icon" class="far fa-fw fa-window-maximize item"></span> <span class="item" style="flex:1">{{app.executablename}}</span> <span class="fas fa-volume-up" style="margin-right:10px;" ng-if="applicationsPlayingAudio.includes(app.executablename)"></span> </a> </div> <div class="form-group"> <label class="col-xs-4 control-label" translate="ui_settings_playback_new_rule_application_name"></label> <div class="col-xs-8"> <div class="input-group"> <input type="text" class="form-control ignoreModalFocus" ng-model="newRule.executable" spellcheck="false"> <div class="input-group-btn"> <button class="btn btn-danger" ng-click="newRule.executable=\'\'"> <i class="glyphicon glyphicon-remove"></i> </button> </div> </div> </div> </div> <div class="form-group"> <label class="col-xs-4 control-label" translate="ui_settings_playback_new_rule_condition"></label> <div class="col-xs-8"> <droplist class="dropup" dp-options="conditionOptions" dp-selected="newRule.condition"></droplist> </div> </div> <div class="form-group"> <label class="col-xs-4 control-label" translate="ui_settings_playback_new_rule_action"></label> <div class="col-xs-8"> <droplist class="dropup" dp-options="actionOptions" dp-selected="newRule.action"></droplist> </div> </div> </form> </div> </div> <div class="modal-footer"> <div> <button ng-if="requiresWallpaperSelection()" class="btn btn-primary" ng-disabled="!newRule.executable" ng-click="chooseWallpaper()" translate="ui_next"></button> <button ng-if="!requiresWallpaperSelection()" class="btn btn-primary" ng-disabled="!newRule.executable" ng-click="createRule()">{{page.name == \'create\' ? \'ui_create\' : \'ui_ok\' | translate}}</button> <button class="btn btn-default" ng-click="page.name=\'\'">{{\'ui_cancel\' | translate}}</button> </div> </div> </div> <div class="perApplicationModal" ng-class="{\'showPage1\':page.name,\'showPage2\':page.name==\'wallpaper\'}"> <div class="modal-body perApplicationModalBody"> <div> <form class="form-horizontal"> <div class="perApplicationList"> <span ng-if="loadItems.length === 0" class="faintText" translate="ui_settings_playback_new_rule_search_empty"></span> <a ng-repeat="item in loadItems | filter:filter.search" class="settingsApplicationRow" ng-click="selectWallpaper(item)"> <span>{{item.label}}</span> </a> </div> <div class="form-group"> <label class="col-xs-4 control-label" translate="ui_settings_playback_new_rule_search"></label> <div class="col-xs-8"> <div class="input-group"> <input type="text" class="form-control ignoreModalFocus" ng-model="filter.search" spellcheck="false"> <div class="input-group-btn"> <button class="btn btn-danger" ng-click="clearWallpaperSearch()"> <i class="glyphicon glyphicon-remove"></i> </button> </div> </div> </div> </div> <div class="form-group" ng-if="newRule.action==\'loadwallpaper\'"> <label class="col-xs-4 control-label" translate="ui_settings_playback_new_rule_preview"></label> <div class="col-xs-8"> <img ng-if="selected.wallpaper" class="perApplicationModalWallpaperPreview" ng-src="{{selected.wallpaper.preview}}"> <a class="perApplicationModalWallpaperUrl" ng-if="selected.wallpaper.workshopurl" ng-click="openSteamWorkshopPage(selected.wallpaper)" translate="ui_settings_playback_new_rule_open_in_workshop"></a> </div> </div> </form> </div> </div> <div class="modal-footer"> <div> <button class="btn btn-primary" ng-disabled="!newRule.file" ng-click="createRule()" translate="ui_create"></button> <button class="btn btn-default" ng-click="cancelLoadRule()">{{\'ui_cancel\' | translate}}</button> </div> </div> </div> </div> </div> '),e.put("views/modals/settingspluginmodal.html",'<div class="modalContainer"> <div class="modal-header"> <h4 class="modal-title" translate="ui_settings_plugins_options_modal_header" translate-values="{name:plugin.name}"></h4> </div> <div class="modal-body"> <div> <form class="form-horizontal"> <div class="form-group" ng-repeat="option in plugin.options" ng-if="!option.condition || evalCondition(option.condition)" ng-class="{settingsPluginSettingsSubIndent:option.condition}"> <div ng-if="!option.name" class="col-xs-12"> <div class="settingsPluginSettingsDivider"> </div> </div> <div ng-if="option.name && option.type === \'checkbox\'"> <span class="col-xs-6 settingsLabel" ng-click="pluginSettings[plugin.key][option.name]=!pluginSettings[plugin.key][option.name]">{{option.label|translate}}</span> <div class="col-xs-6"> <checkbox cb-checked="pluginSettings[plugin.key][option.name]"></checkbox> </div> </div> <div ng-if="option.name && option.type === \'slider\'"> <span class="col-xs-6 settingsLabel">{{option.label|translate}}</span> <div class="col-xs-6" style="display:flex;align-items:center"> <rzslider rz-slider-model="pluginSettings[plugin.key][option.name]" rz-slider-options="{ceil:option.max, floor:option.min, enforceStep:false, step:option.step||1, precision:option.precision||1}"></rzslider> <span style="text-align:right;width:40px">{{pluginSettings[plugin.key][option.name]}}</span> </div> </div> <div class="settingsPluginSettingsRow" ng-if="option.name && option.type === \'combo\'"> <span class="col-xs-6 settingsLabel">{{option.label|translate}}</span> <div class="col-xs-6"> <droplist class="settingsPluginSettingsDropdown" dp-options="option.options" dp-selected="pluginSettings[plugin.key][option.name]"></droplist> </div> </div> </div> \x3c!-- <div class="form-group">\r\n <div class="col-xs-12">\r\n <div class="settingsPluginSettingsDivider">\r\n </div>\r\n </div>\r\n </div>\r\n <div class="form-group">\r\n <div class="settingsPluginSettingsRow">\r\n <div class="col-xs-6">\r\n <span translate="ui_settings_plugins_options_delay_load"></span>\r\n </div>\r\n <div class="col-xs-3">\r\n <input type="number" class="form-control" ng-model="pluginSettings[plugin.key].delay">\r\n </div>\r\n <div class="col-xs-3">\r\n <span translate="ui_settings_plugins_options_delay_load_seconds"></span>\r\n </div>\r\n </div>\r\n </div> --\x3e </form> </div> </div> <div class="modal-footer"> <div> <a class="btn btn-primary" ng-click="ok()" translate="ui_ok"></a> \x3c!-- <a class="btn btn-default" ng-click="cancel()" translate="ui_cancel"></a> --\x3e </div> </div> </div> '),e.put("views/templates/checkbox.html",'<div class="checkBoxBase"> <div ng-click="toggle()" class="checkBoxOuter" ng-class="{\'dis\':cbDisabled}"> <span class="fas fa-square checkBoxBackground"></span> <span ng-if="!cbType"> <span ng-if="cbChecked" class="fas fa-check-square checkBox"></span> <span ng-if="!cbChecked" class="far fa-square checkBox"></span> </span> <span ng-if="cbType==\'tag\'"> <span ng-if="cbChecked===1" class="fas fa-plus-square checkBox successText"></span> <span ng-if="!cbChecked" class="far fa-square checkBox"></span> </span> <span ng-if="cbType==\'bit\'"> <span ng-if="bitChecked()" class="fas fa-check-square checkBox"></span> <span ng-if="!bitChecked()" class="far fa-square checkBox"></span> </span> </div> <div ng-click="toggle()" ng-if="cbTitle" class="checkBoxTitle" ng-class="{\'successText\':cbChecked===1}">{{cbTitle | translate}}</div> </div> '),e.put("views/templates/codeeditor.html",'<div class="editorCodeEditor disableEditorHotkeys"> \x3c!-- tabindex="-1" --\x3e <div class="editorCodeControls"> \x3c!-- required buttons: --\x3e \x3c!-- run edit snippets cancel save --\x3e <div class="editorCodeControlsButtonGroup"> <button ng-if="isJSType()" class="btn btn-primary" ng-click="apply()"><span class="fas fa-cog"></span> <span translate="ui_editor_script_compile"></span></button> <button ng-if="isShaderType()" class="btn btn-primary" ng-click="apply()"><span class="fas fa-check"></span> <span translate="ui_editor_script_apply"></span></button> <button ng-if="isEditable()" class="btn btn-default editorCodeControlsButtonGroupSpacing" ng-click="openEditMenu($event)" ng-mouseover="hoverMenu($event, \'edit\')">{{\'ui_editor_filemenu_edit\'|translate}}</button> <button ng-if="isEditable()" class="btn btn-default editorCodeControlsButtonGroupSpacing" ng-click="openSnippetMenu($event)" ng-mouseover="hoverMenu($event, \'snippet\')">{{\'ui_editor_script_snippets\'|translate}}</button> <button ng-if="isJSType()" class="btn btn-default editorCodeControlsButtonGroupSpacing" ng-click="openWorkshopMenu($event)" ng-mouseover="hoverMenu($event, \'workshop\')">{{\'ui_editor_script_workshop\'|translate}}</button> <button ng-if="ceControls.errorInfo" class="btn btn-danger" ng-click="ceControls.openHLSLError(ceControls.errorInfo)" translate="ui_editor_shader_view_errors"></button> \x3c!-- <button class="btn btn-primary">{{\'ui_editor_filemenu_undo\'|translate}}</button> --\x3e \x3c!-- <button class="btn btn-primary">{{\'ui_editor_filemenu_redo\'|translate}}</button> --\x3e <div class="alert alert-danger editorCodeControlsError" ng-if="ceContentType==\'hlslerror\'">{{ceInitialError.message}}</div> </div> <div class="editorCodeControlsButtonGroup right"> <button ng-if="isEditable()" class="btn btn-primary editorCodeControlsButtonGroupSpacing" translate="ui_ok" ng-click="apply();close()"></button> <button ng-if="isEditable()" class="btn btn-default" translate="ui_cancel" ng-click="cancel();close()"></button> <button ng-if="!isEditable()" class="btn btn-default" translate="ui_close" ng-click="close()"></button> </div> </div> <div class="editorCodeView" id="codeView"> </div> <div> \x3c!-- show errors if any occur during compile or run --\x3e </div> </div> '),e.put("views/templates/compilerprogress.html",'<div> <h5 ng-if="compileInfo.total && compileInfo.total > 1">{{\'ui_editor_importer_compiling_file\' | translate}} {{compileInfo.current + 1}} of {{compileInfo.total}}: {{compileInfo.file}} ({{compileInfo.mode}})</h5> <uib-progressbar class="progress-striped active" ng-class="{\'snapProgressBar\':compileInfo.progress < 2}" max="100" value="compileInfo.total > 1 ? compileInfo.progress : 100"> <i ng-if="compileInfo.total > 1">{{compileInfo.progress}}%</i> </uib-progressbar> </div> '),e.put("views/templates/curveeditor.html",'<div class="curveEditor" tabindex="0"> <div class="propertyControls"> <tree-view ng-if="!usePropertyGroup" class="treeViewRoot" tv-data="properties" tv-multi-select-mode="always" tv-selected-item="selected.items" tv-mode="\'scene\'" tv-remove-clicked="" tv-send-asset-property-change="listPropertyChanged()" tv-context-menu="propertyContextMenu($event, property, item)"></tree-view> <tree-view ng-if="usePropertyGroup" class="treeViewRoot" tv-data="groupedProperties" tv-multi-select-mode="always" tv-selected-item="selected.itemGroups" tv-mode="\'scene\'" tv-remove-clicked="" tv-send-asset-property-change="listPropertyChanged()" tv-context-menu="propertyContextMenu($event, property, item)"></tree-view> </div> <div class="keyControls" layout-class="{rules:[{minHeight:275,minHeightClass:\'horizontal\'},{minHeight:120,minHeightClass:\'minimal\'}]}"> <div class="smallText"> <a class="btn faBtnMultiSimple" ng-class="{\'btn-default\':!animationOptions.autokeyframe,\'btn-primary\':animationOptions.autokeyframe}" ng-click="animationOptions.autokeyframe=!animationOptions.autokeyframe" tooltip="ui_editor_animation_auto_keyframe"> <span class="faBtnMulti"> <span class="fas fa-fw"></span> <span class="fas fa-key big"></span> <span class="fas fa-xs fa-asterisk small"></span> </span> </a> <a ng-if="animationOptions.autokeyframe" class="btn faBtnMultiSimple btn-default faBtnSmallPadding" ng-click="hasKeyframe(selected.frame)?removeKeyframes():insertKeyframes()" tooltip="ui_editor_animation_toggle_keyframe"> <span class="faBtnMulti"> <span class="fas fa-fw"></span> <span class="fas fa-key big"></span> <span ng-if="!hasKeyframe(selected.frame)" class="fas fa-xs fa-plus small"></span> <span ng-if="hasKeyframe(selected.frame)" class="fas fa-xs fa-minus small"></span> </span> </a> <a ng-if="!animationOptions.autokeyframe" class="btn btn-default faBtnMultiSimple" ng-click="updateKeyframes()" tooltip="ui_editor_animation_update_keyframe"> <span class="faBtnMulti"> <span class="fas fa-fw"></span> <span class="fas fa-key big"></span> <span class="fas fa-xs fa-plus small"></span> </span> </a> <a ng-if="!animationOptions.autokeyframe" class="btn btn-default faBtnMultiSimple" ng-click="removeKeyframes()" tooltip="ui_editor_animation_remove_keyframe"> <span class="faBtnMulti"> <span class="fas fa-fw"></span> <span class="fas fa-key big"></span> <span class="fas fa-xs fa-minus small"></span> </span> </a> </div> <div class="wideRow" ng-if="animationOptions.autokeyframe"> <a class="btn btn-default wideButton faBtnSmallPadding" ng-click="hasKeyframe(selected.frame)?removeKeyframes():insertKeyframes()" tooltip="ui_editor_animation_toggle_keyframe"> <span class="faBtnMulti"> <span class="fas fa-fw"></span> <span class="fas fa-key big"></span> <span ng-if="!hasKeyframe(selected.frame)" class="fas fa-xs fa-plus small"></span> <span ng-if="hasKeyframe(selected.frame)" class="fas fa-xs fa-minus small"></span> </span> <span translate="ui_editor_animation_toggle_keyframe"></span> </a> </div> <div class="wideRow" ng-if="!animationOptions.autokeyframe"> <a class="btn btn-default wideButton" ng-click="updateKeyframes()" tooltip="ui_editor_animation_update_keyframe"> <span class="faBtnMulti"> <span class="fas fa-fw"></span> <span class="fas fa-key big"></span> <span class="fas fa-xs fa-plus small"></span> </span> </a> <a class="btn btn-default wideButton" ng-click="removeKeyframes()" tooltip="ui_editor_animation_remove_keyframe"> <span class="faBtnMulti"> <span class="fas fa-fw"></span> <span class="fas fa-key big"></span> <span class="fas fa-xs fa-minus small"></span> </span> </a> </div> <div class="wideRow"> <a class="btn wideButton faBtnSmallPadding" ng-class="{\'btn-default\':!animationOptions.autokeyframe,\'btn-primary\':animationOptions.autokeyframe}" ng-click="animationOptions.autokeyframe=!animationOptions.autokeyframe" tooltip="ui_editor_animation_auto_keyframe"> <span class="faBtnMulti"> <span class="fas fa-fw"></span> <span class="fas fa-key big"></span> <span class="fas fa-xs fa-asterisk small"></span> </span> <span translate="ui_editor_animation_auto_keyframe"></span> </a> </div> <div> <a class="btn btn-default faBtnToggle4" ng-class="\'toggle\' + animationOptions.beziermode" ng-click="cycleBezierMode(animationOptions.beziermode)" tooltip="ui_editor_animation_toggle_bezier"> <span class="fas fa-fw fa-bezier-curve"></span> <span class="btn btn-primary inner"><span class="fas fa-fw fa-bezier-curve"></span></span> <span class="btn btn-primary magic"><span class="fas fa-fw fa-wand-sparkles"></span></span> <span class="btn btn-primary step"><span class="fas fa-fw fa-stairs"></span></span> </a> <a class="btn faBtnMultiSimple btn-default" ng-click="resetSelectedVertices()" tooltip="ui_editor_animation_reset_bezier" ng-disabled="animationOptions.beziermode==\'magic\'||animationOptions.beziermode==\'none\'"> <span class="faBtnMulti"> <span class="fas fa-fw"></span> <span class="fas fa-bezier-curve big"></span> <span class="fas fa-xs fa-horizontal-rule small"></span> </span> </a> <a class="btn faBtnMultiSimple" ng-class="{\'btn-default\':!animationOptions.locklength,\'btn-primary\':animationOptions.locklength}" ng-click="toggleLockLength()" tooltip="ui_editor_animation_lock_control_point_lengths" ng-disabled="animationOptions.beziermode==\'magic\'||animationOptions.beziermode==\'none\'"> <span class="faBtnMulti"> <span class="fas fa-fw"></span> <span class="fas fa-bezier-curve big"></span> <span class="fas fa-xs fa-arrows-h small"></span> </span> </a> <a class="btn faBtnMultiSimple" ng-class="{\'btn-default\':!animationOptions.lockangle,\'btn-primary\':animationOptions.lockangle}" ng-click="toggleLockAngle()" tooltip="ui_editor_animation_lock_control_point_angles" ng-disabled="animationOptions.beziermode==\'magic\'||animationOptions.beziermode==\'none\'"> <span class="faBtnMulti"> <span class="fas fa-fw"></span> <span class="fas fa-bezier-curve big"></span> <span class="fas fa-xs fa-lock small"></span> </span> </a> </div> <div> <a class="btn btn-default wideButton faBtnSmallPadding" ng-click="openAnimationOptions()" tooltip="ui_editor_animation_animation_settings"> <span class="fas fa-fw fa-cog"></span> <span class="wideText" translate="ui_editor_properties_settings"></span> </a> </div> </div> <div class="background"> <canvas class="curves" tooltip="{{curveTooltip}}"></canvas> </div> <div class="playbackControls"> <div ng-if="!animationOptions.isPlaying"> <a class="btn btn-primary fullWidth" ng-click="startPlayback()" tooltip="ui_editor_animation_play"><span class="fas fa-fw fa-play"></span></a> </div> <div ng-if="animationOptions.isPlaying"> <a class="btn btn-default fullWidth" ng-click="pausePlayback(true)" tooltip="ui_editor_animation_pause"><span class="fas fa-fw fa-pause"></span></a> </div> <div> <a class="btn btn-default" ng-click="moveToFrame()" tooltip="ui_editor_animation_jump_to_start"><span class="fas fa-fw fa-arrow-to-left"></span></a> <a class="btn btn-default" ng-click="moveToFrame(true)" tooltip="ui_editor_animation_jump_to_end"><span class="fas fa-fw fa-arrow-to-right"></span></a> </div> <div> <a class="btn btn-default" ng-click="resetView()" tooltip="ui_editor_animation_reset_zoom"> <span class="fas fa-fw fa-search"></span> </a> <a class="btn btn-default" ng-click="showHelp()" tooltip="ui_editor_animation_show_help"> <span class="fas fa-fw fa-question"></span> </a> </div> <div> <a class="btn btn-default fullWidth" ng-click="editAnimationEvents(selected.frame)" tooltip="ui_editor_animation_edit_animation_events"><span class="fas fa-fw fa-alarm-clock"></span></a> </div> </div> </div> '),e.put("views/templates/drawcanvas.html",'<div class="fixHeight" style="position:relative;"> <span class="cnvs" ng-attr-style="opacity:{{dcMaskAttr.opacity / 100}}"> <canvas id="draw" class="innerCanvas"></canvas> </span> <div id="brush" class="brushOutline"></div> </div> '),e.put("views/templates/droplist.html",'<div class="btn-group dropDownComboBox" ng-keydown="keyDown($event)"> <button ng-disabled="dpDisabled || !dpOptions || dpOptions.length == 0" type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <div class="ellipsis"><span class="dropIcon" ng-if="selected.icon" ng-class="selected.icon"></span> <div class="dropdown-san-item" translate="{{selected ? selected.label : dpEmptyText | san}}"></div> </div> <span ng-if="dpOptions.length > 0" class="caret"></span> </button> <ul class="dropdown-menu"> <li ng-repeat="option in dpOptions track by $index" ng-click="selectItem(option)" ng-class="{divider:option.type==\'divider\',groupTitle:option.isgrouptitle}"> <a class="ellipsis"> <span ng-if="option.icon" ng-class="option.icon"></span> <div class="dropdown-san-item" translate="{{option.label | san}}"></div> </a> </li> </ul> </div> '),e.put("views/templates/explorequeryactions.html",'<span> <span class="exploreIcons" ng-if="!eqtQuery.custom && !eqtQuery.noicons"> <a class="btn btn-default" ng-click="eqtCallbacks.like(undefined, !eqtSettings.favorites.includes(eqtQuery.name), eqtQuery)" tooltip="ui_browse_explore_tooltip_add_starred"><span class="fas fa-star fa-fw favorite exploreIcon" ng-class="{\'active\':eqtSettings.favorites.includes(eqtQuery.name)}"></span></a> <a class="btn btn-default" ng-click="eqtCallbacks.like(true, undefined, eqtQuery)" tooltip="ui_browse_explore_tooltip_like"><span class="fas fa-thumbs-up fa-fw exploreIcon" ng-class="{\'active\':eqtSettings.liked.includes(eqtQuery.name)}"></span></a> <a class="btn btn-default" ng-click="eqtCallbacks.like(false, undefined, eqtQuery)" tooltip="ui_browse_explore_tooltip_dislike"><span class="fas fa-thumbs-down fa-fw exploreIcon dislike" ng-class="{\'active\':eqtSettings.disliked.includes(eqtQuery.name)}"></span></a> </span> <span class="exploreIcons" ng-if="eqtQuery.custom && !eqtQuery.noicons"> <a class="btn btn-default" ng-click="eqtCallbacks.remove(eqtQuery)" tooltip="ui_browse_explore_tooltip_remove"><span class="fas fa-trash fa-fw exploreIcon"></span></a> </span> <span class="exploreIcons" ng-if="eqtCallbacks.pushExplorePage"> <a ng-click="eqtCallbacks.pushExplorePage(eqtQuery)"><span class="btn btn-default exploreSeeMore" translate="ui_browse_explore_see_more"></span></a> \x3c!-- <a ng-if="query.wallpapers.length > 0" ng-click="eqtSettings.pushExplorePage(eqtQuery)" class="btn btn-default exploreSeeMore"><span translate="ui_browse_explore_see_more"></span></a> --\x3e </span> </span> '),e.put("views/templates/explorequerytitle.html",'<span> <img ng-if="eqtQuery.category==\'creator\'&&eqtUserInfo[eqtQuery.itemid]" ng-src="{{eqtUserInfo[eqtQuery.itemid].avatar}}" class="avatar"> <span ng-bind-html="translatedTitle"></span> </span> '),e.put("views/templates/filemenu.html",'<div class="filemenu"> <div class="btn-group" ng-repeat="item in fmItems track by $index" preview-toggle> <button type="button" class="btn btn-default dropdown-toggle" ng-mouseover="onMouseOver($event)" onclick="this.blur()" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" ng-disabled="item.disabled || fmDisabled" ng-show="!item.hidden"> {{item.label | translate}} </button> </div> </div> '),e.put("views/templates/hotkeyinput.html",'<div class="input-group"> <input type="text" class="form-control ignoreModalFocus hotkeyInput" ng-focus="startHotkeyRecording()" ng-model="hotkeyLabel" ng-class="{\'faintText\':displayFaintText, \'settingsHotkeyLabelError\':showCombinationError}" spellcheck="false"> <div class="input-group-btn"> <button class="btn btn-default" ng-click="clearHotkey()"> <i class="glyphicon glyphicon-remove"></i> </button> </div> </div> '),e.put("views/templates/knob.html",'<span class="knob"> <span class="knobBg"> </span> <span class="knobPointer"> </span> <span class="knobInput" tabindex="0"> </span> </span>'),e.put("views/templates/mobilemanager.html",'<div class="mobileManager"> <div class="mobileManagerPage" ng-class="{\'hideHome\':mmState.page}"> <div ng-if="mmDevices.length === 0"> <div class="mobileManagerPageContent mobileManagerIntro"> <div translate="ui_browse_mobile_devices_qr_hint"></div> <div class="mmPin"> \x3c!-- <div>QR</div> --\x3e <button class="btn btn-primary mmDownloadBtn" ng-click="openDownloadFaq()"> <div> <div class="rTop"><span class="fas fa-file-download"></span></div> <div class="rBottom"><span class="fas fa-mobile-android-alt"></span></div> </div> <div style="height:100%;display: flex;flex-direction: column;align-items: start;justify-content: center;"> <div style="font-size: 30px;" translate="ui_browse_mobile_devices_btn_download_app"></div> <div translate="ui_browse_mobile_devices_btn_download_app_version"></div> </div> </button> </div> <div class="mobileFaqHint" ng-bind-html="\'ui_browse_mobile_devices_download_info\' | translate"></div> <div class="mobileFaqHint" ng-bind-html="\'ui_browse_mobile_devices_link_info\' | translate"></div> </div> <div> <a class="btn btn-lg btn-primary fullWidth" ng-click="beginDeviceDiscovery()" translate="ui_browse_mobile_devices_btn_connect_new_device"></a> </div> </div> <div ng-if="mmDevices.length > 0"> <div class="mobileManagerPageContent" style="display:flex;flex-direction:column"> <div class="mobileFaqHint" ng-bind-html="\'ui_browse_mobile_devices_download_info\' | translate"></div> <div style="flex:1; overflow-y: auto"> <div ng-repeat="device in mmDevices"> <div class="mobileManagerDevice"> <div class="mmLabel"> <div class="mmName">{{device.name}}</div> <div class="mmAlias" ng-if="device.alias">{{device.alias}}</div> <div class="mmStatus">{{(isDeviceConnected(device.id)?\'ui_browse_mobile_devices_status_connected\':\'ui_browse_mobile_devices_status_disconnected\')|translate}}</div> </div> <div class="mmBtn"> <div> <span ng-if="isDeviceConnected(device.id)" class="fas fa-lock-alt" style="font-size:100%;position:relative;left:40px;top:5px;"></span> <span class="fas" ng-class="{\'fa-wifi successText\':isDeviceConnected(device.id),\'fa-wifi-slash warningText\':!isDeviceConnected(device.id)}" style="font-size:200%"></span> </div> <div> <a class="btn btn-danger" ng-click="removeDevice(device)" style="font-size:160%;margin-left:10px"> <span class="fas fa-fw fa-trash"></span> </a> </div> </div> </div> </div> </div> <div class="mobileFaqHint" ng-bind-html="\'ui_browse_mobile_devices_link_info\' | translate"></div> </div> <div> <a class="btn btn-lg btn-primary fullWidth" ng-click="beginDeviceDiscovery()" translate="ui_browse_mobile_devices_btn_connect_new_device"></a> </div> </div> </div> <div class="mobileManagerPage" ng-class="{\'showPin\':mmState.page==\'connect\'}"> <div class="browseAlert ng-hide" ng-show="showFirewallWarning"> <uib-alert> <div translate="ui_browse_mobile_firewall_warning" style="margin-bottom:10px"></div> <button ng-disabled="isApplyingFixes" class="btn btn-primary fullWidth" ng-click="fixFirewall()"> <span translate="ui_browse_mobile_firewall_warning_fix"></span> <img src="images/uac_small.png"> </button> </uib-alert> </div> <div translate="ui_browse_mobile_devices_pin_hint"></div> <div class="mmPin"> <div> {{currentPin}} </div> </div> <div class="mobileFaqHint" ng-bind-html="\'ui_browse_mobile_devices_link_info\' | translate"></div> <div> <a class="btn btn-lg btn-default fullWidth" ng-click="cancelDeviceDiscovery()" translate="ui_cancel"></a> </div> </div> </div> '),e.put("views/templates/nestedproperties.html",'<div class="nestedScriptGroup" ng-if="activeProperty.linkScriptProperties.length > 0"> <div ng-repeat="scriptProperty in activeProperty.linkScriptProperties | orderBy:\'order\'" class="editorPropertyRow" style="font-size:100%;width:100%"> <div class="propertyRow"> <div class="typeNameColumn" ng-click="onScriptLabelClick(scriptProperty, activeProperty)" ng-right-click="onNestedLabelRightClick($event, scriptProperty, activeProperty)"> \x3c!-- ng-click="onLabelClick(activeProperty)" > --\x3e <div class="keyValueLabel"> <span class="keyValueLabelText" translate="{{scriptProperty.label | san}}"></span> <div ng-if="!scriptProperty.user" ng-switch on="scriptProperty.type" class="checkboxInlay"> <div ng-switch-when="checkbox"> <checkbox cb-checked="scriptProperty.value" cb-changed="sendNestedAssetPropertyChange(scriptProperty, pOwner, activeProperty)"></checkbox> </div> </div> <button ng-if="hasNestedBindings(scriptProperty)" class="btn btn-sm keyValueLabelCog" ng-class="{\'btn-primary\':bindingsNestedActive(scriptProperty), \'btn-default\':!bindingsNestedActive(scriptProperty)}" ng-click="onNestedLabelRightClick($event, scriptProperty, activeProperty)"><span class="fas fa-cog"></span></button> </div> </div> <div ng-if="!scriptProperty.user" ng-switch on="scriptProperty.type" class="typeValueColumn"> <div ng-switch-when="slider" class="editorPropertySliderPropertyRow"> <div> <rzslider rz-slider-model="scriptProperty.value" rz-slider-options="{id:activeProperty.key, ceil:scriptProperty.max, floor:scriptProperty.min, enforceStep:false, precision:2, step:0.01, onStart:sendAssetPropertyChangeSliderStart, onChange:sendAssetPropertyChangeSliderChange, onEnd:sendAssetPropertyChangeSliderEnd}"></rzslider> </div> <div> <input class="fullWidth" truncate-float type="number" onclick="this.select()" ng-model="scriptProperty.value" ng-change="sendNestedAssetPropertyChange(scriptProperty, pOwner, activeProperty, {save:false})" ng-blur="sendNestedAssetPropertyChangeForce(scriptProperty, pOwner, activeProperty)"> </div> </div> <div ng-switch-when="sliderint" class="editorPropertySliderPropertyRow"> <div> <rzslider rz-slider-model="scriptProperty.value" rz-slider-options="{id:activeProperty.key, ceil:scriptProperty.max, floor:scriptProperty.min, onStart:sendAssetPropertyChangeSliderStart, onChange:sendAssetPropertyChangeSliderChange, onEnd:sendAssetPropertyChangeSliderEnd}"></rzslider> </div> <div> <input class="fullWidth" type="number" onclick="this.select()" ng-model="scriptProperty.value" ng-change="sendNestedAssetPropertyChange(scriptProperty, pOwner, activeProperty, {save:false})" ng-blur="sendNestedAssetPropertyChangeForce(scriptProperty, pOwner, activeProperty)"> </div> </div> <div ng-switch-when="paragraph"> <textarea ng-model="scriptProperty.value" ng-change="sendNestedAssetPropertyChange(scriptProperty, pOwner, activeProperty, {save:false})" ng-blur="sendNestedAssetPropertyChangeForce(scriptProperty, pOwner, activeProperty)"></textarea> </div> <div ng-switch-when="combo" class="comboPropertyRow"> <droplist dp-options="scriptProperty.options" dp-selected="scriptProperty.value" dp-change="sendNestedAssetPropertyChange(scriptProperty, pOwner, activeProperty)"></droplist> </div> <div ng-switch-when="color" class="typeColor"> <div ng-if="scriptProperty.normalized"> <spectrum-colorpicker options="colorPickerSettings" ng-model="scriptProperty.value" on-change="sendNestedAssetPropertyChange(scriptProperty, pOwner, activeProperty, {save:false})" on-hide="sendNestedAssetPropertyChangeForce(scriptProperty, pOwner, activeProperty)" on-show-options="{update:false}" vec-color-converter="true"></spectrum-colorpicker> </div> <div ng-if="!scriptProperty.normalized"> <spectrum-colorpicker options="colorPickerSettings" ng-model="scriptProperty.value" on-change="sendNestedAssetPropertyChange(scriptProperty, pOwner, activeProperty, {save:false})" on-hide="sendNestedAssetPropertyChangeForce(scriptProperty, pOwner, activeProperty)" on-show-options="{update:false}" vec-color-converter="false"></spectrum-colorpicker> </div> </div> </div> </div> </div> </div> '),e.put("views/templates/physicsconstraints.html",'<div class="row form-group"> <label class="col-lg-4 control-label" translate="ui_editor_bone_constraints_layout"></label> <div class="col-lg-8" style="display:flex"> <button class="btn" style="flex:1" ng-class="{\'btn-default\':settings.layout!=\'simple\',\'btn-primary\':settings.layout==\'simple\'}" ng-click="settings.layout=\'simple\'" translate="ui_editor_bone_constraints_layout_simple"></button> <button class="btn" style="flex:1" ng-class="{\'btn-default\':settings.layout!=\'advanced\',\'btn-primary\':settings.layout==\'advanced\'}" ng-click="settings.layout=\'advanced\'" translate="ui_editor_bone_constraints_layout_advanced"></button> </div> </div> <div ng-if="settings.layout==\'simple\'" class="containerLayout"> <div class="row form-group"> <label class="col-lg-6 control-label" translate="ui_editor_bone_constraints_preset"></label> <div class="col-lg-6"> <droplist dp-options="presetDropList" dp-selected="settings.preset"></droplist> </div> </div> <div ng-if="settings.preset && settings.preset !=\'none\' && settings.preset !=\'ik2limbs\' && settings.preset !=\'ikconstrained\'"> <div class="row form-group"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_responsiveness"></label> <div class="col-lg-4"> <rzslider rz-slider-model="settings.presetresponsiveness" rz-slider-options="{ceil:100, floor:0, enforceStep:false, precision:1}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="settings.presetresponsiveness" placeholder="0" onclick="this.select()"> </div> </div> </div> </div> <div ng-if="settings.layout==\'advanced\'" class="containerLayout"> <div class="row form-group"> <label class="col-lg-6 control-label" translate="ui_editor_bone_constraints_simulation_mode"></label> <div class="col-lg-6"> <droplist dp-options="modeDropList" dp-selected="temp.mode"></droplist> </div> </div> <div ng-if="temp.mode==\'spring\'"> <div class="row form-group"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_physics_rotation" ng-click="settings.r=!settings.r"></label> <div class="col-lg-6"> <checkbox cb-checked="settings.r"></checkbox> </div> </div> <div class="row form-group" ng-if="settings.r"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_rotational_stiffness"></label> <div class="col-lg-4"> <rzslider rz-slider-model="settings.rs" rz-slider-options="{ceil:500, floor:0, enforceStep:false, precision:1, step:0.1}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="settings.rs" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group" ng-if="settings.r"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_rotational_friction"></label> <div class="col-lg-4"> <rzslider rz-slider-model="settings.rf" rz-slider-options="{ceil:50, floor:1, enforceStep:false, precision:1, step:0.1}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="settings.rf" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group" ng-if="settings.r"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_rotational_inertia"></label> <div class="col-lg-4"> <rzslider rz-slider-model="settings.ri" rz-slider-options="{ceil:99, floor:1, enforceStep:false, precision:1, step:0.1}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="settings.ri" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group" ng-if="settings.r"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_rotation_axes"></label> <div class="col-lg-6"> <div class="editorBoneConstraintsAxes"> <span class="editorBoneConstraintsAxesEntry"> X: <checkbox cb-checked="settings.rax"></checkbox> </span> <span class="editorBoneConstraintsAxesEntry"> Y: <checkbox cb-checked="settings.ray"></checkbox> </span> <span class="editorBoneConstraintsAxesEntry"> Z: <checkbox cb-checked="settings.raz"></checkbox> </span> </div> </div> </div> <div class="row form-group"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_physics_translation" ng-click="settings.t=!settings.t"></label> <div class="col-lg-6"> <checkbox cb-checked="settings.t"></checkbox> </div> </div> <div class="row form-group" ng-if="settings.t"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_translational_stiffness"></label> <div class="col-lg-4"> <rzslider rz-slider-model="settings.ts" rz-slider-options="{ceil:500, floor:0, enforceStep:false, precision:1, step:0.1}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="settings.ts" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group" ng-if="settings.t"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_translational_friction"></label> <div class="col-lg-4"> <rzslider rz-slider-model="settings.tf" rz-slider-options="{ceil:50, floor:1, enforceStep:false, precision:1, step:0.1}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="settings.tf" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group" ng-if="settings.t"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_translational_inertia"></label> <div class="col-lg-4"> <rzslider rz-slider-model="settings.ti" rz-slider-options="{ceil:99, floor:1, enforceStep:false, precision:1, step:0.1}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="settings.ti" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group" ng-if="settings.t"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_max_distance"></label> <div class="col-lg-4"> <rzslider rz-slider-model="settings.tm" rz-slider-options="{ceil:500, floor:0, enforceStep:false, precision:1, step:0.1}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="settings.tm" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group" ng-if="settings.t"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_translation_axes"></label> <div class="col-lg-6"> <div class="editorBoneConstraintsAxes"> <span class="editorBoneConstraintsAxesEntry"> X: <checkbox cb-checked="settings.tax"></checkbox> </span> <span class="editorBoneConstraintsAxesEntry"> Y: <checkbox cb-checked="settings.tay"></checkbox> </span> <span class="editorBoneConstraintsAxesEntry"> Z: <checkbox cb-checked="settings.taz"></checkbox> </span> </div> </div> </div> </div> <div ng-if="temp.mode==\'rigid\'"> <div class="row form-group"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_physics_rotation" ng-click="settings.r=!settings.r"></label> <div class="col-lg-6"> <checkbox cb-checked="settings.r"></checkbox> </div> </div> <div class="row form-group" ng-if="settings.r"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_rotational_friction"></label> <div class="col-lg-4"> <rzslider rz-slider-model="settings.rf" rz-slider-options="{ceil:50, floor:1, enforceStep:false, precision:1, step:0.1}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="settings.rf" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group" ng-if="settings.r"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_rotational_inertia"></label> <div class="col-lg-4"> <rzslider rz-slider-model="settings.ri" rz-slider-options="{ceil:99, floor:1, enforceStep:false, precision:1, step:0.1}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="settings.ri" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group" ng-if="settings.r"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_rotation_axes"></label> <div class="col-lg-6"> <div class="editorBoneConstraintsAxes"> <span class="editorBoneConstraintsAxesEntry"> X: <checkbox cb-checked="settings.rax"></checkbox> </span> <span class="editorBoneConstraintsAxesEntry"> Y: <checkbox cb-checked="settings.ray"></checkbox> </span> <span class="editorBoneConstraintsAxesEntry"> Z: <checkbox cb-checked="settings.raz"></checkbox> </span> </div> </div> </div> <div class="row form-group"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_physics_translation" ng-click="settings.t=!settings.t"></label> <div class="col-lg-6"> <checkbox cb-checked="settings.t"></checkbox> </div> </div> <div class="row form-group" ng-if="settings.t"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_translational_friction"></label> <div class="col-lg-4"> <rzslider rz-slider-model="settings.tf" rz-slider-options="{ceil:50, floor:1, enforceStep:false, precision:1, step:0.1}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="settings.tf" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group" ng-if="settings.t"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_translational_inertia"></label> <div class="col-lg-4"> <rzslider rz-slider-model="settings.ti" rz-slider-options="{ceil:99, floor:1, enforceStep:false, precision:1, step:0.1}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="settings.ti" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group" ng-if="settings.t"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_max_distance"></label> <div class="col-lg-4"> <rzslider rz-slider-model="settings.tm" rz-slider-options="{ceil:500, floor:0, enforceStep:false, precision:1, step:0.1}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="settings.tm" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group" ng-if="settings.t"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_translation_axes"></label> <div class="col-lg-6"> <div class="editorBoneConstraintsAxes"> <span class="editorBoneConstraintsAxesEntry"> X: <checkbox cb-checked="settings.tax"></checkbox> </span> <span class="editorBoneConstraintsAxesEntry"> Y: <checkbox cb-checked="settings.tay"></checkbox> </span> <span class="editorBoneConstraintsAxesEntry"> Z: <checkbox cb-checked="settings.taz"></checkbox> </span> </div> </div> </div> </div> <div ng-if="temp.mode==\'spring\'||temp.mode==\'rigid\'"> <div class="row form-group"> <label class="col-lg-6 control-label" translate="ui_editor_bone_constraints_gravity_enabled" ng-click="settings.ge=!settings.ge"></label> <div class="col-lg-6"> <checkbox cb-checked="settings.ge"></checkbox> </div> </div> <div ng-if="settings.ge"> <div class="row form-group"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_tip_mass"></label> <div class="col-lg-4"> <rzslider rz-slider-model="settings.m" rz-slider-options="{ceil:100, floor:1, enforceStep:false, precision:1, step:0.1}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="settings.m" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group" ng-if="!is3D()"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_gravity_direction"></label> <div class="col-lg-4"> <knob ng-model="temp.gd" k-offset="0.5"></knob> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="temp.gd" placeholder="0" onclick="this.select()" degree-converter="{\'round\':true}"> </div> </div> <div class="row form-group" ng-if="is3D()"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_gravity_direction"></label> <div class="col-lg-6"> <vec-component-input ng-model="settings.gd"></vec-component-input> </div> </div> </div> <div class="row form-group"> <label class="col-lg-6 control-label" translate="ui_editor_bone_constraints_tip_size"></label> <div class="col-lg-4"> <rzslider rz-slider-model="settings.s" rz-slider-options="{ceil:1000, floor:0, enforceStep:false}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="settings.s" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group" ng-if="!is3D()"> <label class="col-lg-6 control-label" translate="ui_editor_bone_constraints_tip_forward_angle"></label> <div class="col-lg-4"> <knob ng-model="temp.a"></knob> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="temp.a" placeholder="0" onclick="this.select()" degree-converter="{\'round\':true}"> </div> </div> <div class="row form-group" ng-if="is3D()"> <label class="col-lg-6 control-label" translate="ui_editor_bone_constraints_tip_forward_angle"></label> <div class="col-lg-6"> <vec-component-input ng-model="settings.a"></vec-component-input> </div> </div> <div class="row form-group"> <label class="col-lg-6 control-label" translate="ui_editor_bone_constraints_limit_rotation" ng-click="settings.la=!settings.la"></label> <div class="col-lg-6"> <checkbox cb-checked="settings.la"></checkbox> </div> </div> <div class="row form-group" ng-if="settings.la"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_min_angle"></label> <div class="col-lg-4"> <rzslider rz-slider-model="temp.lamin" rz-slider-options="{ceil:180, floor:-180, enforceStep:false}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="temp.lamin" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group" ng-if="settings.la"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_max_angle"></label> <div class="col-lg-4"> <rzslider rz-slider-model="temp.lamax" rz-slider-options="{ceil:180, floor:-180, enforceStep:false}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="temp.lamax" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group"> <label class="col-lg-6 control-label" translate="ui_editor_bone_constraints_limit_torque" ng-click="settings.lt=!settings.lt"></label> <div class="col-lg-6"> <checkbox cb-checked="settings.lt"></checkbox> </div> </div> <div class="row form-group" ng-if="settings.lt"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_max_torque"></label> <div class="col-lg-4"> <rzslider rz-slider-model="settings.ltmax" rz-slider-options="{ceil:180, floor:0, enforceStep:false}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="settings.ltmax" placeholder="0" onclick="this.select()"> </div> </div> </div> <div ng-if="temp.mode==\'ik\'"> <div class="row form-group"> <label class="col-lg-6 control-label" translate="ui_editor_bone_constraints_ik_depth"></label> <div class="col-lg-4"> <rzslider rz-slider-model="settings.ikd" rz-slider-options="{ceil:6, floor:1, enforceStep:true}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="settings.ikd" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group"> <label class="col-lg-6 control-label" translate="ui_editor_bone_constraints_ik_simulation_mode"></label> <div class="col-lg-6"> <droplist dp-options="ikModeDropList" dp-selected="settings.ikm"></droplist> </div> </div> <div ng-if="!settings.ikm"> <div class="row form-group"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_ik_gravity_controller" ng-click="settings.ikg=!settings.ikg"></label> <div class="col-lg-6"> <checkbox cb-checked="settings.ikg"></checkbox> </div> </div> <div class="row form-group"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_ik_end_bone_rotation" ng-click="settings.ikr=!settings.ikr"></label> <div class="col-lg-6"> <checkbox cb-checked="settings.ikr"></checkbox> </div> </div> <div class="row form-group" ng-if="settings.ikr"> <div class="col-lg-1"></div> <label class="col-lg-11 control-label" style="font-weight: unset;" translate="ui_editor_bone_constraints_ik_end_bone_rotation_hint"></label> </div> <div class="row form-group" ng-if="settings.ikr"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_ik_end_bone_rotation_distance"></label> <div class="col-lg-4"> <rzslider rz-slider-model="settings.ikrd" rz-slider-options="{ceil:100, floor:1, enforceStep:false}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="settings.ikrd" placeholder="0" onclick="this.select()"> </div> </div> </div> <div ng-if="settings.ikm===\'rope\'"> <div class="row form-group"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_gravity_enabled" ng-click="settings.ge=!settings.ge"></label> <div class="col-lg-6"> <checkbox cb-checked="settings.ge"></checkbox> </div> </div> <div class="row form-group"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_stretch_enabled" ng-click="settings.ikse=!settings.ikse"></label> <div class="col-lg-6"> <checkbox cb-checked="settings.ikse"></checkbox> </div> </div> <div class="row form-group"> <div class="col-lg-2"></div> <label class="col-lg-4 control-label" translate="ui_editor_bone_constraints_free_endpoint" ng-click="settings.ikfe=!settings.ikfe"></label> <div class="col-lg-6"> <checkbox cb-checked="settings.ikfe" cb-disabled="settings.ikse"></checkbox> </div> </div> <div class="row form-group"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_mass"></label> <div class="col-lg-4"> <rzslider rz-slider-model="settings.m" rz-slider-options="{ceil:2000, floor:1, enforceStep:false, precision:1, step:0.1}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="settings.m" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group"> <div class="col-lg-1"></div> <label class="col-lg-5 control-label" translate="ui_editor_bone_constraints_friction"></label> <div class="col-lg-4"> <rzslider rz-slider-model="settings.tf" rz-slider-options="{ceil:99, floor:0, enforceStep:false, precision:1, step:1}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="settings.tf" placeholder="0" onclick="this.select()"> </div> </div> </div> </div> <div ng-if="temp.mode==\'ikc\'"> <div class="row form-group"> <label class="col-lg-6 control-label" translate="ui_editor_bone_constraints_ik_constraint_rotation_min"></label> <div class="col-lg-4"> <rzslider rz-slider-model="temp.ikrmin" rz-slider-options="{ceil:360, floor:0, enforceStep:false}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="temp.ikrmin" placeholder="0" onclick="this.select()"> </div> </div> <div class="row form-group"> <label class="col-lg-6 control-label" translate="ui_editor_bone_constraints_ik_constraint_rotation_max"></label> <div class="col-lg-4"> <rzslider rz-slider-model="temp.ikrmax" rz-slider-options="{ceil:360, floor:0, enforceStep:false}"></rzslider> </div> <div class="col-lg-2"> <input type="number" class="form-control" ng-model="temp.ikrmax" placeholder="0" onclick="this.select()"> </div> </div> </div> </div> '),e.put("views/templates/preview.html",'<div ng-attr-style="padding: {{previewPadding}}"> \x3c!-- <embed ng-mouse-wheel="mouseWheel($event, delta)" ng-keydown="keyDown($event)" ng-keyup="keyUp($event)" id="previewPlugin" type="application/x-ppapi-window-stream" /> --\x3e <canvas id="previewPlugin" class="previewEmbed" tabindex="1" ng-mouse-wheel="mouseWheel($event, delta)" ng-keydown="keyDown($event)" ng-keyup="keyUp($event)"></canvas> <span id="pluginCrossHairOverlay" ng-mouse-wheel="mouseWheel($event, delta)" ng-keydown="keyDown($event)" ng-keyup="keyUp($event)" style="position: absolute; width:100%;height: 100%; left: 0px; top: 0px; display:none;"></span> <span class="editorPreviewBusyOverlay" ng-if="isInShaderReloadOverlay"> <span class="inner"> <wp-anim class="busyAnim" wpa-file="anims/logo_white.json"></wp-anim> <div class="busyStatus">[{{\'ui_editor_preview_shader_reload\'|translate}}]</div> </span> </span> </div> '),e.put("views/templates/propertylist.html",'<div ng-repeat="property in pList track by $index" class="editorPropertyRow" ng-class="property.class" ng-if="!property.condition || evalCondition(property.condition)"> <div class="propertyRow"> <div class="typeNameColumn" ng-click="onLabelClick(property)" ng-right-click="onLabelRightClick($event, property)"> <div class="keyValueLabel"> <span class="keyValueLabelText" tooltip="{{property.key}}">{{property.name | translate}}</span> <div ng-if="!property.linkUser" ng-switch on="property.type" class="checkboxInlay"> <div ng-switch-when="checkbox"> <checkbox cb-disabled="property.disabled" cb-checked="property.value" cb-changed="pCtrl.sendAssetPropertyChange(pOwner, property)"></checkbox> </div> <div ng-switch-when="checkboxbit"> <checkbox cb-checked="property.value" cb-type="bit" cb-bit="property.bit" cb-changed="pCtrl.sendAssetPropertyChange(pOwner, property)" cb-recalculate-bits="recalculateBitFlags(property.key)"></checkbox> </div> </div> <button ng-if="hasBindings(property)" class="btn btn-sm keyValueLabelCog" ng-class="{\'btn-primary\':bindingsActive(property), \'btn-default\':!bindingsActive(property)}" ng-click="onLabelRightClick($event, property)" ng-disabled="property.disabled || property.disabledcondition && $eval(property.disabledcondition)"><span class="fas fa-cog"></span></button> </div> </div> <div ng-if="!property.linkUser||property.type===\'texture\'" ng-switch on="property.type" class="typeValueColumn"> <div ng-switch-when="readonly" class="typeReadonly"> {{property.value | translate}} </div> <div ng-switch-when="readonlycolor" class="typeReadonlyColor" ng-attr-style="background-color:{{property.value}}"> </div> <div ng-switch-when="titleVisibleLock" class="visLockTitle"> <property-title-controls p-root="property" p-properties="{visible:findProperty(\'visible\'), locktransforms:findProperty(\'locktransforms\')}" p-ctrl="titleControls"></property-title-controls> </div> <div ng-switch-when="titleEdit"> <a class="btn btn-primary" ng-click="onTitleEdit(property)"><span class="fas fa-edit"></span></a> </div> <div ng-switch-when="string"> <input type="text" ng-model="property.value" ng-change="pCtrl.sendAssetPropertyChange(pOwner, property)" ng-model-options="{updateOn: \'default blur\', debounce: {\'default\': property.debounce, \'blur\': 0}}"> </div> <div ng-switch-when="paragraph"> <textarea ng-model="property.value" ng-change="pCtrl.sendAssetPropertyChange(pOwner, property)"></textarea> </div> <div ng-switch-when="number"> <input type="number" step="any" truncate-float onclick="this.select()" ng-model="property.value" ng-change="sendAssetPropertyChange(pOwner, property)" ng-model-options="{updateOn: \'default blur\', debounce: {\'default\': property.debounce, \'blur\': 0}}"> </div> <div ng-switch-when="numberdial" class="numberdial"> <input type="number" onclick="this.select()" ng-model="property.value" ng-change="sendAssetPropertyChange(pOwner, property)" ng-model-options="{updateOn: \'default blur\', debounce: {\'default\': property.debounce, \'blur\': 0}}"> <button class="btn btn-primary" ng-disabled="property.value <= property.min" ng-click="property.value=property.value-1;sendAssetPropertyChange(pOwner, property)"><span class="fas fa-caret-left"></span></button> <button class="btn btn-primary" ng-disabled="property.value >= property.max" ng-click="property.value=property.value+1;sendAssetPropertyChange(pOwner, property)"><span class="fas fa-caret-right"></span></button> </div> <div ng-switch-when="checkbox" class="propertyCheckboxOutside"> <checkbox cb-disabled="property.disabled" cb-checked="property.value" cb-changed="sendAssetPropertyChange(pOwner, property)"></checkbox> </div> <div ng-switch-when="checkboxbit" class="propertyCheckboxOutside"> <checkbox cb-checked="property.value" cb-type="bit" cb-bit="property.bit" cb-changed="pCtrl.sendAssetPropertyChange(pOwner, property)" cb-recalculate-bits="recalculateBitFlags(property.key)"></checkbox> </div> <div ng-switch-when="checkboxbit3" class="propertyCheckboxOutside checkboxbit3"> <span class="propertyListCheckboxComponent"> X: <checkbox cb-checked="property.value" cb-disabled="property.disabledX" cb-type="bit" cb-bit="property.bit" cb-changed="pCtrl.sendAssetPropertyChange(pOwner, property)" cb-recalculate-bits="recalculateBitFlags(property.key, property.bit)"></checkbox> </span> <span class="propertyListCheckboxComponent"> Y: <checkbox cb-checked="property.value" cb-disabled="property.disabledY" cb-type="bit" cb-bit="getBit(property.bit,1)" cb-changed="pCtrl.sendAssetPropertyChange(pOwner, property)" cb-recalculate-bits="recalculateBitFlags(property.key,getBit(property.bit,1))"></checkbox> </span> <span class="propertyListCheckboxComponent"> Z: <checkbox cb-checked="property.value" cb-disabled="property.disabledZ" cb-type="bit" cb-bit="getBit(property.bit,2)" cb-changed="pCtrl.sendAssetPropertyChange(pOwner, property)" cb-recalculate-bits="recalculateBitFlags(property.key,getBit(property.bit,2))"></checkbox> </span> </div> <div ng-switch-when="vec2"> <vec-component-input vci-mode="property.mode" vci-options="property" vci-owner="pOwner" vci-count="2" ng-model="property.value" ng-change="sendAssetPropertyChange(pOwner, property)" vci-slider-options="{id:property.key, controlSave:linkedControlSave, onStart:linkedSliderStart, onEnd:linkedSliderEnd}"></vec-component-input> </div> <div ng-switch-when="vec3"> <vec-component-input vci-mode="property.mode" vci-options="property" ng-model="property.value" ng-change="sendAssetPropertyChange(pOwner, property)" vci-disabled="property.disabledcondition && $eval(property.disabledcondition)" vci-slider-options="{id:property.key, controlSave:linkedControlSave, onEnd:linkedSliderEnd}"></vec-component-input> </div> <div ng-switch-when="vec4"> <vec-component-input vci-mode="property.mode" vci-options="property" vci-count="4" ng-model="property.value" ng-change="sendAssetPropertyChange(pOwner, property)" vci-slider-options="{id:property.key, controlSave:linkedControlSave, onEnd:linkedSliderEnd}"></vec-component-input> </div> <div ng-switch-when="vec3-slider-z"> <vec-component-input vci-mode="property.mode" vci-options="property" vci-show-slider-z="true" ng-model="property.value" ng-change="sendAssetPropertyChange(pOwner, property)" vci-disabled="property.disabledcondition && $eval(property.disabledcondition)" vci-slider-options="{id:property.key, controlSave:linkedControlSave, onEnd:linkedSliderEnd}"></vec-component-input> </div> <div ng-switch-when="color" class="typeColor"> <div ng-if="property.normalized"> <spectrum-colorpicker options="colorPickerSettings" ng-model="property.value" on-change="pCtrl.sendAssetPropertyChange(pOwner, property, {save:false})" on-hide="sendAssetPropertyChangeColorEnd(pOwner, property)" on-show-options="{update:false}" vec-color-converter="true"></spectrum-colorpicker> </div> <div ng-if="!property.normalized"> <spectrum-colorpicker options="colorPickerSettings" ng-model="property.value" on-change="pCtrl.sendAssetPropertyChange(pOwner, property, {save:false})" on-hide="sendAssetPropertyChangeColorEnd(pOwner, property)" on-show-options="{update:false}" vec-color-converter="false"></spectrum-colorpicker> </div> </div> <div ng-switch-when="hue" class="typeColor"> <div ng-if="property.normalized"> <spectrum-colorpicker options="colorPickerSettingsHueOnly" ng-model="property.value" on-change="pCtrl.sendAssetPropertyChange(pOwner, property, {save:false})" on-hide="sendAssetPropertyChangeColorEnd(pOwner, property)" on-show-options="{update:false}" vec-hue-converter="true"></spectrum-colorpicker> </div> <div ng-if="!property.normalized"> <spectrum-colorpicker options="colorPickerSettingsHueOnly" ng-model="property.value" on-change="pCtrl.sendAssetPropertyChange(pOwner, property, {save:false})" on-hide="sendAssetPropertyChangeColorEnd(pOwner, property)" on-show-options="{update:false}" vec-hue-converter="false"></spectrum-colorpicker> </div> </div> <div ng-switch-when="colorlist" class="editorPropertyColorListPropertyRow"> <div class="sliderRow"> <div> <rzslider rz-slider-model="property.arraysize" rz-slider-options="{id:property.key, ceil:10, floor:1, onChange:onChangeColorListCount}"></rzslider> </div> <div> {{property.arraysize}} </div> </div> <span ng-repeat="colValue in property.value track by $index"> <spectrum-colorpicker options="colorPickerSettings" ng-model="colValue" on-change="updateColorListColor(property,colValue,$index);pCtrl.sendAssetPropertyChange(pOwner, property, {save:false})" on-hide="updateColorListColor(property,colValue,$index);sendAssetPropertyChangeColorEnd(pOwner, property)" on-show-options="{update:false}" vec-color-converter="true"></spectrum-colorpicker> </span> </div> <div ng-switch-when="huesteps" class="editorPropertiesHueSteps"> <div class="editorPropertiesHueStepsContainer"> <span class="hueStep" ng-repeat="step in getHueSteps() track by $index" ng-attr-style="background-color: {{step.color}}"></span> </div> </div> <div ng-switch-when="slider" class="editorPropertySliderPropertyRow"> <div> <rzslider rz-slider-model="property.value" rz-slider-options="{id:property.key, ceil:property.max, floor:property.min, enforceStep:false, disabled:property.disabled, precision:2, step:0.01, onStart:sendAssetPropertyChangeSliderStart, onChange:sendAssetPropertyChangeSliderChange, onEnd:sendAssetPropertyChangeSliderEnd}"></rzslider> </div> <div> <input class="fullWidth" step="any" truncate-float type="number" onclick="this.select()" ng-disabled="property.disabled" ng-model="property.value" ng-change="sendAssetPropertyChange(pOwner, property)" number-input-controls="{\'fractional\':(property.max-property.min) <= 2.0}"> </div> </div> <div ng-switch-when="sliderHighPrecision" class="editorPropertySliderPropertyRow"> <div> <rzslider rz-slider-model="property.value" rz-slider-options="{id:property.key, ceil:property.max, floor:property.min, enforceStep:false, disabled:property.disabled, precision:3, step:0.001, onStart:sendAssetPropertyChangeSliderStart, onChange:sendAssetPropertyChangeSliderChange, onEnd:sendAssetPropertyChangeSliderEnd}"></rzslider> </div> <div> <input class="fullWidth" step="any" truncate-float type="number" onclick="this.select()" ng-disabled="property.disabled" ng-model="property.value" ng-change="sendAssetPropertyChange(pOwner, property)" number-input-controls="{\'fractional\':true}"> </div> </div> <div ng-switch-when="sliderint" class="editorPropertySliderPropertyRow"> <div> <rzslider rz-slider-model="property.value" rz-slider-options="{id:property.key, ceil:property.max, floor:property.min, onStart:sendAssetPropertyChangeSliderStart, onChange:sendAssetPropertyChangeSliderChange, onEnd:sendAssetPropertyChangeSliderEnd}"></rzslider> </div> <div> <input class="fullWidth" type="number" onclick="this.select()" ng-model="property.value" ng-change="sendAssetPropertyChange(pOwner, property)"> </div> </div> <div ng-switch-when="combo" class="comboPropertyRow"> <droplist dp-disabled="property.disabled || property.disabledcondition && $eval(property.disabledcondition)" dp-options="property.options" dp-selected="property.value" dp-change="pCtrl.sendAssetPropertyChange(pOwner, property)"></droplist> </div> <div ng-switch-when="comboup" class="comboPropertyRow"> <droplist class="dropup" dp-options="property.options" dp-selected="property.value" dp-change="pCtrl.sendAssetPropertyChange(pOwner, property)"></droplist> </div> <div ng-switch-when="font" class="comboPropertyRow" native-drop-target="importFontFileToProperty(property, droppedFiles)" ndt-extension-tag="\'font\'" ndt-desired-modal-depth="pModalDepth"> <droplist dp-options="pCtrl.getFonts()" dp-selected="property.value" dp-change="pCtrl.sendAssetPropertyChange(pOwner, property)"></droplist> <div style="margin-top:10px"> <a class="btn btn-primary fullWidth" ng-click="importFontFileToProperty(property)"><span class="glyphicon glyphicon-import"></span> <span translate="ui_editor_properties_import"></span></a> </div> </div> <div ng-switch-when="knob" class="editorPropertySliderPropertyRow"> <div> <knob ng-model="property.value" ng-change="sendAssetPropertyChangeSliderChange(property.key)" k-on-start="sendAssetPropertyChangeSliderStart(property.key)" k-on-end="sendAssetPropertyChangeSliderEnd(property.key)"></knob> </div> <div> <input class="fullWidth" step="any" degree-converter="{\'round\':true}" truncate-float="4" type="number" onclick="this.select()" ng-model="property.value" ng-change="sendAssetPropertyChange(pOwner, property)"> </div> </div> <div ng-switch-when="nestedlink" class="typeNestedLink"> <a ng-click="pCtrl.navigateProperty(property.key, property.value)"><span class="fas fa-angle-double-right"></span> {{property.name}}</a> </div> <div ng-switch-when="materiallink" class="typeMaterialLink"> <a ng-click="pCtrl.navigateProperty(property.key, property.value)" class="btn btn-default link"> <img class="texturePreview" ng-src="{{getTexturePreview(property, property.preview) ? texturePreviews[property.id] : noPreviewURL}}"> <div class="materialLabel"> <span class="materialLightingLabel" translate="ui_editor_properties_advanced_texture_settings"></span> <span class="materialLightingLabel" translate="ui_editor_properties_lighting_and_reflection"></span> <span class="materialLightingFilename">{{property.name}}</span> </div> </a> </div> <div ng-switch-when="texturePreview" class="editorTexturePreviewPropertyRow"> <div class="texturePreview"> <img ng-src="{{getTexturePreview(property, property.value) ? texturePreviews[property.id] : noPreviewURL}}"> </div> </div> <div ng-switch-when="texture" class="editorTexturePropertyRow" native-drop-target="pCtrl.importTextureFile(property.material, property.textureindex, property.component, property.format, droppedFiles, {ismodeltexture:property.ismodeltexture})" ndt-extension-tag="\'texture\'" ndt-internal-condition="pCtrl.textureDropCondition(data)" ndt-internal-function="pCtrl.textureDropped(property.material, property.textureindex, data)" ndt-desired-modal-depth="pModalDepth" ndt-internal-disabled="property.iscomponent"> <div class="texturePreview"> <img ng-src="{{getTexturePreview(property, property.value) ? texturePreviews[property.id] : noPreviewURL}}"> </div> <div class="textureBtn"> <span class="ellipsis">{{property.name | translate}}</span> <div> <button class="btn btn-sm btn-primary fullWidth" ng-if="!property.mode" ng-click="pCtrl.openMaterialBrowser(property)"><span class="fas fa-folder-open"></span> {{\'ui_editor_properties_browse\' | translate}}</button> <button class="btn btn-sm btn-primary fullWidth" ng-if="property.mode&&!property.generated" ng-disabled="property.iserror" ng-click="pCtrl.beginPaint(property)"><span class="fas fa-paint-brush"></span> {{\'ui_editor_properties_paint\' | translate}}</button> <button class="btn btn-sm btn-primary fullWidth" ng-if="property.generated" ng-disabled="property.iserror" ng-click="pCtrl.openTextureGenerator(property)"><span class="fas fa-mountains"></span> {{\'ui_editor_properties_generate\' | translate}}</button> <button class="btn btn-sm btn-primary" ng-if="property.mode" ng-click="pCtrl.openMaterialBrowser(property)" tooltip="ui_editor_properties_browse"><span class="fas fa-fw fa-folder-open"></span></button> <button class="btn btn-sm btn-danger" ng-if="!property.nonremovable && property.value != \'error\'" tooltip="ui_editor_properties_reset" ng-click="pCtrl.resetTextureFile(property.material, property.textureindex, property.component)"><span class="fas fa-fw" ng-class="property.undoicon || \'fa-times\'"></span></button> </div> <div> <div class="btn-group dropdown" is-open="property.isopen"> <a id="open-file-button-button" type="button" class="btn btn-sm btn-default dropDownButton fullWidth" ng-click="openTextureMenu($event, property)"> <span class="fas fa-caret-down"></span> <span translate="ui_editor_properties_manual_editing"></span> </a> </div> <button class="btn btn-sm btn-default" ng-if="property.mode && property.canBeDuplicated" ng-click="pCtrl.duplicateTextureFile(property.material, property.textureindex)" tooltip="ui_editor_properties_duplicate_texture"><span class="fas fa-fw fa-copy"></span></button> \x3c!-- Show settings when paint disabled --\x3e <button class="btn btn-sm" ng-class="{\'btn-primary\':bindingsActive(property), \'btn-default\':!bindingsActive(property)}" ng-if="isTextureOptionsVisible(property)" tooltip="ui_editor_properties_settings" ng-disabled="property.iserror" ng-click="onTextureContextMenu($event, property)"><span class="fas fa-fw fa-cog"></span></button> </div> </div> </div> <div ng-switch-when="rendertarget" class="editorTexturePropertyRow" native-drop-target="pCtrl.importTextureFile(property.material, property.textureindex, property.component, property.format, droppedFiles, {ismodeltexture:property.ismodeltexture})" ndt-extension-tag="\'rendertarget\'" ndt-internal-condition="pCtrl.textureDropCondition(data, property)" ndt-internal-function="pCtrl.textureDropped(property.material, property.textureindex, data)" ndt-desired-modal-depth="pModalDepth" ndt-internal-disabled="property.iscomponent"> <div class="texturePreview"> <img ng-src="{{getTexturePreview(property, property.value) ? texturePreviews[property.id] : noPreviewURL}}"> </div> <div class="textureBtn renderTargetOnly"> <div style="flex-direction: column;"> <div class="lineClamp4">{{property.name | translate}}</div> <div ng-if="property.value == \'error\'" style="opacity:0.8" translate="ui_editor_properties_drag_drop_layer_hint"></div> </div> <button class="btn btn-sm btn-danger" ng-if="!property.nonremovable && property.value != \'error\'" tooltip="ui_editor_properties_reset" ng-click="pCtrl.resetTextureFile(property.material, property.textureindex, property.component)"><span class="fas fa-fw" ng-class="property.undoicon || \'fa-times\'"></span></button> </div> </div> <div ng-switch-when="texturevariant" class="editorTextureVariantOptionPreviewPropertyRow" ng-class="{\'missingCondition\':!textureVariantOptionHasCondition(property)}"> <div class="variantPreviewRow"> <div style="flex:1" class="ellipsis">{{property.name}}</div> \x3c!-- <a class="btn btn-primary" ng-click="textureRenameVariantOption(property)"><span class="fas fa-pen-to-square"></span></a> --\x3e <a class="btn btn-sm btn-default keyValueLabelCog" ng-click="textureOpenVariantOptions($event, property)"><span class="fas fa-cog"></span></a> </div> <div class="variantPreviewRow"> <div class="texturePreview"> <img ng-src="{{getTexturePreview(property, property.value, false) ? texturePreviews[property.id] : noPreviewURL}}"> </div> <div class="variantPreviewColumn"> <div class="variantPreviewRow"> <a class="btn btn-primary variantPreviewBtn" ng-click="textureSortVariantOption(property, true)"><span class="fas fa-caret-up"></span></a> <a class="btn btn-primary variantPreviewBtn" ng-click="textureSortVariantOption(property, false)"><span class="fas fa-caret-down"></span></a> \x3c!-- <a class="btn btn-danger variantPreviewBtn" ng-click="textureRemoveVariantOption(property)"><span class="fas fa-xmark"></span></a> --\x3e </div> <div class="variantPreviewRow" ng-if="property.variantallowcomplexblend"> <droplist class="variantPreviewBtn" dp-options="dropListTextureVariantBlendOptions" dp-selected="property.blend" dp-change="textureSetVariantOptionBlend(property)"></droplist> </div> <div class="variantPreviewRow"> <a class="btn variantPreviewBtn" ng-click="textureEditVariantOptionCondition(property)" ng-class="{\'btn-primary\':textureVariantOptionHasCondition(property),\'btn-warning\':!textureVariantOptionHasCondition(property)}"><span class="fas fa-cog"></span> <span translate="ui_editor_properties_condition"></span></a> </div> </div> </div> </div> <div ng-switch-when="effects"> <div class="treeViewPropertyRowButtons"> <button class="btn btn-primary" ng-click="pCtrl.addPropertyEffect(pOwner, property)"><span class="fas fa-plus"></span> {{\'ui_editor_properties_effects_add\' | translate}}</button> <button class="btn btn-primary" ng-click="pCtrl.editPropertyEffect(selectedEffect.item)" ng-disabled="property.value.indexOf(selectedEffect.item) === -1"><span class="fas fa-edit"></span> {{\'ui_editor_properties_effects_edit\' | translate}}</button> </div> <div class="treeViewPropertyRow treeViewPropertyRowSmall"> <tree-view class="treeViewRoot" tv-drag-drop-tag="effect" tv-drag-drop-enabled="true" tv-data="property.value" tv-mode="\'scene\'" tv-selected-item="selectedEffect" tv-remove-clicked="pCtrl.onPropertyEffectRemoved(property, item)" tv-element-dragged="pCtrl.onPropertyEffectDragged(from, to)" tv-element-double-clicked="pCtrl.editPropertyEffect(selectedEffect.item)" tv-send-asset-property-change="pCtrl.sendAssetPropertyChange({id: resource.material}, property)" tv-context-menu="pCtrl.contextMenuPropertyEffect($event, property, item)"></tree-view> </div> </div> <div ng-switch-when="particle"> <a class="btn btn-primary fullWidth" ng-click="pCtrl.editParticle(pOwner, property)"> {{\'ui_editor_properties_effects_edit\' | translate}} </a> </div> <div ng-switch-when="particleinstancereset"> <a class="btn btn-default fullWidth propertyButton" ng-click="sendMultipleProperties(pOwner, property)"> {{\'ui_editor_properties_effects_reset\' | translate}} </a> </div> <div ng-switch-when="sounds"> <div class="treeViewPropertyRow treeViewPropertyRowSmall treeViewSoundPropertyRow"> <tree-view class="treeViewRoot" tv-drag-drop-tag="renderable" tv-drag-drop-enabled="true" tv-data="property.value" tv-mode="\'scene\'" tv-selected-item="selectedEffect" tv-remove-clicked="pCtrl.onPropertySoundRemoved(property, item)" tv-element-dragged="pCtrl.onPropertySoundDragged(from, to)" tv-new-element-added="pCtrl.onPropertySoundAssetDropped(property, item, index)"></tree-view> </div> <div class="treeViewPropertyRowButtons"> <button class="btn btn-primary" ng-click="pCtrl.addPropertySound(pOwner, property)"><span class="fas fa-plus"></span> {{\'ui_editor_properties_effects_add\' | translate}}</button> </div> </div> <div ng-switch-when="horizontalalign"> <div> <a class="btn" ng-class="{\'btn-default\':property.value!=\'left\',\'btn-primary\':property.value==\'left\'}" ng-click="property.value=\'left\';sendAssetPropertyChange(pOwner, property)"><span class="far fa-fw fa-align-left"></span></a> <a class="btn" ng-class="{\'btn-default\':property.value!=\'center\',\'btn-primary\':property.value==\'center\'}" ng-click="property.value=\'center\';sendAssetPropertyChange(pOwner, property)"><span class="far fa-fw fa-align-center"></span></a> <a class="btn" ng-class="{\'btn-default\':property.value!=\'right\',\'btn-primary\':property.value==\'right\'}" ng-click="property.value=\'right\';sendAssetPropertyChange(pOwner, property)"><span class="far fa-fw fa-align-right"></span></a> </div> </div> <div ng-switch-when="verticalalign"> <div> <a class="btn" ng-class="{\'btn-default\':property.value!=\'center\',\'btn-primary\':property.value==\'center\'}" ng-click="property.value=\'center\';sendAssetPropertyChange(pOwner, property)"><span class="far fa-fw fa-text-height"></span></a> <a class="btn" ng-class="{\'btn-default\':property.value!=\'top\',\'btn-primary\':property.value==\'top\'}" ng-click="property.value=\'top\';sendAssetPropertyChange(pOwner, property)"><span class="far fa-fw fa-arrow-to-top"></span></a> <a class="btn" ng-class="{\'btn-default\':property.value!=\'bottom\',\'btn-primary\':property.value==\'bottom\'}" ng-click="property.value=\'bottom\';sendAssetPropertyChange(pOwner, property)"><span class="far fa-fw fa-arrow-to-bottom"></span></a> </div> </div> <div ng-switch-when="anchor"> <div> <a class="btn" ng-class="{\'btn-default\':property.value!=\'topleft\',\'btn-primary\':property.value==\'topleft\'}" ng-click="toggleStringProperty(property, \'topleft\')"><span class="fas fa-location-arrow fa-fw fa-rotate-270"></span></a> <a class="btn" ng-class="{\'btn-default\':property.value!=\'top\',\'btn-primary\':property.value==\'top\'}" ng-click="toggleStringProperty(property, \'top\')"><span class="far fa-arrow-up fa-fw"></span></a> <a class="btn" ng-class="{\'btn-default\':property.value!=\'topright\',\'btn-primary\':property.value==\'topright\'}" ng-click="toggleStringProperty(property, \'topright\')"><span class="fas fa-location-arrow fa-fw"></span></a> </div> <div style="margin-top:5px"> <a class="btn" ng-class="{\'btn-default\':property.value!=\'left\',\'btn-primary\':property.value==\'left\'}" ng-click="toggleStringProperty(property, \'left\')"><span class="far fa-arrow-left fa-fw"></span></a> <a class="btn" ng-class="{\'btn-default\':property.value!=\'center\',\'btn-primary\':property.value==\'center\'}" ng-click="toggleStringProperty(property, \'center\')"><span class="fas fa-circle fa-fw"></span></a> <a class="btn" ng-class="{\'btn-default\':property.value!=\'right\',\'btn-primary\':property.value==\'right\'}" ng-click="toggleStringProperty(property, \'right\')"><span class="far fa-arrow-right fa-fw"></span></a> </div> <div style="margin-top:5px"> <a class="btn" ng-class="{\'btn-default\':property.value!=\'bottomleft\',\'btn-primary\':property.value==\'bottomleft\'}" ng-click="toggleStringProperty(property, \'bottomleft\')"><span class="fas fa-location-arrow fa-fw fa-rotate-180"></span></a> <a class="btn" ng-class="{\'btn-default\':property.value!=\'bottom\',\'btn-primary\':property.value==\'bottom\'}" ng-click="toggleStringProperty(property, \'bottom\')"><span class="far fa-arrow-down fa-fw"></span></a> <a class="btn" ng-class="{\'btn-default\':property.value!=\'bottomright\',\'btn-primary\':property.value==\'bottomright\'}" ng-click="toggleStringProperty(property, \'bottomright\')"><span class="fas fa-location-arrow fa-fw fa-rotate-90"></span></a> </div> </div> <div ng-switch-when="alignment" ng-class="{\'disabledAllChildren\':property.disabledcondition && $eval(property.disabledcondition)}"> <div> <a class="btn" ng-class="{\'btn-default\':property.value!=\'topleft\',\'btn-primary\':property.value==\'topleft\'}" ng-click="setStringProperty(property, \'topleft\')"><span class="fas fa-location-arrow fa-fw fa-rotate-270"></span></a> <a class="btn" ng-class="{\'btn-default\':property.value!=\'top\',\'btn-primary\':property.value==\'top\'}" ng-click="setStringProperty(property, \'top\')"><span class="far fa-arrow-up fa-fw"></span></a> <a class="btn" ng-class="{\'btn-default\':property.value!=\'topright\',\'btn-primary\':property.value==\'topright\'}" ng-click="setStringProperty(property, \'topright\')"><span class="fas fa-location-arrow fa-fw"></span></a> </div> <div style="margin-top:5px"> <a class="btn" ng-class="{\'btn-default\':property.value!=\'left\',\'btn-primary\':property.value==\'left\'}" ng-click="setStringProperty(property, \'left\')"><span class="far fa-arrow-left fa-fw"></span></a> <a class="btn" ng-class="{\'btn-default\':property.value!=\'center\',\'btn-primary\':property.value==\'center\'}" ng-click="setStringProperty(property, \'center\')"><span class="fas fa-circle fa-fw"></span></a> <a class="btn" ng-class="{\'btn-default\':property.value!=\'right\',\'btn-primary\':property.value==\'right\'}" ng-click="setStringProperty(property, \'right\')"><span class="far fa-arrow-right fa-fw"></span></a> </div> <div style="margin-top:5px"> <a class="btn" ng-class="{\'btn-default\':property.value!=\'bottomleft\',\'btn-primary\':property.value==\'bottomleft\'}" ng-click="setStringProperty(property, \'bottomleft\')"><span class="fas fa-location-arrow fa-fw fa-rotate-180"></span></a> <a class="btn" ng-class="{\'btn-default\':property.value!=\'bottom\',\'btn-primary\':property.value==\'bottom\'}" ng-click="setStringProperty(property, \'bottom\')"><span class="far fa-arrow-down fa-fw"></span></a> <a class="btn" ng-class="{\'btn-default\':property.value!=\'bottomright\',\'btn-primary\':property.value==\'bottomright\'}" ng-click="setStringProperty(property, \'bottomright\')"><span class="fas fa-location-arrow fa-fw fa-rotate-90"></span></a> </div> </div> <div ng-switch-when="editablefile"> <a class="btn btn-primary" ng-click="pCtrl.editTextFile(property)" translate="ui_editor_properties_effects_edit"></a> </div> <div ng-switch-when="filler"> </div> <div ng-switch-when="divider"> <hr> </div> <div ng-switch-when="alert"> <uib-alert type="{{property.alerttype}}" class=""> <b><span>{{property.label|translate}}</span></b> <span ng-bind-html="property.message | translate"></span> </uib-alert> </div> <div ng-switch-when="navigate"> <button class="btn fullWidth" ng-disabled="property.disabled" ng-class="property.btnclass||\'btn-primary\'" ng-click="pCtrl.navigateProperty(property.key, property.value)"><span ng-if="property.icon" class="fa fa-fw" ng-class="property.icon"></span> {{property.label|translate}}</button> </div> <div ng-switch-when="button"> <button class="btn fullWidth" ng-disabled="property.disabled" ng-class="property.btnclass||\'btn-primary\'" ng-click="pCtrl[property.function](property, this)"><span ng-if="property.icon" class="fa fa-fw" ng-class="property.icon"></span> {{property.label|translate}}</button> </div> <div ng-switch-when="buttonrow" class="typeButtonRow"> <button ng-repeat="button in property.buttons track by $index" class="btn fullWidth" ng-disabled="button.disabled" ng-class="button.btnclass||\'btn-primary\'" ng-click="pCtrl[button.function](button, this)"><span ng-if="button.icon" class="fa fa-fw" ng-class="button.icon"></span> {{button.label|translate}}</button> </div> <div ng-switch-when="radiobuttonrow" class="typeRadioButtonRow"> <button ng-repeat="button in property.buttons track by $index" class="btn fullWidth" ng-disabled="button.disabled" ng-class="{\'btn-primary\':property.state===button.value,\'btn-default\':property.state!==button.value}" ng-click="property.state=button.value;pCtrl[button.function](button, this)"><span ng-if="button.icon" class="fa fa-fw" ng-class="button.icon"></span> {{button.label|translate}}</button> </div> <div ng-switch-when="boneweights" class="editorPropertyBoneWeights"> <div class="editorPropertyBoneLabels"> <div class="bones"> <div class="txt"> </div> </div> <div class="rows" ng-repeat="vertex in property.value.vertices" ng-class="vertex.class"> <div class="txt"> {{vertex.label}} </div> </div> </div> <div class="editorPropertyBoneVertexContainer"> <div class="editorPropertyBoneVertices"> <div class="bones"> <div class="bone" ng-repeat="bone in property.value.bones" ng-attr-style="background-color:{{bone.color}}"> {{bone.label}} </div> </div> <div class="rows" ng-repeat="vertex in property.value.vertices" ng-class="vertex.class"> <div class="weight" ng-repeat="weight in vertex.weights"> <input type="number" onclick="this.select()" ng-model="weight.weight" ng-change="sendAssetPropertyChangeWeights(pOwner, property, {vertex:vertex.id, bone:weight.bone, weight:weight.weight, all:weight.all})"> </div> </div> </div> </div> </div> <div ng-switch-when="itemlist"> <div class="treeViewPropertyRowButtons"> <button class="btn btn-primary" ng-click="pCtrl[property.objectcontroller].add(pOwner, property)"><span class="fas fa-plus"></span> {{\'ui_editor_properties_add\' | translate}}</button> <button class="btn btn-primary" ng-click="pCtrl[property.objectcontroller].edit(selectedItem.item)" ng-disabled="!property.value||property.value.indexOf(selectedItem.item) === -1"><span class="fas fa-edit"></span> {{\'ui_editor_properties_edit\' | translate}}</button> </div> <div class="treeViewPropertyRow"> <tree-view class="treeViewRoot" tv-drag-drop-tag="unknown" tv-drag-drop-enabled="true" tv-data="property.value" tv-mode="\'scene\'" tv-selected-item="selectedItem" tv-remove-clicked="pCtrl[property.objectcontroller].remove(property, item)" tv-element-dragged="pCtrl[property.objectcontroller].drag(from, to)" tv-element-double-clicked="pCtrl[property.objectcontroller].edit(selectedItem.item)" tv-context-menu="pCtrl[property.objectcontroller].contextMenu($event, property, item)" tv-send-asset-property-change="pCtrl.sendAssetPropertyChange(resource, property)"></tree-view> </div> </div> <div ng-switch-when="flatlist"> <div class="treeViewPropertyRowButtons"> <button class="btn btn-primary" ng-click="pCtrl[property.objectcontroller].save(pOwner, property, selectedFlatItem.item)"><span class="fas fa-save"></span> {{\'ui_editor_properties_save\' | translate}}</button> <button class="btn btn-primary" ng-click="pCtrl[property.objectcontroller].load(pOwner, selectedFlatItem.item)" ng-disabled="property.value.indexOf(selectedFlatItem.item) === -1"><span class="fas fa-folder-open"></span> {{\'ui_editor_properties_load\' | translate}}</button> </div> <div class="treeViewPropertyRow" style="height: 100px;"> <tree-view class="treeViewRoot" tv-drag-drop-tag="unknown" tv-drag-drop-enabled="true" tv-data="property.value" tv-mode="\'scene\'" tv-selected-item="selectedFlatItem" tv-remove-clicked="pCtrl[property.objectcontroller].remove(pOwner, property, item)" tv-element-dragged="pCtrl[property.objectcontroller].drag(pOwner, from, to)" tv-element-double-clicked="pCtrl[property.objectcontroller].load(pOwner, selectedFlatItem.item)" tv-context-menu="pCtrl[property.objectcontroller].contextMenu($event, property, item)" tv-multi-select-mode="deselect"></tree-view> </div> </div> <div ng-switch-when="constlist"> <div class="treeViewPropertyRow" style="height: 200px;"> <tree-view class="treeViewRoot" tv-drag-drop-tag="unknown" tv-drag-drop-enabled="false" tv-data="property.value" tv-mode="\'scene\'" tv-selected-item="selectedConstItem" tv-send-asset-property-change="pCtrl.sendAssetPropertyChange(resource, property)" tv-element-selected="pCtrl[property.objectcontroller].itemSelected(pOwner, property, item)" tv-default-selection="property.default" tv-show-buttons="property.showbuttons" tv-context-menu="pCtrl[property.objectcontroller].contextMenu && pCtrl[property.objectcontroller].contextMenu($event, property, item, pOwner)"></tree-view> </div> </div> <div ng-switch-when="multilist"> <div class="treeViewPropertyRowButtons"> <button class="btn btn-primary" ng-click="selectAll(property, true)"><span class="fas fa-list-check"></span> {{\'ui_editor_properties_select_all\' | translate}}</button> <button class="btn btn-primary" ng-click="selectAll(property, false)"><span class="fas fa-list-ul"></span> {{\'ui_editor_properties_deselect_all\' | translate}}</button> </div> <div class="treeViewPropertyRow" style="height: 300px;"> <tree-view class="treeViewRoot" tv-drag-drop-tag="unknown" tv-drag-drop-enabled="false" tv-data="property.value" tv-mode="\'scene\'" tv-selected-item="selectedMultiItem" tv-send-asset-property-change="pCtrl.sendAssetPropertyChange(resource, property)" tv-element-selected="pCtrl[property.objectcontroller].itemSelected(pOwner, property, item)" tv-default-selection="property.default" tv-show-buttons="property.showbuttons" tv-multi-select-mode="full"></tree-view> </div> </div> <div ng-switch-when="bonedepth"> <div class="boneDepthRow"> <span class="boneDepthRowItem">{{property.label|translate}}</span> <span class="boneDepthRowItem"> <input ng-model="property.value" ng-change="sendAssetPropertyChangeBoneDepth(pOwner, property)" onclick="this.select()" type="number" ng-model="property.value" ng-model-options="{updateOn: \'default blur\', debounce: {\'default\': 100, \'blur\': 0}}"> <a class="btn btn-sm btn-primary" ng-click="revertBoneDepth(pOwner)"><span class="fas fa-undo"></span></a> </span> </div> </div> <div ng-switch-when="puppetreferenceoverlay" class="editorPropertyGroup closed" ng-class="{\'closed\':puppetReferenceOverlayState.isClosed}"> <div class="editorPropertyGroupTitle" ng-click="togglePuppetReferenceOverlayVisibility()"> <div class="editorPropertyGroupTitleText">{{property.label|translate}}</div> <span class="fas fa-fw fa-circle-chevron-down editorPropertyGroupTitleIcon"></span> </div> <div class="editorPropertyGroupFold" style="max-height:240px;font-size:14px"> <property-list p-list="pResourcePool[property.childkey][property.childid].properties" p-ctrl="pCtrl" p-owner="pOwner" p-condition-scope="this" p-modal-depth="0" p-resource-pool="pResourcePool"></property-list> </div> </div> <div ng-switch-when="matrixselector"> <div class="matrixSelectorContainer" ng-class="{\'hideYLabels\':property.ylist.length<2}"> <div class="matrixSelectorRow"> <div class="matrixSelectorCell yLabel"></div> <div class="matrixSelectorCell" ng-repeat="x in property.xlist">{{x}}</div> </div> <div class="matrixSelectorRow" ng-repeat="y in property.ylist"> <div class="matrixSelectorCell yLabel">{{y}}</div> <div class="matrixSelectorCell" ng-repeat="x in property.xlist"> <button class="btn btn-default matrixSelectorButton" ng-class="{\'btn-default\':!matrixSelectorIsActiveBtn(property, x, y),\'btn-primary\':matrixSelectorIsActiveBtn(property, x, y)}" ng-click="matrixSelectorSelectBtn(property, x, y)"></button> </div> </div> </div> </div> </div> </div> <nested-properties></nested-properties> </div> '),e.put("views/templates/propertylisttitlecontrols.html",'<div class="editorPropertyTitle"> <span class="title" ng-right-click="pRoot.enablebindings && titleControls.onPropertyRightClick($event, pProperties.visible)">{{pRoot.name | translate}}</span> <div ng-if="!pProperties.visible.linkUser"> <a class="fas fa-fw fa-eye titleControl" ng-if="pProperties.visible.value" ng-click="toggleVisible(false)" ng-right-click="pRoot.enablebindings && titleControls.onPropertyRightClick($event, pProperties.visible)"></a> <a class="fas fa-fw fa-eye-slash titleControl" ng-if="!pProperties.visible.value" ng-click="toggleVisible(true)" ng-right-click="pRoot.enablebindings && titleControls.onPropertyRightClick($event, pProperties.visible)"></a> </div> <div ng-if="pProperties.locktransforms"> <a class="fas fa-fw fa-lock-open titleControl" ng-if="!pProperties.locktransforms.value" ng-click="toggleLock(true)"></a> <a class="fas fa-fw fa-lock titleControl warningText" ng-if="pProperties.locktransforms.value" ng-click="toggleLock(false)"></a> </div> <a ng-if="pRoot.enablebindings" class="btn keyValueLabelCog" ng-class="{\'btn-primary\':titleControls.bindingsActive(pProperties.visible), \'btn-default\':!titleControls.bindingsActive(pProperties.visible)}" ng-click="titleControls.onPropertyRightClick($event, pProperties.visible)"><span class="fas fa-cog"></span></a> </div> '),e.put("views/templates/radiobutton.html",'<div class="checkBoxBase"> <div ng-click="toggle()" class="checkBoxOuter" ng-class="{\'dis\':rbDisabled}"> <span class="fas fa-circle checkBoxBackground"></span> <span ng-if="rbValue == model" class="fas fa-dot-circle checkBox"></span> <span ng-if="rbValue != model" class="far fa-circle checkBox"></span> </div> <div ng-click="toggle()" ng-if="rbTitle" class="checkBoxTitle">{{rbTitle | translate}}</div> </div> '),e.put("views/templates/ratingtable.html",'<div> <div class="ratingTableBody ratingTableColors" ng-class="{everyoneH:highlight===\'Everyone\', questionableH:highlight===\'Questionable\', matureH:highlight===\'Mature\', banH:highlight===\'Ban\'}"> <div class="ratingTableInner"> <div class="ratingTableRow"> <div></div> <div class="header" translate="ui_rating_table_header_cgi"></div> </div> <div class="ratingTableRow"> <div class="info"> <span class="fas fa-arrow-right iconMature"></span> <span class="infoMature" translate="ui_rating_table_hardcore_sexual_acts"></span> </div> <div class="mature" translate="ui_workshop_tags_rating_mature"></div> </div> <div class="ratingTableRow"> <div class="info"> <span class="fas fa-arrow-right iconMature"></span> <span class="infoMature" translate="ui_rating_table_nudity_explicit"></span> </div> <div class="mature" translate="ui_workshop_tags_rating_mature"></div> </div> <div class="ratingTableRow"> <div class="info"> <span class="fas fa-arrow-right iconQuestionable"></span> <span class="infoQuestionable" translate="ui_rating_table_partial_nudity_suggestive"></span> </div> <div class="questionable" translate="ui_workshop_tags_rating_questionable"></div> </div> <div class="ratingTableRow"> <div class="info"> <span class="fas fa-arrow-right iconEveryone"></span> <span lass="infoEveryone" translate="ui_rating_table_suitable_for_everyone"></span> </div> <div class="everyone" translate="ui_workshop_tags_rating_everyone"></div> </div> </div> </div> </div> '),e.put("views/templates/scriptconsole.html",'<div class="scriptLog"> <div class="scriptLogBox"> </div> <div class="scriptLogButtons"> <a ng-click="clearLog()" tooltip="ui_editor_script_clear_log" class="btn btn-default"><span class="fas fa-trash"></span></a> <a ng-click="scEditorSettings.scriptconsoleautoclear=!scEditorSettings.scriptconsoleautoclear" tooltip="ui_editor_script_clear_log_on_run" class="btn btn-default" ng-class="{\'btn-primary\':scEditorSettings.scriptconsoleautoclear, \'btn-default\':!scEditorSettings.scriptconsoleautoclear}"><span class="fas fa-recycle"></span></a> <a ng-click="scEditorSettings.scriptconsoleautoscroll=!scEditorSettings.scriptconsoleautoscroll" tooltip="ui_editor_script_auto_scroll" class="btn" ng-class="{\'btn-primary\':scEditorSettings.scriptconsoleautoscroll, \'btn-default\':!scEditorSettings.scriptconsoleautoscroll}"><span class="fas fa-sort-size-down-alt"></span></a> </div> </div>'),e.put("views/templates/titlebar.html",'<div class="titlebar" ng-hide="hideTitle"> <button class="titlebarBtn closeButton" ng-click="closeWindow()"> <div class="fal fa-times closeButtonIcon"> </div> </button> <button ng-if="!isDialog" class="titlebarBtn windowButton" tooltip="ui_title_maximize" ng-disabled="!maximizeEnabled || isMiniMode" onclick="window.ui.maximize()"> <div class="far" ng-class="{\'fa-square\':!isMaximized,\'fa-window-restore\':isMaximized}"> </div> </button> <button ng-if="!isDialog" class="titlebarBtn windowButton" onclick="window.ui.minimize()"> <div class="fal fa-minus"> </div> </button> <button ng-if="showMiniMode && !isMaximized" tooltip="ui_title_mini_mode" class="titlebarBtn miniModeBtn" ng-click="sendToggleMiniMode()"> <div class="fas" ng-class="{\'fa-chevron-double-right\':!isMiniMode, \'fa-chevron-double-left\':isMiniMode}"> </div> </button> <div class="title"> <span ng-bind="captionPrefix"></span><span translate="{{caption}}" translate-values="captionValues"></span> </div> </div> '),e.put("views/templates/userproperties.html",'<div class="editorUserPropertyContainer"> <div class="editorUserPropertyList"> <div class="editorUserPropertyRow" ng-if="propertyTitlesVisible"> <div ng-if="upSelectedProperty" class="editorUserPropertyRowCell" style="min-width: 56px" translate="ui_editor_user_properties_link"></div> <div class="editorUserPropertyRowCell editorUserPropertyRowReadOnly" translate="ui_editor_user_properties_title"></div> <div class="editorUserPropertyRowCell editorUserPropertyRowReadOnlyFill" translate="ui_editor_user_properties_value" style="padding-right:20px"></div> <div ng-if="!upSelectedProperty && !upDisableEditing" class="editorUserPropertyRowCell editorUserPropertyRowReadOnly" translate="ui_editor_user_properties_order"></div> </div> <div ng-repeat="prop in properties" class="editorUserPropertyRow" ng-class="\'editorUserPropertyRowType\' + prop.type" ng-show="isTypeVisible(prop.type)"> <radiobutton ng-if="upSelectedProperty" class="editorUserPropertyRowCell" ng-model="upSelectedProperty.selected" rb-value="prop.key" style="padding: 0 6px 0 0; min-width: 50px;"></radiobutton> <div class="editorUserPropertyRowCell editorUserPropertyRowColumn"> <div class="editorUserPropertyRowName"> <span ng-if="activeProperties && !activeProperties.includes(prop.key) && prop.type !== \'group\'" tooltip="ui_editor_user_properties_select_unused_warning" class="fas fa-exclamation-triangle warningText editorUserPropertyRowWarning"></span> <div ng-if="isPropertyReadOnly(prop)" class="editorUserPropertyRowReadOnlyInput">{{prop.text | translate}}</div> <input ng-if="!isPropertyReadOnly(prop)" type="text" class="form-control disableMinWidth" ng-model="prop.text" ng-class="{editorUserPropertyWarningPadding:activeProperties && !activeProperties.includes(prop.key)}"> </div> </div> <div class="editorUserPropertyRowCell editorUserPropertyRowColumn"> <div ng-if="prop.type === \'color\'"> <spectrum-colorpicker options="colorPickerOptions" ng-model="prop.value" vec-color-converter on-show-options="{update:false}"></spectrum-colorpicker> </div> <div ng-if="prop.type === \'slider\'" class="editorUserPropertyRowSlider"> <input type="number" class="form-control" ng-model="prop.value"> </div> <div ng-if="prop.type === \'combo\'" class="editorUserPropertyRowDropList"> <droplist class="editorUserPropertyTypeDropDown" dp-options="prop.options" dp-selected="prop.value"></droplist> </div> <div ng-if="prop.type === \'bool\'"> <checkbox cb-checked="prop.value"></checkbox> </div> <div ng-if="prop.type === \'textinput\'" class="editorUserPropertyRowText"> <input type="text" class="form-control" ng-model="prop.value"> </div> <div ng-if="prop.type === \'group\'"> <span class="badge badge-info editorUserPropertyRowBadge">{{\'ui_editor_user_properties_type_group\'|translate}}</span> </div> <div ng-if="prop.type === \'scenetexture\'"> <span ng-if="!upDisableEditing" class="badge badge-warning editorUserPropertyRowBadge">{{\'ui_editor_user_properties_type_scenetexture\'|translate}}</span> <button ng-if="upDisableEditing" ng-click="performUserTextureTest(prop)" class="btn btn-lg btn-info" translate="ui_browse_modal_user_shortcut_test_command"></button> </div> <div ng-if="prop.type === \'usershortcut\'"> <span ng-if="!upDisableEditing" class="badge badge-danger editorUserPropertyRowBadge">{{\'ui_editor_user_properties_type_usershortcut\'|translate}}</span> <button ng-if="upDisableEditing" ng-click="performUserShortcutTest(prop)" class="btn btn-lg btn-info" translate="ui_browse_modal_user_shortcut_test_command"></button> </div> </div> <div class="editorUserPropertyRowCell editorUserPropertyRowColumn editorUserPropertyRowControls" ng-if="!isPropertyReadOnly(prop) && !upDisableEditing"> <a ng-if="!upSelectedProperty" class="btn btn-default" ng-click="moveProperty(prop, -1)"><span class="fas fa-fw fa-chevron-up"></span></a> <a ng-if="!upSelectedProperty" class="btn btn-default" ng-click="moveProperty(prop, 1)"><span class="fas fa-fw fa-chevron-down"></span></a> <span ng-if="!upSelectedProperty"><input type="number" style="display:inline-block;width:50px" class="form-control editorUserPropertyRowColumn orderInput" ng-model="prop.index" ng-keypress="orderKeyPress($event, prop)" ng-blur="movePropertyToIndex(prop)" onclick="this.select()"></span> <a class="btn btn-default" ng-click="editProperty(prop)"><span class="fas fa-fw fa-edit"></span></a> <a class="btn btn-danger" ng-click="removeProperty(prop)"><span class="fas fa-fw fa-times"></span></a> </div> </div> </div> <div ng-if="!upDisableEditing"> <div ng-if="upSelectedProperty" style="display:inline-block;width:46px;"></div> <a class="btn btn-default" ng-click="createProperty()"><span class="fas fa-plus"></span> <span translate="ui_editor_user_properties"></span></a> </div> </div> '),e.put("views/templates/veccomponentinput.html",'<div ng-switch="vciMode"> <div ng-switch-when="position" class="vecComponents"> <div class="vecPositionPicker"> <a class="fas fa-crosshairs crosshairs" ng-click="pickPosition()"></a> </div> <div class="vecComponentPart"> <span class="vecComponentLabel">X</span> <input type="number" step="any" onclick="this.select()" ng-model="value.x" ng-focus="suppressSave(true)" ng-blur="suppressSave(false)" number-input-controls> </div> <div class="vecComponentPart"> <span class="vecComponentLabel">Y</span> <input type="number" step="any" onclick="this.select()" ng-model="value.y" ng-focus="suppressSave(true)" ng-blur="suppressSave(false)" number-input-controls> </div> </div> <div ng-switch-when="linkedslider"> <div class="editorPropertySliderPropertyRow"> <span>X</span> <div> <rzslider rz-slider-model="value.x" rz-slider-options="{id:\'x\', ceil:vciOptions.max, floor:vciOptions.min, enforceStep:false, precision:2, step:0.01, onStart:sendAssetPropertyChangeSliderStart, onChange:sendAssetPropertyChangeSliderChange, onEnd:sendAssetPropertyChangeSliderEnd}"></rzslider> </div> <div> <input class="fullWidth" step="any" truncate-float onclick="this.select()" ng-focus="suppressSave(true)" ng-blur="suppressSave(false)" type="number" ng-model="value.x" ng-change="sendAssetPropertyChangeSliderChange(\'x\', value.x)" number-input-controls> </div> </div> <div class="vecLinkIcon"> <a><span class="fas fa-link" ng-class="{\'fa-unlink\':!settings.linked}" ng-click="toggleLinked()"></span></a> </div> <div class="editorPropertySliderPropertyRow"> <span>Y</span> <div> <rzslider rz-slider-model="value.y" rz-slider-options="{id:\'y\', ceil:vciOptions.max, floor:vciOptions.min, enforceStep:false, precision:2, step:0.01, onStart:sendAssetPropertyChangeSliderStart, onChange:sendAssetPropertyChangeSliderChange, onEnd:sendAssetPropertyChangeSliderEnd}"></rzslider> </div> <div> <input class="fullWidth" step="any" truncate-float onclick="this.select()" ng-focus="suppressSave(true)" ng-blur="suppressSave(false)" type="number" ng-model="value.y" ng-change="sendAssetPropertyChangeSliderChange(\'y\', value.y)" number-input-controls> </div> </div> </div> <div ng-switch-default class="vecComponents"> <div class="vecComponentPart"> <span class="vecComponentLabel vecComponentLabelX">{{(vciOptions.labelX | translate) || \'X\'}}</span> <input class="vecComponentPartInput" step="any" type="number" onclick="this.select()" ng-model="value.x" ng-disabled="vciDisabled" ng-focus="suppressSave(true)" ng-blur="suppressSave(false)" number-input-controls> </div> <div class="vecComponentPart"> <span class="vecComponentLabel vecComponentLabelY">{{(vciOptions.labelY | translate) || \'Y\'}}</span> <input class="vecComponentPartInput" step="any" type="number" onclick="this.select()" ng-model="value.y" ng-disabled="vciDisabled" ng-focus="suppressSave(true)" ng-blur="suppressSave(false)" number-input-controls> </div> <div ng-if="vciCount >= 3" class="vecComponentPart"> <span class="vecComponentLabel vecComponentLabelZ">Z</span> <input class="vecComponentPartInput" step="any" type="number" onclick="this.select()" ng-model="value.z" ng-disabled="vciDisabled" ng-focus="suppressSave(true)" ng-blur="suppressSave(false)" number-input-controls> </div> <div ng-if="vciCount >= 4" class="vecComponentPart"> <span class="vecComponentLabel vecComponentLabelW">W</span> <input class="vecComponentPartInput" step="any" type="number" onclick="this.select()" ng-model="value.w" ng-disabled="vciDisabled" ng-focus="suppressSave(true)" ng-blur="suppressSave(false)" number-input-controls> </div> </div> <div ng-if="vciShowSliderZ"> <div class="fullWidth" style="margin:10px 0;"> <span translate="ui_editor_properties_height"></span> </div> <div class="editorPropertySliderPropertyRow"> <rzslider rz-slider-model="value.z" rz-slider-options="{ceil:2000, floor:0, onStart:sliderZChangeStart, onEnd:sliderZChangeEnd}"></rzslider> </div> \x3c!-- <div>\r\n <input class="fullWidth" type="number" onclick="this.select()" ng-model="value.z" ng-change="sendAssetPropertyChangeSliderChange(\'z\', value.z)">\r\n </div> --\x3e </div> </div> '),e.put("views/templates/workshopauthordynamic.html",'<span class="infoAuthor"> <img ng-if="waInfos[waItem.authorsteamid]" ng-src="{{waInfos[waItem.authorsteamid].avatar}}" class="avatar infoAuthorItem"> <img ng-if="!waInfos[waItem.authorsteamid]" src="images/noavatar.jpg" class="avatar infoAuthorItem"> <a ng-if="waInfos[waItem.authorsteamid]" class="infoAuthorItem infoAuthorTitle" ng-click="waOpenUserPage(waItem.authorsteamid)">{{waInfos[waItem.authorsteamid].name}}</a> <span ng-if="!waInfos[waItem.authorsteamid]" class="infoAuthorItem infoAuthorTitle">{{waItem.author || (\'ui_browse_details_author_pending\' | translate)}}</span> <a ng-if="waInfos[waItem.authorsteamid] && waBrowseAuthor" ng-click="waBrowseAuthor(waItem.authorsteamid)" class="btn btn-default infoAuthorItem"><span class="fas fa-search"></span></a> </span> '),e.put("views/templates/workshopauthorstatic.html",'<span> <img ng-if="waInfos[waItem.authorsteamid]" ng-src="{{waInfos[waItem.authorsteamid].avatar}}" class="avatar infoAuthorItem"> <img ng-if="!waInfos[waItem.authorsteamid]" src="images/noavatar.jpg" class="avatar infoAuthorItem"> <span ng-if="waInfos[waItem.authorsteamid]" class="infoAuthorItem infoAuthorTitle">{{waInfos[waItem.authorsteamid].name}}</span> <span ng-if="!waInfos[waItem.authorsteamid]" class="infoAuthorItem infoAuthorTitle">{{waItem.author || (\'ui_browse_details_author_pending\' | translate)}}</span> </span> '),e.put("views/templates/workshopdetails.html",'<div class="container-fluid verticalLabels"> <div class="row"> <div class="col-xs-12"> <div class="form-group" ng-if="wdEditorSettings.category!=\'wallpaper\'"> <label translate="ui_editor_workshop_options_upload_as"></label> <droplist class="editorUpdateItemDropDown" dp-options="uploadProjectOptions" dp-selected="selectedUploadOption.value"></droplist> </div> </div> <div class="col-xs-6"> <div class="form-group"> <label for="workshopTitle" translate="ui_editor_workshop_options_title"></label><span class="displayInvisible requiredIndicator" translate="ui_editor_workshop_options_required"></span> <input type="text" class="form-control" id="workshopTitle" ng-model="wdProjectData.title"> </div> <div class="form-group" ng-if="!wdProjectData.lockgenre" style="margin-bottom:5px"> <label for="workshopTags" translate="ui_editor_workshop_options_genre"></label> <droplist class="editorTagDropDown" id="workshopTags" dp-options="availableTags" dp-selected="selectedTag.tag"></droplist> </div> <div class="form-group"> <div class="editorWorkshopDetailsHint" ng-bind-html="getGenreHint()| translate"></div> </div> <div class="form-group"> <label for="workshopDescription" translate="ui_editor_workshop_options_description"></label> <textarea style="resize:none;height:115px" class="form-control" id="workshopDescription" ng-model="wdProjectData.description"></textarea> \x3c!-- <div style="margin-top:5px" class="editorWorkshopDetailsHint" translate="ui_editor_workshop_options_description_hint"></div> --\x3e </div> <div class="form-group" ng-if="wdEditorSettings.category==\'wallpaper\'"> <label translate="ui_editor_workshop_options_scheme_color"></label> <spectrum-colorpicker class="form-control colorpicker-control" options="colorPickerOptions" ng-model="wdProjectData.general.properties.schemecolor.value" vec-color-converter on-show-options="{update:false}"></spectrum-colorpicker> </div> </div> <div class="col-xs-6"> <div class="form-group" ng-if="!wdProjectData.lockrating && canUseAgeRatingTags()"> <label for="workshopRating" translate="ui_editor_workshop_options_rating"></label> <div class="row" style="height:34px;display:flex;align-items:center"> <div class="col-md-6 col-xs-5"> <span translate="{{wdProjectData.contentrating ? \'ui_workshop_tags_rating_\' + wdProjectData.contentrating.toLowerCase() : \'ui_workshop_workshop_tags_rating_not_set\'}}"></span> </div> <div class="col-md-6 col-xs-7"> <a class="btn btn-primary fullWidth pull-right" ng-click="openRatingModal(wdProjectData)" translate="ui_editor_workshop_options_rating_change"></a> </div> </div> </div> <div class="form-group" style="margin-bottom:5px"> <label for="workshopVisibility" translate="ui_editor_workshop_options_visibility"></label> <droplist id="workshopVisibility" dp-options="visibilityOptions" dp-selected="wdProjectData.visibility"></droplist> </div> <div class="form-group"> <div class="editorWorkshopDetailsHint">{{\'ui_workshop_info_visibility_\' + (wdProjectData.visibility || \'public\') | translate}}</div> </div> <div class="form-group"> <label for="workshopPreviewImage" translate="ui_editor_workshop_options_preview_image"></label><span class="displayInvisible requiredIndicator" translate="ui_editor_workshop_options_required"></span> <div class="row"> <div class="col-xs-5"> <div class="text-center editorWorkshopDetailsPreviewImage" ng-class="{smallPreview:wdEditorSettings.category!=\'wallpaper\'}"> <div class="noPreviewMsg" ng-if="!previewRefreshUrl" translate="ui_editor_workshop_options_missing"></div> <img ng-if="previewRefreshUrl" ng-src="{{previewRefreshUrl}}"> </div> </div> <div class="col-md-1"></div> <div class="col-md-6 col-xs-7 editorWorkshopDetailsPreviewImageControls"> <button class="btn btn-primary fullWidth" ng-disabled="wdProjectData.type.toLowerCase()==\'application\'" ng-click="takeSnapshot()" translate="ui_editor_workshop_options_preview_take_snapshot"></button> <button class="btn btn-primary fullWidth" ng-click="importSnapshot()" translate="ui_editor_workshop_options_preview_import_file"></button> </div> </div> </div> </div> </div> </div> '),e.put("views/templates/workshopratingscore.html",'<div class="browseWallpaperDetailsWorkshopRateRowRating"> <div class="browseWallpaperDetailsWorkshopRateRowRatingButtons"> <span class="browseWallpaperDetailsWorkshopRateRowRatingButtonsLeft"> <a class="btn btn-default rateUp" ng-class="{\'toggled\':wrItem.uservote===\'up\'}" ng-click="setUserVote(wrItem.workshopid, wrItem.uservote===\'up\'?\'cancel\':\'up\')"><span class="fas fa-thumbs-up"></span> <span class="rateUpLabel" translate="ui_browse_details_rate"></span></a> <a class="btn btn-default" ng-class="{\'toggled\':wrItem.uservote===\'down\'}" ng-click="setUserVote(wrItem.workshopid, wrItem.uservote===\'down\'?\'cancel\':\'down\')"><span class="fas fa-thumbs-down"></span></a> </span> <span class="browseWallpaperDetailsWorkshopRateRowRatingButtonsRight"> <a class="btn btn-default favorite" ng-class="{\'toggled\':wrItem.favorite}" ng-click="setFavorited(wrItem.workshopid, !wrItem.favorite);wrItem.favorite=!wrItem.favorite;"><span class="fas fa-heart"></span></a> </span> </div> <div class="browseWallpaperDetailsWorkshopRateRowRatingScore"> <span class="fas fa-thumbs-up"></span> <span class="score">{{wrItem.rating | number : 1}}%</span> </div> </div> '),e.put("views/templates/workshopratingstars.html",'<div class="browseWallpaperDetailsWorkshopRateRowRating"> <div class="browseWallpaperDetailsWorkshopRateRowRatingButtons"> <span class="browseWallpaperDetailsWorkshopRateRowRatingButtonsLeft"> <a class="btn btn-default" ng-class="{\'toggled\':wrItem.uservote===\'down\'}" ng-click="setUserVote(wrItem.workshopid, \'down\')"><span class="fas fa-thumbs-down"></span></a> <a class="btn btn-default rateUp" ng-class="{\'toggled\':wrItem.uservote===\'up\'}" ng-click="setUserVote(wrItem.workshopid, \'up\')"><span class="fas fa-thumbs-up"></span> <span class="rateUpLabel" translate="ui_browse_details_rate"></span></a> </span> <span class="browseWallpaperDetailsWorkshopRateRowRatingButtonsRight"> <a class="btn btn-default favorite" ng-class="{\'toggled\':wrItem.favorite}" ng-click="setFavorited(wrItem.workshopid, !wrItem.favorite);wrItem.favorite=!wrItem.favorite;"><span class="fas fa-heart"></span></a> </span> </div> <div> <span class="browseWallpaperDetailsWorkshopRateRowRatingStars" ng-class="{\'disabled\':wrItem.ratingrounded < 1}"> <span class="glyphicon" ng-class="{\'glyphicon-star-empty\':wrItem.ratingrounded < 1,\'glyphicon-star\':wrItem.ratingrounded >= 1}"></span> <span class="glyphicon" ng-class="{\'glyphicon-star-empty\':wrItem.ratingrounded < 2,\'glyphicon-star\':wrItem.ratingrounded >= 2}"></span> <span class="glyphicon" ng-class="{\'glyphicon-star-empty\':wrItem.ratingrounded < 3,\'glyphicon-star\':wrItem.ratingrounded >= 3}"></span> <span class="glyphicon" ng-class="{\'glyphicon-star-empty\':wrItem.ratingrounded < 4,\'glyphicon-star\':wrItem.ratingrounded >= 4}"></span> <span class="glyphicon" ng-class="{\'glyphicon-star-empty\':wrItem.ratingrounded < 5,\'glyphicon-star\':wrItem.ratingrounded >= 5}"></span> </span> </div> </div> '),e.put("views/views/browsewallpapers.html",'<div class="clientArea responsive"> \x3c!-- <div class="browseAlert browsePiracyAlert ng-hide" ng-show="showPirateWarning">\r\n <uib-alert type="danger">\r\n <div translate="ui_alert_connect_steam"></div>\r\n </uib-alert>\r\n </div> --\x3e <div class="browseWallpaperBrowseContainer"> <div class="browseWallpaperBrowseContainerLeft"> <div class="browseWallpaperBrowseContainerLeftTop"> <div class="browseWallpaperMonitorHeader" ng-if="showMonitorRow"> <div class="browseWallpaperMonitorChangeButton"> <a ng-click="toggleMonitorSelection()" class="browseWallpaperConfigHeaderLink"> <h1 class="browseWallpaperConfigHeader">{{(wallpaperConfigGroup==\'screensaver\' ? \'ui_browse_screensaver\' : \'ui_browse_monitor\' | translate) + \' \' + (showMonitorIndex ? selectedMonitor.index + 1 : \'\') + \' \' + (selectedMonitor.isSplit ? (\'ui_browse_split\' | translate) + \' \' + selectedMonitor.splitIndex : \'\')}}</h1> <button ng-if="wallpaperConfigGroup==\'wallpaper\'" class="btn btn-default btnPill" translate="ui_browse_choose_monitor"></button> <div ng-if="wallpaperConfigGroup==\'screensaver\'" ng-click="$event.stopPropagation()" style="padding: 3px 9px 3px 0;cursor:default;"> <button ng-click="openSystemWallpaperDialog();stopEvt($event)" class="btn btn-default btnPill"><span class="fab fa-windows"></span> <span class="btnPillLabel" translate="ui_browse_windows_screensaver_settings"></span></button> <button ng-click="changeConfigGroup(\'wallpaper\');stopEvt($event)" class="btn btn-danger btnPill"><span class="fas fa-times"></span> <span class="btnPillLabel" translate="ui_browse_close_screensaver"></span></button> </div> </a> </div> </div> <div class="browseAlert ng-hide" ng-show="showMotdMessage"> <uib-alert close="showMotdMessage=false"> <div style="display:flex;align-items:center;"> <div>{{motdMessage|translate}}</div> </div> </uib-alert> </div> <div class="browseWallpaperSourceContainer"> <div class="controls"> <span class="controlHeaderBtn"><a class="btn controlBtn" ng-class="{\'btn-default\':mobileManagerState.connectedDevices.length==0,\'btn-success\':mobileManagerState.connectedDevices.length>0}" ng-click="toggleManageMobileDevices()" tooltip="ui_browse_header_option_mobile_devices"><span class="far fa-mobile-android"></span> <span class="controlText" translate="ui_browse_header_option_mobile_devices"></span></a> </span> <span class="controlHeaderBtn"><a class="btn btn-default controlBtn" ng-click="toggleMonitorSelection();" tooltip="ui_browse_header_option_monitors"><span class="far fa-desktop"></span> <span class="controlText" translate="ui_browse_header_option_monitors"></span></a> </span> <span class="controlHeaderBtn"><a class="btn btn-default controlBtn" ng-click="callbackShowSettings()" tooltip="ui_browse_header_option_settings"><span class="fas fa-cog"></span> <span class="controlText" translate="ui_browse_header_option_settings"></span></a> </span> </div> <div class="sourceBox" style="position: relative"> <script type="text/ng-template" id="exploreAdvertiseTemplate.html"> <div ng-click="setListSourceRecorded(\'explore\')" translate="ui_browse_advertise_explore"></div> <\/script> <script type="text/ng-template" id="workshopAdvertiseTemplate.html"> <div ng-click="setListSourceRecorded(\'workshop\')" translate="ui_browse_advertise_workshop"></div> <\/script> <div class="btn-group browserSourceGroupButton" id="configGroupSelector" uib-dropdown is-open="status.isopengroup"> <a ng-click="setListSourceInstalled()" class="btn-primary browserSourceButton" ng-class="{\'sourceOverrideActive\':source==\'installed\'}" ng-mouseenter="openConfigGroup()"><span class="fas fa-save"></span> <span translate="ui_browse_list_source_installed"></span> <span class="fas fa-caret-down"></span></a> <ul class="dropdown-menu" uib-dropdown-menu role="menu" style="border-top-left-radius: 0px;border-top-right-radius: 0px;z-index: 10001;"> <li role="menuitem"><a ng-click="changeConfigGroup(\'wallpaper\');setListSourceRecorded(\'installed\')"><span class="fas fa-image"></span> <span translate="ui_browse_monitors_wallpaper"></span></a></li> <li role="menuitem"><a ng-click="changeConfigGroup(\'screensaver\');setListSourceRecorded(\'installed\')"><span class="fas fa-moon-stars"></span> <span translate="ui_browse_monitors_screensaver"></span></a></li> </ul> </div> <a ng-click="setListSourceRecorded(\'explore\')" class="btn-primary browserSourceButton" ng-class="{\'sourceOverrideActive\':source==\'explore\', \'advertiseWorkshop\':browserSettings.advertiseexplore&&!steamWorkshopStatus.error}" ng-if="showDiscover"><span class="fas fa-compass"></span> <span translate="ui_browse_list_source_explore" uib-popover-template="\'exploreAdvertiseTemplate.html\'" popover-placement="bottom" popover-is-open="browserSettings.advertiseexplore && canAdvertiseAny && canAdvertiseWorkshop" popover-trigger="none" popover-class="popoverAdvertiseWorkshop" popover-append-to-body="true"></span></a> <a ng-click="setListSourceRecorded(\'workshop\')" class="btn-primary browserSourceButton" ng-class="{\'sourceOverrideActive\':source==\'workshop\', \'advertiseWorkshop\':browserSettings.advertiseworkshop&&!steamWorkshopStatus.error}" uib-popover-template="\'workshopAdvertiseTemplate.html\'" popover-placement="right" popover-is-open="browserSettings.advertiseworkshop && canAdvertiseAny && canAdvertiseWorkshop" popover-trigger="none" popover-class="popoverAdvertiseWorkshop" popover-append-to-body="true"><span ng-class="providerIcon"></span> <span translate="ui_browse_list_source_workshop"></span></a> </div> </div> <div class="browseAlert ng-hide" ng-show="showTrialAdvertiseAlert"> <uib-alert> <div style="display:flex;align-items:center"> <div translate="ui_browse_alert_trial_reminder"></div> <a class="btn btn-primary" translate="ui_browse_alert_trial_reminder_button" style="margin-left:10px" ng-click="callOpenStorePage()"></a> </div> </uib-alert> </div> <div class="browseAlert ng-hide" ng-show="browserOptions.activeloadrule"> <uib-alert type="info"> <div translate="ui_browse_alert_active_application_rule" translate-values="{executable:browserOptions.activeloadrule}"></div> </uib-alert> </div> <div class="browseAlert ng-hide" ng-show="browserOptions.activevramtrigger"> <uib-alert type="info"> <div translate="ui_browse_alert_vram_exhausted"></div> </uib-alert> </div> <div class="browseAlert ng-hide" ng-show="showScreensaverWindowsSettingsWarning"> <uib-alert type="info"> <div style="display:flex;align-items:center"> <div translate="ui_browse_monitors_configure_in_windows_hint" style="flex:1"></div> <button ng-click="openSystemWallpaperDialog();stopEvt($event)" class="btn btn-default btnPill"><span class="fab fa-windows"></span> <span class="btnPillLabel" translate="ui_browse_windows_screensaver_settings"></span></button> </div> </uib-alert> </div> <div class="browseAlert ng-hide" ng-show="showScreensaverApplicationWallpaperWarning"> <uib-alert> <div translate="ui_browse_alert_screensaver_app"></div> </uib-alert> </div> <div class="browseAlert ng-hide" ng-show="showWorkshopAgreementUpdate"> <uib-alert> <div style="display:flex;align-items:center"> <div translate="ui_browse_mobile_modal_author_permission_missing_alert" style="margin-right: 10px;flex:1"></div> <button ng-click="openWorkshopAgreementURL();stopEvt($event)" class="btn btn-default btnPill"><span class="fab fa-steam"></span> <span class="btnPillLabel" translate="ui_browse_mobile_modal_author_permission_missing_open_agreement"></span></button> </div> </uib-alert> </div> <div class="browseAlert ng-hide" ng-show="sourceIsWorkshop && filterPreset.workshopid"> <uib-alert close="callbackClearPresetFilter()"> <div translate="ui_browse_preset_filter_notice" translate-values="{title:filterPreset.title}"></div> </uib-alert> </div> <div class="browseAlert ng-hide" ng-show="sourceIsWorkshop && filterAuthor.authorSteamId"> <uib-alert close="callbackClearAuthorFilter()"> <div translate="ui_browse_author_filter_notice" translate-values="{author:steamUserInfos[filterAuthor.authorSteamId].name}"></div> </uib-alert> </div> <div class="browseAlert ng-hide" ng-show="!sourceIsInstalled && isUsingBackup"> <uib-alert type="info"> <div translate="ui_browse_steam_offline_notice" translate-values="{date:(backupDate|date)}"></div> </uib-alert> </div> <div ng-if="wallpaperConfigGroup==\'screensaver\'"> <div class="browseWallpaperScreensaverModeRow scalable"> <div class="browseWallpaperScreensaverModeRowInner"> <span class="lbl" translate="ui_browse_monitors_screensaver_mode_label"></span> <div class="btn-group"> <a class="btn scrnBtn" ng-class="{\'btn-default\':!wallpaperConfigScreensaver.sameaswallpaper,\'btn-primary\':wallpaperConfigScreensaver.sameaswallpaper}" translate="ui_browse_monitors_same_as_wallpaper" ng-click="wallpaperConfigScreensaver.sameaswallpaper=true"></a> <a class="btn scrnBtn" ng-class="{\'btn-default\':wallpaperConfigScreensaver.sameaswallpaper,\'btn-primary\':!wallpaperConfigScreensaver.sameaswallpaper}" translate="ui_browse_monitors_configured_separately" ng-click="wallpaperConfigScreensaver.sameaswallpaper=false"></a> </div> </div> </div> <hr style="margin:0 0 11px 0;border-width: 3px"> </div> <div class="browseWallpaperSearchContainer" ng-if="!sourceIsExplore && !hideWallpaperSelection"> <div class="form-group has-feedback browseWallpaperSearchContainerSearchField" ng-class="{\'showOptions\':searchHasSpaces()}"> <div ng-class="{\'input-group\':filter.text}"> <div class="textOptionsParent"> <input id="browseSearchFilterText" type="text" class="form-control" placeholder="{{\'ui_browse_search_placeholder\' | translate}}" ng-model="filter.text" ng-model-options="{debounce:100}" maxlength="40"> <span class="glyphicon glyphicon-search form-control-feedback" aria-hidden="true"></span> <div class="browseWallpaperSearchTextOptions" tabindex="0" ng-if="sourceIsWorkshop&&showExactMath"> <div class="content"> <checkbox cb-title="\'ui_browse_search_exact_match\'" cb-checked="filter.exactMatch"></checkbox> </div> </div> </div> <div class="input-group-btn"> <button ng-if="filter.text" class="btn btn-danger" ng-click="resetSearchFilter()"> <i class="glyphicon glyphicon-remove"></i> </button> </div> </div> </div> <div> <a ng-click="showFilter.visible=!showFilter.visible" class="btn btn-primary filterBtn"> <span class="fas fa-tasks filterIcon"></span> <span class="filterLabel" translate="ui_browse_filter_results"></span> <span ng-if="showFilter.counts && !sourceIsWorkshop && (steamWorkshopStatus.complete || steamWorkshopStatus.error)" class="browseFilterActiveClass" translate="ui_browse_filter_results_count" translate-values="{filtered:filteredCount, unfiltered:unfilteredCount}"></span> <span ng-if="showFilter.counts && sourceIsWorkshop && (steamWorkshopStatus.complete || steamWorkshopStatus.error)" class="browseFilterActiveClass" translate="ui_browse_filter_results_filtered"></span> </a> </div> <div class="browseWallpaperSearchContainerFill"> </div> <div class="browseWallpaperSearchContainerSort"> <span style="cursor: pointer" class="glyphicon sortDirection" ng-class="{\'glyphicon-triangle-bottom\': filter.descending, \'glyphicon-triangle-top\': !filter.descending}" ng-click="skipNextFilterDebounce();filter.descending=!filter.descending;" ng-if="!sourceIsWorkshop"></span> <droplist ng-if="!sourceIsWorkshop || !filterAuthor.authorSteamId" dp-options="sortOptions" dp-selected="filter.sort"></droplist> <droplist ng-if="sourceIsWorkshop && filterAuthor.authorSteamId" dp-options="filterAuthor.sortOptions" dp-selected="filterAuthor.sort"></droplist> </div> </div> <div class="browseWallpaperSearchContainer" ng-if="sourceIsExplore"> <div class="browseExploreRow"> <a ng-visible="exploreNavigation.length>1" ng-click="popExplorePage()"><span class="fas fa-arrow-circle-left browseExploreIcon browseExploreBackIcon"></span></a> <span ng-show="!exploreNavigation[0].key" class="exploreQueryTitle"> <explorequerytitle eqt-query="exploreNavigation[0]" eqt-user-info="steamUserInfos"></explorequerytitle> <explorequeryactions eqt-query="exploreNavigation[0]" eqt-settings="browserSettings.explore" eqt-callbacks="{like:exploreLikedCallback,remove:exploreCustomRemoveCallback}"></explorequeryactions> </span> <span ng-show="exploreNavigation[0].key && exploreNavigation[0].title" class="browseExploreTitle">{{exploreNavigation[0].title | translate}}</span> <span class="browseExploreHomeRow" ng-show="exploreNavigation.length==1"> <a class="btn btn-default browseExploreTextIcon" ng-mousedown="openExplorePersonalizedContentDropdown($event, false)" ng-mouseup="openExplorePersonalizedContentDropdown($event, true)"> <div class="browseExploreHomePersonalizedBtn"> <img ng-if="steamUserInfos[browserRuntime.usersteamid]" ng-src="{{steamUserInfos[browserRuntime.usersteamid].avatar}}" class="browseExploreHomeAvatar"> <img ng-if="!steamUserInfos[browserRuntime.usersteamid]" src="images/noavatar.jpg" class="browseExploreHomeAvatar"> <span translate="ui_browse_explore_your_content"></span> <span style="margin-left:10px;font-size: 90%;" class="fas fa-caret-down"></span> </div> </a> <a class="btn btn-default browseExploreTextIcon" ng-click="setListSourceRecorded(\'workshop\')" tooltip="ui_browse_explore_search"> <span class="fas fa-search" style="font-size: 90%;"></span> <span class="text" translate="ui_browse_explore_search"></span> </a> \x3c!-- <a class="btn btn-default browseExploreTextIcon" ng-click="pushExplorePage({title:\'ui_browse_explore_favorites\', key: \'wallpaperfavorites\'})" tooltip="ui_browse_explore_favorites">\r\n <span class="fas fa-heart"></span> <span class="text" translate="ui_browse_explore_favorites"></span>\r\n </a>\r\n <a class="btn btn-default browseExploreTextIcon" ng-click="pushExplorePage({title:\'ui_browse_explore_followed_users\', key: \'favorites\'})" tooltip="ui_browse_explore_followed_users">\r\n <span class="fas fa-star"></span> <span class="text" translate="ui_browse_explore_followed_users"></span>\r\n </a> --\x3e </span> <span ng-show="exploreNavigation[0].key==\'favorites\'"> <a class="btn btn-default browseExploreIcon" ng-click="addExploreCustomFavoriteQuery()"><span class="fas fa-plus fa-fw"></span></a> </span> </div> </div> <div class="browseWallpaperGridParent"> <div class="browseWallpaperGridContainerParent"> <div class="browseWallpaperFilter ng-hide" ng-show="showFilter.visible && !sourceIsExplore && (wallpaperConfigGroup!=\'screensaver\'||!wallpaperConfigScreensaver.sameaswallpaper||!sourceIsInstalled)"> <div> <div class="browseFilterTopBar"> <span> <a ng-click="callbackResetFilter()" class="btn btn-primary iconInfo"> <span class="fas fa-sync-alt"></span> <span translate="ui_browse_filter_reset"></span> </a> </span> <span ng-if="sourceIsWorkshop && canUseFilterSettings()"> <a ng-click="showWorkshopAdvertiseModal(true)" class="btn btn-default iconInfo"> <span class="fas fa-cog"></span> <span translate="ui_browse_filter_settings"></span> </a> </span> </div> \x3c!-- SPECIAL TAGS --\x3e <div style="margin: 0 10px 0 0"> <div class="groupBox" style="padding: 15px 10px 10px 0px"> <div class="heading" translate="ui_browse_filter_show_only"></div>\x3c!-- <span class="fas fa-play headerIcon"></span> --\x3e <div class="filterItem" ng-if="showApprovedTag"> <checkbox cb-type="tag" cb-checked="filter.utilitytags.Approved"></checkbox><span ng-click="filter.utilitytags.Approved=filter.utilitytags.Approved?0:1"><span class="fas fa-trophy fa-fw browseWallpaperApproved"></span><span class="filterItemLabel" translate="ui_workshop_tags_approved" ng-class="{successText:filter.utilitytags.Approved}"></span></span> </div> <div class="filterItem" ng-if="sourceIsInstalled"> <checkbox cb-type="tag" cb-checked="filterTemp.filterFavoritesOnly" cb-changed="tempFilterChanged()"></checkbox><span ng-click="filterTemp.filterFavoritesOnly=filterTemp.filterFavoritesOnly?0:1;tempFilterChanged()"><span class="fas fa-heart fa-fw browseWallpaperFavorite"></span><span class="filterItemLabel" translate="ui_browse_query_sort_my_favorites" ng-class="{successText:filterTemp.filterFavoritesOnly}"></span></span> </div> <div class="filterItem"> <checkbox cb-type="tag" cb-checked="filterTemp.filterMobileCompatibleOnly" cb-changed="tempFilterChanged()"></checkbox><span ng-click="filterTemp.filterMobileCompatibleOnly=filterTemp.filterMobileCompatibleOnly?0:1;tempFilterChanged()"><span class="fas fa-mobile-android fa-fw browseWallpaperPortrait"></span><span class="filterItemLabel" translate="ui_workshop_filter_mobile_compatible" ng-class="{successText:filterTemp.filterMobileCompatibleOnly}"></span></span> </div> <div class="filterItem"> <checkbox cb-type="tag" cb-checked="filter.utilitytags[filterUtilityTags[0].value]" cb-title="filterUtilityTags[0].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-type="tag" cb-checked="filter.utilitytags[filterUtilityTags[1].value]" cb-title="filterUtilityTags[1].label"></checkbox> </div> </div> \x3c!-- <div class="filterItem" ng-repeat="tag in filterUtilityTags" ng-class="{\'approved\':tag.value==\'Approved\'}">\r\n <checkbox cb-type="tag" cb-checked="filter.utilitytags[tag.value]" cb-title="tag.label"></checkbox> <span class="fas fa-trophy browseWallpaperApproved"></span>\r\n </div> --\x3e <div class="browseFilterBottomPadding"></div> </div> \x3c!-- TYPES --\x3e <div ng-if="!sourceIsWorkshop || !filterPreset.workshopid"> <div class="filterHeader browseFilterToggle" ng-click="filterHideTypes=!filterHideTypes"> <span ng-if="filterHideTypes" class="fas fa-fw fa-caret-down"></span> <span ng-if="!filterHideTypes" class="fas fa-fw fa-caret-right"></span> <span translate="ui_browse_filter_type"></span> <span ng-if="filterStatus.type" class="browseFilterActiveClass" translate="ui_browse_filter_results_filtered"></span> </div> <div class="browseFilterHide" ng-show="filterHideTypes"> \x3c!-- <div class="filterItem" ng-repeat="tag in filterTypeTags">\r\n <checkbox cb-checked="filter.typetags[tag.value]" cb-title="tag.label"></checkbox>\r\n </div> --\x3e <div class="filterItem"> <checkbox cb-checked="filter.typetags[filterTypeTags[0].value]" cb-title="filterTypeTags[0].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.typetags[filterTypeTags[1].value]" cb-title="filterTypeTags[1].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.typetags[filterTypeTags[2].value]" cb-title="filterTypeTags[2].label"></checkbox> </div> <div class="filterItem" ng-if="wallpaperConfigGroup!=\'screensaver\'"> <checkbox cb-checked="filter.typetags[filterTypeTags[3].value]" cb-title="filterTypeTags[3].label"></checkbox> </div> <div class="filterDivider"></div> <div class="filterItem"> <checkbox cb-checked="filter.categorytags[filterCategoryTags[0].value]" cb-title="filterCategoryTags[0].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.categorytags[filterCategoryTags[1].value]" cb-title="filterCategoryTags[1].label"></checkbox> </div> <div class="browseFilterBottomPadding"></div> </div> </div> \x3c!-- RATING --\x3e <div ng-if="canUseAgeRatingTags()"> <div class="filterHeader browseFilterToggle" ng-click="filterHideRating=!filterHideRating"> <span ng-if="filterHideRating" class="fas fa-fw fa-caret-down"></span> <span ng-if="!filterHideRating" class="fas fa-fw fa-caret-right"></span> <span translate="ui_workshop_workshop_tags_rating"></span> <span ng-if="filterStatus.rating" class="browseFilterActiveClass" translate="ui_browse_filter_results_filtered"></span> </div> <div class="browseFilterHide" ng-show="filterHideRating"> <div class="filterItem" ng-repeat="tag in filterRatingTags"> <checkbox cb-checked="filterProxy.ratingtags[tag.value]" cb-title="tag.label"></checkbox> </div> <div ng-if="sourceIsWorkshop"> <div style="position:relative"> <span style="position:absolute;right:10px;top:-19px;" tooltip="ui_browse_filter_content_preferences_tool_tip" t-options="{delay:150,width:250}"> <span class="far fa-circle-info browserFilterWarning"></span> </span> </div> <div style="padding: 10px 10px 0 0"> <button class="btn btn-default btn-sm fullWidth" style="white-space:normal;" ng-click="openAccountPreferences()"><span ng-class="providerIcon"></span> <span translate="ui_browse_filter_content_preferences"></span></button> </div> </div> <div class="browseFilterBottomPadding"></div> </div> </div> \x3c!-- RESOLUTION --\x3e <div ng-if="!sourceIsWorkshop || !filterPreset.workshopid"> <div class="filterHeader browseFilterToggle" ng-click="filterHideResolution=!filterHideResolution"> <span ng-if="filterHideResolution" class="fas fa-fw fa-caret-down"></span> <span ng-if="!filterHideResolution" class="fas fa-fw fa-caret-right"></span> <span translate="ui_browse_filter_resolution"></span> <span ng-if="filterStatus.resolution" class="browseFilterActiveClass" translate="ui_browse_filter_results_filtered"></span> </div> <div class="browseFilterHide" ng-show="filterHideResolution"> <span ng-if="sourceIsWorkshop" style="display:flex;"> <a ng-click="showResolutionSettingsModal()" class="btn btn-info iconInfo" style="flex:1;margin:0 5px 0 15px;"> <span class="fas fa-cog"></span> <span translate="ui_browse_resolution_settings"></span> </a> </span> \x3c!-- <div class="filterItem" ng-repeat="tag in filterResolutionTags">\r\n <checkbox cb-checked="filter.resolutiontags[tag.value]" cb-title="tag.label"></checkbox>\r\n </div> --\x3e \x3c!-- var asd = \'\'; for(var x = 0; x < 24; ++x)asd += \'<div class="filterItem"><checkbox cb-checked="filter.resolutiontags[filterResolutionTags[%V].value]" cb-title="filterResolutionTags[%V].label"></checkbox></div>\\n\'.replaceAll(\'%V\', x);console.log(asd) --\x3e <div class="filterItem filterResolutionTitle" translate="ui_resolution_widescreen"></div> <div class="filterItem filterMultiButtons"> <a class="filterMultiBtn" ng-click="callbackToggleResolutionFilter($event, 0, true)"><span translate="ui_browse_filter_all"></span></a> <a class="filterMultiBtn" ng-click="callbackToggleResolutionFilter($event, 0, false)"><span translate="ui_browse_filter_none"></span></a> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[0].value]" cb-title="filterResolutionTags[0].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[1].value]" cb-title="filterResolutionTags[1].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[2].value]" cb-title="filterResolutionTags[2].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[3].value]" cb-title="filterResolutionTags[3].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[4].value]" cb-title="filterResolutionTags[4].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[5].value]" cb-title="filterResolutionTags[5].label"></checkbox> </div> <div class="filterDivider"></div> <div class="filterItem filterResolutionTitle" translate="ui_resolution_ultrawide"></div> <div class="filterItem filterMultiButtons"> <a class="filterMultiBtn" ng-click="callbackToggleResolutionFilter($event, 1, true)"><span translate="ui_browse_filter_all"></span></a> <a class="filterMultiBtn" ng-click="callbackToggleResolutionFilter($event, 1, false)"><span translate="ui_browse_filter_none"></span></a> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[6].value]" cb-title="filterResolutionTags[6].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[7].value]" cb-title="filterResolutionTags[7].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[8].value]" cb-title="filterResolutionTags[8].label"></checkbox> </div> <div class="filterDivider"></div> <div class="filterItem filterResolutionTitle" translate="ui_resolution_dual"></div> <div class="filterItem filterMultiButtons"> <a class="filterMultiBtn" ng-click="callbackToggleResolutionFilter($event, 2, true)"><span translate="ui_browse_filter_all"></span></a> <a class="filterMultiBtn" ng-click="callbackToggleResolutionFilter($event, 2, false)"><span translate="ui_browse_filter_none"></span></a> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[9].value]" cb-title="filterResolutionTags[9].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[10].value]" cb-title="filterResolutionTags[10].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[11].value]" cb-title="filterResolutionTags[11].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[12].value]" cb-title="filterResolutionTags[12].label"></checkbox> </div> <div class="filterDivider"></div> <div class="filterItem filterResolutionTitle" translate="ui_resolution_triple"></div> <div class="filterItem filterMultiButtons"> <a class="filterMultiBtn" ng-click="callbackToggleResolutionFilter($event, 3, true)"><span translate="ui_browse_filter_all"></span></a> <a class="filterMultiBtn" ng-click="callbackToggleResolutionFilter($event, 3, false)"><span translate="ui_browse_filter_none"></span></a> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[13].value]" cb-title="filterResolutionTags[13].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[14].value]" cb-title="filterResolutionTags[14].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[15].value]" cb-title="filterResolutionTags[15].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[16].value]" cb-title="filterResolutionTags[16].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[17].value]" cb-title="filterResolutionTags[17].label"></checkbox> </div> <div class="filterDivider"></div> <div class="filterItem filterResolutionTitle" translate="ui_resolution_portrait"></div> <div class="filterItem filterMultiButtons"> <a class="filterMultiBtn" ng-click="callbackToggleResolutionFilter($event, 4, true)"><span translate="ui_browse_filter_all"></span></a> <a class="filterMultiBtn" ng-click="callbackToggleResolutionFilter($event, 4, false)"><span translate="ui_browse_filter_none"></span></a> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[18].value]" cb-title="filterResolutionTags[18].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[19].value]" cb-title="filterResolutionTags[19].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[20].value]" cb-title="filterResolutionTags[20].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[21].value]" cb-title="filterResolutionTags[21].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[22].value]" cb-title="filterResolutionTags[22].label"></checkbox> </div> <div class="filterDivider"></div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[23].value]" cb-title="filterResolutionTags[23].label"></checkbox> </div> <div class="filterItem"> <checkbox cb-checked="filter.resolutiontags[filterResolutionTags[24].value]" cb-title="filterResolutionTags[24].label"></checkbox> </div> <div class="browseFilterBottomPadding"></div> </div> </div> \x3c!-- SOURCE --\x3e <div ng-if="!sourceIsWorkshop"> <div class="filterHeader browseFilterToggle" ng-click="filterHideSource=!filterHideSource"> <span ng-if="!filterHideSource" class="fas fa-fw fa-caret-down"></span> <span ng-if="filterHideSource" class="fas fa-fw fa-caret-right"></span> <span translate="ui_browse_filter_source"></span> <span ng-if="filterStatus.source" class="browseFilterActiveClass" translate="ui_browse_filter_results_filtered"></span> </div> <div class="browseFilterHide" ng-hide="filterHideSource"> <div class="filterItem" ng-repeat="tag in filterSourceTags"> <checkbox cb-checked="filter.sourcetags[tag.value]" cb-title="tag.label"></checkbox> </div> <div class="browseFilterBottomPadding"></div> </div> </div> \x3c!-- GENRES --\x3e <div class="filterHeader browseFilterToggle" ng-click="filterHideGenres=!filterHideGenres"> <span ng-if="!filterHideGenres" class="fas fa-fw fa-caret-down"></span> <span ng-if="filterHideGenres" class="fas fa-fw fa-caret-right"></span> <span class="filterHeader" translate="ui_browse_filter_tags"></span> <span ng-if="filterStatus.tags" class="browseFilterActiveClass" translate="ui_browse_filter_results_filtered"></span> </div> <div class="browseFilterHide" ng-hide="filterHideGenres"> <div class="filterItem filterMultiButtons"> \x3c!-- <a class="" ng-if="sourceIsWorkshop" ng-click="showWorkshopAdvertiseModal(true, $event)"><span translate="ui_browse_filter_suggestions"></span></a> --\x3e <a class="filterMultiBtn" ng-click="callbackToggleGenreFilter($event, true)"><span translate="ui_browse_filter_all"></span></a> <a class="filterMultiBtn" ng-click="callbackToggleGenreFilter($event, false)"><span translate="ui_browse_filter_none"></span></a> </div> <div class="filterItem" ng-repeat="tag in filterAllTags"> <checkbox cb-checked="filter.tags[tag.value]" cb-title="tag.label"></checkbox> </div> </div> </div> </div> <div class="browseWallpaperScreensaverMirrorView ng-hide" ng-show="hideWallpaperSelection"> <div class="hint" translate="ui_browse_monitors_same_as_wallpaper_hint"></div> <div> <a class="btn btn-primary btn-lg"><span class="fas fa-fw fa-question" ng-click="openScreensaverFaq()"></span></a> </div> </div> <div class="browseWallpaperGridAndNavigationView" ng-show="(!sourceIsExplore || !exploreNavigation[0].key) && !hideWallpaperSelection"> <div class="browseFolderNavigation" ng-class="{visible:sourceIsInstalled && currentFolder}"> <a class="item itemUpArrow fas fa-arrow-circle-up" ng-click="navigateFolderUp()"></a> <a class="item" ng-click="navigateFolder()" translate="ui_browse_navigation_top"></a> <span ng-repeat="folder in folderNavigation"><span class="item">></span><a class="item" ng-click="navigateFolder(folder)">{{folder.title}}</a></span> </div> <div class="browseWallpaperGridView"> <div ng-if="sortedWallpapers.length == 0 && sortedFolders.length == 0" class="emptyGrid"> <span ng-class="{\'emptyGridDanger\':showErrorInBackground}" ng-bind-html="queryActive ? \'ui_browse_grid_no_results_refreshing\' : showErrorInBackground ? \'ui_browse_no_service_body\' : \'ui_browse_grid_no_results\' | translate"></span> <div ng-if="!queryActive && showErrorInBackground" style="margin-top:20px;"> <a class="btn btn-default btn-lg" ng-click="callbackChangePage(currentPage, false, true)"><span class="fas fa-sync-alt"></span> <span translate="ui_browse_reload"></span></a> </div> <wp-anim ng-if="queryActive" class="wpAnimQuery" wpa-file="anims/logo_white.json"></wp-anim> </div> <wallpaper-thumbnail id="WallpaperBrowseInner1" class="wallpaperBrowseInner" wt-wallpapers="sortedWallpapers" wt-folders="sortedFolders" wt-wallpaper-flags="selectedMonitor.playlistFlags" wt-selection="currentSelection" wt-multiselection="multiSelection" wt-flagcallback="callbackToggleAllWallpapersInCurrentMonitorPlaylist(wallpaper)" wt-mousecallback="callbackWallpaperAllMouse(btn, context, $event)" wt-selectioncallback="callbackWallpaperSelectionRectangle(items, $event)" wt-enabledragdrop="!sourceIsWorkshop" ng-class="\'browseViewSize\' + browserSettings.viewiconsize" wt-blacklist="sourceIsWorkshop && browserSettingsExtensions.authorblocklist" wt-steam-user-infos="steamUserInfos" wt-tag="source!=\'explore\'?source:exploreNavigation[0].wtTag||\'explore\'"></wallpaper-thumbnail> </div> </div> <div class="browseWallpaperGridAndNavigationView" ng-show="sourceIsExplore && exploreNavigation[0].key" intersectionhandler ish-sentinel="#ExploreViewSentinel" ish-callback="exploreScrollSentinelChanged(visible)"> <div class="browseWallpaperGridView"> <div id="WallpaperBrowseInner2" class="wallpaperBrowseInner exploreList" ng-show="exploreNavigation[0].key"> <div ng-repeat="query in sortedExploreQueries" class="browseExploreQueryRow" ng-class="query.class"> <div class="browseExploreQueryControls"> <explorequerytitle eqt-query="query" eqt-user-info="steamUserInfos"></explorequerytitle> </div> <div ng-if="query.loading"> <wp-anim class="wpAnimQueryExplore" wpa-file="anims/logo_white.json"></wp-anim> \x3c!-- <div class="wpAnim">\r\n <img class="spin" src="images/wp_logo_blue_inner_rect.png">\r\n </div> --\x3e <div class="exploreQueryLoadingLabel" translate="ui_browse_grid_no_results_refreshing"></div> </div> <div ng-if="query.showError"> <span class="emptyGridDanger" ng-bind-html="\'ui_browse_no_service_body\' | translate"></span> <a class="btn btn-default btn-lg" ng-click="performExploreQuery(query)"><span class="fas fa-sync-alt"></span> <span translate="ui_browse_reload"></span></a> </div> <div class="browseExploreQueryWallpaperBox" ng-class="{disliked:browserSettings.explore.disliked.includes(query.name)}"> <div class="browseExploreQueryWallpapers" ng-if="query.wallpapers.length > 0" explorescroll> <div class="exploreArrow exploreArrowLeft"> <span class="fas fa-chevron-left chevronIcon"></span> </div> <div class="exploreArrow exploreArrowRight"> <span class="fas fa-chevron-right chevronIcon"></span> </div> <div class="browseExploreQueryScroll"> <wallpaper-thumbnail class="wallpaperQueryList" wt-wallpapers="query.wallpapers" wt-wallpaper-flags="selectedMonitor.playlistFlags" wt-selection="currentSelection" wt-multiselection="multiSelection" wt-flagcallback="callbackToggleAllWallpapersInCurrentMonitorPlaylist(wallpaper)" wt-mousecallback="callbackWallpaperAllMouse(btn, context, $event)" wt-selectioncallback="callbackWallpaperSelectionRectangle(items, $event)" wt-enabledragdrop="false" ng-class="\'browseViewSize\' + browserSettings.viewiconsize" wt-steam-user-infos="steamUserInfos" wt-tag="query.category!==\'highlight\' ? \'explore\' : \'exploreHighlights\'"></wallpaper-thumbnail> </div> </div> </div> <div class="browseExploreQueryFooter" ng-if="!query.loading"> <explorequeryactions eqt-query="query" eqt-settings="browserSettings.explore" eqt-callbacks="{pushExplorePage:pushExplorePage,like:exploreLikedCallback,remove:exploreCustomRemoveCallback}"></explorequeryactions> \x3c!-- <div ng-if="!browserSettings.explore.hasLikedAny && !query.custom" class="exploreVotePrompt warningText">\r\n <span class="fas fa-fw fa-arrow-up exploreIcon warningText"></span>\r\n <span translate="ui_browse_explore_prompt_to_vote"></span>\r\n </div> --\x3e </div> </div> <div id="ExploreViewSentinel" class="exploreViewSentinel"></div> </div> </div> </div> </div> <div class="browseWallpaperPagination" ng-show="pagination.visible && !hideWallpaperSelection"> <span><a class="fas fa-angle-double-left paginationIcon" ng-click="callbackChangePage(\'prev\', true)"></a></span> <span ng-repeat="page in pagination.pages"><a class="paginationIcon pageItem" ng-click="callbackChangePage(page.label, true)" ng-class="{\'{{page.class}}\':true, \'linkOverrideActive\':page.label==pagination.current}">{{page.label}}</a></span> <span><a class="fas fa-angle-double-right paginationIcon" ng-click="callbackChangePage(\'next\', true)"></a></span> </div> <div class="browseWallpaperGridPlaylistParent" ng-class="{playlistShow:selectedMonitor.playlist.items.length>0 || isDragDropActive,playlistDaytime:selectedMonitor.playlist.settings.mode === \'daytime\'||selectedMonitor.playlist.settings.mode === \'dayofweek\'}" ng-show="!hideWallpaperSelection"> <div class="browseWallpaperGridPlaylistParentChild"> <div class="browseWallpaperGridPlaylistHeader"> <h3 translate="{{(selectedMonitor.playlist.items.length) ? \'ui_browse_playlist_header_count\' : \'ui_browse_playlist_header\'}}" translate-values="{count:selectedMonitor.playlist.items.length}"></h3> <a ng-click="callbackShowPlaylists()" class="btn btn-default"> <span class="fas fa-folder-open"></span> <span class="playlistLabel" translate="ui_browse_playlist_button_load"></span> </a> <a ng-click="callbackShowPlaylists(true)" ng-class="{\'disabled\': selectedMonitor.playlist.items.length<2}" class="btn btn-default"> <span class="fas fa-save"></span> <span class="playlistLabel" translate="ui_browse_playlist_button_save"></span> </a> <a ng-click="callbackShowPlaylistSettings()" ng-class="{\'disabled\': !selectedMonitor.playlist.items.length}" class="btn btn-default"> <span class="fas fa-cogs"></span> <span class="playlistLabel" translate="ui_browse_playlist_button_configure"></span> </a> <a ng-if="!selectedMonitor.playlistFlags[currentSelection.file]" ng-click="callbackToggleAllWallpapersInCurrentMonitorPlaylist(currentSelection)" ng-class="{\'disabled\': !currentSelection.file}" class="btn btn-primary"> <span class="fas fa-plus"></span> <span class="playlistLabel" translate="ui_browse_playlist_button_add"></span> </a> <a ng-if="selectedMonitor.playlistFlags[currentSelection.file]" ng-click="callbackToggleAllWallpapersInCurrentMonitorPlaylist(currentSelection)" class="btn btn-primary"> <span class="fas fa-minus"></span> <span class="playlistLabel" translate="ui_browse_playlist_button_remove"></span> </a> <a ng-if="selectedMonitor.playlist.items.length" style="margin-left: auto;" ng-click="callbackClearPlaylist()" class="btn btn-danger"> <span class="fas fa-trash"></span> <span class="playlistLabel" translate="ui_browse_playlist_button_clear"></span> </a> </div> <div class="browseWallpaperPlaylist" id="PlaylistContainer" scroll-horizontal> <div class="browseWallpaperPlaylistRow" ng-attr-style="min-width:{{52 * selectedMonitor.playlist.items.length * (selectedMonitor.playlist.items.length<1001)}}px"> <div ng-if="selectedMonitor.playlist.settings.mode === \'daytime\'" class="playlistTimeline" id="PlaylistContainerTimeline"> <div class="playlistTimelineFixed"> <div class="timelineParent"><span class="timelineChild">{{1 | date : getTimelineFormat() : \'+0000\'}}</span></div> <div class="timelineParent"><span class="timelineChild">{{(1000*60*60*6) | date : getTimelineFormat() : \'+0000\'}}</span></div> <div class="timelineParent"><span class="timelineChild">{{(1000*60*60*12) | date : getTimelineFormat() : \'+0000\'}}</span></div> <div class="timelineParent"><span class="timelineChild">{{(1000*60*60*18) | date : getTimelineFormat() : \'+0000\'}}</span></div> <div class="timelineParent"><span class="timelineChild">{{(1000*60*60*24-1000*60) | date : getTimelineFormat() : \'+0000\'}}</span></div> </div> </div> <div ng-if="selectedMonitor.playlist.settings.mode === \'dayofweek\'" class="playlistTimeline"> <div class="playlistTimelineFixed"> <div class="timelineParentDayOfWeek" ng-repeat="entry in selectedMonitor.playlist.items track by $index"> <span class="timelineChild"> {{getDayOfWeekLabel(selectedMonitor.playlist, $index)}} </span> </div> </div> </div> <div class="playlistWallpaperContainer" id="PlaylistContainerRow"> <div ng-if="selectedMonitor.playlist.items.length > 1000"> <span class="playlistWallpaperContainerLimitHint" translate="ui_browse_playlist_too_many_items"></span> </div> <div ng-if="selectedMonitor.playlist.items.length < 1001" class="playlistWallpaperRow"> <div ng-repeat="entry in selectedMonitor.playlist.items track by $index" class="browseWallpaperPlaylistImage" ng-attr-style="flex-grow:{{entry.flex || 1}}" ng-class="{selected:entry.wallpaper===currentSelection}" ng-click="callbackWallpaperSelected(entry.wallpaper)" attach-scope> <div class="browseWallpaperPlaylistImageChild" ng-attr-style="background: {{getPreviewUrl(entry.wallpaper)}}, rgba(127,127,127,0.1)"> <a class="trashIcon" ng-click="callbackToggleEntryInCurrentMonitorPlaylist(entry, true);callbackCancelEvent($event);"><span class="fas fa-times"></span></a> <div class="presetName" ng-if="entry.preset">{{entry.preset}}</div> <div class="selectBorder"></div> <div class="daytimeDragBorder"></div> <div class="playlistTimelineMarker" ng-if="entry.daytimeend > 0"></div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> <div class="browseWallpaperDetailView" ng-class="{\'showScrollY\':isMiniMode}"> <div ng-if="!currentSelection" class="details placeholder"> <div translate="ui_browse_select_prompt"></div> </div> <div ng-if="currentSelection" class="details"> <div class="previewContainer"> <div ng-if="currentSelection.youtube && preview.play" class="browseWallpaperDetailsViewInner browseWallpaperYoutubeEmbed"> <iframe ng-src="{{currentSelection.youtube}}" onload="youtubeLoaded(this)"> </iframe> </div> <div ng-if="!currentSelection.youtube || !preview.play" class="browseWallpaperDetailsViewInner"> <img ng-src="{{currentSelection.preview}}" class="previewImage"> <div class="browseWallpaperDetailViewYoutubePlayOverlay" ng-show="currentSelection.youtube"> <a ng-click="preview.play = true"> <div> <span class="centerButton"> <span class="fas fa-play playButton"></span> </span> </div> </a> </div> </div> </div> <div class="info"> <div class="browseWallpaperDetailViewTopPadding" ng-if="isMiniMode || currentSelection.youtube"> <div class="browseWallpaperPagination" ng-if="isMiniMode"> <span><a class="fas fa-angle-double-left paginationIcon" ng-click="navigateWallpapers(\'left\')"></a></span> <span><a class="fas fa-angle-double-right paginationIcon" ng-click="navigateWallpapers(\'right\')"></a></span> </div> </div> <div class="content-title"> {{currentSelection.title}} </div> <div class="infoRow center" ng-if="!currentSelection.local"> <workshop-author wa-item="currentSelection" wa-infos="steamUserInfos" wa-browse-author="callbackBrowseAuthor" wa-open-user-page="openSteamUserPage"></workshop-author> </div> <div ng-if="currentSelection.hasrating" class="infoRow browseWallpaperDetailsWorkshopRateRow"> <workshop-rating wr-item="currentSelection" set-user-vote="setUserVote" set-favorited="setFavorited"></workshop-rating> </div> <div class="infoRow center infoRowFaint"> <span>{{(currentSelection.typelabel|translate) || getDisplayType(currentSelection.type)}}</span> <span style="margin-left:6px" ng-if="currentSelection.filesizelabel">{{currentSelection.filesizelabel}}</span> </div> <div class="infoRow center wrap" ng-if="currentSelection.tags"> \x3c!-- <span class="fas fa-tags infoRowIcon"></span> --\x3e \x3c!-- {{getDisplayTags(currentSelection.tags)}} --\x3e <span ng-repeat="tag in getDisplayTags(currentSelection.tags)" class="infoTagPill">{{tag}}</span> </div> </div> <div class="detailButtons"> <div ng-if="currentSelection.workshopid"> <div class="browseWallpaperDetailsWorkshopControls"> <a ng-if="currentSelection.status != \'downloadable\'" ng-click="callbackUnsubscribeOrRemove(currentSelection)" class="btn btn-danger"> <span class="fas fa-times" aria-hidden="true"></span> {{\'ui_browse_details_btn_unsubscribe\' | translate}} </a> <a ng-if="currentSelection.status == \'downloadable\'" ng-click="subscribeWorkshopItem(currentSelection)" class="btn btn-success"> <span class="fas fa-download" aria-hidden="true"></span> {{\'ui_browse_details_btn_download\' | translate}} </a> <div class="smallRow"> <a ng-if="canOpenWallpaperDetailsOnPlatform" ng-click="openSteamWorkshopPage(currentSelection)" class="btn btn-default" tooltip="ui_browse_details_btn_workshop" t-align-right="true"> <span class="fa-fw" ng-class="providerIcon" aria-hidden="true"></span> <span class="detailsCommentLabel" translate="ui_browse_details_btn_comment"></span> </a> <a ng-if="canOpenWallpaperDetailsOnWeb" ng-click="copyWorkshopUrl(currentSelection)" class="btn btn-default" tooltip="ui_browse_details_btn_copy_url" t-align-right="true"> <span class="fas fa-fw fa-copy" aria-hidden="true"></span> </a> <a ng-if="canSendReports && !isUsingBackup" ng-click="openReportDialog(currentSelection)" class="btn btn-default" tooltip="ui_browse_details_btn_report" t-align-right="true"> <span class="fas fa-fw fa-exclamation-triangle" aria-hidden="true"></span> </a> </div> </div> </div> <div ng-if="currentSelection.localAndExternal || currentSelection.official"> <a ng-click="callbackUnsubscribeOrRemove(currentSelection)" class="btn btn-danger fullWidth"> <span class="fas fa-times" aria-hidden="true"></span> {{\'ui_browse_details_btn_remove_from_history\' | translate}} </a> </div> <div ng-if="!(currentSelection.localAndExternal || currentSelection.official || currentSelection.workshopid)"> <a ng-click="callbackOpenInEditor(currentSelection)" class="btn btn-primary fullWidth"> <span class="fas fa-folder-open" aria-hidden="true"></span> {{\'ui_browse_details_btn_open_in_editor\' | translate}} </a> <div style="margin-top:10px;text-align:center;" translate="ui_browse_details_local_editor_hint"></div> </div> </div> <div ng-if="mobileManagerState.connectedDevices.length > 0 && canUploadWallpaperToMobileDevice(currentSelection)" class="browseWallpaperDetailsProperties"> <div class="browseWallpaperDetailsHeader"> <h5 class="browseWallpaperDetailsHeaderItem" translate="ui_browse_details_mobile_devices"></h5> <hr class="browseWallpaperDetailsHeaderDivider"> </div> <script type="text/ng-template" id="sendToAdvertiseTemplate.html"> <div ng-click="sendToMobileDevice(currentSelection, mobileManagerState.connectedDevices[0])" translate="ui_browse_advertise_send_to_mobile"></div> <\/script> <div class="browseWallpaperDetailSendToDeviceList" style="margin-top:4px" uib-popover-template="\'sendToAdvertiseTemplate.html\'" popover-placement="left" popover-is-open="browserSettings.advertisesendtomobile" popover-trigger="none" popover-class="popoverAdvertiseWorkshop" popover-append-to-body="true"> <a ng-repeat="device in mobileManagerState.connectedDevices" ng-click="sendToMobileDevice(currentSelection, device)" class="btn btn-default fullWidth sendBtn"> <span class="far fa-mobile-android" aria-hidden="true"></span> <span translate="ui_browse_details_btn_send_to_mobile_device" translate-values="{device:device.name}"></span> </a> </div> </div> <div ng-if="currentSelection.status == \'installed\'" class="browseWallpaperDetailsProperties"> <div class="browseWallpaperDetailsHeader"> <h5 class="browseWallpaperDetailsHeaderItem" translate="ui_browse_details_properties"></h5> <hr class="browseWallpaperDetailsHeaderDivider"> </div> <div id="BrowserUserPropertiesParent"></div> <div ng-if="showPresetPublishOptions(currentSelection)"> <div class="browseWallpaperDetailsHeader"> <h5 class="browseWallpaperDetailsHeaderItem" translate="ui_browse_details_header_workshop"></h5> <hr class="browseWallpaperDetailsHeaderDivider"> </div> <div class="browseWallpaperDetailsActions"> <div class="browseWallpaperDetailsActionsRow"> <button class="btn btn-default browseWallpaperDetailsActionsRowItem" ng-click="callbackBrowsePresets(currentSelection)" tooltip="ui_browse_details_properties_preset_browse_workshop" t-values="{count:getNumberOfWorkshopPresets(currentSelection)}" t-align-right="true"><span ng-class="providerIcon + \'fa-fw\'"></span> <span class="browseWallpaperDetailsActionsRowItemLabel" translate="ui_browse_details_properties_preset_browse_workshop" translate-values="{count:getNumberOfWorkshopPresets(currentSelection)}"></span></button> <button class="btn btn-default browseWallpaperDetailsActionsRowItem browseWallpaperDetailsActionsRowItemSmall" ng-click="callbackShowPresetHint()"><span class="fas fa-fw fa-question"></span></button> </div> <div class="browseWallpaperDetailsActionsRow"> <button class="btn btn-primary browseWallpaperDetailsActionsRowItem" ng-click="callbackPublishPreset()"><span class="fas fa-fw fa-share"></span> {{\'ui_browse_details_properties_preset_publish_to_workshop\'|translate}}</button> </div> </div> </div> <div class="browseWallpaperDetailsHeader"> <h5 class="browseWallpaperDetailsHeaderItem" translate="ui_browse_details_header_presets"></h5> <hr class="browseWallpaperDetailsHeaderDivider"> </div> <div class="browseWallpaperDetailsActions"> <div class="browseWallpaperDetailsActionsRow"> \x3c!-- load / save --\x3e <a class="btn btn-default browseWallpaperDetailsActionsRowItem" ng-click="callbackLoadWallpaperProperties()" tooltip="ui_browse_details_properties_load" t-align-right="true"><span class="fas fa-fw fa-folder-open"></span> <span class="browseWallpaperDetailsActionsRowItemLabel">{{\'ui_browse_details_properties_load\'|translate}}</span></a> <a class="btn btn-default browseWallpaperDetailsActionsRowItem" ng-click="callbackSaveWallpaperProperties()" tooltip="ui_browse_details_properties_save" t-align-right="true"><span class="fas fa-fw fa-save"></span> <span class="browseWallpaperDetailsActionsRowItemLabel">{{\'ui_browse_details_properties_save\'|translate}}</span></a> </div> <div class="browseWallpaperDetailsActionsRow" ng-if="currentSelection.type===\'Scene\'||currentSelection.type===\'Video\'||currentSelection.type===\'Image\'"> \x3c!-- set as default --\x3e <a class="btn btn-default browseWallpaperDetailsActionsRowItem" ng-click="callbackSavePropertiesAsDefaults(currentSelection.properties[selectedMonitor.location])"><span class="fas fa-fw fa-list-alt"></span> <span translate="ui_browse_details_properties_apply_to_all_wallpapers" class="browseWallpaperDetailsActionsRowItemLabel"></span><span translate="ui_browse_details_properties_apply_to_all" class="browseWallpaperDetailsActionsRowItemLabelShow"></span></a> </div> <div class="browseWallpaperDetailsActionsRow"> \x3c!-- share json --\x3e <a class="btn btn-default browseWallpaperDetailsActionsRowItem" ng-click="callbackShareWallpaperProperties()"><span class="fas fa-fw fa-retweet"></span> {{\'ui_browse_details_properties_share_json\'|translate}}</a> </div> <div class="browseWallpaperDetailsActionsRow"> \x3c!-- reset --\x3e <a class="btn btn-danger browseWallpaperDetailsActionsRowItem" ng-click="callbackResetCurrentWallpaperProperties()"><span class="fas fa-fw fa-sync-alt"></span> {{\'ui_browse_details_properties_reset\'|translate}}</a> </div> </div> </div> </div> </div> </div> <div class="browseWallpaperFooter"> <div class="browseWallpaperFooterControls"> <div class="navigationControls controlFlex"> <div> <a class="btn btn-primary" tooltip="ui_browse_footer_btn_wallpaper_editor" ng-click="callbackShowEditor()" style="margin-right: 5px;"> <span class="fas fa-pencil-ruler" aria-hidden="true"></span> <span class="footerLeftText" translate="ui_browse_footer_btn_wallpaper_editor"></span> </a> <div class="btn-group dropup" tooltip="ui_browse_footer_btn_open_wallpaper" uib-dropdown is-open="status.isopen"> <a id="open-file-button-button" type="button" class="btn btn-default" uib-dropdown-toggle> <span class="glyphicon glyphicon-open" aria-hidden="true"></span> <span class="footerLeftText" translate="ui_browse_footer_btn_open_wallpaper"></span> </a> <ul class="dropdown-menu" uib-dropdown-menu role="menu"> <li role="menuitem"><a ng-click="callbackShowEditor()"><span class="fas fa-pencil-ruler"></span> <span translate="ui_browse_footer_btn_create_new_wallpaper"></span></a></li> <li role="menuitem"><a ng-click="openFromFile()"><span class="fas fa-film"></span> <span translate="ui_browse_footer_btn_open_animated_wallpaper"></span></a></li> <li role="menuitem"><a ng-click="openFromFile(\'static\')"><span class="fas fa-image"></span> <span translate="ui_browse_footer_btn_open_static_wallpaper"></span></a></li> <li role="menuitem"><a ng-click="openFromUrl()"><span class="fas fa-globe"></span> <span translate="ui_browse_footer_btn_open_from_url"></span></a></li> </ul> </div> </div> </div> \x3c!-- <div class="center" ng-if="generalUserSettings.allowbrowseropacity">\r\n <span class="fas fa-adjust centerIcon"></span>\r\n <rzslider class="centerSlider" rz-slider-model="viewOpacity.value" rz-slider-options="{ceil:100, floor:30}"></rzslider>\r\n </div> --\x3e <div> <div class="controls footerButtons"> <a class="btn btn-primary" ng-click="callbackOk()" translate="ui_ok"></a> <a class="btn btn-default" ng-click="callbackClose()" translate="ui_cancel"></a> </div> </div> </div> </div> <div class="browseWallpaperDropOverlay"> <div native-drop-target="dropFileEditor(droppedFiles)" style="margin-bottom:20px" ndt-config="dropConfigEditor"></div> <div native-drop-target="dropFile(droppedFiles)" ndt-config="dropConfigBrowser"></div> </div> </div> <div class="browseMonitorSelectionContainer" ng-hide="!changeMonitorActive"> <div class="backdrop" ng-click="toggleMonitorSelectionBackground($event)"></div> <div class="monitorModalOuter"> <div class="inner"> <div class="row" ng-click="toggleMonitorSelection()" style="cursor:pointer"> <a class="closeSelection"> <h3 style="margin:0"><span class="glyphicon glyphicon-chevron-up"></span></h3> </a> </div> <div class="row" ng-click="toggleMonitorSelection()" style="cursor:pointer;margin-bottom:15px;"> <div class="col-xs-12"> <h1 class="monitorHeader" translate="ui_browse_monitors_choose_monitor"></h1> </div> </div> <div ng-if="wallpaperConfigGroup==\'screensaver\'"> <div> <div class="row" style="margin-top: 10px;"> <div class="col-xs-12 monitorLayoutRow"> <div class="browseWallpaperScreensaverModeRow" style="margin:0"> <div class="browseWallpaperScreensaverModeRowInner"> <span class="lbl" translate="ui_browse_monitors_screensaver_mode_label"></span> <button class="btn" style="flex:1" ng-class="{\'btn-default\':!wallpaperConfigScreensaver.sameaswallpaper,\'btn-primary\':wallpaperConfigScreensaver.sameaswallpaper}" translate="ui_browse_monitors_same_as_wallpaper" ng-click="wallpaperConfigScreensaver.sameaswallpaper=true"></button> <button class="btn" style="flex:1" ng-class="{\'btn-default\':wallpaperConfigScreensaver.sameaswallpaper,\'btn-primary\':!wallpaperConfigScreensaver.sameaswallpaper}" translate="ui_browse_monitors_configured_separately" ng-click="wallpaperConfigScreensaver.sameaswallpaper=false"></button> </div> </div> </div> </div> <div class="row" style="margin-top:20px;" ng-if="wallpaperConfigScreensaver.sameaswallpaper"> <div class="col-xs-12 monitorLayoutRow"> <div class="browseAlert"> <uib-alert> <div style="display:flex;align-items:center;"> <div translate="ui_browse_monitors_same_as_wallpaper_hint"></div> </div> </uib-alert> </div> </div> </div> </div> <hr ng-if="!wallpaperConfigScreensaver.sameaswallpaper"> </div> <div ng-show="wallpaperConfigGroup==\'wallpaper\'||!wallpaperConfigScreensaver.sameaswallpaper"> <div class="row browseMonitorSelectionButtonRow"> <div class="col-xs-12 monitorLayoutRow"> <droplist class="monitorLayoutRowItem" dp-options="wallpaperConfigGroup==\'screensaver\'?layoutsScreensaver:layouts" dp-selected="wallpaperConfig.layout"></droplist> </div> </div> <div class="row" style="margin-top: 5px;" ng-show="wallpaperConfig.layout === 2"> <div class="col-xs-12 centerText" translate="ui_browse_monitors_clone_hdr_hint"> </div> </div> <div class="row browseMonitorSelectionButtonRow" ng-show="wallpaperConfig.layout === 0"> <div class="col-xs-12 monitorLayoutRow"> <a class="btn btn-default monitorLayoutRowItem" tooltip="ui_browse_monitors_split" ng-if="!selectedMonitor.isGroup && !selectedMonitor.isInGroup" ng-click="callbackSplitSelectedMonitor(selectedMonitor)"><span class="fas fa-fw fa-cut"></span> {{\'ui_browse_monitors_split\'|translate}}</a> \x3c!-- Remove group button --\x3e <a class="btn btn-danger monitorLayoutRowItem" ng-if="selectedMonitor.isGroup || selectedMonitor.isInGroup" ng-click="callbackRemoveGroup(selectedMonitor)" tooltip="ui_browse_monitors_ungroup"><span class="fas fa-fw fa-object-ungroup"></span> {{\'ui_browse_monitors_ungroup\'|translate}}</a> \x3c!-- Group extend button, no drop down --\x3e <button class="btn btn-default dropdown-toggle monitorLayoutRowItem" ng-if="!selectedMonitor.isSplit && selectedMonitor.isGroup" ng-class="{\'active\':monitorSelectionState.createGroup}" ng-disabled="monitors.length < 2" tooltip="ui_browse_monitors_group" data-toggle="dropdown" ng-click="monitorSelectionState.createGroup=selectedMonitor.layout"><span class="fas fa-fw fa-object-group"></span> {{\'ui_browse_monitors_group\'|translate}}</button> \x3c!-- Group create button with drop down --\x3e <div class="monitorLayoutRowItem" ng-if="!selectedMonitor.isSplit && !selectedMonitor.isGroup" style="position:relative"> <button class="btn btn-default dropdown-toggle" ng-class="{\'active\':monitorSelectionState.createGroup}" ng-disabled="monitors.length < 2" tooltip="ui_browse_monitors_group" data-toggle="dropdown" ng-click="callbackCancelMonitorGrouping($event)" style="width: 100%;"><span class="fas fa-fw fa-object-group"></span> {{\'ui_browse_monitors_group\'|translate}}</button> <ul class="dropdown-menu" style="width:100%"> <li ng-click="monitorSelectionState.createGroup=1"> <a><span class="fas fa-fw fa-object-group"></span> <div class="dropdown-san-item" translate="ui_browse_monitors_stretch"></div> </a> </li> <li ng-click="monitorSelectionState.createGroup=2"> <a><span class="fas fa-fw fa-clone"></span> <div class="dropdown-san-item" translate="ui_browse_monitors_clone"></div> </a> </li> </ul> </div> <a class="btn btn-danger monitorLayoutRowItem" ng-if="selectedMonitor.isSplit" ng-click="callbackRemoveSplit(selectedMonitor)" tooltip="ui_browse_monitors_remove_split"><span class="fas fa-fw fa-times"></span> {{\'ui_browse_monitors_remove_split\'|translate}}</a> </div> </div> <div class="row browseMonitorSelectionButtonRow" style="margin-bottom: 20px"> <div class="col-xs-12 monitorLayoutRow"> <a class="btn btn-default monitorLayoutRowItem" tooltip="ui_browse_monitors_load_profile" ng-click="callbackShowProfiles()"><span class="fas fa-fw fa-folder-open"></span> {{\'ui_browse_monitors_load_profile\'|translate}}</a> <a class="btn btn-default monitorLayoutRowItem" tooltip="ui_browse_monitors_save_profile" ng-click="callbackShowProfiles(true)"><span class="fas fa-fw fa-save"></span> {{\'ui_browse_monitors_save_profile\'|translate}}</a> </div> </div> <div> <div class="monitorSelectionInnerLayout"> \x3c!-- <div > --\x3e <div class="monitorSelectionBox" id="MonitorSelectionBox"> <div class="monitorSelectionFlex"> <div ng-attr-style="{{monitorSelectionBoxStyle}}" ng-class="{\'monitorSelectionGroupActive\':monitorSelectionState.createGroup}"> <monitor-selection ms-controller="monitorController" ms-monitors="monitors" ms-scale="monitorScale" ms-splits="monitorSplits" ms-selected-monitor="selectedMonitor" ms-make-selection="callbackSelectMonitor(monitor, toggleMonitorSelection === true)" ms-on-split-moved="callbackSplitMoved(location, position)" ms-split-dbl-click="callbackSplitDblClick(location)" ms-selection-state="monitorSelectionState" ms-create-group="callbackCreateGroup(monitors)" ms-groups="monitorGroups" ms-layout="wallpaperConfig.layout" ms-monitor-context-menu="callbackMonitorRightClick($event, monitor, baseMonitor)" ms-split-context-menu="callbackSplitRightClick($event, location)" ms-user-monitor-settings="userMonitorSettings"></monitor-selection> </div> </div> </div> \x3c!-- </div> --\x3e </div> </div> <div class="buttonRow"> <a class="btn btn-primary" ng-click="toggleMonitorSelection()">{{wallpaperConfigGroup==\'screensaver\'?\'ui_browse_monitors_change_screensaver\':\'ui_browse_monitors_change_wallpaper\'|translate}}</a> <a class="btn btn-default" ng-click="callbackRemoveWallpaperAndPlaylistFromMonitor(selectedMonitor.location)">{{wallpaperConfigGroup==\'screensaver\'?\'ui_browse_monitors_remove_screensaver\':\'ui_browse_monitors_remove_wallpaper\'|translate}}</a> </div> </div> <div class="checkboxRow" ng-if="showMonitorAutoShowToggle"> <checkbox cb-checked="browserSettings.showmonitorselectiononstart" cb-title="\'ui_browse_monitors_show_on_start\'"></checkbox> </div> </div> </div> </div> <div class="browseMonitorSelectionContainer" ng-hide="!mobileDeviceManagementActive"> <div class="backdrop" ng-click="toggleManageMobileDevicesBackground($event)"></div> <div class="monitorModalOuter"> <div class="inner"> <div class="row" ng-click="toggleManageMobileDevices()" style="cursor:pointer;"> <a class="closeSelection"> <h3><span class="glyphicon glyphicon-chevron-up"></span></h3> </a> </div> <div class="row" ng-click="toggleManageMobileDevices()" style="cursor:pointer;"> <div class="col-xs-12"> <h1 class="monitorHeader" translate="ui_browse_mobile_devices_header"></h1> </div> </div> <div> <mobile-manager mm-state="mobileManagerState" mm-devices="browserSettings.paireddevices"></mobile-manager> </div> </div> </div> </div> <div class="browseWallpaperTopBar"> <div ng-if="steamWorkshopStatus" ng-click="callbackClickSteamStatus()" class="browseWallpapersWorkshopStatus" ng-class="{\'workshopError\' : steamWorkshopStatus.error, \'invis\':steamWorkshopStatus.hidden}"> <div> <span ng-class="providerIcon"></span></div> <div translate="{{steamWorkshopStatus.text}}" translate-values="{{steamWorkshopStatus}}"></div> </div> </div> <div class="browseMobileToastParent ng-hide" ng-show="mobileUploadState.visible"> <div class="toast"> <div> <wp-anim class="wpAnimMobile" wpa-file="anims/logo_white.json" wpa-playing="mobileUploadState.visible"></wp-anim> </div> <div class="status"> <div class="message" translate="{{mobileUploadState.token}}" translate-values="mobileUploadState"></div> <div class="info">{{mobileUploadState.status|translate}}</div> </div> <div class="controls"> <a ng-click="cancelMobileUploads()" class="cancelButton"> <span class="fas fa-times"></span> </a> </div> <div class="mmProgress" ng-attr-style="width:{{mobileUploadState.progress * 100}}%"></div> </div> </div> </div> '),e.put("views/views/editor.html",'<div ng-class="editorLayoutClass"> <filemenu fm-items="filemenu" fm-data="editorSettings"></filemenu> <div class="clientArea hasFilemenu"> \x3c!--<div id="asdsadsa" style="position:absolute;width:200px;height:200px;z-index:9999;top: 20px;left: 20px;"></div>--\x3e <div class="editorToolbar"> <div> <div class="editorToolbarContextGroup" ng-if="!gizmoContext"> <a ng-if="project.scene.is2d" class="fa-stack fa-2x editorToolbarButton" ng-click="setGizmoMode(\'multi\')" ng-class="{\'active\':gizmoMode===\'multi\'}" tooltip="{{tooltips.ui_editor_gizmo_multi}}"> <span class="far fa-fw fa-circle fa-stack-1x" style="font-size: 1.3em"></span> <span class="fas fa-fw fa-arrows-alt fa-stack-1x" style="font-size: 0.8em"></span> </a> <a class="editorToolbarButton" ng-click="setGizmoMode(\'translate\')" ng-class="{\'active\':gizmoMode===\'translate\'}" tooltip="{{tooltips.ui_editor_gizmo_translate}}"> <span class="fas fa-fw fa-arrows-alt"></span> </a> <a class="editorToolbarButton" ng-click="setGizmoMode(\'rotate\')" ng-class="{\'active\':gizmoMode===\'rotate\'}" tooltip="{{tooltips.ui_editor_gizmo_rotate}}"> <span class="fas fa-fw fa-sync-alt"></span> </a> <a class="editorToolbarButton" ng-click="setGizmoMode(\'scale\')" ng-class="{\'active\':gizmoMode===\'scale\'}" tooltip="{{tooltips.ui_editor_gizmo_scale}}"> <span class="fas fa-fw fa-expand-arrows-alt"></span> </a> <div class="editorToolbarSeparator"> <div></div> </div> <button class="editorToolbarButton" ng-click="setGizmoOrientation(\'world\')" ng-disabled="isGizmoOrientationLocked()" ng-class="{\'active\':gizmoOrientation[gizmoMode]===\'world\'}" tooltip="{{tooltips.ui_editor_gizmo_world_space}}"> <span class="fas fa-fw fa-globe"></span> </button> <button class="editorToolbarButton" ng-click="setGizmoOrientation(\'local\')" ng-disabled="isGizmoOrientationLocked()" ng-class="{\'active\':gizmoOrientation[gizmoMode]===\'local\'}" tooltip="{{tooltips.ui_editor_gizmo_local_space}}"> <span class="fas fa-fw fa-house"></span> </button> </div> <div class="editorToolbarContextGroup" ng-if="gizmoContext==\'puppetgeometry\'"> <span class="far fa-vector-polygon fa-fw editorToolbarContextGroupIcon"></span> <a class="editorToolbarButton" ng-click="setGizmoGeometryMode(\'translate\')" ng-class="{\'active\':gizmoGeometryMode===\'translate\'}" tooltip="{{tooltips.ui_editor_gizmo_translate}}"> <span class="fas fa-fw fa-arrows-alt"></span> </a> <a class="editorToolbarButton" ng-click="setGizmoGeometryMode(\'rotate\')" ng-class="{\'active\':gizmoGeometryMode===\'rotate\'}" tooltip="{{tooltips.ui_editor_gizmo_rotate}}"> <span class="fas fa-fw fa-sync-alt"></span> </a> <a class="editorToolbarButton" ng-click="setGizmoGeometryMode(\'scale\')" ng-class="{\'active\':gizmoGeometryMode===\'scale\'}" tooltip="{{tooltips.ui_editor_gizmo_scale}}"> <span class="fas fa-fw fa-expand-arrows-alt"></span> </a> </div> <div class="editorToolbarSeparator"> <div></div> </div> <button class="editorToolbarButton" ng-disabled="!undoState || !undoState.canundo" ng-click="performUndoRedo()"> <span class="fas fa-fw fa-undo"></span> </button> <button class="editorToolbarButton" ng-disabled="!undoState || !undoState.canredo" ng-click="performUndoRedo(true)"> <span class="fas fa-fw fa-redo"></span> </button> <div class="editorToolbarSeparator"> <div></div> </div> <a class="editorToolbarButton" ng-click="toggleShowGrid()" ng-class="{\'active\':editorSettings.showgrid}" tooltip="ui_editor_filemenu_show_grid"> <span class="fas fa-fw fa-th"></span> </a> <a class="editorToolbarButton" ng-click="toggleShowSelectionBox()" ng-class="{\'active\':editorSettings.showselectionbox}" tooltip="ui_editor_filemenu_show_selection_box"> <span class="far fa-fw fa-square"></span> </a> <a class="editorToolbarButton" ng-click="toggleShowStats()" ng-class="{\'active\':editorSettings.showstatsmode===\'always\'}" tooltip="ui_editor_filemenu_show_stats"> <span class="fas fa-fw fa-chart-line"></span> </a> <div class="editorToolbarSeparator"> <div></div> </div> <a class="editorToolbarButton" ng-click="toggleDesktopPreview()" ng-class="{\'active\':editorTemp.previewdesktop}" tooltip="ui_editor_filemenu_show_desktop_preview"> <span class="fas fa-fw fa-desktop"></span> </a> <a class="editorToolbarButton" ng-click="togglePhonePreview()" ng-class="{\'active\':editorTemp.previewphone}" tooltip="ui_editor_filemenu_show_phone_preview"> <span class="fas fa-fw fa-mobile-android-alt"></span> </a> <button class="editorToolbarButton" ng-click="togglePreviewFPSLock()" ng-class="{\'active\':editorSettings.previewfpslock}" tooltip="ui_editor_filemenu_toggle_preview_fps_lock" ng-disabled="!isRunningScriptPreview"> <span class="fas fa-fw fa-gauge-circle-minus"></span> </button> \x3c!-- <a class="editorToolbarButton fa" ng-click="setCameraMode(\'fly\')" ng-class="{\'active\':cameraMode===\'fly\'}" tooltip="Camera mode \'fly\'">\r\n <span class="fas fa-plane"></span>\r\n <span class="editorToolbarButtonCameraAddon fas fa-camera"></span>\r\n </a>\r\n <a class="editorToolbarButton fa" ng-click="setCameraMode(\'pivot\')" ng-class="{\'active\':cameraMode===\'pivot\'}" tooltip="Camera mode \'pivot\'">\r\n <span class="fas fa-street-view"></span>\r\n <span class="editorToolbarButtonCameraAddon fas fa-camera"></span>\r\n </a> --\x3e </div> <div ng-if="showRunScript || isRunningScriptPreview"> <button class="btn btn-default" ng-if="!isRunningScriptPreview" ng-click="callbackRunScriptPreview(true)" ng-disabled="waitForScriptToggle || keyDisableScriptPreview"><span class="fas fa-play successText"></span> <span translate="ui_editor_script_run_scripts"></span></button> <button class="btn btn-default" ng-if="isRunningScriptPreview" ng-click="callbackRunScriptPreview(false)" ng-disabled="waitForScriptToggle"><span class="fas fa-stop dangerText"></span> <span translate="ui_editor_script_stop_scripts"></span></button> </div> <div class="rightToolbarElement"></div> </div> <div class="editorLayoutRoot" layout l-layout-type="layoutType" l-ctrl="layoutCtrl" l-saved-layouts="editorSettings.savedlayouts"> <div class="editorLayoutPanel editorSceneGraphRootContainer" layout-panel="{tag: \'files\', title: \'ui_editor_treeview_header_files\', icon: \'fas fa-fw fa-copy\'}"> <div class="editorSceneGraphTree"> <tree-view class="treeViewRoot" tv-drag-drop-tag="renderable" tv-data="project.tree" tv-selected-item="selectedResource"></tree-view> </div> </div> <div class="editorLayoutPanel editorSceneGraphRootContainer" layout-panel="{tag: \'layers\', title: \'ui_editor_tooltip_layers\', icon: \'fas fa-fw fa-layer-group\'}"> <div> <a class="btn btn-primary fullWidth" ng-click="showAddRenderableModal()"><span class="fas fa-plus"></span> {{\'ui_editor_camera_add_renderable\' | translate}}</a> </div> <div class="editorSceneGraphTree"> <tree-view class="treeViewRoot" tv-drag-drop-tag="renderable" tv-drag-drop-enabled="project.data.type===\'scene\'" tv-data="project.tree" tv-mode="\'sceneHierarchy\'" tv-selected-item="selectedResource" tv-remove-clicked="onResourceRemove(item)" tv-element-dragged="onResourceDragged(from, to, count, parent)" tv-new-element-added="onResourceAddedToScene(item, index, hierarchyData)" tv-send-asset-property-change="sendAssetPropertyChange(resource, property)" tv-context-menu="callbackAssetContextMenu($event, item)" tv-validate-parent="callbackValidateParent(item, parent, errorInfo)" tv-show-error="callbackShowHierarchyError(message)"></tree-view> </div> <div class="editorScriptBlockOverlay" ng-if="isRunningScriptPreview || waitForScriptToggle"></div> </div> \x3c!-- <div class="editorLayoutPanel editorSceneGraphRootContainer" layout-panel="{tag: \'camerapaths\', title: \'ui_editor_pane_header_camera\', icon: \'fas fa-fw fa-camera\', canClose: true, hidden: true, siblingTag: \'sceneoptions\'}">\r\n <div>\r\n <a class="btn btn-primary fullWidth" ng-click="addCameraPath()"><span class="fas fa-plus"></span> {{\'ui_editor_camera_add_path\' | translate}}</a>\r\n </div>\r\n <div class="editorSceneGraphTree">\r\n <tree-view class="treeViewRoot" tv-drag-drop-tag="camera" tv-drag-drop-enabled="true" tv-data="project.camerapaths" tv-mode="\'scene\'" tv-selected-item="selectedResource" tv-remove-clicked="onCameraPathRemove(item)" tv-element-dragged="onCameraPathDragged(from, to)"></tree-view>\r\n </div>\r\n <div class="editorScriptBlockOverlay" ng-if="isRunningScriptPreview || waitForScriptToggle"></div>\r\n </div> --\x3e <div class="editorLayoutPanel editorPropertyPaneRoot" layout-panel="{tag: \'sceneoptions\', title: \'ui_editor_tooltip_scene_options\', icon: \'fas fa-fw fa-cog\'}"> <div class="editorPropertyPaneProperties"> <property-list p-list="project.scenegeneralproperties.properties" p-ctrl="propertyControl" p-owner="project.scenegeneralproperties" p-condition-scope="this" p-modal-depth="0"></property-list> </div> <div class="editorScriptBlockOverlay" ng-if="isRunningScriptPreview || waitForScriptToggle"></div> </div> <div class="editorLayoutPanel editorLayoutPreview" native-drop-target="dropFile(droppedFiles)" ndt-extension-tag="nativeDropOptions.previewExtension" ndt-desired-modal-depth="0" layout-panel="{tag: \'preview\', title: \'ui_editor_pane_header_preview\', noHide: true, icon: \'fas fa-fw fa-image\'}"> <div class="previewContainer"> \x3c!-- <span ng-if="isEditingCameraPath()" disable-animate class="editorOverlayIcon fas fa-video fa-3x"></span> --\x3e <span ng-if="paintOptions.enabled" disable-animate class="editorOverlayIcon fas fa-paint-brush fa-3x"></span> <div class="editorSceneStatsOverlay" ng-if="editorSettings.showstatsmode!=\'never\'" ng-class="{autoMode:editorSettings.showstatsmode==\'auto\'}"> \x3c!-- <div class="item"><span translate="ui_editor_stats_title"></span></div> --\x3e <div class="item" ng-class="{\'danger\':isRunningScriptPreview&&editorSettings.previewfpslock>0}"><span translate="{{(isRunningScriptPreview&&editorSettings.previewfpslock>0)?\'ui_editor_stats_fps_limited\':\'ui_editor_stats_fps\'}}"></span><span>{{renderStats.fps}}</span></div> <div class="item" ng-class="{\'danger\':renderStats.texturememory>400}"><span translate="ui_editor_stats_texture_memory"></span><span>{{renderStats.texturememory}} <a class="editorOverlayLink" ng-if="renderStats.texturememory>400" ng-click="showTextureOptimizationFaq()"><span class="fas fa-question-circle"></span></a></span></div> <div class="item" ng-if="renderStats.lightcount>0" ng-class="{\'danger\':renderStats.lightcount>6}"><span translate="ui_editor_stats_light_count"></span><span>{{renderStats.lightcount}}</span></div> <div class="item" ng-class="{\'danger\':renderStats.scriptexecutiontime>10}"><span translate="ui_editor_stats_script_execution_time"></span><span>{{renderStats.scriptexecutiontime.toFixed(3)}}</span></div> <div class="item" ng-if="renderStats.performancegroupwarning_expensive>0" ng-class="{\'danger\':renderStats.performancegroupwarning_expensive>10}"><span translate="{{renderStats.performancegroupwarning_expensive>10?\'ui_editor_stats_performance_group_warning_expensive\':\'ui_editor_stats_performance_group_expensive\'}}"></span><span>{{renderStats.performancegroupwarning_expensive||0}}</span></div> <div class="item" ng-if="renderStats.performancegroupwarning_veryexpensive>0" ng-class="{\'danger\':renderStats.performancegroupwarning_veryexpensive>1}"><span translate="{{renderStats.performancegroupwarning_veryexpensive>1?\'ui_editor_stats_performance_group_warning_very_expensive\':\'ui_editor_stats_performance_group_very_expensive\'}}"></span><span>{{renderStats.performancegroupwarning_veryexpensive||0}}</span></div> <div class="item"><span translate="ui_editor_stats_draw_calls"></span><span>{{renderStats.drawcalls}}</span></div> <div class="item"><span translate="ui_editor_stats_primitives"></span><span>{{renderStats.renderedprimitives}}</span></div> <div class="item" ng-class="{\'danger\':renderStats.programcount>100}"><span translate="ui_editor_stats_program_count"></span><span>{{renderStats.programcount}}</span></div> <div class="item"><span translate="ui_editor_stats_framebuffer_copies"></span><span>{{renderStats.framebuffercopies}}</span></div> <div class="item"><span translate="ui_editor_stats_particle_count"></span><span>{{renderStats.particlecount}}</span></div> <div class="item"><span translate="ui_editor_stats_particle_memory"></span><span>{{renderStats.particlememory | number : 2}}</span></div> <div class="item" ng-class="{\'danger\':renderStats.particlesimulationtime>10}"><span translate="ui_editor_stats_particle_simulation_time"></span><span>{{renderStats.particlesimulationtime.toFixed(3)}}</span></div> <div class="item" ng-class="{\'danger\':renderStats.rendertargetstatechanges>100}"><span translate="ui_editor_stats_render_target_changes"></span><span>{{renderStats.rendertargetstatechanges}}</span></div> <div class="item" ng-if="renderStats.videotexturecount>0" ng-class="{\'danger\':renderStats.videotexturecount>3}"><span translate="ui_editor_stats_video_texture_count"></span><span>{{renderStats.videotexturecount}}</span></div> <div class="item" ng-if="renderStats.clippingmaskpasses>0" ng-class="{\'danger\':renderStats.clippingmaskpasses>5}"><span translate="ui_editor_stats_clipping_mask_pass_count"></span><span>{{renderStats.clippingmaskpasses}}</span></div> </div> <preview p-options="{tag:\'main\', ctrl:\'previewCtrl\', interactive:true}" p-aspect-ratio="editorTemp.previewaspect" p-input-handler="paintMouseHandler"></preview> \x3c!-- <camera-timeline ng-if="isEditingCameraPath()" ct-data="selectedResource.item"></camera-timeline> --\x3e </div> </div> <div class="editorLayoutPanel editorPropertyPaneRoot" layout-panel="{tag: \'properties\', title: \'ui_editor_pane_header_properties\', icon: \'fas fa-fw fa-list\'}"> <div class="editorNavigationHeader" ng-if="selectedResource.stack.length > 1"> <span><a class="lnk" ng-repeat="nav in selectedResource.stack track by $index" ng-click="navigateProperty(nav.key, nav.id)"> <span class="fas fa-caret-right ico"></span> <span class="lbl">{{nav.label ? (nav.label | translate) : nav.key}}</span> </a></span> </div> <div class="editorPropertyPaneProperties" id="SelectedResourcePropertyList"> <property-list p-list="selectedResource.item.properties" p-ctrl="propertyControl" p-owner="selectedResource.item" p-condition-scope="this" p-modal-depth="0" p-resource-pool="project.objectproperties"></property-list> <div ng-if="!selectedResource.item.key.startsWith(\'puppet\')"> <div class="divider"></div> <div class="ctrlButtons"> <a class="btn btn-default fullFlex" ng-click="doPropertiesCopy(selectedResource.item.properties)"><span class="fas fa-copy"></span> {{\'ui_browse_preset_modal_copy\'|translate}}</a> <a class="btn btn-default fullFlex" ng-click="doPropertiesPaste(selectedResource.item, selectedResource.item.properties)"><span class="fas fa-paste"></span> {{\'ui_browse_preset_modal_paste\'|translate}}</a> </div> </div> </div> <div class="editorScriptBlockOverlay" ng-if="isRunningScriptPreview || waitForScriptToggle"></div> </div> <div class="editorLayoutPanel editorAssetListingTreeViewContainer" layout-panel="{tag: \'assets\', title: \'ui_editor_pane_header_assets\', icon: \'fas fa-fw fa-copy\', canClose: true}"> <tree-view class="treeViewRoot" tv-drag-drop-tag="renderable" tv-drag-drop-enabled="true" tv-data="project.availableassets" tv-mode="\'directory\'"></tree-view> <div class="editorScriptBlockOverlay" ng-if="isRunningScriptPreview || waitForScriptToggle"></div> </div> <div class="editorLayoutPanel editorScriptLog" layout-panel="{tag: \'log\', title: \'ui_editor_pane_header_log\', icon: \'fas fa-fw fa-terminal\', canClose: true}"> <script-console sc-editor-settings="editorSettings" sc-msg-click="callbackClickScriptMessage(message)"></script-console> </div> <div class="editorLayoutPanel editorPropertyPreview" layout-panel="{tag: \'userproperties\', title: \'ui_editor_pane_header_user_properties\', icon: \'fas fa-fw fa-user\', canClose: true}"> <div class="propertyWrapper"> <user-properties up-properties="project.data.general.properties" up-project-data="project.data" up-controller="userPropertyPreviewCtrl" up-disable-editing="isRunningScriptPreview || waitForScriptToggle"></user-properties> </div> </div> <div class="editorLayoutPanel editorBrushSettings" layout-panel="{tag: \'brush\', title: \'ui_editor_pane_header_brush\', icon: \'fas fa-fw fa-paint-brush\', canClose: true, onClose: onPaintBrushClosed, hidden: true, noPadding: true, titleClass: \'editorBrushSettingsTitle\', siblingTag: \'sceneoptions\'}" layout-class="{rules:[{minWidth:300,minWidthClass:\'editorBrushSettingsSmall\'}]}"> <div class="editorBrushSettingsBox"> <div class="editorPaintOverlayControls"> <div> <a class="btn btn-primary fullWidth" ng-click="endPaint(true)"><span class="fas fa-save"></span> {{\'ui_ok\' | translate}}</a> <a class="btn btn-danger fullWidth" ng-click="endPaint(false)"><span class="fas fa-times"></span> {{\'ui_cancel\' | translate}}</a> </div> <div ng-if="paintOptions.mode != \'weightmask\' && paintOptions.mode != \'displacement\'"> <div style="display:flex;flex-direction:row;"> <a class="btn btn-default fullWidth" ng-disabled="!paintHistoryState.canundo" tooltip="Undo" ng-click="applyPaintHistory(true)"><span class="fas fa-undo"></span></a> <a class="btn btn-default fullWidth" ng-disabled="!paintHistoryState.canrepeat" tooltip="Repeat" ng-click="applyPaintHistory(false)"><span class="fas fa-redo"></span></a> </div> <a class="btn btn-default fullWidth" ng-click="clearPaint()"><span ng-class="{\'fas fa-fill-drip\':paintOptions.mode == \'depth\' || paintOptions.mode == \'opacitymask\' || paintOptions.mode == \'rgbmask\',\'far fa-file\':!(paintOptions.mode == \'depth\' || paintOptions.mode == \'opacitymask\' || paintOptions.mode == \'rgbmask\')}"></span> {{\'ui_editor_properties_clear\' | translate}}</a> </div> <div ng-if="paintOptions.mode == \'displacement\'"> <a class="btn btn-default fullWidth" ng-click="clearPaint()"><span class="far fa-file"></span> {{\'ui_editor_properties_clear\' | translate}}</a> </div> \x3c!--\r\n <div>\r\n <a class="btn btn-default fullWidth" ng-click="clearPaint()"><span class="far fa-file"></span> {{\'ui_editor_properties_clear\' | translate}}</a>\r\n <a class="btn btn-danger fullWidth" ng-click="endPaint(false)"><span class="fas fa-times"></span> {{\'ui_cancel\' | translate}}</a>\r\n </div>\r\n <div>\r\n <div style="display:flex;flex-direction:row;">\r\n <a class="btn btn-default fullWidth" ng-disabled="!paintHistoryState.canundo" tooltip="Undo" ng-click="applyPaintHistory(true)"><span class="fas fa-undo"></span></a>\r\n <a class="btn btn-default fullWidth" ng-disabled="!paintHistoryState.canrepeat" tooltip="Repeat" ng-click="applyPaintHistory(false)"><span class="fas fa-redo"></span></a>\r\n </div>\r\n <a class="btn btn-primary fullWidth" ng-click="endPaint(true)"><span class="fas fa-save"></span> {{\'ui_ok\' | translate}}</a>\r\n </div>\r\n --\x3e </div> </div> <div class="editorBrushSettingsBox"> <div class="paintControlLabels" ng-if="paintOptions.mode == \'opacitymask\' || paintOptions.mode == \'depth\'"> <span class="paintControlLabelsText paintControlLabelsTextBreak" translate="ui_editor_properties_type"></span> <a class="btn" ng-class="{\'btn-primary\': paintOptions.brushtype == \'\', \'btn-default\':paintOptions.brushtype != \'\'}" ng-click="paintOptions.brushtype = \'\'" tooltip="ui_editor_properties_draw"><span class="fas fa-fw fa-paint-brush"></span> <span class="typeLabel" translate="ui_editor_properties_draw"></span></a> <a class="btn" ng-class="{\'btn-primary\': paintOptions.brushtype == \'smooth\', \'btn-default\':paintOptions.brushtype != \'smooth\'}" ng-click="paintOptions.brushtype = \'smooth\'" tooltip="ui_editor_properties_smooth"><span class="fas fa-fw fa-tint"></span> <span class="typeLabel" translate="ui_editor_properties_smooth"></span></a> </div> <div class="paintControlLabels" ng-if="paintOptions.mode == \'displacement\'"> <span class="paintControlLabelsText paintControlLabelsTextBreak" translate="ui_editor_properties_type"></span> <a class="btn" ng-class="{\'btn-primary\': paintOptions.brushtype == \'\', \'btn-default\':paintOptions.brushtype != \'\'}" ng-click="paintOptions.brushtype = \'\'" tooltip="ui_editor_properties_draw"><span class="fas fa-fw fa-arrow-up-to-dotted-line"></span> <span class="typeLabel" translate="ui_editor_properties_raise"></span></a> <a class="btn" ng-class="{\'btn-primary\': paintOptions.brushtype == \'subtract\', \'btn-default\':paintOptions.brushtype != \'subtract\'}" ng-click="paintOptions.brushtype = \'subtract\'" tooltip="ui_editor_properties_lower"><span class="fas fa-fw fa-arrow-down-to-dotted-line"></span> <span class="typeLabel" translate="ui_editor_properties_lower"></span></a> <a class="btn" ng-class="{\'btn-primary\': paintOptions.brushtype == \'flatten\', \'btn-default\':paintOptions.brushtype != \'flatten\'}" ng-click="paintOptions.brushtype = \'flatten\'" tooltip="ui_editor_properties_flatten"><span class="fas fa-fw fa-arrows-to-dotted-line"></span> <span class="typeLabel" translate="ui_editor_properties_flatten"></span></a> <a class="btn" ng-class="{\'btn-primary\': paintOptions.brushtype == \'smudge\', \'btn-default\':paintOptions.brushtype != \'smudge\'}" ng-click="paintOptions.brushtype = \'smudge\'" tooltip="ui_editor_properties_smudge"><span class="fas fa-fw fa-hand-point-down"></span> <span class="typeLabel" translate="ui_editor_properties_smudge"></span></a> <a class="btn" ng-class="{\'btn-primary\': paintOptions.brushtype == \'smooth\', \'btn-default\':paintOptions.brushtype != \'smooth\'}" ng-click="paintOptions.brushtype = \'smooth\'" tooltip="ui_editor_properties_smooth"><span class="fas fa-fw fa-tint"></span> <span class="typeLabel" translate="ui_editor_properties_smooth"></span></a> </div> <div class="paintControlLabels" ng-if="paintOptions.mode == \'weightmask\'"> <span class="paintControlLabelsText paintControlLabelsTextBreak" translate="ui_editor_properties_type"></span> <a class="btn" ng-class="{\'btn-primary\': paintOptions.brushtype == \'\', \'btn-default\':paintOptions.brushtype != \'\'}" ng-click="paintOptions.brushtype = \'\'" tooltip="ui_editor_properties_add"><span class="fas fa-fw fa-plus"></span> <span class="typeLabel" translate="ui_editor_properties_add"></span></a> <a class="btn" ng-class="{\'btn-primary\': paintOptions.brushtype == \'subtract\', \'btn-default\':paintOptions.brushtype != \'subtract\'}" ng-click="paintOptions.brushtype = \'subtract\'" tooltip="ui_editor_properties_subtract"><span class="fas fa-fw fa-minus"></span> <span class="typeLabel" translate="ui_editor_properties_subtract"></span></a> <a class="btn" ng-class="{\'btn-primary\': paintOptions.brushtype == \'smooth\', \'btn-default\':paintOptions.brushtype != \'smooth\'}" ng-click="paintOptions.brushtype = \'smooth\'" tooltip="ui_editor_properties_smooth"><span class="fas fa-fw fa-tint"></span> <span class="typeLabel" translate="ui_editor_properties_smooth"></span></a> </div> \x3c!-- <a class="btn"><span class="fas fa-fw fa-paint-brush"></span></a> --\x3e \x3c!-- <a class="btn"><span class="fas fa-fw fa-eraser"></span></a> --\x3e <div class="paintControlLabels" ng-if="paintOptions.mode == \'flowmask\'"> <span class="paintControlLabelsText" translate="ui_editor_properties_type"></span> <a class="btn" ng-class="{\'btn-primary\': paintOptions.brushtype == \'\', \'btn-default\':paintOptions.brushtype != \'\'}" ng-click="paintOptions.brushtype = \'\'" tooltip="ui_editor_properties_direction"><span class="fas fa-fw fa-arrow-from-left"></span> <span class="typeLabel" translate="ui_editor_properties_direction"></span></a> <a class="btn" ng-class="{\'btn-primary\': paintOptions.brushtype == \'smooth\', \'btn-default\':paintOptions.brushtype != \'smooth\'}" ng-click="paintOptions.brushtype = \'smooth\'" tooltip="ui_editor_properties_smooth"><span class="fas fa-fw fa-tint"></span> <span class="typeLabel" translate="ui_editor_properties_smooth"></span></a> <a class="btn" ng-class="{\'btn-primary\': paintOptions.brushtype == \'spin\', \'btn-default\':paintOptions.brushtype != \'spin\'}" ng-click="paintOptions.brushtype = \'spin\'" tooltip="ui_editor_properties_spin"><span class="fas fa-fw fa-sync-alt"></span> <span class="typeLabel" translate="ui_editor_properties_spin"></span></a> <a class="btn" ng-class="{\'btn-primary\': paintOptions.brushtype == \'spread\', \'btn-default\':paintOptions.brushtype != \'spread\'}" ng-click="paintOptions.brushtype = \'spread\'" tooltip="ui_editor_properties_spread"><span class="fas fa-fw fa-expand-arrows-alt"></span> <span class="typeLabel" translate="ui_editor_properties_spread"></span></a> <a class="btn" ng-class="{\'btn-primary\': paintOptions.brushtype == \'pinch\', \'btn-default\':paintOptions.brushtype != \'pinch\'}" ng-click="paintOptions.brushtype = \'pinch\'" tooltip="ui_editor_properties_pinch"><span class="fas fa-fw fa-compress-arrows-alt"></span> <span class="typeLabel" translate="ui_editor_properties_pinch"></span></a> <a class="btn" ng-class="{\'btn-primary\': paintOptions.brushtype == \'fixeddirection\', \'btn-default\':paintOptions.brushtype != \'fixeddirection\'}" ng-click="paintOptions.brushtype = \'fixeddirection\'" tooltip="ui_editor_properties_fixed_direction"><span class="fas fa-fw fa-arrow-right"></span> <span class="typeLabel" translate="ui_editor_properties_fixed_direction"></span></a> </div> </div> <div class="editorBrushSettingsBox" ng-if="paintOptions.brushtype == \'fixeddirection\'"> <div class="paintControlLabels"> <span class="paintControlLabelsText" translate="ui_editor_properties_angle"></span> <span> <knob ng-model="paintOptions.angle"></knob> </span> <span class="paintControlLabelsValue"> <input style="width:100%" type="number" step="any" onclick="this.select()" ng-model="paintOptions.angle" degree-converter="{\'round\':true}" number-input-controls> </span> </div> </div> <div class="editorBrushSettingsBox"> <div class="paintControlLabels" ng-if="paintOptions.mode == \'opacitymask\' || paintOptions.mode == \'depth\' || paintOptions.mode == \'flowmask\'"> <span class="paintControlLabelsText">{{paintOptions.mode == \'flowmask\' ? \'ui_editor_properties_strength\' : \'ui_editor_properties_amount\' | translate}}</span> <span> <rzslider rz-slider-model="paintOptions.value" rz-slider-options="{ceil:255, floor:0}"></rzslider> </span> <span class="paintControlLabelsValue labelElement" ng-click="makeLabelEditable($event, {name:\'value\',min:0,max:255})">{{paintOptions.value}}</span> <input class="inputElement" type="number"> <span class="editorPaintOverlayValuePreview" ng-attr-style="background-color: rgb({{paintOptions.value}}, {{paintOptions.value}}, {{paintOptions.value}})"></span> <a class="btn" ng-if="paintOptions.mode == \'opacitymask\' || paintOptions.mode == \'depth\'" ng-class="{\'btn-default\':!maskEyeDropperActive,\'btn-primary\':maskEyeDropperActive}" ng-click="startMaskEyeDropper()" tooltip="ui_editor_properties_eye_dropper_hotkey" t-values="{key:\'I\'}"><span class="fas fa-eye-dropper"></span></a> </div> <div class="paintControlLabels" ng-if="paintOptions.mode == \'rgbmask\'"> <span class="paintControlLabelsText" translate="ui_editor_properties_color"></span> <span> <spectrum-colorpicker options="colorPickerSettings" ng-model="paintOptions.color" on-show-options="{update:false}" vec-color-converter></spectrum-colorpicker> </span> </div> <div class="paintControlLabels"> <span class="paintControlLabelsText" translate="ui_editor_properties_size"></span> <span> <rzslider rz-slider-model="paintOptions.size" rz-slider-options="paintOptionsSliderSize"></rzslider> </span> <span class="paintControlLabelsValue labelElement" ng-click="makeLabelEditable($event, {name:\'size\',min:1,max:9999})">{{paintOptions.size}}</span> <input class="inputElement" type="number"> <span class="editorPaintOverlaySizePreview"> <span ng-attr-style="width: {{getPaintBrushSizePreview()}}px; height: {{getPaintBrushSizePreview()}}px"></span> </span> </div> </div> <div class="editorBrushSettingsBox"> <div class="paintControlLabels"> <span class="paintControlLabelsText" translate="ui_editor_properties_opacity"></span> <span> <rzslider rz-slider-model="paintOptions.opacity" rz-slider-options="{ceil:100, floor:1}"></rzslider> </span> <span class="paintControlLabelsValue labelElement" ng-click="makeLabelEditable($event, {name:\'opacity\',min:0,max:100})">{{paintOptions.opacity}}</span> <input class="inputElement" type="number"> <span class="editorPaintOverlaySizePreview"> <span ng-attr-style="opacity: {{paintOptions.opacity / 100}}"></span> </span> </div> <div class="paintControlLabels"> <span class="paintControlLabelsText" translate="ui_editor_properties_hardness"></span> <span> <rzslider rz-slider-model="paintOptions.hardness" rz-slider-options="{ceil:100, floor:0}"></rzslider> </span> <span class="paintControlLabelsValue labelElement" ng-click="makeLabelEditable($event, {name:\'hardness\',min:0,max:100})">{{paintOptions.hardness}}</span> <input class="inputElement" type="number"> <span class="editorPaintOverlaySizePreview"> <span ng-attr-style="width:12px;height:12px;filter: blur({{(1.0 - (paintOptions.hardness / 100)) * 6}}px)"></span> </span> </div> </div> <div class="editorBrushSettingsBox"> <div class="editorPaintOverlayControls" ng-if="paintOptions.mode != \'weightmask\'"> <div> \x3c!-- <a class="btn fullWidth" ng-class="{\'btn-default\':!paintOptionsLocal.isolateEffect,\'btn-primary\':paintOptionsLocal.isolateEffect}" translate="ui_editor_properties_isolate_effect" ng-click="togglePaintIsolateEffect()"></a> --\x3e <a class="btn fullWidth" ng-class="{\'btn-default\':!paintOptions.showmask,\'btn-primary\':paintOptions.showmask}" translate="ui_editor_properties_show_mask" ng-click="setPaintShowShading(false);paintOptions.showmask=!paintOptions.showmask" tooltip="ui_hotkey" t-values="{key:\'M\'}"></a> </div> <div ng-if="paintOptions.mode == \'displacement\'"> <a class="btn fullWidth" ng-class="{\'btn-default\':!getPaintShowShading(),\'btn-primary\':getPaintShowShading()}" translate="ui_editor_properties_show_shading" ng-click="paintOptions.showmask=false;setPaintShowShading(!getPaintShowShading())" tooltip="ui_hotkey" t-values="{key:\'N\'}"></a> </div> <div class="paintControlLabels" ng-if="paintOptions.showmask || getPaintShowShading()"> <span class="paintControlLabelsText" translate="ui_editor_properties_mask_opacity"></span> <span> <rzslider rz-slider-model="paintOptions.maskopacity" rz-slider-options="{ceil:100, floor:10}"></rzslider> </span> <span class="paintControlLabelsValue labelElement" ng-click="makeLabelEditable($event, {name:\'maskopacity\',min:0,max:100})">{{paintOptions.maskopacity}}</span> <input class="inputElement" type="number"> </div> <div class="paintControlLabels" ng-if="paintOptions.mode == \'displacement\' && (paintOptions.showmask || getPaintShowShading())"> <span class="paintControlLabelsText" translate="ui_editor_properties_wireframe_opacity"></span> <span> <rzslider rz-slider-model="paintOptions.wireframeopacity" rz-slider-options="{ceil:100, floor:0}"></rzslider> </span> <span class="paintControlLabelsValue labelElement" ng-click="makeLabelEditable($event, {name:\'wireframeopacity\',min:0,max:100})">{{paintOptions.wireframeopacity}}</span> <input class="inputElement" type="number"> </div> </div> </div> <div class="editorScriptBlockOverlay" ng-if="isRunningScriptPreview || waitForScriptToggle"></div> </div> \x3c!-- <div class="editorLayoutPanel" layout-panel="{tag: \'scripteditor\', title: \'ui_editor_pane_header_script_editor\', icon: \'fas fa-fw fa-code\'}">\r\n </div>\r\n <div class="editorLayoutPanel" layout-panel="{tag: \'shadereditor\', title: \'ui_editor_pane_header_shader_editor\', icon: \'fas fa-fw fa-code-branch\'}">\r\n </div> --\x3e </div> </div> <div class="browseWallpaperTopBar"> <div ng-if="steamWorkshopStatus" class="browseWallpapersWorkshopStatus" ng-class="{\'workshopError\':steamWorkshopStatus.error, \'invis\':steamWorkshopStatus.hidden}"> <div> <span ng-class="providerIcon"></span></div> <div translate="{{steamWorkshopStatus.text}}" translate-values="{{steamWorkshopStatus}}"></div> </div> </div> <div ng-if="blockEditorInput" class="editorInputBlock"></div> </div> '),e.put("views/views/empty.html",'<div class="text-center" style="padding-top: 15px;font-size: 170%"> <div>Nothing to see here.</div> <div style="color:#999;font-size:40%;">(Either you started the UI directly or there has been an error)</div> <div style="padding-top: 15px;"> <a class="btn btn-primary" style="font-size:150%;margin-top:20px;" onclick="window.ui.close()">{{btnText}}</a> \x3c!-- ng-click="showimg = true;" --\x3e </div> \x3c!-- <div ng-if="showimg" onclick="window.ui.close()" style="position: absolute; left: 0px; top: 0px; width:100%; height:100%; background: url(\'https://media.giphy.com/media/2ZgsAUCqN0q1a/giphy.gif\'); background-size: cover;background-position: center center;"></div>--\x3e </div> '),e.put("views/views/settings.html",'<div class="clientArea"> <div> <uib-tabset class="tab-animation settingsTabs" active="tabInfo.activeIndex"> \x3c!-- \r\n Performance tab\r\n --\x3e <uib-tab heading="{{\'ui_settings_performance\' | translate}}" select="refreshSlider()"> <div class="settingsContainer autoScrollY"> <div class="groupBox"> <div class="heading"><span class="fas fa-play headerIcon"></span> {{\'ui_settings_playback\'|translate}}</div> <div class="infoTable settingsPlaybackTable"> <div> <div class="infoTableLabel" translate="ui_settings_playback_focused"> </div> <div> <droplist dp-options="playbackOptionsFocus" dp-selected="generalSettings.playbackfocus"></droplist> </div> </div> <div> <div class="infoTableLabel" translate="ui_settings_playback_maximized"> </div> <div> <droplist dp-options="playbackOptionsMaximized" dp-selected="generalSettings.playbackmaximized"></droplist> </div> </div> <div> <div class="infoTableLabel" translate="ui_settings_playback_fullscreen"> </div> <div> <droplist dp-options="playbackOptionsFullscreen" dp-selected="generalSettings.playbackfullscreen"></droplist> </div> </div> <div> <div class="infoTableLabel" translate="ui_settings_playback_playing_audio"> </div> <div> <droplist dp-options="playbackOptionsAudio" dp-selected="generalSettings.playbackaudio"></droplist> </div> </div> <div> <div class="infoTableLabel" translate="ui_settings_playback_sleep"> </div> <div> <droplist dp-options="playbackOptionsSleep" dp-selected="generalSettings.playbacksleep"></droplist> </div> </div> <div ng-if="runtime.islaptop"> <div class="infoTableLabel" translate="ui_settings_playback_battery"> </div> <div> <droplist dp-options="playbackOptionsBattery" dp-selected="generalSettings.playbackonbattery"></droplist> </div> </div> <div> <div class="infoTableLabel" translate="ui_settings_playback_application_rules"></div> <div> <button class="btn btn-primary fullWidth" translate="ui_settings_playback_application_rules_edit" ng-click="editPerApplicationSettings()"></button> </div> </div> </div> </div> <div class="groupBox"> <div class="heading"><span class="fas fa-award headerIcon"></span> {{\'ui_settings_gfx_quality\'|translate}}</div> <div class="infoTable settingsPlaybackTable"> <div class="btn-group settingsQualityButtonRow"> <a class="btn btn-primary settingsQualityButton" ng-click="applyPreset(0)" translate="ui_settings_gfx_preset_low"></a> <a class="btn btn-primary settingsQualityButton" ng-click="applyPreset(1)" translate="ui_settings_gfx_preset_medium"></a> <a class="btn btn-primary settingsQualityButton" ng-click="applyPreset(2)" translate="ui_settings_gfx_preset_high"></a> <a class="btn btn-primary settingsQualityButton" ng-click="applyPreset(3)" translate="ui_settings_gfx_preset_ultra"></a> </div> <div style="position: relative"> <div class="infoTableLabel infoTableLabelWithExclamation"> <span translate="ui_settings_gfx_fps"></span> <div ng-if="generalSettings.fps > 30 && generalSettings.fps <= 60" class="infoTableExclamationWarning" tooltip="ui_settings_gfx_fps_warning" t-options="{delay:150}"> <span class="fas fa-exclamation-triangle"></span> </div> <div ng-if="generalSettings.fps > 60" class="infoTableExclamation" tooltip="ui_settings_gfx_fps_warning_high" t-options="{delay:150}"> <span class="fas fa-exclamation-triangle"></span> </div> </div> <div class="rzsliderContainer" style="width: 215px"> <rzslider rz-slider-model="generalSettings.fps" rz-slider-options="fpsSlider"></rzslider> </div> <div style="width: 30px; text-align: right;"> {{generalSettings.fps}} </div> </div> <div> <div class="infoTableLabel infoTableLabelWithExclamation"> <span translate="ui_settings_gfx_antialiasing"></span> <div ng-if="generalSettings.msaa==\'x8\'" class="infoTableExclamation" tooltip="ui_settings_gfx_tooltip_warn_msaa" t-options="{delay:150}"> <span class="fas fa-exclamation-triangle"></span> </div> </div> <div> <droplist class="dropup" dp-options="antiAliasingOptions" dp-selected="generalSettings.msaa"></droplist> </div> </div> <div> <div class="infoTableLabel infoTableLabelWithExclamation"> <span translate="ui_settings_gfx_post_processing"></span> <div ng-if="generalSettings.postprocessing==\'ultra\'||generalSettings.postprocessing==\'displayhdr\'" class="infoTableExclamationWarning" tooltip="ui_settings_gfx_tooltip_warn_post_processing_ultra" t-options="{delay:150}"> <span class="fas fa-exclamation-triangle"></span> </div> </div> <div> <droplist class="dropup" dp-options="postProcessingOptions" dp-selected="generalSettings.postprocessing"></droplist> </div> </div> <div> <div class="infoTableLabel" translate="ui_settings_gfx_texture_resolution"> </div> <div> <droplist class="dropup" class="dropNoPadding" dp-options="textureResolutionOptions" dp-selected="generalSettings.resolution"></droplist> </div> </div> <div> <div class="infoTableLabel" translate="ui_settings_gfx_shadows"> </div> <div> <droplist class="dropup" class="dropNoPadding" dp-options="lightingOptions" dp-selected="generalSettings.shadows"></droplist> </div> </div> <div> <div class="infoTableLabel" translate="ui_settings_gfx_volumetrics"> </div> <div> <droplist class="dropup" class="dropNoPadding" dp-options="lightingOptions" dp-selected="generalSettings.volumetrics"></droplist> </div> </div> <div class="settingsQualityCheckboxRow"> <div class="infoTableLabel" translate="ui_settings_gfx_reflections" ng-click="generalSettings.reflection=!generalSettings.reflection"> </div> <div> <checkbox cb-checked="generalSettings.reflection"></checkbox> </div> </div> </div> </div> </div> </uib-tab> \x3c!-- \r\n General tab\r\n --\x3e <uib-tab heading="{{\'ui_settings_general\' | translate}}" select="refreshSlider()"> <div class="settingsScoller"> <div class="settingsContainer"> <div class="groupBox"> <div class="heading"><span class="fas fa-star headerIcon"></span> {{\'ui_settings_startup\' | translate}}</div> <div class="infoTable settingsPlaybackTable"> <div> <div class="infoTableLabel" translate="ui_settings_start_with_windows" ng-click="(!generalSettings.autostartscheduler)?generalSettings.autostart=!generalSettings.autostart:null"></div> <div class="settingsGeneralAutoStartRow"> <checkbox cb-checked="generalSettings.autostart" cb-changed="toggleAutoStartRegistry(generalSettings.autostart)" class="autostart" cb-title="\'\'" ng-show="!generalSettings.autostartscheduler"></checkbox> <a class="btn btn-primary btn-sm autoStartButton" ng-class="{\'btn-success btn-autostart-set\':generalSettings.autostartscheduler}" ng-click="generalSettings.autostart&&toggleAutoStartScheduler(!generalSettings.autostartscheduler)" ng-disabled="!generalSettings.autostart"><img src="images/uac_small.png"> {{generalSettings.autostartscheduler ? \'ui_settings_remove_service\' : \'ui_settings_register_service\' | translate}}</a> </div> </div> <div class="settingsQualityCheckboxRow" ng-if="!generalSettings.vdesktopenabled"> <div class="infoTableLabel" ng-click="generalSettings.safemode=!generalSettings.safemode"> {{\'ui_settings_use_safe_mode\'|translate}} <a class="pull-right infoTableHint" ng-click="showGenericHelp($event, \'ui_settings_use_safe_mode\', \'ui_settings_use_safe_mode_hint\')"><span class="fas fa-question"></span></a> </div> <div> <checkbox cb-checked="generalSettings.safemode"></checkbox> </div> </div> <div class="settingsGeneralSlider"> <div class="infoTableLabel" ng-click="generalSettings.extremesleephack=!generalSettings.extremesleephack"> {{\'ui_settings_advanced_sleep_hack\'|translate}} <a class="pull-right infoTableHint" ng-click="showGenericHelp($event, \'ui_settings_advanced_sleep_hack\', \'ui_settings_advanced_sleep_hack_tip\')"><span class="fas fa-question"></span></a> </div> <div> <checkbox cb-checked="generalSettings.extremesleephack"></checkbox> </div> </div> </div> </div> <div class="groupBox"> <div class="heading"><span class="fas fa-cog headerIcon"></span> {{\'ui_settings_basic\' | translate}}</div> <div class="infoTable settingsPlaybackTable"> <div style="position: relative;"> <div class="infoTableLabel" translate="ui_settings_ui_language"></div> <div> <droplist class="settingsLanguageDropList" dp-options="availableLanguages" dp-selected="generalSettings.language"></droplist> </div> \x3c!-- <a ng-click="openTranslationHelp()" style="position: absolute;color:#A03; font-size:90%; bottom: -5px">Help translate Wallpaper Engine!</a> --\x3e </div> <div> <div class="infoTableLabel" translate="ui_settings_hotkeys"></div> <div> <button class="btn btn-primary fullWidth" translate="ui_settings_playback_application_rules_edit" ng-click="editHotkeys()"></button> </div> </div> <div style="position: relative;"> <div class="infoTableLabel" translate="ui_settings_wallpaper_browser_transition"></div> <div> <droplist class="settingsLanguageDropList" dp-options="transitionOptions" dp-selected="generalSettings.browsetransition.transition"></droplist> </div> </div> <div ng-if="generalSettings.browsetransition.transition === \'random\'"> <div class="browseWallpaperPlaylistSettingsTransitions" style="width:100%"> <a class="btn btn-default fullWidth browseWallpaperPlaylistSettingsTransitionBtn" ng-click="transitionSelectAll(true)" translate="ui_browse_playlist_modal_settings_transition_enable_all"></a> <a class="btn btn-default fullWidth browseWallpaperPlaylistSettingsTransitionBtn" ng-click="transitionSelectAll(false)" translate="ui_browse_playlist_modal_settings_transition_disable_all"></a> </div> </div> <div ng-if="generalSettings.browsetransition.transition === \'random\'" style="height:auto"> <div class="browseWallpaperPlaylistSettingsTransitions" style="width:100%"> <div ng-repeat="info in transitionOptionsButtons" class="browseWallpaperPlaylistSettingsTransitionBtn"> <a class="btn fullWidth" ng-class="{\'btn-default\':generalSettings.browsetransition.transitionpool&&generalSettings.browsetransition.transitionpool.indexOf(info.value)===-1,\'btn-primary\':!generalSettings.browsetransition.transitionpool||generalSettings.browsetransition.transitionpool.indexOf(info.value)>=0}" ng-click="transitionToggleSingle(info.value)">{{info.label|translate}}</a> </div> </div> </div> <div class="settingsGeneralSlider" ng-if="generalSettings.browsetransition.transition && generalSettings.browsetransition.transition !== \'none\' && generalSettings.browsetransition.transition !== \'-2\'"> <div class="rzsliderLabel"> <div class="infoTableLabel" translate="ui_browse_playlist_modal_settings_transition_time"></div> </div> <div class="rzsliderContainer"> <rzslider rz-slider-model="generalSettings.browsetransition.transitiontime" rz-slider-options="transitionTimeSlider"></rzslider> <div class="rzsliderSuffix"> {{generalSettings.browsetransition.transitiontime}} ms </div> </div> </div> </div> </div> <div class="groupBox"> <div class="heading"><span class="fab fa-windows headerIcon"></span> {{\'ui_settings_windows\' | translate}}</div> <div class="infoTable settingsPlaybackTable"> <div> <div class="infoTableLabel" translate="ui_settings_adjust_windows_color"></div> <div ng-if="runtime.lightthemewarning" class="infoTableExclamationWarning" tooltip="ui_settings_adjust_windows_color_light_theme_hint" t-options="{delay:150}"> <span class="fas fa-exclamation-triangle"></span> </div> <div> <droplist dp-options="adjustDWMColorModes" dp-selected="dwmColorSettings.adjustdwmcolormode"></droplist> </div> </div> <div class="settingsGeneralSlider"> <div class="rzsliderLabel"> <div class="infoTableLabel" translate="ui_settings_icon_opacity"></div> </div> <div class="rzsliderContainer"> <rzslider rz-slider-model="generalSettings.iconopacity" rz-slider-options="iconOpacitySlider"></rzslider> <div class="rzsliderSuffix"> {{generalSettings.iconopacity}}% </div> </div> </div> <div> <div class="infoTableLabel"> {{\'ui_settings_advanced_monitor_identification\'|translate}} <a class="pull-right infoTableHint" ng-click="showGenericHelp($event, \'ui_settings_advanced_monitor_identification\', \'ui_settings_advanced_monitor_identification_tip\')"><span class="fas fa-question"></span></a> </div> <div> <droplist class="" dp-options="monitorDetectionOptions" dp-selected="generalSettings.monitordetection"></droplist> </div> </div> <div ng-if="generalSettings.monitordetection==\'managed\'"> <div class="infoTableLabel" translate="ui_settings_advanced_manage_monitor"></div> <div> <button class="btn btn-primary fullWidth" translate="ui_settings_playback_application_rules_edit" ng-click="editManagedMonitors()"></button> </div> </div> <div class="settingsGeneralSlider"> <div class="infoTableLabel" ng-click="sharedSettings.slideshowwarningenabled=!sharedSettings.slideshowwarningenabled" translate="ui_win32_slideshow_compat_settings_label"> </div> <div> <checkbox cb-checked="sharedSettings.slideshowwarningenabled"></checkbox> </div> </div> <div class="settingsGeneralSlider"> <div class="infoTableLabel" ng-click="generalSettings.slideshowkiller=!generalSettings.slideshowkiller"> {{\'ui_settings_disable_slideshow\'|translate}} <a class="pull-right infoTableHint" ng-click="showGenericHelp($event, \'ui_settings_disable_slideshow\', \'ui_settings_disable_slideshow_tip\')"><span class="fas fa-question"></span></a> </div> <div> <checkbox cb-checked="generalSettings.slideshowkiller"></checkbox> </div> </div> <div class="settingsGeneralSlider"> <div class="infoTableLabel" ng-click="generalSettings.unpauseaero=!generalSettings.unpauseaero"> {{\'ui_settings_advanced_unpause_during_aero_peek\'|translate}} <a class="pull-right infoTableHint" ng-click="showGenericHelp($event, \'ui_settings_advanced_unpause_during_aero_peek\', \'ui_settings_advanced_unpause_during_aero_peek_tip\')"><span class="fas fa-question"></span></a> </div> <div> <checkbox cb-checked="generalSettings.unpauseaero"></checkbox> </div> </div> <div class="settingsGeneralSlider"> <div class="rzsliderLabel"> <div class="infoTableLabel" ng-click="overrideWallpaperSettings.overridewallpaper=!overrideWallpaperSettings.overridewallpaper"> {{\'ui_settings_enable_override_wallpaper\'|translate}} </div> </div> <div class="rzsliderContainer"> <checkbox cb-checked="overrideWallpaperSettings.overridewallpaper"></checkbox> </div> </div> <div class="settingsGeneralSlider"> <div class="rzsliderLabel"> <div class="infoTableLabel" ng-click="overrideWallpaperSettings.overridelockscreen=!overrideWallpaperSettings.overridelockscreen"> {{\'ui_settings_enable_override_lockscreen\'|translate}} </div> </div> <div class="rzsliderContainer"> <checkbox cb-checked="overrideWallpaperSettings.overridelockscreen"></checkbox> </div> </div> <div class="settingsGeneralSlider" ng-if="shouldShowVDesktopSupport"> <div class="infoTableLabel" ng-click="vDesktopSettings.enabled=!vDesktopSettings.enabled"> {{\'ui_settings_enable_vdesktop_support\'|translate}} <a class="pull-right infoTableHint" ng-click="showVDesktopHelp($event)"><span class="fas fa-question"></span></a> </div> <div> <checkbox cb-checked="vDesktopSettings.enabled"></checkbox> </div> </div> <div class="settingsGeneralSlider"> <div class="infoTableLabel" ng-click="generalSettings.mediaintegration=!generalSettings.mediaintegration"> {{\'ui_settings_enable_media_integration_support\'|translate}} <a class="pull-right infoTableHint" ng-click="showGenericHelp($event, \'ui_settings_enable_media_integration_support\', \'ui_settings_enable_media_integration_support_hint\')"><span class="fas fa-question"></span></a> </div> <div> <checkbox cb-checked="generalSettings.mediaintegration"></checkbox> </div> </div> <div ng-if="generalSettings.mediaintegration"> <div class="infoTableLabel" translate="ui_settings_enable_media_integration_support_blocklist"></div> <div> <button class="btn btn-primary fullWidth" translate="ui_settings_playback_application_rules_edit" ng-click="editMediaIntegrationBlocklist()"></button> </div> </div> </div> </div> <div class="groupBox"> <div class="heading"><span class="fas fa-palette headerIcon"></span> {{\'ui_settings_appearance\' | translate}}</div> <div class="infoTable settingsPlaybackTable"> <div> <div class="infoTableLabel audioInputText" translate="ui_settings_theme"></div> <div> <droplist class="settingsSkinDropList" dp-options="generalSettings.konami ? uiSkinsFull : uiSkins" dp-selected="generalSettings.uiskin"></droplist> </div> </div> <div ng-if="canUseSeasonalTheming()"> \x3c!-- style="margin-bottom:12px;position:relative;"> --\x3e <div class="infoTableLabel" ng-click="generalSettings.uiskinseasonal=!generalSettings.uiskinseasonal"> {{\'ui_settings_seasonal_theme\'|translate}} <a class="pull-right infoTableHint" ng-click="showGenericHelp($event, \'ui_settings_seasonal_theme\', \'ui_settings_seasonal_theme_hint\')"><span class="fas fa-question"></span></a> </div> <div> <checkbox cb-checked="generalSettings.uiskinseasonal"></checkbox> \x3c!-- <droplist dp-options="generalSettings.konami ? uiSkinsFull : uiSkins" dp-selected="generalSettings.uiskinseasonal"></droplist> --\x3e </div> \x3c!-- <span class="infoTableLabel" style="position:absolute;opacity:0.7;font-size:90%;bottom:-8px" translate="ui_settings_seasonal_theme_hint"></span> --\x3e </div> <div> <div class="infoTableLabel" translate="ui_settings_ui_hardware_acceleration" ng-click="generalSettings.uihardwareacceleration=!generalSettings.uihardwareacceleration"> </div> <div> <checkbox cb-checked="generalSettings.uihardwareacceleration"></checkbox> </div> </div> <div> <div class="infoTableLabel" translate="ui_settings_ui_performance"> </div> <div> <droplist dp-options="generalSettings.uihardwareacceleration?uiPerformanceModes:uiPerformanceModesSoftware" dp-selected="generalSettings.uiquality"></droplist> \x3c!-- <checkbox cb-disabled="!generalSettings.uihardwareacceleration" cb-checked="generalSettings.uieffects"></checkbox> --\x3e </div> </div> </div> </div> <div class="groupBox"> <div class="heading"><span class="fas fa-volume-up headerIcon"></span> {{\'ui_settings_audio\' | translate}}</div> <div class="infoTable settingsPlaybackTable"> <div> <div class="infoTableLabel" translate="ui_settings_video_audio_label" ng-click="generalSettings.videoaudiooutput=!generalSettings.videoaudiooutput"></div> <div> <checkbox cb-checked="generalSettings.videoaudiooutput"></checkbox> </div> </div> <div> <div class="infoTableLabel" translate="ui_settings_audio_input_device"> </div> <div> <droplist dp-empty-text="ui_settings_no_devices" dp-options="runtime.audiodevices" dp-selected="generalSettings.audioinputdevice"></droplist> </div> </div> <div class="settingsGeneralSlider"> <div class="rzsliderLabel"> <div class="infoTableLabel audioInputText" translate="ui_settings_recording_volume"></div> </div> <div class="rzsliderContainer"> <rzslider rz-slider-model="generalSettings.audioinputvolume" rz-slider-options="audioSlider"></rzslider> <div class="rzsliderSuffix"> <input class="rzsliderSuffixInput" type="number" ng-model="generalSettings.audioinputvolume"> </div> </div> </div> <div class="settingsGeneralSlider"> <div class="rzsliderLabel"> <div class="infoTableLabel audioInputText" translate="ui_settings_recording_threshold"></div> </div> <div class="rzsliderContainer"> <rzslider rz-slider-model="generalSettings.audioinputthreshold" rz-slider-options="audioThresholdSlider"></rzslider> <div class="rzsliderSuffix"> <input class="rzsliderSuffixInput" type="number" ng-model="generalSettings.audioinputthreshold"> </div> </div> </div> <div> <div class="infoTableLabel" translate="ui_settings_reload_audio_device_changed" ng-click="generalSettings.reloadaudio=!generalSettings.reloadaudio"></div> <div> <checkbox cb-checked="generalSettings.reloadaudio"></checkbox> </div> </div> </div> </div> <div class="groupBox"> <div class="heading"><span class="fas fa-film headerIcon"></span> {{\'ui_settings_video\' | translate}}</div> <div class="infoTable settingsPlaybackTable"> <div> <div class="infoTableLabel" translate="ui_settings_advanced_video_framework"> </div> <div> <droplist class="" dp-options="videoFrameworkOptions" dp-selected="generalSettings.videoframework"></droplist> </div> </div> <div ng-if="!generalSettings.videoframework||generalSettings.videoframework==\'mf\'"> <div class="infoTableLabel" translate="ui_settings_video_media_foundation_stutter_fix" ng-click="generalSettings.videomfstutterhack=!generalSettings.videomfstutterhack"></div> <div> <checkbox cb-checked="generalSettings.videomfstutterhack"></checkbox> </div> </div> <div> <div class="infoTableLabel" translate="ui_settings_video_hardware_acceleration_label" ng-click="generalSettings.videohardwareacceleration=!generalSettings.videohardwareacceleration"></div> <div> <checkbox cb-checked="generalSettings.videohardwareacceleration"></checkbox> </div> </div> <div> <div class="infoTableLabel" translate="ui_settings_advanced_video_read"> </div> <div> <droplist class="" dp-options="videoReadOptions" dp-selected="generalSettings.videoreadmode"></droplist> </div> </div> <div> <div class="infoTableLabel" translate="ui_settings_advanced_video_loop"> </div> <div> <droplist class="" dp-options="videoLoopOptions" dp-selected="generalSettings.videoloopmode"></droplist> </div> </div> <div> <div class="infoTableLabel" translate="ui_settings_advanced_webm_framework"> </div> <div> <droplist class="" dp-options="webmFrameworkOptions" dp-selected="generalSettings.webmframework"></droplist> </div> </div> </div> </div> <div class="groupBox"> <div class="heading"><span class="fas fa-tools headerIcon"></span> {{\'ui_settings_advanced\' | translate}}</div> <div class="infoTable settingsPlaybackTable"> <div> <div class="infoTableLabel" translate="ui_settings_process_priority"></div> <div> <droplist class="" dp-options="priorityOptions" dp-selected="generalSettings.processpriority"></droplist> </div> </div> <div ng-if="runtime.hasopenglsupport"> <div class="infoTableLabel">Graphics API: </div> <div> <droplist class="" dp-options="graphicsApiOptions" dp-selected="generalSettings.graphicsapi"></droplist> </div> </div> <div class="settingsGeneralSlider"> <div class="rzsliderLabel"> <div class="infoTableLabel" ng-click="generalSettings.pausevram=!generalSettings.pausevram" translate="ui_settings_advanced_stop_on_low_vram"></div> </div> <div class="rzsliderContainer"> <checkbox cb-checked="generalSettings.pausevram"></checkbox> </div> </div> \x3c!-- <div>\r\n <div class="infoTableLabel" ng-click="generalSettings.allowbrowseropacity=!generalSettings.allowbrowseropacity">\r\n {{\'ui_settings_advanced_enable_browser_transparency\'|translate}}\r\n <a class="pull-right" style="padding-right:10px" ng-click="showOpacityHelp($event)"><span class="fas fa-question"></span></a>\r\n </div>\r\n <div>\r\n <checkbox cb-checked="generalSettings.allowbrowseropacity"></checkbox>\r\n </div>\r\n </div> --\x3e <div class="settingsGeneralSlider"> <div class="rzsliderLabel"> <div class="infoTableLabel" ng-click="generalSettings.minimodeminimizewindows=!generalSettings.minimodeminimizewindows" translate="ui_settings_advanced_mini_mode_minimize"></div> </div> <div class="rzsliderContainer"> <checkbox cb-checked="generalSettings.minimodeminimizewindows"></checkbox> </div> </div> <div class="settingsGeneralSlider"> <div class="infoTableLabel" ng-click="generalSettings.highprecisiontimer=!generalSettings.highprecisiontimer"> {{\'ui_settings_advanced_high_precision_timers\'|translate}} <a class="pull-right infoTableHint" ng-click="showGenericHelp($event, \'ui_settings_advanced_high_precision_timers\', \'ui_settings_advanced_high_precision_timers_hint\')"><span class="fas fa-question"></span></a> </div> <div> <checkbox cb-checked="generalSettings.highprecisiontimer"></checkbox> </div> </div> <div> <div class="infoTableLabel" ng-click="generalSettings.anticrash=!generalSettings.anticrash"> {{\'ui_settings_restart_after_crash\'|translate}} <a class="pull-right infoTableHint" ng-click="showGenericHelp($event, \'ui_settings_restart_after_crash\', \'ui_settings_restart_after_crash_hint\')"><span class="fas fa-question"></span></a> </div> <div> <checkbox cb-checked="generalSettings.anticrash"></checkbox> </div> </div> </div> </div> <div class="groupBox"> <div class="heading"><span class="fas fa-code headerIcon"></span> {{\'ui_settings_developers\' | translate}}</div> <div class="infoTable settingsPlaybackTable"> <div> <div class="infoTableLabel" translate="ui_settings_advanced_log_level"></div> <div> <droplist dp-options="logLevelOptions" dp-selected="generalSettings.loglevel"></droplist> </div> </div> <div> <div class="infoTableLabel" translate="ui_settings_advanced_cef_command_line"> </div> <div> <input type="text" style="outline:none" class="fullWidth" ng-model="generalSettings.cefcommandline" ng-model-options="{debounce: 1200}" spellcheck="false"> </div> </div> <div> <div class="infoTableLabel" translate="ui_settings_advanced_cef_devtools_port"> </div> <div> <input type="number" style="outline:none" class="fullWidth" ng-model="generalSettings.cefdevtoolsport" ng-model-options="{debounce: 1200}"> </div> </div> </div> </div> <div class="groupBox"> <div class="heading"><span class="fas fa-exclamation-triangle headerIcon"></span> {{\'ui_settings_reset\' | translate}}</div> <div class="infoTable settingsPlaybackTable"> <div> <div class="infoTableLabel" translate="ui_settings_advanced_reset_config"> </div> <div> <a class="btn btn-danger fullWidth" ng-click="resetConfig()" translate="ui_settings_advanced_reset_config_button"></a> </div> </div> </div> </div> </div> </div> </uib-tab> \x3c!-- \r\n Plugins tab\r\n--\x3e <uib-tab heading="{{\'ui_settings_plugins\' | translate}}" select="refreshSlider()" ng-if="plugins.length > 0"> <div class="settingsContainer"> <div class="groupBox settingsPluginBox"> \x3c!-- <div class="heading" translate="ui_settings_advanced"></div> --\x3e <div ng-repeat="plugin in plugins" class="settingsPluginRow"> <div class="pluginCheckbox"> <checkbox cb-checked="plugin.state.enabled"></checkbox> </div> <div class="pluginSettings"> <a ng-if="plugin.options.length > 0" ng-click="editPluginSettings(plugin)"><span class="fas fa-cog"></span></a> </div> <div class="pluginInfo"> <div> <span>{{plugin.name}}</span> <span class="pull-right" ng-class="{\'successText\':plugin.status, \'warningText\':!plugin.status}"> {{plugin.status ? \'ui_settings_plugins_status_loaded\' : \'ui_settings_plugins_status_not_loaded\' | translate}} </span> </div> <div ng-if="plugin.description" class="pluginDescriptionText"> {{plugin.description | translate}} </div> <div class="pull-right pluginFileName pluginInfoText"> {{plugin.file}} </div> </div> </div> </div> <div class="groupBox settingsPluginOptionsBox"> <div class="heading"><span class="fas fa-cogs headerIcon"></span> {{\'ui_settings_plugins_options\'|translate}}</div> <div class="settingsGeneralSlider"> <div class="infoTableLabel" style="flex:1"> <span translate="ui_settings_plugins_options_delay_load"></span> <a class="pull-right" style="padding-right:10px" ng-click="showGenericHelp($event, \'ui_settings_plugins_options_delay_load_help_title\', \'ui_settings_plugins_options_delay_load_help_body\')"><span class="fas fa-question"></span></a> </div> <input type="number" onclick="this.select()" style="outline:none;width:100px" ng-model="generalSettings.plugindelay" ng-model-options="{debounce: 300}" spellcheck="false"> <div class="infoTableLabel" style="padding: 0 0 0 10px;flex:0" translate="ui_settings_plugins_options_delay_load_seconds"></div> </div> </div> </div> </uib-tab> \x3c!-- \r\n About tab\r\n --\x3e <uib-tab heading="{{\'ui_settings_about\' | translate}}" select="refreshSlider()"> <div class="settingsScoller"> <div class="settingsAbout"> <div class="settingsAboutCopyright"> <div>Wallpaper Engine © 2016-2024 Kristjan Skutta. {{\'ui_settings_copyright\' | translate}}</div> <div>The Wallpaper Engine Team is Kristjan Skutta & Tim Eulitz</div> <div>Build {{buildVersion}} <a ng-click="showChangelog()"> <span translate="ui_settings_about_changelog"></span></a> </div> <div> <a ng-click="openFaq()"> <span class="fas fa-question"></span> <span translate="ui_settings_about_faq"></span> </a> </div> <div> <a ng-click="sendSupportMail()"> <span class="fas fa-envelope"></span> <span translate="support_email"></span> </a> </div> </div> <div class="groupBox" style="margin-top: 20px; flex: 1 1 auto; display: flex;"> <div class="heading"><span class="fas fa-gavel headerIcon"></span> {{\'ui_settings_thirdparty\'|translate}}</div> <div style="overflow-y:auto" ng-include="\'views/includes/thirdpartynotices.html\'"></div> </div> </div> </div> </uib-tab> </uib-tabset> </div> <div class="footer footerButtons"> <div class="left"> </div> <div class="right"> <a class="btn btn-primary" ng-click="callbackOk()"> <span ng-if="generalState.isRestartRequired" class="fas fa-exclamation-triangle warningText"></span> <span translate="ui_ok"></span> </a> <a class="btn btn-default" ng-click="callbackCancel()" translate="ui_cancel"></a> </div> </div> </div> '),e.put("views/views/welcome.html",'<div class="welcomeDialogRoot"> <div class="welcomeTitle"> <h3 translate="ui_welcome_header"></h3> \x3c!-- <img src="images/wp_logo.png"> --\x3e </div> <div class="welcomeBody container-fluid"> <div class="page container-fluid" ng-class="{\'past\': page > 0}" ng-show="page===0||lastPage===0"> <div class="row" style="margin-top: 10px;"> <div class="col-xs-2"></div> <div class="col-xs-2"><span style="position:relative;top:-7px;font-size:280%" class="far fa-language"></span></div> <div class="col-xs-6"> <droplist class="welcomeLanguageDropList" dp-options="availableLanguages" dp-selected="generalSettings.language"></droplist> </div> <div class="col-xs-2"></div> </div> <div class="row" style="margin-top: 10px;"> <div class="col-xs-12" translate="ui_welcome_intro"></div> </div> <div class="row"> <div class="col-xs-12 text-center" style="pointer-events: none;"> <div class="wpAnim"> <wp-anim class="wpAnimWelcome" ng-if="!useDarkSkin"></wp-anim> <wp-anim class="wpAnimWelcome" ng-if="useDarkSkin" wpa-file="anims/logo_blue_white.json"></wp-anim> \x3c!-- <img class="offset" src="images/wp_logo_blue_outer_rect.png">\r\n <img class="spin" src="images/wp_logo_blue_inner_rect.png"> --\x3e </div> </div> </div> </div> <div class="page welcomeDialogOptions" ng-class="{\'past\': page > 1, \'future\': page < 1}" ng-show="page===1||lastPage===1"> <div class="col-xs-12"> \x3c!-- <span class="wdLabel" translate="ui_welcome_quality_body"></span> --\x3e \x3c!-- <br /> --\x3e \x3c!-- <br /> --\x3e <div class="row wdRow"> <div class="col-xs-12" translate="ui_welcome_quality_column_header"></div> </div> <br> <div class="row"> <div class="col-xs-12"> <div class="btn-group wdQualityRow"> <a class="btn btn-primary wdQualityButton" uib-btn-radio="\'low\'" ng-model="qualityPreset"><span translate="ui_settings_gfx_preset_low"></span></a> <a class="btn btn-primary wdQualityButton" uib-btn-radio="\'medium\'" ng-model="qualityPreset"><span translate="ui_settings_gfx_preset_medium"></span></a> <a class="btn btn-primary wdQualityButton" uib-btn-radio="\'high\'" ng-model="qualityPreset"><span translate="ui_settings_gfx_preset_high"></span></a> <a class="btn btn-primary wdQualityButton" uib-btn-radio="\'ultra\'" ng-model="qualityPreset"><span translate="ui_settings_gfx_preset_ultra"></span></a> </div> </div> </div> <br> <div class="row"> \x3c!-- <div class="col-xs-5" translate="ui_welcome_quality_description_header"></div> --\x3e <div class="col-xs-12"> <div class="row"> <div class="col-xs-6" translate="ui_welcome_quality_fps_limit"></div> <div class="col-xs-6 wdLabel">{{generalSettings.fps}}</div> </div> <div class="row"> <div class="col-xs-6" translate="ui_welcome_quality_anti_aliasing"></div> <div class="col-xs-6 wdLabel">MSAA {{generalSettings.msaa}}</div> </div> <div class="row"> <div class="col-xs-6" translate="ui_welcome_quality_bloom"></div> <div class="col-xs-6 wdLabel">{{generalSettings.postprocessing == \'ultra\' ? \'ui_settings_gfx_ultra\' : generalSettings.postprocessing == \'enabled\' ? \'ui_settings_gfx_enabled\' : \'ui_settings_gfx_disabled\' | translate}}</div> </div> <div class="row"> <div class="col-xs-6" translate="ui_welcome_quality_lighting"></div> <div class="col-xs-6 wdLabel">{{(\'ui_settings_gfx_preset_\' + generalSettings.shadows) | translate}}</div> </div> <div class="row"> <div class="col-xs-6" translate="ui_welcome_quality_reflections"></div> <div class="col-xs-6 wdLabel">{{generalSettings.reflection ? \'ui_settings_gfx_enabled\' : \'ui_settings_gfx_disabled\' | translate}}</div> </div> </div> </div> <div ng-if="led.visible"> <hr> <span class="wdLabel" translate="ui_welcome_use_led_effects_description"></span> <div class="row wdRow"> <div class="col-xs-5" translate="ui_welcome_use_led_effects" ng-click="led.enabled=!led.enabled"></div> <div class="col-xs-7"> <checkbox cb-checked="led.enabled"></checkbox> </div> </div> </div> </div> </div> <div class="page welcomeDialogOptions" ng-class="{\'past\': page > 2, \'future\': page < 2}" ng-show="page===2||lastPage===2"> <div class="col-xs-12"> <div class="wdAutoBorder"> <span class="wdLabel" translate="ui_welcome_autostart_description"></span> <br> <div class="row wdRow"> <div class="col-xs-5" translate="ui_welcome_autostart_label"></div> <div class="col-xs-7"> <div class="wdAutoStart"> <checkbox cb-checked="generalSettings.autostart" cb-changed="toggleAutoStartRegistry(generalSettings.autostart)" cb-title="\'\'" cb-disabled="generalSettings.autostartscheduler" ng-show="!generalSettings.autostartscheduler"></checkbox> <a class="btn btn-primary" ng-class="{\'btn-success\':generalSettings.autostartscheduler}" ng-click="generalSettings.autostart&&toggleAutoStartScheduler(!generalSettings.autostartscheduler)" ng-disabled="!generalSettings.autostart"><img src="images/uac_small.png"> {{generalSettings.autostartscheduler ? \'ui_settings_remove_service\' : \'ui_settings_register_service\' | translate}}</a> </div> </div> </div> </div> <br> <br> <span class="wdLabel" translate="ui_welcome_windows_color_description"></span> <br> <div class="row wdRow"> <div class="col-xs-5" translate="ui_welcome_windows_color_header"></div> <div class="col-xs-7"> <checkbox ng-if="!isWindows10OrGreater" cb-title="\'\'" cb-checked="dwmColorSettings.adjustdwmcolor"></checkbox> <droplist ng-if="isWindows10OrGreater" dp-options="adjustDWMColorModes" dp-selected="dwmColorSettings.adjustdwmcolormode"></droplist> </div> </div> <br> <br> <span class="wdLabel" translate="ui_welcome_use_dark_theme_description"></span> <br> <div class="row wdRow"> <div class="col-xs-5" translate="ui_welcome_use_dark_theme" ng-click="useDarkSkin=!useDarkSkin"></div> <div class="col-xs-7"> <checkbox cb-checked="useDarkSkin"></checkbox> </div> </div> </div> </div> <div class="page welcomeDialogOptions" ng-class="{\'past\': page > 3, \'future\': page < 3}" ng-show="page===3||lastPage===3"> <div class="col-xs-12"> <span translate="ui_welcome_finish_body"></span> <div style="margin-top:20px" class="text-center"> <img src="images/tray_example.png"> </div> </div> </div> </div> <div class="welcomeFooter container-fluid"> <div class="row"> <div class="col-xs-12 text-center"> <a class="navigationDot" ng-class="{\'active\':page===0}" ng-click="page=0"></a> <a class="navigationDot" ng-class="{\'active\':page===1}" ng-click="page=1"></a> <a class="navigationDot" ng-class="{\'active\':page===2}" ng-click="page=2"></a> <a class="navigationDot" ng-class="{\'active\':page===3}" ng-click="page=3"></a> </div> </div> <div style="display: flex;"> <div style="flex-grow: 1"> <div style="padding-top: 4px" ng-show="page===3"> <checkbox cb-checked="showBrowseWallpapers" cb-title="\'ui_welcome_browse_wallpapers_now\'"></checkbox> </div> </div> <div> <a class="btn btn-primary buttonParent btn-lg pull-right" ng-click="advancePage()"> <div class="buttonFade" ng-show="page===0"><span translate="ui_welcome_button_first_page"></span> <span class="glyphicon pull-right glyphicon-chevron-right"></span></div> <div class="buttonFade" ng-show="page!==0&&page!==3"><span translate="ui_welcome_button_next_page"></span> <span class="glyphicon pull-right glyphicon-chevron-right"></span></div> <div class="buttonFade" ng-show="page===3"> <span translate="ui_welcome_button_last_page"></span> <span class="fas pull-right fa-check" style="position:relative;top:2px;"></span></div> </a> </div> </div> </div> </div> ')}]);