home *** CD-ROM | disk | FTP | other *** search
/ Chip 2003 August / CHIP_08_2003.iso / Chip / service / Wm99xme / MPSetup.exe / QuickSilver.wmz / script.js < prev    next >
Encoding:
Text (UTF-16)  |  2002-10-15  |  32.3 KB  |  767 lines

  1.  
  2. /*
  3. Microsoft Windows Media Player
  4. (C) Microsoft Corporation, 2002.  All Rights Reserved.
  5. File: Quicksilver
  6. Description: WMP Series 9 Skin
  7. */
  8.  
  9. /*
  10.     main mode
  11. */
  12.  
  13. // check media types
  14. function checkMediaOnLoad(){
  15.     if(player){}
  16.     view.width = 0;
  17.     view.height = 0;
  18.     view.backgroundImage = "";
  19.  
  20.     if( ((player.Playstate==3)||(player.Playstate==2)) && (player.currentMedia.ImageSourceWidth>0)){
  21.         theme.currentViewID = 'videoView';
  22.         theme.savePreference("videoViewOn","true");
  23.         loadGlobalPrefs();
  24.     }else{
  25.         theme.currentViewID = 'mainView';
  26.         theme.savePreference("videoViewOn","false");
  27.         loadGlobalPrefs();
  28. /*        if (!player.controls.isAvailable("Stop")) {
  29.             if(player.currentMedia.ImageSourceWidth>0){
  30.                 theme.currentViewID = 'videoView';
  31.                 theme.savePreference("videoViewOn","true");
  32.             } 
  33.         }*/
  34.     }
  35. }
  36.  
  37. var shuttervar = true;
  38.  
  39. // open file
  40. function openFile(){
  41.     media = theme.openDialog('FILE_OPEN','FILES_ALLMEDIA');
  42.     if (media) {
  43.         player.URL = media;
  44.         player.controls.play();
  45.     }
  46. }
  47.  
  48.  
  49. function updateShuffRep(){
  50.     if(player.settings.getMode('shuffle')){
  51.         shuffleButton.down = true;
  52.     }else{
  53.         shuffleButton.down = false;
  54.     }
  55.  
  56.     if(player.settings.getMode('loop')){
  57.         loopButton.down = true;
  58.     }else{
  59.         loopButton.down = false;
  60.     }
  61. }
  62.  
  63. function Toggleshutter(){
  64.  
  65.     if(shuttervar){
  66.     //closing    
  67.         Meta.alphaBlendTo(0,500);
  68.         shutter2.visible = true;
  69.         shutterbut2.down = true;
  70.         mute2.alphaBlendTo(0,500);
  71.         mute2.enabled = false;
  72.         volume.alphaBlendTo(0,500);
  73.         volumeslider.enabled = false;
  74.         progress.alphaBlendTo(0,500);
  75.         progressMain.enabled = false;
  76.         fullminclose.alphaBlendTo(0,500);
  77.         fullminclose.enabled = false;
  78.         coverbottom.alphaBlendTo(255,400);
  79.         pleqviscov.alphaBlendTo(255,500);
  80.         mainmin.enabled = false;
  81.         mainclose.enabled = false;
  82.         mainfull.enabled = false;
  83.         mutebut.enabled = false;
  84.         shutbutton.uptooltip = "Open Shutter";
  85.     
  86.         volume.passThrough = "True";
  87.         progress.passThrough = "True";
  88.         mute2.passThrough = "True";
  89.         visButton.enabled = false;
  90.         eqButton.enabled = false;
  91.         plButton.enabled = false;    
  92.         
  93.         
  94.         shuttervar = false;
  95.     }else{
  96.     //opening    
  97.         shutter.visible = true;
  98.         shutter2.visible = false;
  99.         shutter.alphaBlendTo(255,0);
  100.         
  101.         shutterbut.down = true;
  102.         fullminclose.alphaBlendTo(255,5000);
  103.         fullminclose.enabled = true;
  104.         coverbottom.alphaBlendTo(0,5000);
  105.         mute2.alphaBlendTo(255,5000);
  106.         mute2.enabled = true;
  107.         volume.alphaBlendTo(255,5000);
  108.         volumeslider.enabled = true;
  109.         progress.alphaBlendTo(255,5000);    
  110.         progressMain.enabled = true;
  111.         pleqviscov.alphaBlendTo(0,500);
  112.         mainmin.enabled = true;
  113.         mainclose.enabled = true;
  114.         mainfull.enabled = true;
  115.         mutebut.enabled = true;
  116.         shutbutton.uptooltip = "Close Shutter";
  117.  
  118.         volume.passThrough = "False";
  119.         progress.passThrough = "False";
  120.         mute2.passThrough = "False";
  121.         Meta.alphaBlendTo(255,500);
  122.         visButton.enabled = true;
  123.         eqButton.enabled = true;
  124.         plButton.enabled = true;
  125.         shuttervar = true;
  126.  
  127.     }
  128. }
  129.  
  130.  
  131. function Blendshutter(){
  132.     if(shutter.alphaBlend==255){
  133.         
  134.         mainView.timerInterval="0";
  135.         //shutter.alphaBlendTo(0,500);
  136.         pleqviscov.alphaBlendTo(0,500);    
  137.         fullminclose.alphaBlendTo(255,500);
  138.         coverbottom.alphaBlendTo(0,500);
  139.         mute2.alphaBlendTo(255,500);
  140.         volume.alphaBlendTo(255,500);
  141.         progress.alphaBlendTo(255,500);    
  142.  
  143.         volume.passThrough = "False";
  144.         progress.passThrough = "False";
  145.         mute2.passThrough = "False";
  146.         Meta.alphaBlendTo(255,500);    
  147.  
  148.         shuttervar = true;
  149.  
  150.     }
  151. }
  152.  
  153.  
  154. // play states -- main player
  155. function checkPlayerState(){
  156.  
  157.     if (player){
  158.         switch (player.playState){
  159.             case 0:        //undefined
  160.                 
  161.                 break;
  162.             case 1:        //stopped
  163.                 pausebutton.visible = false;
  164.  
  165.                 break;
  166.             case 2:        //paused
  167.                 pausebutton.visible = false;
  168.                 //visMark = visMark;
  169.                 
  170.                 //killVis();
  171.                 break;
  172.             case 3:     //playing
  173.                 if("true"==theme.loadPreference("visViewer")){
  174.                     theme.openView( "visView" );
  175.                 }
  176.                 pausebutton.visible = true;
  177.                 pausebut.down = true;
  178.                 if(player.currentMedia.ImageSourceWidth>0){
  179.                     theme.currentViewID = 'videoView';
  180.                     theme.savePreference("videoViewOn","true");
  181.                 }
  182.                 visButton.enabled = true;
  183.                 //toggleVis();
  184.                 break;
  185.             case 6:        //buffering
  186.                 
  187.                 break;
  188.             case 7:        //waiting
  189.                 
  190.                 break;
  191.             case 8:        //media ended
  192.                 pausebutton.visible = false;
  193.                 
  194.                 break;
  195.             case 9:        //Transitioning
  196.                 
  197.                 break;
  198.             case 10:    //Ready
  199.                 pausebutton.visible = false;
  200.                 
  201.                 break;
  202.             }
  203.         }
  204.  
  205.     if (!player.controls.isAvailable("Stop")) {
  206.         //visMask.alphaBlendTo(0,500);
  207.         //visMark = visMark;
  208.     }
  209.  
  210.     updateMetadata()
  211. }
  212.  
  213. function checkPlayerMediaGlobal(){
  214.     if(((player.Playstate==3)||(player.Playstate==2)) && player.currentMedia.ImageSourceWidth>0){
  215.         if("true"==theme.loadPreference("videoViewOn")){
  216.             if(player.playState==3){
  217.                 theme.savePreference("videoViewOn","true");
  218.             }
  219.         }else{
  220.             theme.currentViewID="videoView";
  221.             theme.savePreference("videoViewOn","true");
  222.         }
  223.     }else{
  224.         if("false"==theme.loadPreference("videoViewOn")){
  225.             theme.savePreference("videoViewOn","false");
  226.         }else{
  227.             theme.currentViewID="mainView";
  228.             theme.savePreference("videoViewOn","false");
  229.         }
  230.     }
  231. }
  232.  
  233. // initial main setup
  234.  
  235. function startup(){
  236.     loadMainPrefs();
  237.     checkPlayerState();
  238.     
  239. }
  240.  
  241. //meta data
  242.  
  243. function updateMetadata(){
  244.  
  245.     if(player.openState!=13) return;
  246.  
  247.     //metadata.value = player.status;
  248.  
  249.     var authorppl = player.currentmedia.getiteminfo("#author");
  250.     
  251.     metadata.value = authorppl;
  252.  
  253.     if (authorppl == "") {
  254.         authorppl = player.currentmedia.getiteminfo("author");
  255.     }
  256.  
  257.     if (authorppl != "") {
  258.         authorppl += " - ";
  259.     }
  260.  
  261.     if (metadata.value != "") {
  262.         metadata.value += " - ";
  263.     }
  264.  
  265.     metadata.value += authorppl;
  266.     metadata.value += player.currentmedia.name;
  267.     metadata.scrolling = (metadata.textWidth>metadata.width);
  268.     
  269. }
  270.  
  271. function toggleVis(){
  272.     if("true"==theme.loadPreference("visViewer")){
  273.         theme.savePreference("visViewer", "false");
  274.         theme.closeView( "visView" );
  275.     }else{
  276.         theme.openView( "visView" );
  277.     }
  278. }
  279.  
  280.  
  281. function checkVisPlayStates(){
  282.     if(player){
  283.         switch(player.PlayState){
  284.             case 2:
  285.                 visMask.visible = true;
  286.             case 3:
  287.                 visMask.visible = true;
  288.                 break;
  289.             
  290.         }
  291.     }
  292.  
  293.     if (!player.controls.isAvailable("Stop")) {
  294.     //    view.close();
  295.     }
  296.  
  297. }
  298.  
  299. function loadVisPrefs(){
  300.     theme.savePreference( 'visViewer', 'true' )
  301.     checkVisPlayStates();
  302.     visEffects.currentEffectType = mediacenter.effectType;
  303.     visEffects.currentPreset = mediacenter.effectPreset;
  304.  
  305.     var visWH = theme.loadPreference( "visWidth" );
  306.  
  307.     if( "--" != visWH ){
  308.         visView.width = visWH;
  309.     }
  310.     visWH = theme.loadpreference( "visHeight" );
  311.  
  312.     if( "--" != visWH ){
  313.         visView.height = visWH;
  314.     }
  315.     
  316.     visEffectsText.value = visEffects.currentEffectTitle;
  317.  
  318. }
  319.  
  320. function saveVisPrefs(){
  321.  
  322.     mediacenter.effectType = visEffects.currentEffectType;
  323.     mediacenter.effectPreset = visEffects.currentPreset;
  324.  
  325.     theme.savepreference( "visWidth", visView.width );
  326.     theme.savepreference( "visHeight", visView.height );
  327.     
  328. }
  329.  
  330. function displayVisText(){
  331.     visEffectsText.visible = true;
  332.     visEffectsText.value = visEffects.currentEffectTitle + ": " + visEffects.currentPresetTitle;
  333.     visView.timerInterval = 6000;
  334. }
  335.  
  336. function hideVisText(){
  337.     visEffectsText.visible = false;
  338.     visView.timerInterval = 0;
  339. }
  340.  
  341. function killVis(){
  342.     theme.closeView( 'visView' );
  343.     
  344. }
  345.  
  346. function viewResizer(event){
  347.     switch(event.keycode){
  348.         case 37:
  349.             view.width-=20;
  350.             break;
  351.         case 38:
  352.             view.height-=20
  353.             break;
  354.         case 39:
  355.             view.width+=20;
  356.             break;
  357.         case 40:
  358.             view.height+=20;
  359.             break;
  360.         }
  361. }
  362.  
  363. function viewHotKeys(){
  364.     switch(event.keycode){
  365.         case 122:
  366.         case 90:
  367.             player.controls.previous();
  368.             break;
  369.         case 120:
  370.         case 88:
  371.             player.controls.play();
  372.             break;
  373.         case 99:
  374.         case 67:
  375.             player.controls.pause();
  376.             break;
  377.         case 118:
  378.         case 86:
  379.             player.controls.stop();
  380.             break;
  381.         case 98:
  382.         case 66:
  383.             player.controls.next();
  384.             break;
  385.         case 108:
  386.         case 76:
  387.             openFile()
  388.             break;
  389.     }
  390. }
  391.  
  392. // main preferences
  393.  
  394. function loadMainPrefs(){
  395.  
  396.     updateMetadata();
  397.  
  398.     if ("true"==theme.loadPreference("visViewer")){
  399.         theme.openView( 'visView' );
  400.     }
  401.  
  402.     theme.savePreference("videoViewOn","false");
  403. }
  404.  
  405. var eqvar = true;
  406.  
  407. function toggleEQ(){
  408.     if(eqvar){
  409.         
  410.         eqsubview.alphaBlendTo(255,500);
  411.         fullminclose.alphaBlendTo(0,500);
  412.         progress.alphaBlendTo(0,500);
  413.         volume.alphaBlendTo(0,500);
  414.         mute2.alphaBlendTo(0,500);
  415.         eqsubview.passThrough = "False";
  416.         
  417.         volume.passThrough = "True";
  418.         progress.passThrough = "True";
  419.         mute2.passThrough = "True";
  420.         
  421.         shutterbuttoncov.alphaBlendTo(255,500);
  422.         shutterbuttoncov.passThrough = "False";
  423.  
  424.         eq1.enabled = "True";
  425.         eq2.enabled = "True";
  426.         eq3.enabled = "True";
  427.         eq4.enabled = "True";
  428.         eq5.enabled = "True";
  429.         eq6.enabled = "True";
  430.         eq7.enabled = "True";
  431.         eq8.enabled = "True";
  432.         eq9.enabled = "True";
  433.         eq10.enabled = "True";
  434.         eqbal.enabled = "True";
  435.         balslid.enabled = "True";
  436.         eqprev.enabled = "True";
  437.         eqnext.enabled = "True";
  438.         eqres.enabled = "True";
  439.         fullminclosebut.enabled = "False";
  440.         progressMain.enabled = "False";
  441.         volumeslider.enabled = "False";
  442.         mutebut.enabled = "False";
  443.         
  444.         eqButton.upToolTip = "Hide Graphic Equalizer";
  445.  
  446.         eqvar = false;
  447.         
  448.     }else{
  449.         
  450.         eqsubview.alphaBlendTo(0,500);
  451.         fullminclose.alphaBlendTo(250,500);
  452.         progress.alphaBlendTo(250,500);
  453.         volume.alphaBlendTo(250,500);
  454.         mute2.alphaBlendTo(255,500);
  455.         eqsubview.passThrough = "True";
  456.         volume.passThrough = "False";
  457.         progress.passThrough = "False";
  458.         mute2.passThrough = "False";
  459.         shutterbuttoncov.alphaBlendTo(0,500);
  460.         shutterbuttoncov.passThrough = "True";
  461.         //loadEQPrefs();
  462.         eq1.enabled = "False";
  463.         eq2.enabled = "False";
  464.         eq3.enabled = "False";
  465.         eq4.enabled = "False";
  466.         eq5.enabled = "False";
  467.         eq6.enabled = "False";
  468.         eq7.enabled = "False";
  469.         eq8.enabled = "False";
  470.         eq9.enabled = "False";
  471.         eq10.enabled = "False";
  472.         eqbal.enabled = "False";
  473.         balslid.enabled = "False";
  474.         eqprev.enabled = "False";
  475.         eqnext.enabled = "False";
  476.         eqres.enabled = "False";
  477.         fullminclosebut.enabled = "True";
  478.         progressMain.enabled = "True";
  479.         volumeslider.enabled = "True";
  480.         mutebut.enabled = "True";
  481.         eqButton.upToolTip = "Show Graphic Equalizer";
  482.         eqvar = true;
  483.         
  484.     }
  485. }
  486.  
  487.  
  488. // pl area
  489.  
  490. function loadPlPrefs(){
  491.     theme.savePreference( 'plViewer', "true" );
  492.     var dwScale = theme.loadPreference( "PlaylistWidth" );
  493.  
  494.     if( "--" != dwScale )
  495.     {
  496.         plView.width = dwScale;
  497.     }
  498.     dwScale = theme.loadpreference( "PlaylistHeight" );
  499.  
  500.     if( "--" != dwScale )
  501.     {
  502.         plView.height = dwScale;
  503.     }
  504.  
  505.     plFrame.setColumnResizeMode( 0, "stretches" );
  506.     plFrame.setColumnResizeMode( 1, "autosizedata" );
  507.     plFrame.setColumnResizeMode( 2, "autosizedata" );
  508.     plFrame.setColumnResizeMode( 3, "autosizedata" );
  509. }
  510.  
  511. function savePlPrefs(){
  512.     theme.savepreference( "PlaylistWidth", plView.width );
  513.     theme.savepreference( "PlaylistHeight", plView.height );
  514. }
  515.  
  516. function togglePL(){
  517.     if("true"==theme.loadPreference("plViewer")){
  518.         theme.savePreference("plViewer", "false");
  519.         theme.closeView( "plView" );
  520.     }else{
  521.         theme.openView( "plView" );
  522.     }
  523. }
  524.  
  525. // vid area
  526.  
  527. function loadVidPrefs(){
  528.     
  529.     if("true"==theme.loadPreference("visViewer")){
  530.         theme.savePreference("visViewer", "true");
  531.         theme.closeView( "visView" );
  532.     }    
  533.  
  534.     theme.savePreference("videoViewOn","true");
  535.  
  536.     if(player.playState==3){
  537.         checkVideoPlayerState();
  538.     }
  539.  
  540.     var _vidRightDrawer = theme.loadPreference('vidRightDrawer');
  541.  
  542.     if (_vidRightDrawer != '--') {
  543.         vidRightDrawer = (_vidRightDrawer.toLowerCase() == 'true') ? false : true;
  544.     } else {
  545.         vidRightDrawer = true;
  546.     }
  547.  
  548.     if(player.playState==3){
  549.         loadVidSize();
  550.     }
  551.     moveRightVidDrawer();
  552. }
  553.  
  554. function saveVidPrefs(){
  555.     theme.savePreference('vidRightDrawer',vidRightDrawer);
  556. }
  557.  
  558.  
  559. var vidRightDrawer = false;
  560.  
  561. function moveRightVidDrawer(){
  562.     if(!vidRightDrawer){
  563.         vidSettingsSub.visible = true;
  564.         vidRightSideDrawer.moveTo(view.width-109,view.height-105,500);
  565.         //VidOpener.moveto(view.width-109,videoView.height-95,500);
  566.         VidArrow.visible = true;
  567.         vidRightOpener.down = true;
  568.         vidSettingsSub.enabled = true;
  569.         VidTranspButtons.enabled = true;
  570.         vidButtonsWood.enabled = true;
  571.         vidRightDrawer = !vidRightDrawer;
  572.         
  573.     }else{
  574.         vidRightSideDrawer.moveTo(view.width-109,view.height-184,500);    
  575.         vidSettingsSub.enabled = false;
  576.         VidTranspButtons.enabled = false;
  577.         vidButtonsWood.enabled = false;
  578.         VidArrow.visible = false;
  579.         vidRightDrawer = !vidRightDrawer;
  580.         
  581.     }
  582. }
  583.  
  584. function checkRightDrawerEnd(){
  585.     vidRightDrawer = vidRightDrawer;
  586.     vidSettingsSub.visible = vidRightDrawer;
  587. }
  588.  
  589. function openStateCheck(){
  590.     if(player){
  591.         switch(player.openState){
  592.             case 13:
  593.                 if(player.currentMedia.ImageSourceWidth>0){
  594.                     if(player)
  595.                     {
  596.                     }
  597.                     break;
  598.                 }else{
  599.                     //resizeToMode();
  600.                     theme.currentViewID = 'mainView';
  601.                     break;
  602.                 }
  603.             
  604.         }
  605.     }
  606.     
  607. }
  608.  
  609. function checkVideoPlayerState(){
  610.  
  611.     if (player){
  612.         loadVidSize();
  613.         switch (player.playState){
  614.             case 0:        //undefined
  615.  
  616.                 break;
  617.             case 1:        //stopped
  618.                 
  619.                 break;
  620.             case 2:        //paused
  621.                 
  622.                 VidResize.visible = true;
  623.                 break;
  624.             case 3:     //playing
  625.                 
  626.                 VidResize.visible = true;
  627.                 switchBackButton.enabled = false;
  628.                 switchBackButton.uptooltip = "Return to Player Mode: Disabled During Playback";
  629.                 vidZoom.enabled = true;
  630.                 
  631.                 break;
  632.             case 6:        //buffering
  633.                 
  634.                 break;
  635.             case 7:        //waiting
  636.                 
  637.                 break;
  638.             case 8:        //media ended
  639.                 
  640.                 break;
  641.             case 9:        //Transitioning
  642.  
  643.                 break;
  644.             case 10:    //Ready
  645.                 
  646.                 break;
  647.             }
  648.             vidColorBox.visible = false;
  649.             centerBox.visible = true;
  650.         }
  651.  
  652.     if (!player.controls.isAvailable("Stop")) {
  653.             centerBox.visible = false;
  654.             
  655.             resizeToMode();
  656.             vidZoom.enabled = false;
  657.             switchBackButton.enabled = true;
  658.             switchBackButton.upToolTip = "Return To Player Mode";
  659.             VidResize.visible = false;
  660.  
  661.             if(player.openState==13){ // need to do a double check in order to size back to mode...
  662.                 view.width = 697;
  663.                 view.height = 156;
  664.                 vidColorBox.visible = true;
  665.             }
  666.  
  667.     }
  668.     //updateZoomToolTip();
  669. }
  670.  
  671. function resizeToMode(){
  672.     saveVidSize();
  673. //    view.width = 697;
  674. //    view.height = 156;
  675. }
  676.  
  677. function videoZoom(){
  678.  
  679.     if(mediacenter.videoZoom < 76){
  680.         mediacenter.videoZoom = 100;
  681.     }else if(mediacenter.videoZoom <101){
  682.         mediacenter.videoZoom = 150;
  683.     }else if(mediacenter.videoZoom < 156){
  684.         mediacenter.videoZoom = 200;
  685.     }else{
  686.         mediacenter.videoZoom = 75;
  687.     }
  688.     SnapToVideo();
  689.     updateZoomToolTip();
  690. }
  691.  
  692. function updateZoomToolTip(){
  693.  
  694.     vidZoom.upToolTip = "Video Size - [Current: " + mediacenter.videoZoom + "%] - [Next: ";
  695.  
  696.     if(mediacenter.videoZoom < 76){
  697.         nextZoom = 100;
  698.     }else if(mediacenter.videoZoom <101){
  699.         nextZoom = 150;
  700.     }else if(mediacenter.videoZoom < 156){
  701.         nextZoom = 200;
  702.     }else{
  703.         nextZoom = 75;
  704.     }
  705.  
  706.     vidZoom.upToolTip += nextZoom + "%]";
  707. }
  708.  
  709. function loadVidSize(){
  710.     
  711.     var vidSizer = theme.loadPreference( "videoWidth" );
  712.  
  713.     if( "--" != vidSizer )
  714.     {
  715.         view.width = vidSizer;
  716.     }
  717.  
  718.     var vidSizer = theme.loadpreference( "videoHeight" );
  719.  
  720.     if( "--" != vidSizer )
  721.     {
  722.         view.height = vidSizer;
  723.     }
  724.  
  725. }
  726.  
  727. function saveVidSize(){
  728.     theme.savepreference( "videoWidth", view.width );
  729.     theme.savepreference( "videoHeight", view.height );
  730. }
  731.  
  732. function SnapToVideo(){
  733.  
  734.     var zoom = mediacenter.videoZoom;
  735.     var viewWidth = (player.currentMedia.imageSourceWidth * (zoom/100.00));
  736.     var viewHeight = (player.currentMedia.imageSourceHeight * (zoom/100.00));
  737.  
  738.     view.width = viewWidth + 302;
  739.     view.height = viewHeight + 160;
  740.  
  741.     saveVidSize();
  742. }
  743.  
  744.  
  745. // global prefs
  746. function loadGlobalPrefs(){
  747.     if ("true"==theme.loadPreference("plViewer")){
  748.         theme.openView( 'plView' );
  749.     }
  750.   } 
  751.  
  752. function UpdatePLToolTip(){
  753.     if("true"==theme.loadPreference("plViewer")){
  754.         plButton.upToolTip = "Hide Playlist";
  755.     }else{
  756.         plButton.upToolTip = "Show Playlist";
  757.     }
  758.  
  759. function updateVisToolTip(){
  760.     if("true"==theme.loadPreference("visViewer")){
  761.         visButton.upToolTip = "Hide Visualizations";
  762.     }else{
  763.         visButton.upToolTip = "Show Visualizations";
  764.     }
  765. }
  766.