wdgt#Hp Q10.9.2yyyResources/Images/WidgetImage.png* *Y+H off Resources/Images/dropAllowed.png center center 0 0.1 false arrangeIkonsTimer.ticking = false; animator.start(arrangeIkonsTimer.moveAnimations); 0.1 false arrangeIkonTimer.ticking = false; ArrangeIkons(arrangeIkonTimer.id); F2 control ShowHideIkonsList(); print("runCommand() Result: " + result); Update(true); Unload(); popup Labels Position: Right checkbox Show Labels Below Icon 0 popup Icons Size: 64 72 96 112 128 144 192 224 256 128 popup Activation Effect: Glow popup Level of iKons Window: floating topmost normal below konspose below checkbox Lock iKons Positions 0 checkbox Snap iKons to Grid 1 checkbox Drop Shadow 0 slider iKons Opacity: 20% Opacity 100% 51 255 17 255 hotkey Show/Hide "iKons List": Control+F2 color Main Label Text: #FFFFFF colors color Shadow: #000000 colors slider 0% Shadow Opacity 100% 0 255 17 128 colors color Sub Label Text: #FFFFFF colors color Shadow: #000000 colors slider 0% Shadow Opacity 100% 0 255 17 128 colors font Main Label: Tahoma text slider Size: Smallest Largest 8 36 14 19 text font Sub Label: Tahoma text slider Size: Smallest Largest 8 36 14 13 text popup Shadow Direction: 0 1 2 3 text Choose where you want the labels to drop their shadow to. 2 slider iKons Horizontal Spacing: Short Wide 10 20 10 13 metrics slider iKons Vertical Spacing: Short Wide 10 20 10 7 When 'Snap iKons to Grid' is enabled, these settings represent the horizontal and vertical space between iKons. 15 metrics slider Labels Horizontal Offset: Left Center Right -10 10 10 2 metrics slider Labels Vertical Offset: Up Center Down -10 10 10 0 These settings represent the horizontal and vertical distance of the labels from the icon. metrics text 0.9|0 true checkbox true false text true true true true Resources/Images/AboutBox.png Tahoma 11 207 157 #bdbdbd #000000 0 1 September 2006 Tahoma 11 79 280 #a6a6a6 #000000 0 1 yyylny@gmail.com mailto:yyylny@gmail.com Tahoma 10 78 299 #a6a6a6 #000000 0 1 yyylny.deviantart.com http://yyylny.deviantart.com Tahoma 10 69 312 #a6a6a6 #000000 0 1 "II{t/* iKons 0.9.2 (Beta) ============== The K adds much more... September 2006 yyy */ //----------------------------------------- // "iKon Preferences" Objets //----------------------------------------- var ipWindow = new Window("ip_Window"); ipWindow.width = 335; ipWindow.height = 245; ipWindow.title = "iKons"; ipWindow.onFirstDisplay = "ipWindow.hOffset = ipWindow.vOffset = 100;"; var ip_background = new Image(ipWindow); ip_background.src = "Resources/images/ipBackground.png"; ip_background.hOffset = 10; ip_background.vOffset = 10; var ip_closeButton = new Image(ipWindow); ip_closeButton.src = "Resources/Images/Controls/closeButton_normal.png"; ip_closeButton.hOffset = 248; ip_closeButton.vOffset = 195; ip_closeButton.onMouseDown = "ip_closeButton.src = 'Resources/Images/Controls/closeButton_pressed.png';"; ip_closeButton.onMouseUp = "ip_closeButton.src = 'Resources/Images/Controls/closeButton_normal.png'; CloseIkonPreferences();"; ip_closeButton.tooltip = "Close this window."; var ip_iconImage = new Image(ipWindow); ip_iconImage.hAlign = "center"; ip_iconImage.vAlign = "center"; ip_iconImage.hOffset = 64; ip_iconImage.vOffset = 64; var ip_imageCover = new Image(ipWindow); ip_imageCover.src = "Resources/images/trans.png"; ip_imageCover.tracking = "rectangle"; ip_imageCover.width = 128; ip_imageCover.height = 128; ip_imageCover.onDragEnter = "if(system.event.data[0] == 'filenames'){ip_dropSign.src = 'Resources/Images/dropAllowed.png';}else{ip_dropSign.src = 'Resources/Images/dropForbidden.png';} animator.start(new FadeAnimation(ip_dropSign, 255, 300, animator.kEaseIn));"; ip_imageCover.onDragExit = "animator.start(new FadeAnimation(ip_dropSign, 0, 500, animator.kEaseOut));"; ip_imageCover.onDragDrop = "if(system.event.data[0] == 'filenames'){FadeIcon(system.event.data[1]);}"; ip_imageCover.onMouseDown = "var file = chooseFile(new Array('.png', '.gif', '.jpg', 'jpeg')); if(file != null){FadeIcon(file);}"; ip_imageCover.tooltip = "Click to browse for an image file or drop in an image file."; var ip_dropSign = new Image(ipWindow); ip_dropSign.src = "Resources/images/dropAllowed.png"; ip_dropSign.hOffset = 78; ip_dropSign.vOffset = 78; ip_dropSign.opacity = 0; var ip_mlTextbox = new TextArea(ipWindow) ip_mlTextbox.editable = true; ip_mlTextbox.scrollbar = false; ip_mlTextbox.lines = 1; ip_mlTextbox.spellCheck = false; ip_mlTextbox.hOffset = 133; ip_mlTextbox.vOffset = 44; ip_mlTextbox.size = 11; ip_mlTextbox.color = "#000000"; ip_mlTextbox.width = 173; ip_mlTextbox.onKeyUp = "ikons[editedIkon].UpdateLabelsText('ml', ip_mlTextbox.data);"; ip_mlTextbox.onKeyPress = "if(system.event.keyString == 'Tab'){ip_mlTextbox.rejectKeyPress(); ip_slTextbox.focus();} if(system.event.keyString == 'Return' | system.event.keyString == 'Enter'){ip_mlTextbox.rejectKeyPress();}"; ip_mlTextbox.onDragDrop = "InsertTextToTextbox('ml', system.event.data[1]);"; ip_mlTextbox.tooltip = "Enter the main label's text."; var ip_mlOptionsButton = new Image(ipWindow); ip_mlOptionsButton.src = "Resources/images/Controls/arrowButton.png"; ip_mlOptionsButton.hOffset = 302; ip_mlOptionsButton.vOffset = 46; ip_mlOptionsButton.onMouseDown = "BuildDynamicDataContextMenu('ml');"; ip_mlOptionsButton.tooltip = "Click to insert dynamic data to the main label if a file, folder or drive path is specified in the target box."; var ip_slTextbox = new TextArea(ipWindow) ip_slTextbox.editable = true; ip_slTextbox.scrollbar = false; ip_slTextbox.lines = 1; ip_slTextbox.spellCheck = false; ip_slTextbox.hOffset = 133; ip_slTextbox.vOffset = 84; ip_slTextbox.size = 11; ip_slTextbox.color = "#000000"; ip_slTextbox.width = 173; ip_slTextbox.onKeyUp = "ikons[editedIkon].UpdateLabelsText('sl', ip_slTextbox.data);"; ip_slTextbox.onKeyPress = "if(system.event.keyString == 'Tab') {ip_slTextbox.rejectKeyPress(); ip_targetTextbox.focus();} if(system.event.keyString == 'Return' | system.event.keyString == 'Enter'){ip_slTextbox.rejectKeyPress();}"; ip_slTextbox.onDragDrop = "InsertTextToTextbox('sl', system.event.data[1]);"; ip_slTextbox.tooltip = "Enter the sub label's text."; var ip_slOptionsButton = new Image(ipWindow); ip_slOptionsButton.src = "Resources/images/Controls/arrowButton.png"; ip_slOptionsButton.hOffset = 302; ip_slOptionsButton.vOffset = 86; ip_slOptionsButton.onMouseDown = "BuildDynamicDataContextMenu('sl');"; ip_slOptionsButton.tooltip = "Click to insert dynamic data to the sub label if a file, folder or drive path is specified in the target box."; var ip_targetTextbox = new TextArea(ipWindow) ip_targetTextbox.editable = true; ip_targetTextbox.scrollbar = false; ip_targetTextbox.lines = 1; ip_targetTextbox.spellCheck = false; ip_targetTextbox.hOffset = 84; ip_targetTextbox.vOffset = 143; ip_targetTextbox.size = 11; ip_targetTextbox.color = "#000000"; ip_targetTextbox.width = 219; ip_targetTextbox.onLoseFocus = "if(ip_targetTextbox.data == ''){ip_targetTextbox.color = '#808080'; ip_targetTextbox.data = 'Enter a path or a URL address here'}"; ip_targetTextbox.onGainFocus = "if(ip_targetTextbox.color == '#808080'){ip_targetTextbox.color = '#000000'; ip_targetTextbox.data = '';}"; ip_targetTextbox.onKeyUp = "ikons[editedIkon].shortcut = ip_targetTextbox.data; ip_targetTextbox.color = '#000000'; ikons[editedIkon].UpdateLabelsText('both', null);"; ip_targetTextbox.onKeyPress = "if(system.event.keyString == 'Tab') {ip_targetTextbox.rejectKeyPress(); ip_mlTextbox.focus();} if(system.event.keyString == 'Return' | system.event.keyString == 'Enter'){ip_targetTextbox.rejectKeyPress(); if(IsTargetValid()){ikons[editedIkon].UpdateLabelsText('both', null)}}"; ip_targetTextbox.onDragEnter = "ip_targetTextbox.focus(); if(system.event.data[0] == 'filenames' | system.event.data[0] == 'urls'){ip_targetTextbox.select(0, -1);}else{ip_targetTextbox.select(-1, -1);}"; ip_targetTextbox.onDragExit = "ip_targetTextbox.loseFocus();"; ip_targetTextbox.onDragDrop = "ip_targetTextbox.color = '#000000'; if(ip_targetTextbox.color == '#808080'){ip_targetTextbox.data = '';} switch(system.event.data[0]){case 'filenames': ip_targetTextbox.data = ikons[editedIkon].shortcut = \"'\" + CheckDrive(convertPathToPlatform(system.event.data[1], true)) + \"'\"; ikons[editedIkon].UpdateLabelsText('both', null); break; case 'urls': ip_targetTextbox.data = ikons[editedIkon].shortcut = system.event.data[1]; ikons[editedIkon].UpdateLabelsText('both', null); break; case 'string': ip_targetTextbox.replaceSelection(system.event.data[1]); ikons[editedIkon].shortcut = ip_targetTextbox.data; break;}"; ip_targetTextbox.tooltip = "Enter or drop in a file, folder, drive or a URL Address. Press \"Enter\" to validate the path."; ip_browse = new Image(ipWindow); ip_browse.src = "Resources/Images/Controls/browse.png"; ip_browse.tracking = "rectangle"; ip_browse.hOffset = 297; ip_browse.vOffset = 145; ip_browse.onMouseDown = "BuildBrowseContextMenu();"; ip_browse.tooltip = "Click to browse for a file or a folder."; var ip_color = new Image(ipWindow); ip_color.hOffset = 84; ip_color.vOffset = 173; ip_color.onMouseDown = "BuildColorContextMenu();"; ip_color.tracking = "rectangle"; var ip_colorBoxCover = new Image(ipWindow); ip_colorBoxCover.src = "Resources/images/Controls/colorBoxCover.png"; ip_colorBoxCover.hOffset = 84; ip_colorBoxCover.vOffset = 173; ip_colorBoxCover.tooltip = "Choose a color if you want the icon to be colorized."; var ip_sliderButton = new Image(ipWindow); ip_sliderButton.src = "Resources/Images/Controls/sliderButton.png"; ip_sliderButton.hAlign = "center"; ip_sliderButton.hOffset = 138; ip_sliderButton.vOffset = 196; ip_sliderButton.onMouseDown = "mouseH = system.event.x; ikons[editedIkon].window.shadow = false; if(ikons[editedIkon].activationEffect != null && (preferences.activationEffect.value == 'Spin' | preferences.activationEffect.value == 'Rock')){ikons[editedIkon].activationEffect.kill(); ikons[editedIkon].activationEffect = null;}"; ip_sliderButton.onMouseUp = "ikons[editedIkon].window.shadow = preferences.dropShadow.value;"; ip_sliderButton.onMouseMove = "SetSliderValue((360*Math.max(0, Math.min(120, Math.round(system.event.hOffset - 89) + (12 - mouseH))))/120 - 180, true);"; ip_sliderButton.value = 0; ip_sliderButton.tooltip = "Move this slider button to adjust the rotation angle of the icon."; UpdateIkonPreferences(); //----------------------------------------- // "iKons Preferences" Functions //----------------------------------------- function UpdateIkonPreferences() { try { var ikon = ikons[editedIkon]; SetIcon(ikon.icon.src, false); if(ikon.icon.colorize != null && ikon.icon.colorize != "") { ip_color.src = "Resources/Images/Controls/color.png"; ip_color.colorize = ikon.icon.colorize; } else { ip_color.src = "Resources/Images/Controls/noColor.png"; } ip_mlTextbox.data = ikon.ml.format; ip_slTextbox.data = ikon.sl.format; ip_targetTextbox.data = ikon.shortcut; if(ip_targetTextbox.data == "") { ip_targetTextbox.color = "#808080"; ip_targetTextbox.data = "Enter a path or a URL address here"; } else { ip_targetTextbox.color = "#000000"; } SetSliderValue(ikon.icon.rotation, false); ipWindow.locked = false; } catch(e) { Print("UpdateIkonPreferences()", "", e); } } function IsTargetValid() { if(ip_targetTextbox.color != "#808080") { var item = GetShortcutInfo(ip_targetTextbox.data); if(ip_targetTextbox.data != "" && item.type == "unknown") { alert("The shortcut \"" + item.shortcut + "\" specified in the \"target\" box is invalid! Make sure to use parentheses (\"\") if a path is specified."); ip_targetTextbox.color = '#ff0000'; ip_targetTextbox.focus(); return false; } else { ip_targetTextbox.data = ikons[editedIkon].shortcut = CheckDrive(ip_targetTextbox.data); ip_targetTextbox.color = '#000000'; return true; } } else { return true; } } function InsertTextToTextbox(label, data) { if(data != "" && data != null) { if(label == "ml") { ip_mlTextbox.replaceSelection(data.replace(/\n/g, "")); ikons[editedIkon].UpdateLabelsText("ml", ip_mlTextbox.data); } else { ip_slTextbox.replaceSelection(data.replace(/\n/g, "")); ikons[editedIkon].UpdateLabelsText("sl", ip_slTextbox.data); } } } function SetSliderValue(value, applyChanges) { ip_sliderButton.value = value = SnapSliderButton(Math.max(-180, Math.min(180, value))); ip_sliderButton.hOffset = 89 + 120*(value + 180)/360; if(applyChanges) { ikons[editedIkon].icon.orgRotation = ikons[editedIkon].icon.rotation = value; } } function SnapSliderButton(value) { if(system.event.modifiers.toLowerCase() != "shift") { if(value > -5 && value < 5) { return 0; } if(value > -95 && value < -85) { return -90; } if(value > 85 && value < 95) { return 90; } } return value; } function SetIcon(image, applyChanges) { try { if(applyChanges) { ikons[editedIkon].icon.src = image; ikons[editedIkon].icon.reload(); ikons[editedIkon].window.recalcShadow(); } ip_iconImage.src = image; ip_iconImage.reload(); ResizeImageByRatio(ip_iconImage, 128); if(ilInitialized) { il_icons[editedIkon].src = image; il_icons[editedIkon].reload(); ResizeImageByRatio(il_icons[editedIkon], 48); } } catch(e) { Print("SetIcon()", "", e); } } function FadeIcon(image) { try { if(ikons[editedIkon].setIconAnimation != null) { ikons[editedIkon].setIconAnimation.kill(); } ikons[editedIkon].icon.opacity = 0; SetIcon(image, true); ikons[editedIkon].setIconAnimation = new FadeAnimation(ikons[editedIkon].icon, 255, 2000, animator.kEaseOut, function(){ikons[this.id].setIconAnimation = null;}); ikons[editedIkon].setIconAnimation.id = editedIkon; animator.start(ikons[editedIkon].setIconAnimation); } catch(e) { Print("FadeIcon()", "", e); ikons[editedIkon].icon.opacity = 255; } } function BuildDynamicDataContextMenu(label) { var items = new Array(); var ind = 0; switch(GetShortcutInfo(ikons[editedIkon].shortcut).type) { case "file": items[ind] = new MenuItem(); items[ind].title = "File: Name"; items[ind].onSelect = "InsertTextToTextbox('" + label + "', '#name#');"; ind++; items[ind] = new MenuItem(); items[ind].title = "File: Size"; items[ind].onSelect = "InsertTextToTextbox('" + label + "', '#size#');"; ind++; items[ind] = new MenuItem(); items[ind].title = "File: Last Modified (24 hours)"; items[ind].onSelect = "InsertTextToTextbox('" + label + "', '#lastMod24#');"; ind++; items[ind] = new MenuItem(); items[ind].title = "File: Last Modified (12 hours)"; items[ind].onSelect = "InsertTextToTextbox('" + label + "', '#lastMod12#');"; break; case "folder": items[ind] = new MenuItem(); items[ind].title = "Folder: Name"; items[ind].onSelect = "InsertTextToTextbox('" + label + "', '#name#');"; ind++; items[ind] = new MenuItem(); items[ind].title = "Folder: Last Modified (24 hours)"; items[ind].onSelect = "InsertTextToTextbox('" + label + "', '#lastMod24#');"; ind++; items[ind] = new MenuItem(); items[ind].title = "Folder: Last Modified (12 hours)"; items[ind].onSelect = "InsertTextToTextbox('" + label + "', '#lastMod12#');"; break; case "drive": items[ind] = new MenuItem(); items[ind].title = "Drive: Name"; items[ind].onSelect = "InsertTextToTextbox('" + label + "', '#name#');"; ind++; items[ind] = new MenuItem(); items[ind].title = "Drive: Total Space"; items[ind].onSelect = "InsertTextToTextbox('" + label + "', '#totalSpace#');"; ind++; items[ind] = new MenuItem(); items[ind].title = "Drive: Free Space"; items[ind].onSelect = "InsertTextToTextbox('" + label + "', '#freeSpace#');"; ind++; items[ind] = new MenuItem(); items[ind].title = "Drive: Free Space (%)"; items[ind].onSelect = "InsertTextToTextbox('" + label + "', '#freeSpace%#');"; ind++; items[ind] = new MenuItem(); items[ind].title = "Drive: Used Space"; items[ind].onSelect = "InsertTextToTextbox('" + label + "', '#usedSpace#');"; ind++; items[ind] = new MenuItem(); items[ind].title = "Drive: Used Space (%)"; items[ind].onSelect = "InsertTextToTextbox('" + label + "', '#usedSpace%#');"; break; default: items[ind] = new MenuItem(); items[ind].title = "Not Available"; items[ind].enabled = false; break; } popupMenu(items, system.event.hOffset, system.event.vOffset); } function BuildColorContextMenu() { var items = new Array(); var ind = 0; items[ind] = new MenuItem(); items[ind].title = "Original Colors"; items[ind].onSelect = "ip_color.colorize = ikons[editedIkon].icon.colorize = ''; ip_color.src = 'Resources/Images/Controls/noColor.png';"; items[ind].checked = ikons[editedIkon].icon.colorize == ""; ind++; items[ind] = new MenuItem(); items[ind].title = "-"; ind++; items[ind] = new MenuItem(); items[ind].title = "Black"; items[ind].onSelect = "ip_color.colorize = ikons[editedIkon].icon.colorize = '#000000'; ip_color.src = 'Resources/Images/Controls/color.png';"; items[ind].checked = ip_color.colorize == "#000000"; ind++; items[ind] = new MenuItem(); items[ind].title = "White"; items[ind].onSelect = "ip_color.colorize = ikons[editedIkon].icon.colorize = '#FFFFFF'; ip_color.src = 'Resources/Images/Controls/color.png';"; items[ind].checked = ip_color.colorize.toLowerCase() == "#ffffff"; ind++; items[ind] = new MenuItem(); items[ind].title = "Red"; items[ind].onSelect = "ip_color.colorize = ikons[editedIkon].icon.colorize = '#ff0000'; ip_color.src = 'Resources/Images/Controls/color.png';"; items[ind].checked = ip_color.colorize.toLowerCase() == "#ff0000"; ind++; items[ind] = new MenuItem(); items[ind].title = "Blue"; items[ind].onSelect = "ip_color.colorize = ikons[editedIkon].icon.colorize = '#0000ff'; ip_color.src = 'Resources/Images/Controls/color.png';"; items[ind].checked = ip_color.colorize.toLowerCase() == "#0000ff"; ind++; items[ind] = new MenuItem(); items[ind].title = "Green"; items[ind].onSelect = "ip_color.colorize = ikons[editedIkon].icon.colorize = '#00ff00'; ip_color.src = 'Resources/Images/Controls/color.png';"; items[ind].checked = ip_color.colorize.toLowerCase() == "#00ff00"; ind++; items[ind] = new MenuItem(); items[ind].title = "Purple"; items[ind].onSelect = "ip_color.colorize = ikons[editedIkon].icon.colorize = '#ff00ff'; ip_color.src = 'Resources/Images/Controls/color.png';"; items[ind].checked = ip_color.colorize.toLowerCase() == "#ff00ff"; ind++; items[ind] = new MenuItem(); items[ind].title = "Orange"; items[ind].onSelect = "ip_color.colorize = ikons[editedIkon].icon.colorize = '#ff8000'; ip_color.src = 'Resources/Images/Controls/color.png';"; items[ind].checked = ip_color.colorize.toLowerCase() == "#ff8000"; ind++; items[ind] = new MenuItem(); items[ind].title = "More Colors..."; items[ind].onSelect = "var color = chooseColor(ikons[editedIkon].icon.colorize); if(color != false){ip_color.colorize = ikons[editedIkon].icon.colorize = color; ip_color.src = 'Resources/Images/Controls/color.png';}"; popupMenu(items, system.event.hOffset, system.event.vOffset); } function BuildBrowseContextMenu() { var items = new Array(); var ind = 0; items[ind] = new MenuItem(); items[ind].title = "Browse File..."; items[ind].onSelect = "var file = chooseFile(); if(file != null){ip_targetTextbox.data = ikons[editedIkon].shortcut = \"'\" + convertPathToPlatform(file, true) + \"'\"; ip_targetTextbox.color = '#000000'; ikons[editedIkon].UpdateLabelsText('both', null);}"; ind++; items[ind] = new MenuItem(); items[ind].title = "Browse Folder/Drive..."; items[ind].onSelect = "var folder = chooseFolder(); if(folder != null){ip_targetTextbox.data = ikons[editedIkon].shortcut = \"'\" + CheckDrive(convertPathToPlatform(folder, true)) + \"'\"; ip_targetTextbox.color = '#000000'; ikons[editedIkon].UpdateLabelsText('both', null);}"; popupMenu(items, system.event.hOffset, system.event.vOffset); }#+++Y+/* iKons 0.9.2 (Beta) ============== The K adds much more... September 2006 yyy */ function iKon(id) { //----------------------------------------- // Global Variables Declaration //----------------------------------------- var window = new Window(); window.title = "iKons"; window.width = window.height = 500; window.hOffset = 100; window.vOffset = 100; window.onGainFocus = "focusediKon = " + id + ";"; window.onContextMenu = "focusedIkon = ikons[" + id + "].id; ikons[" + id + "].window.contextMenuItems = GetIkonContextMenu(" + id + ", 'iKon');"; //----------------------------------------- // Objects //----------------------------------------- var icon = new Image(window); parseInt(preferences.iconsSize.value) > 128 ? icon.src = "Resources/Images/defaultIcon_Big.png" : icon.src = "Resources/Images/defaultIcon_Small.png"; SetIkonEvents(icon, id); var mlShadow = new Shadow(); var slShadow = new Shadow(); var ml = new Text(window); ml.data = "Main Label"; ml.format = "Main Label"; ml.truncation = "end"; ml.shadow = mlShadow; SetIkonEvents(ml, id); var sl = new Text(window); sl.data = "Sub Label"; sl.format = "Sub Label"; sl.truncation = "end"; sl.shadow = slShadow; SetIkonEvents(sl, id); var labelUpdateTimer = new Timer(); labelUpdateTimer.ticking = false; labelUpdateTimer.interval = 5; labelUpdateTimer.onTimerFired = "ikons[" + id + "].UpdateLabelsText('both', null);"; this.window = window; this.icon = icon; this.mlShadow = mlShadow; this.slShadow = slShadow; this.ml = ml; this.sl = sl; this.timer = labelUpdateTimer; //----------------------------------------- // Properties //----------------------------------------- this.hOffset = window.hOffset; this.vOffset = window.vOffset; this.shortcut = ""; this.id = id; this.orgRotation = 0; this.activationEffect = null; this.moveAnimation = null; this.setIconAnimation = null; //----------------------------------------- // Methods //----------------------------------------- this.Update = function() { this.window.locked = parseBool(preferences.lockIkons.value); this.window.level = preferences.iKonsWindowLevel.value; this.window.shadow = parseBool(preferences.dropShadow.value); this.window.opacity = preferences.iKonsOpacity.value; this.icon.vRegistrationPoint = this.icon.hRegistrationPoint = parseInt(preferences.iconsSize.value)/2; this.icon.vOffset = this.icon.hOffset = this.window.width/2; this.icon.height = this.icon.width = parseInt(preferences.iconsSize.value); this.icon.zOrder = parseBool(preferences.labelsBelowIcon.value) ? 2 : 0; if(this.icon.src == "Resources/Images/defaultIcon_Big.png" | this.icon.src == "Resources/Images/defaultIcon_Small.png") { parseInt(preferences.iconsSize.value) > 128 ? icon.src = "Resources/Images/defaultIcon_Big.png" : icon.src = "Resources/Images/defaultIcon_Small.png"; } this.mlShadow.color = preferences.mlShadowColor.value; this.mlShadow.opacity = parseInt(preferences.mlShadowOpacity.value); this.mlShadow.hOffset = parseInt((preferences.shadowDirection.value % 2 ? -1 : 1)*0.13*preferences.mlSize.value); this.mlShadow.vOffset = parseInt((preferences.shadowDirection.value < 2 ? -1 : 1)*0.13*preferences.mlSize.value); this.slShadow.color = preferences.slShadowColor.value; this.slShadow.opacity = parseInt(preferences.slShadowOpacity.value); this.slShadow.hOffset = parseInt((preferences.shadowDirection.value % 2 ? -1 : 1)*0.13*preferences.slSize.value); this.slShadow.vOffset = parseInt((preferences.shadowDirection.value < 2 ? -1 : 1)*0.13*preferences.slSize.value); this.ml.color = preferences.mlTextColor.value; this.ml.font = preferences.mlFont.value; this.ml.size = preferences.mlSize.value; this.ml.shadow = this.mlShadow; this.ml.zOrder = parseBool(preferences.labelsBelowIcon.value) ? 1 : 2; this.sl.color = preferences.slTextColor.value; this.sl.font = preferences.slFont.value; this.sl.size = preferences.slSize.value; this.sl.shadow = this.slShadow; this.sl.zOrder = parseBool(preferences.labelsBelowIcon.value) ? 0 : 1; var labelsHoffset = parseInt(preferences.labelsHoffset.value)*4; var labelsVoffset = parseInt(preferences.labelsVoffset.value)*4; switch(preferences.labelsPosition.value) { case "Left": this.ml.hAlign = this.sl.hAlign = "right"; this.ml.hOffset = this.sl.hOffset = this.icon.hOffset - this.icon.width/2 + labelsHoffset; this.ml.vOffset = this.icon.vOffset + labelsVoffset; this.ml.width = this.sl.width = this.icon.hOffset - this.icon.width/2 + labelsHoffset - 2; this.ml.truncation = this.sl.truncation = "end"; break; case "Right": this.ml.hAlign = this.sl.hAlign = "left"; this.ml.hOffset = this.sl.hOffset = this.icon.hOffset + this.icon.width/2 + labelsHoffset; this.ml.vOffset = this.icon.vOffset + labelsVoffset; this.ml.width = this.sl.width = this.window.width - this.icon.hOffset - this.icon.width/2 - labelsHoffset - 2; this.ml.truncation = this.sl.truncation = "end"; break; case "Top": this.ml.hAlign = this.sl.hAlign = "center"; this.ml.hOffset = this.sl.hOffset = this.icon.hOffset + labelsHoffset; this.ml.vOffset = this.icon.vOffset - this.icon.height/2 + labelsVoffset; this.ml.width = this.sl.width = 1.65*this.icon.width; this.ml.truncation = this.sl.truncation = "center"; break; case "Bottom": this.ml.hAlign = this.sl.hAlign = "center"; this.ml.hOffset = this.sl.hOffset = this.icon.hOffset + labelsHoffset; this.ml.vOffset = this.icon.vOffset + this.icon.height/2 + this.ml.size - 0.15*this.ml.size + labelsVoffset; this.ml.width = this.sl.width = 1.65*this.icon.width; this.ml.truncation = this.sl.truncation = "center"; break; } this.sl.vOffset = this.ml.vOffset + 1.2*this.sl.size; } this.Remove = function() { this.window.visible = false; this.icon.removeFromSuperview(); this.ml.removeFromSuperview(); this.sl.removeFromSuperview(); this.icon = null; this.mlShadow = null; this.slShadow = null; this.ml = null; this.sl = null; this.timer = null; this.window = null; } this.UpdateLabelsText = function(mode, text) { switch(mode) { case "ml": if(text != null) { this.ml.format = text; } this.ml.data = UnformatText(this.id, this.ml.format); if(ilInitialized) { il_ml[editedIkon].data = text; } break; case "sl": if(text != null) { this.sl.format = text; } this.sl.data = UnformatText(this.id, this.sl.format); if(ilInitialized) { il_sl[editedIkon].data = text; } break; case "both": this.ml.data = UnformatText(this.id, this.ml.format); this.sl.data = UnformatText(this.id, this.sl.format); break; } if(this.window.shadow) { this.window.recalcShadow(); } } this.OpenShortcut = function() { try { if(this.shortcut != null && this.shortcut != "") { var item = GetShortcutInfo(this.shortcut); switch(item.type) { case "url": openURL(this.shortcut); RunEffect(this.id); break; case "drive": runCommand("open " + this.shortcut.replace(/\\/g, "/")); RunEffect(this.id); break; case "folder": runCommand("open " + this.shortcut.replace(/\\/g, "/")); RunEffect(this.id); break; case "file": runCommand(this.shortcut.replace(/\\/g, "/")); RunEffect(this.id); break; default: alert("Could not open the following shortcut: \"" + item.shortcut + "\".\n\nPlease make sure this is a valid shortcut and try again."); if(ipInitialized){ip_targetTextbox.color = "#ff0000";}; break; } } } catch(e) { Print("OpenShortcut()", "", e); alert("Could not open the following shortcut: \"" + this.shortcut + "\".\n\nPlease make sure this is a valid shortcut and try again."); } } } //----------------------------------------- // iKon Related Functions //----------------------------------------- function SetIkonEvents(object, id) { object.onMouseDown = "mouseH = system.event.hOffset; mouseV = system.event.vOffset; if(system.event.modifiers == 'shift'){moveAllIkons = true;}"; object.onMultiClick = "if(system.event.clickCount == 2){ikons[" + id + "].OpenShortcut();}"; object.onMouseUp = "if(parseBool(preferences.snapIkons.value)){if(moveAllIkons){ArrangeIkons(-1);}else{ArrangeIkons(" + id + ");} moveAllIkons = false;}"; object.onMouseMove = "if(!ikons[" + id + "].window.locked){MoveIkon(" + id + ", mouseH, mouseV);}"; object.onDragEnter = "CheckDroppedContent(" + id + ");"; object.onDragDrop = "HandleDroppedContent(" + id + ");"; object.onDragExit = "RemoveDropSign(" + id + ");"; } function CheckDroppedContent(id) { try { var ikon = ikons[id]; var type = GetShortcutInfo(ikon.shortcut).type; dropSign.window = ikon.window; dropSign.zOrder = 3; ((type == "file" | type == "folder" | type == "drive") && system.event.data[0] == "filenames") ? dropSign.src = "Resources/Images/dropAllowed.png" : dropSign.src = "Resources/Images/dropForbidden.png"; if(dropSign.animation != null) { dropSign.animation.kill(); } dropSign.opacity = 0; dropSign.animation = new FadeAnimation(dropSign, 255, 300, animator.kEaseIn); animator.start(dropSign.animation); } catch(e) { Print("CheckDroppedContent()", "", e); } } function RemoveDropSign(id) { try { dropSign.animation = new FadeAnimation(dropSign, 0, 300, animator.kEaseOut, function(){ikons[this.id].window.recalcShadow()}); dropSign.animation.id = id; animator.start(dropSign.animation); } catch(e) { Print("RemoveDropSign()", "", e); } } function HandleDroppedContent(id) { if(system.event.data[0] == "filenames") { var item = GetShortcutInfo(ikons[id].shortcut); if(item.type == "folder" | item.type == "drive") { print(""); print("Starting to move files to: '" + item.shortcut + "'"); for(var i = 1; i < system.event.data.length; i++) { try { filesystem.move(system.event.data[i], item.shortcut); } catch(e) { Print("HandleDroppedContent()", "Failed to move: '" + system.event.data[i] + "' to: '" + item.shortcut + "'. The error message is: ", e); } } print("Done."); RunEffect(id); } if(item.type == "file") { print(""); print("Attempting to open: '" + system.event.data[1] + "' using: '" + item.shortcut + "'..."); runCommandInBg("'" + item.shortcut.replace(/\\/g, "/") + "' '" + system.event.data[1] + "'", "result"); RunEffect(id); } } })|3 |{t/* iKons 0.9.2 (Beta) ============== The K adds much more... September 2006 yyy ********************************************* Credits and Acknowledgements: * The isUrlOrEmail() function is adopted from 2 sources: 1. The URL address validation is based on code written by rafaeltds and is adopted from http://www.bigbold.com/snippets/ 2. The E-mail address validation is based on code written by William Warby and is adapted from a code sample published on the Unofficial Konfabulator Wiki at http://konfabulator.wikicities.com. */ //----------------------------------------- // Global Variables Declaration //----------------------------------------- var ikons = new Array(); var mouseH, mouseV; var editedIkon = -1; var focusedIkon = -1; var ipInitialized = false; var ilInitialized = false; var moveAllIkons = false; //----------------------------------------- // Prototypes //----------------------------------------- Date.prototype.shortString = false; Date.prototype.hours24 = true; Date.prototype.SetProperties = function(shortString, hours24) { this.shortString = shortString; this.hours24 = hours24; return this; } Date.prototype.toString = function() { if(this.shortString) { var hours = this.getHours(); if(this.hours24) { if(hours < 10) { hours = "0" + hours; } } else { if(hours > 12) { hours -= 12; } if(hours < 10) { if(hours == 0) { hours = 12; } else { hours = "0" + hours; } } } var day = this.getDate().toString(); switch(day.toString()[day.length - 1]) { case "1": day != "11" ? day += "st" : day += "th"; break; case "2": day != "12" ? day += "nd" : day += "th"; break; case "3": day != "13" ? day += "rd" : day += "th"; break; default: day += "th"; break; } var months = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"); return day + " " + months[parseInt(this.getMonth())] + " " + this.getFullYear() + " " + hours + ":" + (this.getMinutes() < 9 ? "0" + this.getMinutes() : this.getMinutes()) + ":" + (this.getSeconds() < 9 ? "0" + this.getSeconds() : this.getSeconds()) + (this.hours24 ? "" : this.getHours() < 12 ? " AM" : " PM"); } else { return this; } } //----------------------------------------- // Main Functions //----------------------------------------- print(""); if(preferences.firstLoad.value != "0.9|1") { print("First load - extracting default XML file..."); preferences.firstLoad.value = "0.9|1"; widget.extractFile("Resources/Misc/iKons.xml"); } Load(); function Load() { print("Loading Widget..."); Update(false); include("iKon.js"); try { var fileName = "/iKons.xml"; if(parseBool(preferences.useBackup.value)) { fileName = "/iKons_Backup.xml" print("Attempting to load backup XML file..."); } else { print("Attempting to load XML file..."); } if(filesystem.itemExists(system.widgetDataFolder + fileName)) { print("Found XML file. Trying to read the file..."); var doc = XMLDOM.parse(filesystem.readFile(system.widgetDataFolder + fileName, false)) if(doc != null) { print("XML file was read successfully! Starting to create iKons.."); var ikonNodes = doc.evaluate("iKons/iKon"); var ikonsNumber = ikonNodes.length; if(ikonsNumber != null && ikonsNumber > 0) { for(var id = 0; id < ikonsNumber; id++) { try { ikons[id] = new iKon(id); var ikon = ikons[id]; var ikonNode = ikonNodes.item(id); ikon.hOffset = ikon.window.hOffset = parseInt(ikonNode.evaluate("string(hOffset)")); ikon.vOffset = ikon.window.vOffset = parseInt(ikonNode.evaluate("string(vOffset)")); ikon.shortcut = ikonNode.evaluate("string(shortcut)"); ikon.icon.src = ikonNode.evaluate("string(iconSrc)"); ikon.icon.colorize = ikonNode.evaluate("string(iconColorize)"); ikon.icon.orgRotation = ikon.icon.rotation = ikonNode.evaluate("string(iconRotation)"); ikon.ml.format = ikonNode.evaluate("string(mlFormat)"); ikon.sl.format = ikonNode.evaluate("string(slFormat)"); ikon.ml.data = UnformatText(id, ikon.ml.format); ikon.sl.data = UnformatText(id, ikon.sl.format); ikon.Update(); } catch(e) { ikons[id] = null; if(e instanceof DOMException) { print("ERROR: Load() > Failed to load iKon #" + id + " due to error code #" + e.code); } else { Print("Load()", "Failed to load iKon #" + id + ". The error message is: ", e); } } } if(parseBool(preferences.useBackup.value)) { preferences.useBackup.value = false; preferences.backupTime.value = new Date().getTime(); savePreferences(); SaveIkons(false); } else { CreateBackup(); } print("Finished loading iKons."); if(parseBool(preferences.snapIkons.value)) { ArrangeIkons(-1); } } else { print("ERROR: Load() >> Can't parse XML file."); IkonsLoadingError(); } } else { print("ERROR: Load() >> Can't parse XML file."); IkonsLoadingError(); } } else { print("XML file wasn't found."); AddIkon(); } } catch(e) { if(e instanceof DOMException) { print("ERROR: Load() >> Failed to load iKons due to error code #" + e.code); } else { Print("Load()", "", e); } IkonsLoadingError(); } } function Unload() { print("Saving iKons..."); SaveIkons(false); print("Widget is ready to unload."); } function Update(initialized) { try { dropSign.height = dropSign.width = Math.min(50, parseInt(preferences.iconsSize.value)*0.4); dropSign.hOffset = dropSign.vOffset = 250; var regexp = /(?:(.+)\+)?(.+)/; var result = regexp.exec(preferences.iKonsListHotkey.value); if(result != null) { toggleIkonsListHotkey.modifier = result[1]; toggleIkonsListHotkey.key = result[2]; } else { toggleIkonsListHotkey.modifier = ""; toggleIkonsListHotkey.key = ""; } } catch(e) { dropSign.height = dropSign.width = 50; toggleIkonsListHotkey.modifier = "control"; toggleIkonsListHotkey.key = "F2"; preferences.iKonsListHotkey.value = "control+F2"; Print("Update()", "", e); } if(initialized) { for(var id = 0; id < ikons.length; id++) { if(ikons[id] instanceof iKon) { ikons[id].Update(); } } if(parseBool(preferences.snapIkons.value)) { ArrangeIkons(-1); } savePreferences(); } } //----------------------------------------- // General Functions //----------------------------------------- function SaveIkons(backup) { try { if(backup) { preferences.backupTime.value = new Date().getTime(); savePreferences(); } var doc = XMLDOM.createDocument(); var ikonsNode = doc.createElement("iKons"); for(var id = 0; id < ikons.length; id++) { try { if(ikons[id] instanceof iKon) { var ikon = ikons[id]; var ikonNode = doc.createElement("iKon"); ikonNode.appendChild(GetTextNode(doc, "hOffset", ikon.hOffset)); ikonNode.appendChild(GetTextNode(doc, "vOffset", ikon.vOffset)); ikonNode.appendChild(GetCDATANode(doc, "shortcut", ikon.shortcut)); ikonNode.appendChild(GetCDATANode(doc, "iconSrc", ikon.icon.src)); ikonNode.appendChild(GetTextNode(doc, "iconColorize", ikon.icon.colorize)); ikonNode.appendChild(GetTextNode(doc, "iconRotation", ikon.icon.orgRotation)); ikonNode.appendChild(GetCDATANode(doc, "mlFormat", ikon.ml.format)); ikonNode.appendChild(GetCDATANode(doc, "slFormat", ikon.sl.format)); ikonsNode.appendChild(ikonNode); } } catch(e) { if(e instanceof DOMException) { print("ERROR: SaveIkons() >> Failed to save iKon #" + id + " due to error code #" + e.code); } else { Print("SaveIkons()", "Failed to save iKon #" + id + ". The error message is: ", e); } } } doc.appendChild(ikonsNode); var fileName = backup ? "/iKons_Backup.xml" : "/iKons.xml"; filesystem.writeFile(system.widgetDataFolder + fileName, doc.toXML()); } catch(e) { if(e instanceof DOMException) { print("ERROR: SaveIkons() >> Failed to save iKons due to error code #" + e.code); } else { Print("SaveIkons()", "", e); } } CreateBackup(); } function CreateBackup() { try { var time = parseInt(preferences.backupTime.value); if((time.toString() != "NaN" && (new Date().getTime() - time >= 86400000)) | time.toString() == "NaN") { print("Creating backup file..."); SaveIkons(true); } } catch(e) { Print("CreateBackup()", "", e); } } function GetTextNode(doc, nodeName, nodeText) { if(nodeText == null) { nodeText = ""; } var node = doc.createElement(nodeName); node.appendChild(doc.createTextNode(nodeText)); return node; } function GetCDATANode(doc, nodeName, nodeText) { if(nodeText == null) { nodeText = ""; } var node = doc.createElement(nodeName); node.appendChild(doc.createCDATASection(nodeText)); return node; } function RemoveIkons() { if(alert("Are you sure you want to remove all iKons?\n\nWarning: If you choose to remove all iKons your current iKons will be lost!", "Yes", "No") == 1) { for(index in ikons) { ikons[index] = null; } preferences.backupTime.value = 0; AddIkon(); } } function LoadBackup() { if(!parseBool(preferences.useBackup.value) && filesystem.itemExists(system.widgetDataFolder + "/iKons_Backup.xml")) { if(alert("Your iKons are being saved every 24 hours or more in a backup file. The latest backup file was created at: " + filesystem.getFileInfo(system.widgetDataFolder + "/iKons_Backup.xml").lastModified.toLocaleString() + ".\n\nAre you sure you want to replace your current iKons with the backup file's iKons?\n\nWarning: If you choose to load the backup file's iKons your current iKons will be lost!", "Yes", "No") == 1) { preferences.useBackup.value = true; reloadWidget(); } } } function UnformatText(id, text) { try { if(text != null) { var ikon = ikons[id]; var item = GetShortcutInfo(ikon.shortcut); shortcut = item.shortcut; switch(item.type) { case "file": text = text.replace(/#name#/g, function(){return filesystem.getDisplayName(shortcut);}).replace(/#size#/g, function(){return bytesToUIString(filesystem.getFileInfo(shortcut).size);}).replace(/#lastMod24#/g, function(){return filesystem.getFileInfo(shortcut).lastModified.SetProperties(true, true);}).replace(/#lastMod12#/g, function(){return filesystem.getFileInfo(shortcut).lastModified.SetProperties(true, false);}); break; case "folder": text = text.replace(/#name#/g, function(){return filesystem.getDisplayName(shortcut);}).replace(/#lastMod24#/g, function(){return filesystem.getFileInfo(shortcut).lastModified.SetProperties(true, true);}).replace(/#lastMod12#/g, function(){return filesystem.getFileInfo(shortcut).lastModified.SetProperties(true, false);}); break; case "drive": var driveNum = item.driveNum; text = text.replace(/#name#/g, function(){return filesystem.getDisplayName(shortcut);}).replace(/#totalSpace#/g, function(){return bytesToUIString(filesystem.volumes[driveNum].totalBytes);}).replace(/#freeSpace#/g, function(){return bytesToUIString(filesystem.volumes[driveNum].freeBytes);}).replace(/#freeSpace%#/g, function(){return GetPercentage(filesystem.volumes[driveNum].freeBytes, filesystem.volumes[driveNum].totalBytes) + "%";}).replace(/#usedSpace#/g, function(){return bytesToUIString(filesystem.volumes[driveNum].totalBytes - filesystem.volumes[driveNum].freeBytes);}).replace(/#usedSpace%#/g, function(){return GetPercentage(filesystem.volumes[driveNum].totalBytes - filesystem.volumes[driveNum].freeBytes, filesystem.volumes[driveNum].totalBytes) + "%";}); break; } var regExp = /#name#|#size#|#lastMod24#|#lastMod12#|#totalSpace#|#freeSpace#|#freeSpace%#|#usedSpace#|#usedSpace%#/g; if(regExp.test(ikon.ml.format) | regExp.test(ikon.sl.format)) { ikon.timer.ticking = true; } else { ikon.timer.ticking = false; } } else { print("ERROR: UnformatText() >> Invalid format."); } } catch(e) { Print("UnformatText()", "", e); } return text; } function GetPercentage(value, maxValue) { return Math.round(100*value/maxValue); } function CheckDrive(path) { if(system.platform == "windows" && path.length < 3 && path.length > 0) { return path += "\\"; } return path; } function GetDrive(path) { var path = CheckDrive(path); for(var i = 0; i < filesystem.volumes.length; i++) { if(convertPathToPlatform(path.toLowerCase()) == filesystem.volumes[i].path.toLowerCase()) { return i; } } return -1; } function GetShortcutInfo(shortcut) { var ret = new Object(); ret.type = "unknown"; ret.shortcut = shortcut; try { var regexp = /'(.+?)'|\"(.+?)\"|(.[^ ]+)/; var results = regexp.exec(shortcut); if(results != null) { ret.shortcut = shortcut = results[1] == null ? results[2] == null ? results[3] : results[2] : results[1]; } if(results != null && filesystem.itemExists(shortcut)) { if(filesystem.isDirectory(shortcut)) { var driveNum = GetDrive(shortcut); if(driveNum != -1) { ret.type = "drive"; ret.driveNum = driveNum; } else { ret.type = "folder"; } } else { ret.type = "file"; } } else { if(shortcut != "") { var driveNum = GetDrive(shortcut); if(driveNum != -1) { ret.type = "drive"; ret.driveNum = driveNum; } else if(isUrlOrEmail(shortcut)) { ret.type = "url"; } } } } catch(e) { Print("GetShortcutInfo()", "", e); } return ret; } function isUrlOrEmail(str) { objRegExp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/; if(objRegExp.test(str)) { return true; } objRegExp = /^mailto\:([a-zA-Z0-9])+([\.a-zA-Z0-9_-])*@([a-zA-Z0-9])+(\.[a-zA-Z0-9_-]+)+$/; return objRegExp.test(str); } function parseBool(bool) { if(bool == "true" | bool == "1") { return true; } else { return false } } function GetIkonsNumber() { var num = 0; for(var i = 0; i < ikons.length; i++) { if(ikons[i] instanceof iKon) { num++; } } return num; } function ResizeImageByRatio(image, maxSize) { image.width = image.srcWidth; image.height = image.srcHeight; if(image.width > maxSize | image.height > maxSize) { image.width >= image.height ? image.width = maxSize : image.height = maxSize; image.srcWidth < image.srcHeight ? image.width = (image.srcWidth*image.height)/image.srcHeight : image.height = (image.srcHeight*image.width)/image.srcWidth; } } function ShowIkonPreferences() { if(editedIkon != -1) { ipWindow.visible = false; } editedIkon = focusedIkon; if(!ipInitialized) { ipInitialized = true; include("iKon Preferences.js"); } else { UpdateIkonPreferences(); } ipWindow.visible = true; } function CloseIkonPreferences() { if(IsTargetValid()) { ipWindow.visible = false; editedIkon = -1; SaveIkons(false); } } function ShowHideIkonsList() { if(!ilInitialized) { ilInitialized = true; include("iKons List.js"); } else { if(ilWindow.visible) { ilWindow.visible = false } else { RecreateIkonsList(); ilWindow.visible = true; } } } //----------------------------------------- // iKon Handling Functions //----------------------------------------- function MoveIkon(id, hOffset, vOffset) { try { if(moveAllIkons) { for(var i = 0; i < ikons.length; i++) { if(ikons[i] instanceof iKon) { var ikon = ikons[i]; if(ikon.moveAnimation != null) { ikon.moveAnimation.kill(); } ikon.hOffset = ikon.window.hOffset += system.event.hOffset - hOffset; ikon.vOffset = ikon.window.vOffset += system.event.vOffset - vOffset; } } } else { var ikon = ikons[id]; if(ikon.moveAnimation != null) { ikon.moveAnimation.kill(); } ikon.hOffset = ikon.window.hOffset += system.event.hOffset - hOffset; ikon.vOffset = ikon.window.vOffset += system.event.vOffset - vOffset; } } catch(e) { Print("MoveIkon()", "", e); moveAllIkons = false; } } function AddIkon() { var index = ikons.length; for(var i = 0; i < ikons.length; i++) { if(!(ikons[i] instanceof iKon)) { index = i; break; } } print("Adding a new iKon to index #" + index + "..."); try { ikons[index] = new iKon(index); print("Updating iKon..."); ikons[index].Update(); print("Done."); SaveIkons(false); if(parseBool(preferences.snapIkons.value)) { arrangeIkonTimer.id = index; arrangeIkonTimer.ticking = true; } if(ilInitialized) { RecreateIkonsList(); } } catch(e) { Print("AddIkon()", "", e); alert("An error occurred during an attempt to add a new iKon! The iKon may not be added."); } } function RemoveIkon(id) { var answer = alert("Are you sure you want to remove this iKon?", "Yes", "No"); if(answer == 1) { print("Removing iKon from index #" + id + "..."); try { var ikon = ikons[id]; if(editedIkon == id && ipWindow.visible == true) { ipWindow.visible = false; } if(ikon.activationEffect != null) { ikon.activationEffect.kill(); } ikon.Remove(); ikons[id] = null; focusedIkon = -1; print("Done."); SaveIkons(false); if(ilInitialized) { RecreateIkonsList(); } } catch(e) { Print("RemoveIkon()", "", e); alert("An error occurred during an attempt to remove an iKon! The iKon may not be removed."); } } } function ArrangeIkons(id) { if(id == -1) { arrangeIkonsTimer.moveAnimations = new Array(); for(var i = 0; i < ikons.length; i++) { if(ikons[i] instanceof iKon) { var animation = ArrangeIkon(i); if(animation != null) { arrangeIkonsTimer.moveAnimations[arrangeIkonsTimer.moveAnimations.length] = animation; } } } arrangeIkonsTimer.ticking = true; } else { var animation = ArrangeIkon(id); if(animation != null) { animator.start(animation); } } } function ArrangeIkon(id) { try { var ikon = ikons[id]; var column = preferences.hGridSpacing.value*10; var line = preferences.vGridSpacing.value*10; var center = ikon.window.width/2; var newHoffset = Math.round((ikon.window.hOffset + center)/column)*column - center; var newVoffset = Math.round((ikon.window.vOffset + center)/line)*line - center; if(ikon.window.hOffset != newHoffset | ikon.window.vOffset != newVoffset) { ikon.hOffset = newHoffset; ikon.vOffset = newVoffset; ikon.moveAnimation = new MoveAnimation(ikon.window, newHoffset, newVoffset, 200, animator.kEaseIn); return ikon.moveAnimation; } } catch(e) { Print("ArrangeIkon()", "Failed to snap iKon #" + id + " to grid!. The error message is: ", e); } return null; } function GetIkonContextMenu(id, mode) { var items = new Array(); try { var ind = 0; items[ind] = new MenuItem(); items[ind].title = ipInitialized ? (ipWindow.visible && editedIkon == id ? "Close \"iKon Preferences\"" : "iKon Preferences...") : "iKon Preferences..."; items[ind].onSelect = ipInitialized ? (ipWindow.visible && editedIkon == id ? "CloseIkonPreferences();" : "ShowIkonPreferences();") : "ShowIkonPreferences();"; ind++; items[ind] = new MenuItem(); items[ind].title = "Remove this iKon"; items[ind].onSelect = "RemoveIkon(" + id + ");"; items[ind].enabled = GetIkonsNumber() > 1; ind++; if(mode == "iKons List") { items[ind] = new MenuItem(); items[ind].title = "Reset iKon's Position"; items[ind].onSelect = "animator.start(new MoveAnimation(ikons[" + id + "].window, 100, 100, 500, animator.kEaseIn));"; ind++; } items[ind] = new MenuItem(); items[ind].title = "-"; ind++; items[ind] = new MenuItem(); items[ind].title = "Add a New iKon"; items[ind].onSelect = "AddIkon();"; ind++; items[ind] = new MenuItem(); items[ind].title = "Arrange iKons"; items[ind].onSelect = "ArrangeIkons(-1);"; ind++; items[ind] = new MenuItem(); items[ind].title = ilInitialized ? (ilWindow.visible ? "Close \"iKons List\"" : "iKons List...") : "iKons List..."; items[ind].onSelect = "ShowHideIkonsList();"; } catch(e) { Print("GetIkonContextMenu()", "", e); } return items; } //----------------------------------------- // Effects Functions //----------------------------------------- function RunEffect(id) { if(ikons[id].activationEffect == null) { switch(preferences.activationEffect.value) { case "Glow": RunGlowEffect(id); break; case "Grayscale": RunGrayscaleEffect(id); break; case "Fade": RunFadeEffect(id); break; case "Spin": RunSpinEffect(id); break; case "Rock": RunRockEffect(id); break; case "Vibrate": RunVibrateEffect(id); break; case "Jump": RunJumpEffect(id); break; } } } function RunGlowEffect(id) { ikons[id].activationEffect = new CustomAnimation(1, UpdateGlowAnimation); ikons[id].activationEffect.duration = 700; ikons[id].activationEffect.startLightness = 0; ikons[id].activationEffect.endLightness = 60; ikons[id].activationEffect.id = id; ikons[id].activationEffect.cycle = 1; animator.start(ikons[id].activationEffect); } function UpdateGlowAnimation() { var now = animator.milliseconds; var t = Math.max(0, now - this.startTime); var percent = t/this.duration; ikons[this.id].icon.hslAdjustment = "0,0," + Math.max(0, animator.ease(this.startLightness, this.endLightness, percent - this.cycle + 1, animator.kEaseIn)); if (animator.milliseconds >= (this.startTime + this.duration*this.cycle)) { if(this.cycle < 6) { this.cycle++; var startLightness = this.startLightness; this.startLightness = this.endLightness; this.endLightness = startLightness; } else { ikons[this.id].icon.hslAdjustment = ""; ikons[this.id].activationEffect = null; return false; } } return true; } function RunGrayscaleEffect(id) { ikons[id].activationEffect = new CustomAnimation(1, UpdateGrayscaleAnimation); ikons[id].activationEffect.duration = 700; ikons[id].activationEffect.startSaturation = 0; ikons[id].activationEffect.endSaturation = -100; ikons[id].activationEffect.id = id; ikons[id].activationEffect.cycle = 1; animator.start(ikons[id].activationEffect); } function UpdateGrayscaleAnimation() { var now = animator.milliseconds; var t = Math.max(0, now - this.startTime); var percent = t/this.duration; ikons[this.id].icon.hslAdjustment = "0," + Math.max(-100, Math.min(0, animator.ease(this.startSaturation, this.endSaturation, percent - this.cycle + 1, animator.kEaseIn))) + ",0"; if (animator.milliseconds >= (this.startTime + this.duration*this.cycle)) { if(this.cycle < 6) { this.cycle++; var startSaturation = this.startSaturation; this.startSaturation = this.endSaturation; this.endSaturation = startSaturation; } else { ikons[this.id].icon.hslAdjustment = ""; ikons[this.id].activationEffect = null; return false; } } return true; } function RunFadeEffect(id) { ikons[id].activationEffect = new CustomAnimation(1, UpdateFadeAnimation); ikons[id].activationEffect.duration = 700; ikons[id].activationEffect.startOpacity = preferences.iKonsOpacity.value; ikons[id].activationEffect.endOpacity = 5; ikons[id].activationEffect.id = id; ikons[id].activationEffect.cycle = 1; animator.start(ikons[id].activationEffect); } function UpdateFadeAnimation() { var now = animator.milliseconds; var t = Math.max(0, now - this.startTime); var percent = t/this.duration; ikons[this.id].window.opacity = Math.max(5, Math.min(preferences.iKonsOpacity.value, animator.ease(this.startOpacity, this.endOpacity, percent - this.cycle + 1, animator.kEaseIn))); if (animator.milliseconds >= (this.startTime + this.duration*this.cycle)) { if(this.cycle < 6) { this.cycle++; var startOpacity = this.startOpacity; this.startOpacity = this.endOpacity; this.endOpacity = startOpacity; } else { ikons[this.id].window.opacity = preferences.iKonsOpacity.value; ikons[this.id].activationEffect = null; return false; } } return true; } function RunSpinEffect(id) { ikons[id].activationEffect = new RotateAnimation(ikons[id].icon, 1820 + ikons[id].icon.rotation, 4000, animator.kEaseInOut, ContineSpinEffect); ikons[id].activationEffect.id = id; ikons[id].window.shadow = false; animator.start(ikons[id].activationEffect); } function ContineSpinEffect() { ikons[this.id].activationEffect = new RotateAnimation(ikons[this.id].icon, ikons[this.id].icon.rotation - 20, 1000, animator.kEaseOut, FinishSpinEffect); ikons[this.id].activationEffect.id = this.id ikons[this.id].activationEffect.originalAngle = this.originalAngle; animator.start(ikons[this.id].activationEffect); } function FinishSpinEffect() { ikons[this.id].icon.rotation = ikons[this.id].orgRotation; ikons[this.id].window.shadow = preferences.dropShadow.value; ikons[this.id].activationEffect = null; } function RunRockEffect(id) { ikons[id].activationEffect = new CustomAnimation(1, UpdateRockAnimation); ikons[id].activationEffect.duration = 500; ikons[id].activationEffect.originalAngle = ikons[id].icon.rotation; ikons[id].activationEffect.startAngle = ikons[id].icon.rotation; ikons[id].activationEffect.id = id; ikons[id].activationEffect.cycle = 1; ikons[id].activationEffect.angles = new Array(70, -50, 30, -25, 10, -7, 0); ikons[id].window.shadow = false; animator.start(ikons[id].activationEffect); } function UpdateRockAnimation() { var now = animator.milliseconds; var t = Math.max(0, now - this.startTime); var percent = t/this.duration; this.endAngle = this.originalAngle + this.angles[this.cycle - 1]; ikons[this.id].icon.rotation = animator.ease(this.startAngle, this.endAngle, (percent - this.cycle + 1), animator.kEaseOut); if (animator.milliseconds >= (this.startTime + this.duration*this.cycle)) { if(this.cycle < this.angles.length) { this.cycle++; this.startAngle = this.endAngle; } else { ikons[this.id].icon.rotation = this.originalAngle; ikons[this.id].window.shadow = preferences.dropShadow.value; ikons[this.id].activationEffect = null; return false; } } return true; } function RunVibrateEffect(id) { ikons[id].activationEffect = new CustomAnimation(1, UpdateVibrateAnimation); ikons[id].activationEffect.id = id; ikons[id].activationEffect.cycle = 0; animator.start(ikons[id].activationEffect); } function UpdateVibrateAnimation() { ikons[this.id].window.hOffset = ikons[this.id].hOffset + random(-20, 20); ikons[this.id].window.vOffset = ikons[this.id].vOffset + random(-20, 20); if(this.cycle == 70) { ikons[this.id].window.hOffset = ikons[this.id].hOffset; ikons[this.id].window.vOffset = ikons[this.id].vOffset; ikons[this.id].activationEffect = null; return false; } this.cycle++; return true; } function RunJumpEffect(id) { ikons[id].activationEffect = new CustomAnimation(1, UpdateJumpAnimation); ikons[id].activationEffect.duration = 200; ikons[id].activationEffect.originalDistance = ikons[id].window.vOffset; ikons[id].activationEffect.startDistance = ikons[id].window.vOffset; ikons[id].activationEffect.id = id; ikons[id].activationEffect.cycle = 1; ikons[id].activationEffect.distances = new Array(-40, 0, -30, 0, -10, 0, -5, 0, -3, 0); animator.start(ikons[id].activationEffect); } function UpdateJumpAnimation() { var now = animator.milliseconds; var t = Math.max(0, now - this.startTime); var percent = t/this.duration; this.endDistance = this.originalDistance + this.distances[this.cycle - 1]; ikons[this.id].window.vOffset = animator.ease(this.startDistance, this.endDistance, (percent - this.cycle + 1), animator.kEaseOut); if (animator.milliseconds >= (this.startTime + this.duration*this.cycle)) { if(this.cycle < this.distances.length) { this.startDistance = this.endDistance; this.cycle++; } else { ikons[this.id].window.vOffset = this.originalDistance; ikons[this.id].activationEffect = null; return false; } } return true; } //----------------------------------------- // Error Handling Functions //----------------------------------------- function Print(func, message, e) { print("ERROR: " + func + " >> " + message + e.message + " (File: " + e.fileName + ", Line:" + e.lineNumber + ")"); } function IkonsLoadingError() { if(!parseBool(preferences.useBackup.value) && filesystem.itemExists(system.widgetDataFolder + "/iKons_Backup.xml")) { switch(alert("The Widget failed to initialize! In order to fix the problem, the Widget can load the iKons which were saved in the latest backup file (Created at: " + filesystem.getFileInfo(system.widgetDataFolder + "/iKons_Backup.xml").lastModified.toLocaleString() + ") or remove all the iKons.\n\nWould you like to replace your current iKons with the backup file's iKons, remove all the iKons or to close the Widget?\n\nWarning: If you choose to load the backup file's iKons or remove all the iKons, your current iKons will be lost!", "Load Backup iKons", "Remove All iKons", "Close Widget")) { case 1: preferences.useBackup.value = true; reloadWidget(); break; case 2: for(index in ikons) { ikons[index] = null; } preferences.backupTime.value = 0; AddIkon(); break; case 3: closeWidget(); break; } } else { if(alert("The Widget failed to initialize! It is recommended to remove all iKons in order to fix the problem.\n\nWould you like to remove all the iKons or to close the Widget?", "Remove All iKons", "Close Widget") == 1) { for(index in ikons) { ikons[index] = null; } preferences.backupTime.value = 0; AddIkon(); } else { closeWidget(); } } }B<" 3/* iKons 0.9.2 (Beta) ============== The K adds much more... September 2006 yyy */ //----------------------------------------- // Global Variables Declaration //----------------------------------------- var il_icons = new Array(); var il_ml = new Array(); var il_sl = new Array(); var il_removeButtons = new Array(); //----------------------------------------- // "iKons List" Objects //----------------------------------------- var ilWindow = new Window("il_window"); ilWindow.width = 270; ilWindow.height = 300; ilWindow.title = "iKons"; ilWindow.onFirstDisplay = "ilWindow.hOffset = ilWindow.vOffset = 100;"; var il_background = new Image(ilWindow); il_background.src = "Resources/Images/ilBackground.png"; il_background.onContextMenu = "BuildIkonsListContextMenu();" var il_xButton = new Image(ilWindow); il_xButton.src = "Resources/Images/Controls/xButton_normal.png"; il_xButton.hOffset = 230; il_xButton.vOffset = 14; il_xButton.onMouseDown = "il_xButton.src = 'Resources/Images/Controls/xButton_pressed.png';"; il_xButton.onMouseUp = "il_xButton.src = 'Resources/Images/Controls/xButton_normal.png'; ilWindow.visible = false;"; il_xButton.tooltip = "Close this window."; var il_frameScrollbar = new ScrollBar(ilWindow); il_frameScrollbar.hOffset = 227; il_frameScrollbar.vOffset = 67; il_frameScrollbar.width = 16; il_frameScrollbar.height = 197; il_frameScrollbar.autoHide = false; var il_frame = new Frame(ilWindow); il_frame.hOffset = 19; il_frame.vOffset = 62; il_frame.width = 225; il_frame.height = 207; il_frame.vScrollBar = il_frameScrollbar; CreateIkonsList(); var il_backgroundShadow = new Image(ilWindow); il_backgroundShadow.src = "Resources/Images/ilBackgroundShadow.png"; il_backgroundShadow.hOffset = 19; il_backgroundShadow.vOffset = 62; //----------------------------------------- // "iKons List" Functions //----------------------------------------- function CreateIkonsList() { var itemNum = -1; var ikonsNum = GetIkonsNumber(); for(var id = 0; id < ikons.length; id++) { try { if(ikons[id] instanceof iKon) { itemNum++; il_icons[id] = new Image(); il_icons[id].hOffset = 6; il_icons[id].vOffset = itemNum*60 + 7; il_icons[id].src = ikons[id].icon.src; il_icons[id].onMultiClick = "if(system.event.clickCount == 2){ikons[" + id + "].OpenShortcut()}"; il_icons[id].onContextMenu = "focusedIkon = ikons[" + id + "].id; ilWindow.contextMenuItems = GetIkonContextMenu(" + id + ", 'iKons List');"; ResizeImageByRatio(il_icons[id], 48); il_frame.addSubview(il_icons[id]); il_ml[id] = new Text(); il_ml[id].size = 13; il_ml[id].color = "#FFFFFF"; il_ml[id].style = "bold"; il_ml[id].data = ikons[id].ml.format; il_ml[id].hOffset = 56; il_ml[id].vOffset = itemNum*60 + 25; il_ml[id].width = 113; il_ml[id].truncation = "end"; il_ml[id].onMultiClick = "if(system.event.clickCount == 2){ikons[" + id + "].OpenShortcut()}"; il_ml[id].onContextMenu = "focusedIkon = ikons[" + id + "].id; ilWindow.contextMenuItems = GetIkonContextMenu(" + id + ", 'iKons List');"; il_frame.addSubview(il_ml[id]); il_sl[id] = new Text(); il_sl[id].size = 12; il_sl[id].color = "#c9c9c9"; il_sl[id].data = ikons[id].sl.format; il_sl[id].hOffset = 56; il_sl[id].vOffset = itemNum*60 + 40; il_sl[id].width = 113; il_sl[id].truncation = "end"; il_sl[id].onMultiClick = "if(system.event.clickCount == 2){ikons[" + id + "].OpenShortcut()}"; il_sl[id].onContextMenu = "focusedIkon = ikons[" + id + "].id; ilWindow.contextMenuItems = GetIkonContextMenu(" + id + ", 'iKons List');"; il_frame.addSubview(il_sl[id]); if(ikonsNum > 1) { il_removeButtons[id] = new Image(); il_removeButtons[id].hOffset = 173; il_removeButtons[id].vOffset = itemNum*60 + 13; il_removeButtons[id].src = "Resources/Images/Controls/removeButton_normal.png"; il_removeButtons[id].onMouseDown = "il_removeButtons[" + id + "].src = 'Resources/Images/Controls/removeButton_pressed.png';"; il_removeButtons[id].onMouseUp = "il_removeButtons[" + id + "].src = 'Resources/Images/Controls/removeButton_normal.png'; RemoveIkon(" + id + ")"; il_removeButtons[id].tooltip = "Click to remove this iKon."; il_frame.addSubview(il_removeButtons[id]); } il_separator = new Image(); il_separator.hOffset = 20; il_separator.vOffset = itemNum*60 + 60; il_separator.src = "Resources/Images/Controls/separator.png"; il_frame.addSubview(il_separator); } } catch(e) { Print("CreateIkonsList()", "Failed to add iKon #" + id + " to iKons list. The error message is: ", e); } } ilWindow.locked = false; } function RecreateIkonsList() { for(var i = il_frame.subviews.length - 1; i >= 0 ; i--) { var object = il_frame.subviews[i]; object.removeFromSuperview(); object = null; } CreateIkonsList(); } function BuildIkonsListContextMenu() { var items = new Array(); var ind = 0; items[ind] = new MenuItem(); items[ind].title = "Add a New iKon"; items[ind].onSelect = "AddIkon();"; ind++; items[ind] = new MenuItem(); items[ind].title = "Arrange iKons"; items[ind].onSelect = "ArrangeIkons(-1);"; ind++; items[ind] = new MenuItem(); items[ind].title = "-"; ind++; items[ind] = new MenuItem(); items[ind].title = "Remove All iKons"; items[ind].onSelect = "RemoveIkons();"; ind++; if(!parseBool(preferences.useBackup.value) && filesystem.itemExists(system.widgetDataFolder + "/iKons_Backup.xml")) { items[ind] = new MenuItem(); items[ind].title = "Load Backup iKons"; items[ind].onSelect = "LoadBackup();"; ind++; } ilWindow.contextMenuItems = items; }'J05 140 50 0 cH9 3PNG  IHDR }Jb pHYs  tIME fIDATx͗KlLaΝ>iĨgJJDbF74v lIĂH+BHHy?9wՅLz+3 Fr//iJwePz`2ȺV4O-N`9P,V$ Q?zVPE G Bx  V!U5@'F"2|*ӯn9In`ؠ06vgj/2>J'VR*~ (+2W8QAq-v>끋F#f; ^T+_S6QP)^IENDB`}LA05PNG  IHDR }Jb pHYs  tIME;%V+IDATx՗[lWgfvvvwvk{qlGi4Ƙ(-E**!$*T4 HЧBh+B RUJ)EDQ$IJZI֗mwg3aZ xHG39?;g͸~mxSǿ%;'CR^]}9-Awmu$IWT,jr3R_9rXȟI`6t5mQOƷTz@`]ץ}B>!- wLԶy!2 `;_ٷ(áL\Ccn@%`23}*XFu*PwcKDCYz>+ACV. t KƾJ:c蛇6JCMh.X ف# ZjdfSQ+_hQf+X,0TmGQTGX-P#+4NUBVXBa s:f\qaBR, Bg>uP> : 8xqL(aEd'X8.%֞]/ LX DBҖpE.Bk,p5i|sxBʭW<%(Gd34PIkkTT/*–iGY5j@FKH+F7ڹ'~p#TO)RQhS~1%uo)a)i+uuG5t*뀉G>6Fem`r}(u%w6p~;y{+=f6&?1Y (jilY mls|qe X3y6̼ga6 zh.;B` v,{ `MkU|ts{$`-a/ wmV%j5"}Ġ6#.P!ڄV\! @ \<)M@dnP>>F7>>>nk{av]+?ZrΓC8?iiG{[n R)1H1[&7au] @^@N.u+Y``Z8A#Ģ@l6o뮻zus?:zPXe~gJ-gyEMުĖ4)@洪=Ù9}L6ߵd8j3g<@۠QQQ@Q?xؔF 51VZrJyfff唦qf 6Mpv=%%eJJʵ+OzBmmnƍJϹsL8M4k戯h/#{iC涪vm'[%qqq0N K333iqGjjTP wڜ9sLrj ;6nxɓ'~J0{d՘\vm3~4W l6'K-jy(Kfy]G| 89[ztuϟ?5kήP|'IZm۶Uu(13<#ۥ/+V{0u]3H{3TWW78R R2w-iN6qgtWeHRy3K8A|:P3EJ"(-jLlӈ&S Sxʈi6qLUUU*;@ffWR6l6mĉasyG뮜Sl`Ċ+I^a?xG}믧XbЪU\|駷4~GL6W^yep@Nv)nzzoXX̙ӮZZ94N9ulޓ8|駇Q\P!EwmmVvUs+YJaٲe>PVVf@X`[re! gϞ-_ҥKI~[i0kE*㍓ʇܾ|g(ȑ#% I~pAVluV2580}'.cРҠcxgU0WI]͙wDuq=}o߾ ^4_3qm4\"88`0AWFxx8FkZNi4Npj9ܜ89raaa&9[VHtϒuRR8k֬6l8Ν;7\~w|||LG|M#1''@{oUUUd :thV&OCڲfy%N[r6Ө<`y-j, .Jc]0_#_?Źskol51cFc';L$vKXX8qڽtKk@5""""HHHH$\j5܈{lW,Պ5kפxÍ<ħzjc5kn//?7lpn7H1FC9sjl$<5k<7lpb|9s.n^qAz}v>aaMK6|A3gNQ[D8,< ]PSS2MꫯW;K֬Yӯkd*iq$:#??R~~~2!TġHDČ3f$#׻w}7&::oBƲ`ޗ/_0aBٳ_p諃40X(wH캑(@YQQ,?G8ɝ}||͋y^p޽{1jꫂ{,O>IQ;vV(0vw:txC{+aaaCp8:njЀe˖@jk֐`n߃>%Nؼys"sd=SNW5R$6 oLZ%C6ۑxwwtiwwxD7&h7~˞?̝5E:wܯRd"~b#πu U( 4iqu&ڡM=٤UxgéHTɕ=N""CsWdrNRV<⡓\(Aƨ4@WXt:]g@l[_#˿) "<ɂL5*[ uKIA&&h|=Ǐ?:22I&E?0//£yPj{g_6~< oS'4 ֏mj]U0 fZzɴDb8} EE +22;31ƲJZ23gkQ~vƝuQ\\\]\\\=a„PvÇQr:,@ pu= p!wZbSey~bO>UV Cm2e 6n;c Wy晛j*xbT~~رc_WM>wժUKݼz\[eK;wj-M$DTEQ x`j^xanǏoXbEl~߿;7toPPP)˗/nAQ)攵g, fÇQh-RSSKN8, JʌC窉+?hhhsM֌Gſ3R`# opUjNm~: r-cƌdjqX#~zmqwW\]rz^tږ4soO-NH q0Lvʷvz^c04Aj;[Z êjb8dck֬ f/)սU`uϫuTι\SW '녢{VL PUUuғ8uȤ,TɹiXǡx_|ԮlJsd8w\A .I/eaŷ 1+""g2bĈ{ccXd=zܻ`|ͻncBBB-lٲexW)'͗ [5?#fsСCwڥ?~<6xCѸ7z`h9$$$B]x-0 QL5H=0K,?~u5?AӶ({_-3RLǯtmB(z`^yLg!;;;O>=0ث]<}t5`/uh1  2F c$ 4igΝ)%sϑv7Ɩ< (&f6o6}YYY{~Æ ^~Nc iiixgsFvCfsd XjՄsޙ=eK1{9{w }cTT骪ai<[h4j}+++kIHHW9d3')F4D#h;vlHzzJDsp82ׯȑ#=zu]}b hqӆ p8x O\`A |OTsSPPs凳ͽ֕|X3&78J>>>zYW<cy8q"1O=ԨE y-]z^3gΜщϟ?B釟y1F+CygoM=JNoΜ9 l+ƋfRjؒ1Bs<3ϷYfŋo{g***/XzcaVU[TT!ymp/ԗG8p@a7$cӧז.gHՒ{L uh8FQ*+p8e)?˿ݯtۨuu5nE͛7}G^|ś*++Cx17I~ɗ^ziZYqǪ֭[_~e˖շ2tM JիWVeotwM\<ݻUn:G8PjO L_:( bt۶mcL_Tu]#F mpX+DxxpС}^s5VXq8Khhj\_"fsܸqBv;Ou?9r%!!'5hӉv]"4F4D\d]]7oܿcCAzgU}pcb*s ~I.u;vlpέ!5.YFܵk׀#Gh4ҶmSGaa!M<jZ3Eu,¡9W]e]wZU$g]f||L5j VKF>}ڿU7ɩ߿+j!4Gy,|73t[^hkepܹ^zyt.ԝO#U'ZqGvv&*]x~~~^k*cko25 ;hZGSwxL&S%57Yc<*++E[g04Q#ߟւyʞv;Vk*;Zj]8NiZ8h4NV>sFST}||7EEEnfۙno±ܠYndgϞjl׮]J.S4deL5 bkPz,QʼD70;imisY@IMM=Nq2DֆhtIIIwnذឋ/*'$$TTTxwgsf=?|g OCqqqԦMT6IHlڴuM!] }駟#$Cl#Fݿ~oV(?PSSmTGl߾_|v˖-sUcǎ /+83d cƌ<;J=>r7N@xx^͏'z1bppp^z)mر6ᄑdrd\|9|رog/_\~Qr7vPRRbUd1zoy睉ǎ +Wd_}Um۶M$SG9g% @?GQC9+9R F7D@]4cuV͜cM+9]t4BCCK.!pĉov?vH>djќ6F2qĠ}Q֬n&М7DiΊ'h!^m6 #lC *@t "6Bɚ|Jg4g Y}dff fԜEw IDAT??>4--mu]w@qg:uV Eppp d $$mˈk׮͔.[joo; pႝ1EDDIÀMZK4=D(JeE_?|)࣏>Ju_+@ذayɐᄑVґCSTb }u \]mpT#&o۶m?nlh] o 66 ͤIbO^!;gb`ӦMeܟ@7ߤ%6鞢"6K≎Uk.**}lG!gÆ Ԏ؉EEE鴆(.D$u# C$2D  2DhsC.] } 1qÆ JJ}obcc̞=O?tUttyyy\nn%RSS^{-pkbXtiĕnӧ{1ꫯrj>|wyd"{o{S,JZVnAJw.@ 墧U9tpM3đD H=CIDދ"?B:'$5P-L$5*GE Z"LQDP 16I NEPA9F Sc>|x뮻n zA7է Vk F!Zſg`0I!G*Ôt$&)S|tc``n4hPPpp8H?y۩l9לAAt"%cUVVN|C xqذaC?֬YsS><[?8`0X:}D$++ L&y #|J(Fɑyx{Բ:Sc wLg~sN,S 3s~\ŹZxPo3f Ο?uz, "z,88,K#hnԪ>1Hӕ}]5Ժ[ғ#\wvwr'_ؿAnwڕ1iҤZR}嬹ߕ"3???``0W]h J`f GDFF|Ţ SQm Bk"~O:5bرt:"ѩDQ999IIبQB[J͹̙3}Q(l{Q^SQ)Y\w֖isʭ~g<wqBCC`x{{C4(uDgEA`Xɇ9yciwQBVVVU``!00P/&(2Ym!QL.TTZw2M\1DmߧTwUqd*sUFFq "Yl[aɞY~~~ummgZrsYYMZd2L&h4juLL&L :03u 9ZC[,r,b8罼FQh4!>>> D׷ҵu`V+oZrz=h8Ni4NsZVltWyJSkt׮骽љ[1k*7..||| =xv*1V% 9Dуl6[{4 j9]_6Z2^u4v2mV>EUeY[܍(î dBQQ a2p8蔢(>~())\c{' \L:|W>gn QŎ=С@HtFQ)rJZ:榗l%McG"@>EpQ (  Q$ Q$p)v#~嗛{G}T 㪪؉'kl w@\\~RZn}A؍IOO5Xhf8wo8Ǐ:uwYYSOUFDDi 4'  l6r .t|Faaq yׄsزe lٲѣGHT}&ҥK:w\;Μ9f{6n=Sطo_,ZhEZ z UFuرcm^^^޳g^=#lݺ~wFFƄٳg_|ytffft3JJJl111}6n7$$VTTTXϞ=[B鏴o n?lAQFDg!!!BQ=Z*BG )AP{QRR<tS}&:=Z;VzВK$DlgG{Yr-A#G 5@H4 ___-DWE-~~hYc"Btfb2ZDљDgF5# QFfnJ!'Q$=ZZ8A ZPb7Eڣ-D+aJxGJJJCh"iKG *\p҅ .QLsM D D D D D D D D D D D D D D S)=E;A8rȕn!AP D U;3Ms. Q1D5&ɾ1pP &NÊ1N|t˷@ćrUm.|RJ1jakڻLx?ZAmZɌг8|2v7pa6$44$**b;>xĈǏG|72dgg 8t`-Ɲ씢Zlllr{d2ZjBSkرcF}Z:"A( X, n:qDy-)J"&L Oil6RSS :BCCwjZ& jbbbMLLO?=ԩS(())oNZ,[^^^ıcz@zz:1`Fg~&y ڷ -uumVx @O_rŔ2ʕ+=xƚƍtNb`ԩ?[E1;;{w}_- ;wGl^Fگ_QFei4&v3VVV9rd3|AAAϥ"Q%ŦMx#YYYt>fddd4躐ŋ)'::Dn%=u˗s=Zꫯ^}U H=z^IKKd2 ܾ}/|J\d'$$\p'l[oۏ>(]Z; AAAVf 壏>W[[o޼y 6,7ޘ9tÇYdصkWҟ~ᴧn%m6q۶m4{W!pFsVɡ!9ALAHAHAHAHAHAHAHehw~ު+ݷd<30xŲ]2z\\~iwHK]ٜL@ܖ`]r}駿2ưcǎ{ةS.tM}ݑ͋zg^z9rkDDvҤIøq{nO?^6W[`6&e~fܹV|ѢE{*y(tq<"mO?􁨨(+rK=8F@o߾222{ ^~e0j222 {qct-ԯx#aɱVUU/"qyMRRD! yAtᅲ͚5kGzzzŋof… n۶YVVV 6K/caaa_nXlyyyiii׭ZpUUmŊQ~jax饗~p<[HOOG~Ύ_|q#wtṭJYIqƌ;;&wf͚5kd+pׯ[~}?kE8WSwOVJ#:~+ݭ苺x޼k˖-K :[l9 H<(AzUBm `qdD'+!ʏ&W7J`ͭ]> S]Dg^\$SE#8A0qe睹QsqTQKyF+IDATs; 3wjar^O>)sg3w޷'96'O§fsģ {]49 i;wCv!GbfunUdXQnh&P:77wg޽x&}uTYPI$v'X/NEmjhSAr :*999rp>graGd(/LoҫWIAtrss;w.@(*Y*J;hy/\!hGKgD ݠ]S%yQ)0DP:2A'GH$EQ5J\+;,J1Th\|R %u&I Du\2C}8|br'8ʡU|#Q$EOܨ\$Cr ҔқZ9"GH$Mq<H$M$JfϞo^xl_r%(dҌڄ b3y衇馛v]v|{^`:s=[s%^UUgt(X,җT&MEN@}}|-ڳ}'O{.Z[[seuuuGDvTUMY{0 FT;`"&`"&`".Ds1i @ttt3IG2 F}#P/ydɰN{oCgg3ίE)"@ 6_! !Zt;|^&>G @ I$8E@;::t{NRU=9vuMMM޽{sM r4a}e0 ]=')#|3Q??{'~pŃgw}2#L'r+mooo8s=W>r%%a/C< iuر.ǣTTTeybXr,4=o}wc=Ӳ," y??w]vIEo3fLO(٦M3M@V )0\y.ooG< #9RerǿT `0 `0 `0 `0 `0 AnN}}aY+#D¼Kj 4t_yo\r0 N0ys0"mE?͙Ez ҡ cL0W{O@DPЀ9'\/`q9s|OBrT:ۯL3) 0B!lHhG=;wVB_n@ 4E:6/2RYY㺦iVKKۯʫAѝ`L׾vYjй|nm #4TTT7&] ]Djjj4M qgmN23qɮb]]]=beJR(>}z;SRQQVUU3%" ʳW' fB~P>4 xH4|<:ujӧN{wUU{nB:6WXq֊+(-- j͹,_r>;AUUS4y;/4;iE~oyuܕL5K.iK.iKyG,s̙iqر[neqgΜ_իW_voj@Y .++i z}@] ͋3ei(B䒩s_W*d:6Ǎt[+'?뮫5kVOU~N-[qw@H@UU+H9 :moo`ҥ[{k#x7*۔~>lΝ;k.]z϶mʝ__{ׯ_?TAMnqpumm_tx@+G8`0y#}?ʈD")>2 `0 `0 `0 `0 ``0 `0 `0 `0 `0 `0>zۣC4'-R)N"UUU}'HK_2<2>oURLGNiVpQ#_ m>aخWR٬,"#S 4B̆ >M-UQC8gkf\YYY-e Ǚs_tqSǝ+x<3n:zheYׯp l,آpqmm7pG&`Ϟ=QEQs[HĘ:uj`\k0lwnI&G?uő=\8Q<jwJG ЧL̞=m_|qBUՂ$}HRsr+|3{=fˮnz(LTEq&lnn;6NuaN1ь}ݟ| عsg%,ZYQرjjj9n}JpvC!SH-R;]Ӡ][=,K8TڳZ!VUUUСCbϞ=3gΌ EikMxgҥK;|τB!Ͼ}NW:No߾t: `М;wn+ڵ"gϞD?4䒽`&F9CpBKݻw:֌3ڝmz!X2w(.04^+z.t]>ѣ&Mjh4%pfmuNhI6l2 /_~Z瞛7t̜9s}7G?o}1cׯ_}=Co^uU/^܃,:{h͙7)dF3k>x<(gEQz>ӣRFXO?e˖_v⫯zߜ9sկVQyyu7/|_;l{̙ /ŋ'=ڗN{wϽ;w]n5k&G?|궹[\\sip^ŲA]//U˲eY}^Sرyǎ[{k?ٲe[nc=g1bn5yD"SlڴPi/8.]Eo~9,?߸+ok{٣0z4OʟD!dxiudn0 Cp8a ГdqJ|Fv)@X|FQ1 0A( Ba P 0A( Ba P 0AA( Ba P 0A( Ba  P 0A( Ba P _a qBUUsWC[Fee%rsԩ+υ$ !-iDi_+`Ö6i_@`sHeJ* 1%14b?"DHhz/t~Β9w pc֭p@ @@8PxDPU\\|quu^wk\joo8ڊNa{Pq -0"{؟3+.A%l qpSꮦOUY g@^2cP0cNyr;(PdɒKKK?+{<zx!TU5 ̓CQQ/ zReYVO<5Mk_Jzݢ(Po|c(ᒒ 701H$40sy¹(!=h\Ū'G֯_/5M:jEȣA(///~s- KA '3sC%lƍ+z@]]: p!MJE5\h4|iѣSTs3R`fr\)u'Nt~4mQ^Bi .hjjJ+'vvuuy'ON441QB-N jF(]FF%ΕU:u*СCљ3g&*++CE䯪JTa=cULYNoEwC{LN)6mZ4Mx^3LzEX%Q}hѢ#rUCJp} )K$$7lDdr^?ș^___R]]O$~0DuuuDu+ 6LGy4McǎJXpa( ,h)Dݞ+P.\z{K/MG}4M3~MTvU ]vY`|2sz×aJO[:ziVCCC*ieYHVmۓN: / x[<8y޼yŚ?pPW^*w٥trK(ٸqtx)`%,|";_@455~n8|p̙3cC`׿~͛gu뢭m̼y@tڻo߾rygsi B].@ `iǃy5 !ݻwWUь3ڣѨ)aXeb7xcNxÇKxP&(nY`AS.><'s"T amԩmSNm p$ f-[+W6%q߾}e/p:f˖-S},[;+i4MZ'f6m {o>eY{93zYo*V5 z}YZ"qgOy涓'O֮];ծjB{ʧ~+V488pԫz\ P ֭wq}%,Y Bza=n9_Li G\sM}ii//|=<? jSpZeQ@UUSUUӶCS^(9#O=T\-O/|0 S-LvEђ{t:m_^6mce.=O~[:6w\KP^lo{BXd2R)3~pY4+Lz,K<;::.#LS4SuKuK40 lgzg;-˗/OJ*Rdaea}ᇭիWOsuއncuq.XUWWG6o\mYYLtν׫LV:6ɤH$X,ܬ677jY(0M Eggz b1o͚5kOMMͨX,6&s~?vX\$DO#CH$~w?8qs=7/޽Oa3RvF*"Rk׮ L/9kҥV\͛7v]j^xlY[fKk6W^׽e˖_lxyH2,]tD Cx6 @ɵ੫>FNB$!0A( Ba᣿#J$ |>?Cw~JC&`7!"G0D|(8F%F$ 3l|]߰MAaBa P 0A( Ba P !0A( Ba P 0A( B( Ba P 0A( Ba PP 0A( Ba P 00A( Ba P 0A( Ba  P 0A( Ba P !0A( Ba P 0A( B( Ba P Ê/ӗB0JF7iI(1 ¸,K0ŕbЎڪ9_EWyL{{&*LU0M#/ax9b2'zGG ȋ-!+Gdkc>|8W$(}]C 0K!ɶ<{6ڣ8[(,f^I?%SBiY2eHK>(6 :jGr]Lp Fvyx8Kd޶^hA|dc:%qXD?hR{W\qCH8Gq1I&{%qrix0gHka;vsn@m۶@mD>!\`ٳkJJJ7;}#eflh/bR"K(PfFDlWe2@dlN86(T:2i{-O1 c Òې%%;*+K~;NEP0,.HDHU{1r!\aJY[#ê,Y$Y䓙JR#[Pgf{'!+ [T2*Yha2B.rp x] ?jeخ߅S2AQ/yH2 F&pF/Wo3߭-|9ZL‡h~t_;_Ň5a20de]Z4׫2+C#ad3 F-hMMċ.hz(Ƽ%ddNxԩklooBWnHG/Pr^IDUTT]7) g. {޳mdpG.G}Ν\;/F7=4MҒ޷o_{ggfYV_Ŝۿ۴ydp*2 @%K(--ٳg,X%ܜI"\j(ɿɦG|Oe})CܚN#|ʤIǏOMNzwoڴ0oM iy-}\}2ݪ(?5iҤd֬YeǏ[*b>'kkwa${no4>|z4IƑğJGC4|i9f1r0#GDqɓ' >2MS?~ƎFz Fƴܢ<řF\70.8ҺٌLpJGZ[[U0?[oF~AfÀQEF/IDATagEKuaZ8p`ԨQI&%,omjj򗖖MӔysH*ęFYյkH ?=o#)ٺISL)>|p^m4OP&Ð[ A<"= 3gΌi߿[HDO&%5j1Xq[Mj|f{_ݻs!twhpg_]o{]'.z1 ֈLO'6 ð'nii N4]Ǐu{ 4B9s&0yd-sYLAb,+d.\YΈ;vT7 Cٳgh]{ Ɯ9s]oc˰2jL{^.Y.P" &Mq]z8M"}@ۼMawm|> úau?1 ^ך>}zBQQTTK$d24 ^W "Y X>_~(sΆHDa~ijʼngCCè&'mSN i;zhzǎ'Nh}+r\O#i@SXdha]5 ŝON^28a a\QTT4vƍޞa wNѣGG?Ǎ[(QFf͚5kV̙3mɓ[2??ȣ>:7,{W|+,YR!H$T˲E]ˢuuug>glKdՇPGڊ-ZTnݺ"W˝W# R>]gP>O,2 d-jPk0|J 72]ɵN.g=W]}M?ܹ33`̙J02~pl/;M皚oƌXjgy9S8fi?o-nذA]^JaÆ͛7ǎ=:YiӦuқդ$wmƍ6mr&(`И6mZ>ؽzϹOvgsq#\:6;;; ˲݂0TU5UUEWW^WQŹCx<=vx<(lB2v #kxw?2e҈SX_zY7tӇ^2qFnݚBέ[&nƞߧOBdlFf@WWWK>y~wkkk?z=dɒ w~iu***>l ,Y7i'm_˿/ӶbŊ`T}!iHs'yhx@B˲`p;e ad{f!=sz}umTUqL[]ͥK\`Df͚S7n<}饗)"N:8qbmUU[&|>iwţ}W_}ȑ#~p„ lca}i뮻Z`A5\sɸqJɡT*566ƨAjgρG-S%Oڿf0 @Qw4 a!B 0!4 B B 0!4 Bɐp82&# !H`O)a~x;qS ^ EQ£(J_gچaIae(gЏq66B^%)P+G}"C$,q= qD2L2F]Z @DOe4<ϔ(0wBud(OV7HHP280 f;MٳΝ{.#8 (B7Bi !'޽@@'d9MCq<@@@@b%@`oa}, T?~"-pڛo0v1{e:Yơ2 d8~YMM͢@ q,ta W(Y[395J6 ᘇ{ m| )Sنz2,)WB8d) ]ͩY. R; ,Bf>]Ɇߗ[EZEZEZEZEZEZEZE;GN h(8="5)WCx\hyrIg9)w*g9, 7w0LBmD!V<0"LMY<]s ? ||"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-,WfKa>h.a^wƋ,-.Ҭ\:oW.?o/Ymp;ǞdwfwjY'4+;D\6 .M4+(F2k*;"moh֟?W'CVdDyuiBDOs-C!Ÿ!ZvOd޵n{)&7in8cd'"/,sۉGIՁmU")Uv_3@%^c?eDZi{l8eegnD*R)E*R)E*R)E")E")E")E"EE"EE"E%P(R)T(R)T(R)E*R)E*R)E*R)E")E")E")E"EE"EEJEVD&R.Ide*;ˉ؆'vFgi쁲LggVmЋV#R.Z/ bO؍[Ʈ{mXHjѶC>0lye^~{!o𶜀ui*'2K$Fnߊ W";)DC3;y×oF2]9׀6|nRAQюCrU{$u1wƟkkg}lv;B_Ld G<*c:p=7~['}`#F2pHӺ!s Wc[(E?Q n1: \@'_dkWSaK*!c4"Ӈ%,2ќߋWrzh`>aoT5sóñpI's \UFSe~ʌ}=M \Qqt@NYjI@71g eEN~kn,Y(rpRD )b E@H1"b E H)"R@1"b E H)"RD )b E@H1"RD )b E@1"b E H)"R@1"b E /)b E@H1"RD )b E@1"b E H)"R@1"b E H1"RD )b E@H1"r2/ea<$G:NL&1ri}&_U!qGouȶ+ڰhH1U-{ XEAus8e ßؒܖpx#LU$xx|PPU9}`U}`E @:J~t e`:pioD7#c#yXnj  <p{ғ/3e5b =]1?nhDOIENDB`"͉I^PNG  IHDRN@; pHYs  tIME 7 W IDATxyչ?Uݳ1 kdY!(1**1MczhsD/(., ;o=T]EuOL À}}=y_EC PSX-|{ﭪDBB plo+I?Ӊ()Aet]'?8 pk},wǍcyIe9"eYYxdQQaTU>2zi&***e9ƱQD+B#ع lVZطo_D8?9#y7cƌeclRIw$ay9#TuV֭['ra~c-/.W[p8~dY.Ce֬Y롟@ݨ\cBi q,@8g+p^qMгRӸep䧞 Q$!2 VFSX$I{ 9T/~aV IB̛giYkdݎt| AK/!Wod͚5L:W^y;Jɲ(Cv~?q"曩`͚5deeq=XuZӧpwpUW];x뭷W^yiz'?9 J6oV-(fp'ՀX$QaL"p=UU%L;Z@ (ebYHuOuaKfK& // kWųE@, YcٚXI„y*> Х`%MJ,x>6nۧ}xfu0NF[Cwt @$xg^yjkksm҂XTm+&N63ƼOL82e rm( D<uqo{.ڡCS4 }HO>8}a}{Ӱe Kxg$K/]iڳǐՉZC%IbuJ Á`BTU/`֭|>|>m۸ C=6V\w|>UU]:ע@=Cس/rxٲe=5 !pnۆrܰvqѐb5LfqqqSFF6D"k\ݎtE0|IOĎJ#Gfתt/j$!kך|ToxEJK;O07% ᇑۻ|eذa<<ݮ(RRx"#qӏ\z̚5 M6T{2 tva{曹;),,읹C=d{<}Y222N=i@;w.-0[d9gZ:wz+8x k֬1xꩧJV { ;v,saС\jԨ'O|jP2vXm\@jj*?,Z72w\qݴK/QVVfLeee2v Vɏ'Dw}7%%%s=TTTpE^ˏ;ƒ%K8v_|qݮWtk׮E9s5jT}^buS@}|Νرx=3=-'d~цYg汞 ;bY2< #Ů]u:6r1^~嫁wj=Ȳ455a#A-EtDp4Dg:,?ԄTW>aBNB ͛Tru%I/0o rHKK;k2RDW 6ʍƁχon3C6mѣf}^/ƍ񄌐_|Ak0={$d5uljш{^^oBhwܖJvÇijjB4sBUИ6cC4 UzkN+n7)35 ߏٶmse߿[9Z>Vуss @;vկ2D5x^h:?!atc;-dN6eQ_*|In嗣?xkumaݺ,#iRn.HY%$IYԍBȀxIXw8 45!w_HK$ JhxsIjDس}hcml=IB 7Ȫ?N'#U#GP~f]GYU#O'"zjjlEBr=A[`͆dw_UU4M̞l|}}={ `C/x3f wfѢENEW{dk 7܀oz~~z De /Oʕ+#u]<g??)ikk#77 З !?uTؼys1`cq7m4v;_sSXX֭[OXt)_BF4|>}Y,h'Q0a7n8o^{{1-[e]Ʊc(..fҥXu;3nܸ'3f0c 7M:!1ctڵkַE0K/48pT?gf͚񞂂֯_Aׯy駹iiiywG}#<x0U96͜ǚ\xᅸ\.>SٳYr%S[[ᣏ>K/6E'33m۶I{{;L<_l߾m8p/$1~xjjjشi$1sL NSS??mJؚ`Xr2襤`#,9UzJ{F y4p/"ovdo|=<ɫ[2n8JJJhjj+ֆeȐ!\s5L4s9Ro΍7G}̙3e6f̘AZZǏb4g#2_r[4R#lYIOvΜh# ^%2;[N1ŋYz5 2-^w6 k.4M3KKK\?QHgPw:ulsz8 ND'BˑId_,u'4MCUP"T۝ Crye V=ztI^^S`0-%Vcl$W'{]@=JQTyLh75ᆷco>w&68XѝFIao 䳤"LjG7J w:M(BVԵ07p'CP䁁&Kw%GK ![Qhቑ y>4]gݴ*uuu_v|b<)_װl1DfwlgCXWSCNI N<&>nkcG? 8 v#D@1Bui[x Fq:@2WC?v [a!>?'_F`^ֆnGӴh}7B5IҥزTQQlŤ$='al>]uC;|>E3.xjq,L}&;%7~DY1%I]@ 2nfG?b#6vP\ΥXFMhhhD_5f ޖ$?_r$I8pT#2\r!PUdƦ΍YcN&V,A=_̔[`mmb4rw*؛s܌p. NM6i&6oL @U\YKPՐ%[2K'糳deO5<;||dyyhoKt4>hzzF;EQv74 TWZky>kkj-<Ձ6I|I>L$!*Zh }H*7Gg6ɲ' l t9y6ԇ IB"ǟ.)ƈ |ǐRs 5 qbz:c5 r6_ Y+)sw@Xwzcݎ(KRSnmY*?EӐA3x t[UU%8Yfx0+*jX|+l6x sWٳ袋())BZ{9^x^>eڣf'{lٲ`0w'wdgg_|O(=?筷?x?JٳgAjjyF^^?ݻKltMz?f8–(GOSL!#0`>eLƎQFʓO>O~ijj뿘:u*̜9Rޡ;|١cǎeȑx^{9fϞMaaiMpS2e C pmƌL4 ]ٰa---:tEQׯ_馛شi׿9s&6mb̙;Yf1c 3<Ϛ5wym۶\9!Ȉ`ٲesNN:` Ak#޼ȲLzz:O<*3cvii)v6~3}ذa444׿<_]]x, C!_~fS"I7x#S /~Ǝ{)ٳg #P?>'O&%%۷K/^}UYYYLd,--Θ1CeUUUfGn⋈Yn*3999\qiwuIʊpdY&--+V@ל+ff)S?Ojjj?C愪E 2  D}}=-"766R[[ѣ4={"}(dSVV;͛),,?f/! "I>HDEEN4v)++c > 6+_SUUZ[[TV0Qiو%*mwo4: *Kn6rsuu@VbժULt*Ch333y衇Hd|W ==Ke!of&vfϞmg,Yŋ; Tʴĉp+0a>C,Yilٲ.[۷#I˖-cӦM1쮾j6mľ}7oK.fk׮8:x|/)O6>gcА$'l|_ɟD7KfffB<{qq=Eff&?{ 9'mɉkYm-/k+?o/^Lii)?<{=s#$%Zի袋xgs^o|eeW^aڵ봄uZDaR#5Q<_s 5J{@uM+ otu k\P.zXqNῚzL(y"3V9$x`XUm# 5q @*y I&`^pd`0hlݙEDLE}6Ό %#/#ƄP$xLB!aomiR !ut@SN'n'x;wR__8 %ܻ5L[U[tP3HOO77{n3'lwLm'2uj{!@x#UQ(/O*g(JhXWG0NMx嗩NӴ# KYL 5McH&'B4=MX'd/,[Fl'A(fQ8؄:sgH:D¡t]gԩ[^0A@Ez[x O3@7+O#'ߕ8 =BRSfÑdb`)VQlof&rM 1z#z-st"2۶mcȐ!'E)n .]Dٸ1x0zScL(,2I#6Q\ؿ?Mli>l5[gb"w(k׮OOO7>>OA$H [^xߔLJ$I|ԇTu\jEQu1cƘv ^J166F3g-&&Rg1o=%9a%^S Nap`5$ad]GtҺo>ZZZv~?)))HdM2|$I2 !$ i VRݷ-~?I^k4SГY[9ѣh>_(9A a}iu] ͆s!???~S;c%8nwﴢla1sAojp [[ϝ .WDxa)Buu5`fZZZs=1\+-E}%H} IDAT:(g]jS tVsۍׇD݆>q"׾-hfw^lقaٲe|["p8p8dddpwX6躎(+;n7t6RO@'K пׯۍhiA]!7)q;%9sn6֬Yi,v<|B0Rؗ\(--mMC %CQIQu8//cjY#GHKKbouш͛@JؽDA^1DrK%1 j"#).r4׋D8ՒUOِ6oFڼ9btCFFEItI0$'+ Y;ӔWBQA] aB". } R8i,<"!(* dTz$XZtF!Nd*BPn8A"DH 3 EAz*+w 妊 $aQI!,atNa״>ԝ ٳgS^^Nnn.. YQUó>qСC`x<RRR!!`VW_=kx)\xATUEd{ڀohh E$;F0d֬Y_޼Ν ΦGy$9$Po7III wqGC [ID,Eȯ>'33sճwӧOV39Q6m[oEii)\p5]vEܫ:nR† KUUUD2̾xֿX[[[_j mo#eׁ1ccƌ<>쳘mٲzSXX?~}:瓝ɓqvIKK3|8'8~Μ95 C}}=_|EBo3qDHjj*s '##L233ׯƍ(V"??fz衈n3+3`TUUYx?9T4,X1cx<qwiH3O #p\477wȢ˪wSQQA4غu+wygĊԖ-[8|0Ťr4ï[nfy!XFYϟO^^F}3otߏn';;S%k ѣG?١ٴo>x≈Ǐ'33vc=F}zdee wމY￟7xC͸qhFv>(  "##ǦMLQj-N;33g2|pn7Bشi_L;|\2ȲLkk+~a1ldݼy3w_e˖O {71c"(G6O?4w,w'#v͛(|>3fPy5 B% `p lڴ 6D.cرdffiNNNgfĈ8p bDCW0lv+BMMM:ʋ-t*^?`0Ȼ Kzz:w^.0پx^dY1ժc444`l?zPWWsjiwtF74Lf][[$r `GIB+| ۷o7F\gimmEQ:AT;<BxxG{u5ҕ p%Gm6Ӻu9z۲lv|6#\,K*8'1le,}v aذa\x 4gVZEvvvLd-L8=gŊgɶWdz) >==YWʖ-["\&NYh| ˁXx1EEEYT'~% ||O$'Kd9m,GMOロFvɫi{/#F`_^{ ˗/~z<$j,dܽuOW /ٴ?:tHz뭬[r:.] uvZ300޽^{1i6^"=ņV4v{hW*ZmmmZOSI= &XmѣG do@xD)PFx.=ߝgOFCDO=d†$! t 4 Њ]6!ϜTI[G?ӡIԩ1Ynyݴ=z9ܬYyghz[ NAN2,09GJځ78oǷ 6s(^p 䔕eN6hROXNT[۬MI(x(ko6t(冗D%%(߯iх?vw+TUm Đ "z90x~@ @09;Kx=|W`uX Uq(bD8Ͻx 13zDu$jD.jc#N2~СCoՄ̵1mV~o3uT@&O˻s>Ƃt1v;ʀ^Uݐ> ѣ &IT@K+$Q\\~;jjjz6z'!{|n/MIcݓ/"+ 4pAVJ7lJA2f-n7VEM@jqq ͥX+PV73NtUμ|gDV塔q-=>ׁI4IB:BtMpg<$rg,ʤ4Y=<:peoAwSn.`aQ1rhiB*.),cSU4!KOU4M3:l0zTUpXw\{y%JB!AkKfKRXAYױ) v;UT,Sps/EO錏(>] h'Ms'՟,_1dH蜮Dq[t֬g)#4 @uD  uW[,ۼ$IkkQF@&M oƳ~ܿ`̦dYt:ikk#0gZZZvhϑ]ǖY[Yw&~?bC" YuX B';:s'KIalCREjt!]|%͇Vq.2GA4l6[D & ,XUUQR}R@om%KH_j}]gr#$"'1p FذxG@ MbZZZPhf湗e `DIcRRP v2{ζ!Kq ^WҰU=c<7g#˜0 c-# H-?]r)sոz&!c+(@Y>y<|%biAmmmì"*Z~<*A!h.'/Q#\MM!iBV(c] vEѣv*++[b q^..p $!G M )W]\.ô-? UUe֭||,[F&Z6uQQqipz7! ~%x> KV;픔1s$ǟ$ˇu JN B 49|>]MUM G(m>"sqL4y%uѿ{:d VPzV_Op^| Z!GkրV>|8`͆,lܸ1n] K>^TD#؊:D`^^sM\S, ,}I|>ׯ_ @!>%:>n5675onYFK ''<=+$IRRRufΜ)aIvCCCBmL8Ū2r|Ӄ6c,aiUtX&lO{{;v g>aBF$1q) RR#4e}ر1ͨX wf4εcIIIo7cN% |>|'/$/0nw%;hp8qM7%NEkm ZUu|Ÿn_ye QGUȲL^^q%Gu|X:?%%v ݭ@fi8-꣗`M w:C~0M kcB@ # &OwL]^,F}$'v࢒Fuu!-KsD!B|EAjo{Gl`!KbT9@0h*0&UUKIU旖_>L" ]GVU'_ **ӧ3妒W\ܩv^:$( >!xs^q1CvDдІ0 D "1v>/ Bq. @X]: gϒ(mMќʑ#ʰ geaz~dU=φK̔hjB~"b䐕0--$UK 1$Eh?hJJ8lJr{;DEY2ᨡ iFC#ƏG#-I{@ē FǷ&3D p2*%~B`ooG ;]Hakg$Á8tB"##YYOAcw0.fcHj*Cm6R~?ڸu`iXCOnEu!=RD^^Rԟ!"0aI> $ ruSEbGRkJ]RM f_~aӁZ!  s8$KMC07$S$Q"V ݬl2BT( YjTMnha]Of 60+6,Hu A4dMCx:]jooVl.MqMMY#1sg2͆b233q^jv믿̰a6l Hݻw/O?f&a >Y/