Followers 0

# Working with frames in IE

## 22 posts in this topic

Hi,

I am trying to work with a web site that uses frames (for the first time) and my script crashes in line 13 ($oframe=), would appreciate if someone can explain what I am doing wrong. #include <C:\Program Files\AutoIt3\beta\Include\IE.au3>$o_IE2 = _IECreate ("http://www.acpaccountants.com.au")

$oFrames = _IEFrameGetCollection ($o_IE2)
$iNumFrames = @extended If$iNumFrames > 0 Then
If _IEIsFrameSet ($o_IE2) Then MsgBox(0, "Frame Info", "Page contains " &$iNumFrames & " frames in a FrameSet")

For $i = 0 to ($iNumFrames - 1)
MsgBox(0,"$i",$i)
$oFrame = _IEFrameGetCollection ($o_IE2, $i) MsgBox(0, "Frame Info", _IEPropertyGet ($oFrame, "locationurl"))
Next
Else
MsgBox(0, "Frame Info", "Page contains " & $iNumFrames & " iFrames") EndIf Else MsgBox(0, "Frame Info", "Page contains no frames") EndIf Thank you. VW #### Share this post ##### Link to post ##### Share on other sites #2 · Posted (edited) @VW Your trouble is caused by cross-site scripting security restrictions. You'll notice that your top level page goes to the domain www.acpaccountants.com.au and if you look at the source, you'll see that the frames in the frameset go to www.accounting.eknowhow.com In this detailed reply I would like to document 1) troubleshooting steps, 2) why the error occurs and 3) a suggested workaround/fix for the issue. I'm unhappy that I do not trap the error you received from IE.au3 and give you more of a clue what is wrong. This particular error is very troublesome however because it can crop up almost anywhere unexpectedly since I try to reduce user complexity by accepting frame (actually, window) and and browser objects interchangably in most all functions. Note: see "Frame Comments" below Perhaps I can come up with a way to deal with this condition generically, but it is going to take some thought. Until then, this is one of the primary reasons I added the _IEErrorHandlerRegister() function to version 2. If you add this call near the top of your script, you'll 1) get a console message with detail on any COM error and 2) be able to trap these errors yourself and take appropriate action without your script aborting. I have not promoted the use of _IEErrorHandlerRegister() here in the forums much, but let me start now. With _IEErrorHandlerRegister() in your script, I receive the following: --> COM Error Encountered in tmp-asdfoooe.au3 ---->$IEComErrorScriptline = 2823

----> $IEComErrorNumberHex = 80070005 ---->$IEComErrorNumber = -2147024891

----> $IEComErrorWinDescription = Access is denied. ---->$IEComErrorDescription =

----> $IEComErrorSource = ---->$IEComErrorHelpFile =

----> $IEComErrorHelpContext = ---->$IEComErrorLastDllError = 0

The "$IEComErrorWinDescription = Access is denied." is the indication that this is a cross-site security problem. If you want to trap for such an error, you need to check If @error =$_IEStatus_ComError ThenoÝ÷ Øò¢ìÛhµ©²øiËb¢z'¶¬yË¢·'«®ò¢ç«­¢+Ù%¡ÉÉ½ÈôÀÌØí}%MÑÑÕÍ}
½µÉÉ½È¤¹|( ÀÌØí%
+­*.q©ìjeÊë @«y«^¶)zv§{ë£®"Ø§Ú"´ò¢ìÛhëmå.Øk¢è!±Êâ¦Ü¨ºwvÚ zÖ«y÷«zw¶ayúÚê+ZÚç¥zg§µ¼jZæ§v­Û,­Êk¢«·&®¶­sb6æ6ÇVFRfÇC´RæS2fwC° ¥ôTW'&÷$æFÆW%&Vv7FW" ¢b33c·G'GF6ÒG'VP¢b33c¶ôRÒôT7&VFRgV÷C¶GG¢ò÷wwræ766÷VçFçG2æ6öÒæRgV÷C²Âb33c·G'GF6¢b33c¶ôg&ÖTVÆVÖVçG2ÒôUFtæÖTvWD6öÆÆV7Föâb33c¶ôRÂgV÷C¶g&ÖRgV÷C²¤f÷"b33c¶ôg&ÖTVÆVÖVçBâb33c¶ôg&ÖTVÆVÖVçG0 6öç6öÆUw&FRgV÷C´g&ÖR6÷W&6S¢gV÷C²f×²b33c¶ôg&ÖRç7&2f×²5"¤æW Hopefully this gives you workarounds and ideas and will help others dealing with this sometimes confusing issue of frames. Dale To aid others searching for this specific error from IE.au3 in finding this post, here is the exact message: >Running:(3.2.0.1):C:\Program Files\AutoIt3\autoit3.exe "C:\AutoItScripts\tmp-asdfoooe.au3" C:\Program Files\AutoIt3\beta\Include\IE.au3 (2823) : ==> The requested action with this object has failed.: Return$o_object.location.href ()
Return $o_object.location.href ()^ ERROR +>AutoIT3.exe ended.rc:0 Frame Comments To add to the confusion about frames, there are both Frame Elements and Frames as Windows. Frames as Windows are returned from _IFFrameGetCollection and _IEFrameGetObjByName. Frames as Windows are actually Window objects and can typically be used interchangably with browser objects. Frame Elements on the other hand are more closely tied to the <frame> or <iframe> tag itself, rather than the actual content of the frame. For Example, the .src property of a Frame Element shows you what the initial URL was for the frame and not necessarily what is displayed there currently. Edit: fixed typos Edited by DaleHohm Free Internet Tools: DebugBar, AutoIt IE Builder, HTTP UDF, MODIV2, IE Developer Toolbar, IEDocMon, Fiddler, HTML Validator, WGet, curl Automate input type=file (Related) SciTe Debug mode - it's magic: #AutoIt3Wrapper_run_debug_mode=Y Doesn't work needs to be ripped out of the troubleshooting lexicon. It means that what you tried did not produce the results you expected. It begs the questions 1) what did you try?, 2) what did you expect? and 3) what happened instead? Reproducer: a small (the smallest?) piece of stand-alone code that demonstrates your trouble #### Share this post ##### Link to post ##### Share on other sites Hi Dale, Thank you for looking at this and your additional comments, I must admit at the moment I find frames confusing and I need to work through your analysis. I think this particular site was probably not a good first up choice to start trying to work with frames. Nevertheless one of the things that has become clear to me since I have started working with the IE udf is that there are so many sites out there, and while many sites operate in a "conventional" manner, there are always exceptions. You must have seen quite a few of these sites by now. Cheers, VW #### Share this post ##### Link to post ##### Share on other sites there are so many sites out there, and while many sites operate in a "conventional" manner, there are always exceptions. You must have seen quite a few of these sites by now. Yes, this has made this project quite a challenge. The number of lines in the UDF doubles from version 1 to 2, mostly due to error trapping and handling routines added -- and as you can see it is far from bullet-proof. Read through my reply and let me know what questions remain for you -- everyone, including me, will benefit. Dale Free Internet Tools: DebugBar, AutoIt IE Builder, HTTP UDF, MODIV2, IE Developer Toolbar, IEDocMon, Fiddler, HTML Validator, WGet, curl Automate input type=file (Related) SciTe Debug mode - it's magic: #AutoIt3Wrapper_run_debug_mode=Y Doesn't work needs to be ripped out of the troubleshooting lexicon. It means that what you tried did not produce the results you expected. It begs the questions 1) what did you try?, 2) what did you expect? and 3) what happened instead? Reproducer: a small (the smallest?) piece of stand-alone code that demonstrates your trouble #### Share this post ##### Link to post ##### Share on other sites #5 · Posted (edited) Hi Dale, Your notes started to make a lot more sense to me after I started working through your example. This really is not important, but I was curious why a site would be using two separate domains and in this instance the reason that there are two domains involved is that http://www.acpaccountants.com.au is hosted by an organisation whose domain name is https://www.accounting.eknowhow.com which means that there is a logical reason why this is happening - and that this scenario is likely to be repeated any time you're dealing with a hosted site. Anyway here is a proof-of-concept of your suggested approach. This code identifies whether a site uses frames. If so, then the URL's for the underlying frames are extracted so that you can then "work" with the site as per usual. #include <C:\Program Files\AutoIt3\beta\Include\IE.au3>$o_IE = _IECreate ("http://www.acpaccountants.com.au")

$oFrames = _IEFrameGetCollection ($o_IE)
$iNumFrames = @extended If$iNumFrames > 0 Then
If _IEIsFrameSet ($o_IE) Then ; If the URL contains frames ... ; MsgBox(0, "Frame Info", "Page contains " &$iNumFrames & " frames in a FrameSet")

;       Get the URL for the underlying frame
$oFrameElements = _IETagNameGetCollection($o_IE, "frame")
For $oFrameElement in$oFrameElements
;           MsgBox(0,"FrameElement","Frame source: " & $oFrameElement.src)$o_IE2 = _IECreate($oFrameElement.src)$oLinks = _IELinkGetCollection ($o_IE2)$iNumLinks = @extended
MsgBox(0, "Link Info", $iNumLinks & " links found") If$iNumLinks > 0 Then
For $oLink In$oLinks
ConsoleWrite("Link Info: " & $oLink.href & @CR) Next EndIf _IEQuit($o_IE2)
Sleep(100)
Next

_IEQuit($o_IE) Else MsgBox(0, "Frame Info", "Page contains " &$iNumFrames & " iFrames")
EndIf
Else
MsgBox(0, "Frame Info", "Page contains no frames")
EndIf

What is interesting about this site, is that the first frame does not load anything. I am not sure what it's purpose is. But the second frame in this instance does "load the site" and then all the objects are available. I will be interested to see how well this approach works with other sites with frames.

Something else that I have noticed, is that this is the first site I have worked with that is using https rather than http. So when the page loads in IE you receive a prompt about whether you want to display secure and non-secure items. I was looking through the help to see if there was a switch for 'Yes' or 'No' but I could not see anything - is there an option to have a default response?

Cheers,

VW

Edited by VeeDub

##### Share on other sites

Hi Dale,

When I run the script that I posted earlier in this thread, when the script processes the frames and thus goes to the https://www.accounting.eknowhow.com URL, an IE "Security Information" dialog box appears (I have included a picture of the dialog box as an attachment).

I have tried writing some code using WinWait to wait for and then click the 'Yes' button, however it appears that once the dialog box appears, until a button on the dialog box is clicked the script is waiting in the IE UDF so my code never executes.

Can you suggest how I can have the script click on the Yes button.

Thanks

VW

##### Share on other sites

@VW

I'm guessign that the odd use of frames at this site is actually a workaround for avoiding the security alert...

I believe you can work around this when opening the page directly by adapting the "Whack Security Alert" exampl in the IE section of the Snippets Database -- it uses AdLib to troll for the security alert box.

Dale

Free Internet Tools: DebugBar, AutoIt IE Builder, HTTP UDF, MODIV2, IE Developer Toolbar, IEDocMon, Fiddler, HTML Validator, WGet, curl

Automate input type=file (Related)

SciTe Debug mode - it's magic: #AutoIt3Wrapper_run_debug_mode=Y Doesn't work needs to be ripped out of the troubleshooting lexicon. It means that what you tried did not produce the results you expected. It begs the questions 1) what did you try?, 2) what did you expect? and 3) what happened instead?

Reproducer: a small (the smallest?) piece of stand-alone code that demonstrates your trouble

##### Share on other sites

Hi Dale,

Thanks for your suggestion, that worked fine.

Cheers,

VW

##### Share on other sites

Hi Dale,

I have discovered a site with frames that the earlier script does not handle

Can you have a look at this site http://www.davidleisk.com.au/, I can view the source with Firefox and I can see the links but for some reason View Source is not an option with IE.

The key frame is http://www.davidleisk.com.au/left%20navbar.htm which is where all the links are, but while I can access the frame I have not worked out how to access the links within the frame with IE.au3

It's almost as if the site has some sort of IE "protection".

Thanks

VW

##### Share on other sites

@VW

I'm not certain I understand your trouble, but please note that View Source in the IE browser will show you the source of the document that was loaded, but not any changes that were made resulting from Javascript (or other script, including AutoIt) subsequently modifying the page.

This example will show you the source of the main document and any frames in the dynamic documents:

#include <IE.au3>

Local $sURL = "http://www.davidleisk.com.au/",$tryAttach = True
$oIE = _IECreate($sURL, $tryAttach)$sHTML = _IEDocReadHTML($oIE) ConsoleWrite("-----------> Start Source for main document <-------------" & @CR &$sHTML & @CR & _
"----------->   End Source for main document <-------------" & @CR & @CR)

$oFrames = _IEFrameGetCollection ($oIE)
$iNumFrames = @extended For$i = 0 to ($iNumFrames - 1)$oFrame = _IEFrameGetCollection ($oIE,$i)
$sHTML = _IEDocReadHTML($oFrame)
ConsoleWrite("-----------> Start Source for Frame " & $i & " <-------------" & @CR &$sHTML & @CR & _
"----------->   End Source for Frame " & $i & " <-------------" & @CR & @CR) Next Exit Dale Free Internet Tools: DebugBar, AutoIt IE Builder, HTTP UDF, MODIV2, IE Developer Toolbar, IEDocMon, Fiddler, HTML Validator, WGet, curl Automate input type=file (Related) SciTe Debug mode - it's magic: #AutoIt3Wrapper_run_debug_mode=Y Doesn't work needs to be ripped out of the troubleshooting lexicon. It means that what you tried did not produce the results you expected. It begs the questions 1) what did you try?, 2) what did you expect? and 3) what happened instead? Reproducer: a small (the smallest?) piece of stand-alone code that demonstrates your trouble #### Share this post ##### Link to post ##### Share on other sites Maybe this will help? #include <IE.au3> _IEErrorHandlerRegister()$sURL = "http://www.davidleisk.com.au"
$oIE = _IECreate($sURL, 1)
$oFrame = _IEFrameGetObjByName($oIE, "leftFrame")
$oLinks = _IELinkGetCollection($oFrame)

For $oLink In$oLinks
ConsoleWrite($oLink.href & @CRLF) Next #### Share this post ##### Link to post ##### Share on other sites Maybe this will help? #include <IE.au3> _IEErrorHandlerRegister()$sURL = "http://www.davidleisk.com.au"
$oIE = _IECreate($sURL, 1)
$oFrame = _IEFrameGetObjByName($oIE, "leftFrame")
$oLinks = _IELinkGetCollection($oFrame)

For $oLink In$oLinks
ConsoleWrite($oLink.href & @CRLF) Next Hi Big_Daddy, You're right this code snippet does return the results that I am after, which is good. However I would really like to understand the process you followed to work this out. I have searched through the source for both the main document and the frames and I cannot see any reference to 'leftframe'. In fact this is an aspect that I am still yet to come to terms with generally, being able to identify the object names for various site elements. So hopefully if I can understand the process you followed to construct this code - then it will improve my IE troubleshooting skills generally. (and I can hassle Dale less I would also like to update the frames routine posted earlier in this thread so that it would handle this site. To do this I need to devise some logic to determine when I should use this approach versus the existing code. For instance are there other browser properties I could query using say _IEFrameGetCollection to determine which approach to adopt? Thanks VW #### Share this post ##### Link to post ##### Share on other sites This is the line that I pulled the name from. <frame src="left%20navbar.htm" name="leftFrame" scrolling="no" noresize> For getting the names of elements try this handy little tool. MODIV2 #### Share this post ##### Link to post ##### Share on other sites This is the line that I pulled the name from. <frame src="left%20navbar.htm" name="leftFrame" scrolling="no" noresize> For getting the names of elements try this handy little tool. @big_daddy, Interesting tool, however did you find it? ViM #### Share this post ##### Link to post ##### Share on other sites @big_daddy, Interesting tool, however did you find it? ViM Dale mentioned it here a while back. #### Share this post ##### Link to post ##### Share on other sites Resurecting this excellent post from the archives. I've been having problems accessing specific frames within a frameset on a particular site. Unfortunately the site is internal to our corp. It's a clearquest bug tracking web interface. The base URL is http://clearquest.bna.ourcompany.net/cqweb...;contextid=SCNA It contains a a frameset with one sub frameset and total of 6 frames. I can enumerate them, but can't access any of the properties of them (tested against my own frameset page elsewhere with no problems) From the top of this thread, I hooked in the exception handler, and it told me the error was "Permission denied", which would indicate multiple domains and a possible cross site scripting error. Thing is.. all the src parameters of the frames are local relative addresses. If I look at the source of any given frame, they make many references to top.this() and top.that(), which means the frames are communicating with the frameset page without a problem. Here's the frameset source <frameset topmargin="0" framespacing="0" border="0" frameborder="no" rows="70, *,0,0,0" onload="onload();"> <frame topmargin="0" marginheight="0" marginwidth="0" noresize="1" scrolling="no" frameborder="no" name="bannerFrame" src="/wre/common/html/null.html"> <frameset border="2" marginwidth="0" marginheight="0" leftmargin="0" topmargin="0" framespacing="2" frameborder="1" cols="230, *"> <frame border="2" marginheight="2" marginwidth="2" frameborder="yes" name="treeFrame" src="/wre/common/html/null.html"> <frame marginheight="0" marginwidth="0" name="contentFrame" src="/cqweb/main?USE_CASE=cq_redirect&target=/cqweb/dct/html/download"> </frameset> <frame marginheight="0" marginwidth="0" noresize="1" name="pxScratchPad" src="/wre/common/html/null.html"> <frame marginheight="0" marginwidth="0" noresize="1" name="cqScratchPad" src="/wre/common/html/null.html"> <frame marginheight="0" marginwidth="0" noresize="1" name="loaderFrame" src="/cqweb/main?USE_CASE=px_loader"> <noframes> <body></body> </noframes> </frameset> Now there is a strong possibility that some of the frame content is dynamically generated, but it all comes from the same domain. Because the frames do talk to the frameset page and amonst each other, there is no way I can use the trick suggested above to load the sub pages separately. Any thoughts on what else may be wrong? The main frustration is that I'm driving the navigation between links in the frames by tabbing around, and hitting Enter to activate links and buttons, but I can't wait on anything to finish loading. Sure would be nice if I could tab to a control and then tell AutoIt to latch onto the window object that contains the control with focus and go from there. ian #### Share this post ##### Link to post ##### Share on other sites Text like the following would concern me that there are redirects happening that might actually create the crosse-site permission issue: "USE_CASE=cq_redirect". Check the final URLs of each frame to insure they are what you believe them to me. Dale Free Internet Tools: DebugBar, AutoIt IE Builder, HTTP UDF, MODIV2, IE Developer Toolbar, IEDocMon, Fiddler, HTML Validator, WGet, curl Automate input type=file (Related) SciTe Debug mode - it's magic: #AutoIt3Wrapper_run_debug_mode=Y Doesn't work needs to be ripped out of the troubleshooting lexicon. It means that what you tried did not produce the results you expected. It begs the questions 1) what did you try?, 2) what did you expect? and 3) what happened instead? Reproducer: a small (the smallest?) piece of stand-alone code that demonstrates your trouble #### Share this post ##### Link to post ##### Share on other sites #18 · Posted (edited) Text like the following would concern me that there are redirects happening that might actually create the crosse-site permission issue: "USE_CASE=cq_redirect". Check the final URLs of each frame to insure they are what you believe them to me. Dale The final URLs are all from the same host as the top frameset page. As I said, it's clear from the JS code that all the frames communicate both with the top frameset and with each other, without a problem. None of the pages show any signs of messing with document.domain, and I can run JS URLs like java script:alert(top.bannerFrame.someproperty) and see it. But try to access any subframe with AutoIt, and I get permission denied errors. It's like IE.au3 has just completely lost touch with the DOM. I can access the source of the frameset page, and that's it. I used some of the code earlier in this thread to iterate through the frames and verified that it works properly on my own site with simple frameset and 3 frames, but point it at the clearquest web page and it fails miserably on every frame. ian Edited by Daemon #### Share this post ##### Link to post ##### Share on other sites There is a main document and 6 frames with embedded documents. How have you verified the URL of each (starting with http://)? Anything funky/non-default about your security settings or web zones? I'm used to seeing "Access is Denied", not "Permission Denied" in these situations -- can you please use _IEErrorHandlerRegister and return the full output from the SciTe console? Dale Free Internet Tools: DebugBar, AutoIt IE Builder, HTTP UDF, MODIV2, IE Developer Toolbar, IEDocMon, Fiddler, HTML Validator, WGet, curl Automate input type=file (Related) SciTe Debug mode - it's magic: #AutoIt3Wrapper_run_debug_mode=Y Doesn't work needs to be ripped out of the troubleshooting lexicon. It means that what you tried did not produce the results you expected. It begs the questions 1) what did you try?, 2) what did you expect? and 3) what happened instead? Reproducer: a small (the smallest?) piece of stand-alone code that demonstrates your trouble #### Share this post ##### Link to post ##### Share on other sites There is a main document and 6 frames with embedded documents. How have you verified the URL of each (starting with http://)? I brought up the properties of each frame to see what URL it landed on. (Tried a different trick later.. see below) Anything funky/non-default about your security settings or web zones? Nope, and if there was, IE wouldn't load the page in the first place. I'm used to seeing "Access is Denied", not "Permission Denied" in these situations -- can you please use _IEErrorHandlerRegister and return the full output from the SciTe console? You're right, it's "Access is Denied". Anyway, I've moved on a bit. The web app I've been talking about so far is a 3rd party app so there are some questions I can't answer. For giggles I pointed it our own web application for which I'm one of the developers so I can answer questions about the frames with authority.. and it is showing exactly the same problem. This app has 1 frameset containing 4 frames. All served up from the same hostname. I used a variation of the code in the first post of this thread to iterate through the frames and try to show the locationurl property of each. I added in the erorr handler, and changed all MsgBox to ConsoleWrite. This is the output >"C:\Program Files\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Documents and Settings\ian\My Documents\loadOffice.au3" All frames loaded Frame Info Page contains 4 frames in a FrameSet$i=0
Frame Info locationurl =
COM Error
--> COM Error Encountered in loadOffice.au3
----> $ErrorScriptline = 2824 ---->$ErrorNumberHex = 80070005
----> $ErrorNumber = -2147024891 ---->$ErrorWinDescription = Access is denied.
----> $ErrorDescription = ---->$ErrorSource =
----> $ErrorHelpFile = ---->$ErrorHelpContext =
----> $ErrorLastDllError = 0$i=1
Frame Info locationurl =
COM Error
--> COM Error Encountered in loadOffice.au3
----> $ErrorScriptline = 2824 ---->$ErrorNumberHex = 80070005
----> $ErrorNumber = -2147024891 ---->$ErrorWinDescription = Access is denied.
----> $ErrorDescription = ---->$ErrorSource =
----> $ErrorHelpFile = ---->$ErrorHelpContext =
----> $ErrorLastDllError = 0$i=2
Frame Info locationurl =
COM Error
--> COM Error Encountered in loadOffice.au3
----> $ErrorScriptline = 2824 ---->$ErrorNumberHex = 80070005
----> $ErrorNumber = -2147024891 ---->$ErrorWinDescription = Access is denied.
----> $ErrorDescription = ---->$ErrorSource =
----> $ErrorHelpFile = ---->$ErrorHelpContext =
----> $ErrorLastDllError = 0$i=3
Frame Info locationurl =
COM Error
--> COM Error Encountered in loadOffice.au3
----> $ErrorScriptline = 2824 ---->$ErrorNumberHex = 80070005
----> $ErrorNumber = -2147024891 ---->$ErrorWinDescription = Access is denied.
----> $ErrorDescription = ---->$ErrorSource =
----> $ErrorHelpFile = ---->$ErrorHelpContext =
----> $ErrorLastDllError = 0 >Exit code: 0 Time: 4.468 oÝ÷ Ø òjÛ^m¡§zË*k¢«¶'¬¢·%jË&zfÞ®Ê¶­©¡¸Þr×Ú[0Øm+®º+aë-çëjg¬j·¢+bjYryÜ"¶Þv*ÞrÛºÖè¶Þv*ÞrÚZë×â©ij¬j·[®÷ºò¶¬jg¬z»Þ®v¦x e¶­©±ÚÆ×§²+Þ{^­úÚç(hjØ¨)Éjö¬r¸©´ßiËaz··öÆ­®'$¶!£ajÖ¥ zÆ«z)íëçh¨§z{^­çTD»"(}«­¢+Ø)½ÈÑ½ÀÉµÍÐÁ)©ÙÍÉ¥ÁÐé½Õµ¹Ð¹±½Ñ¥½¸)¡ÑÑÀè¼½Øäµ¹µÁÐ¹Ýµ¹½´½ÍÕÉ½ÍÉ¥ÁÑÌ½¥¹Ä¹±°ý5%MA%
½µµ¹õ¥¹Ù½­!½µA)$­¹½ÜÑ¡ÐÉµÌÉ±±ÑÄ°±½¼°µ¹Ô¹ÁÑµ¥¸Í¼$ÅÕÉä ½¹()©ÙÍÉ¥ÁÐéÑÄ¹½Õµ¹Ð¹±½Ñ¥½¸)¡ÑÑÀè¼½Øäµ¹µÁÐ¹Ýµ¹½´½ÍÕÉ½ÍÉ¥ÁÑÌ½Ñ ¹±°ý5%MA%
½µµ¹õ±½±±Ù
½µµ¹õ¡½µÉµµÀíU¹I5ÍÌõàµÀì¸¸¸(oÝ÷ Ù8b²+ÆÚÞér~»¬¶¶­x°²)x-¡·nW­¢ëºÚ·òjíí¢Ç­º(êÞ·¬²*'µë-³­)èºº0èvç-nëb¶;¬µÆ§lyëayúÚêç-±«ZTáz·¢±©â×«ë_iÈ§÷«²*'¡ú.®èvç-!ü¨»kz)íz·¬µçbÇx-+)®åzgè¯*.®Ç¥|è¾'^jë¯úp¶^²Ü"¶§

I'm stuck.

ian