1 <html><head><title>Roo/lib/Motion.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/*
2 * Portions of this file are based on pieces of Yahoo User Interface Library
3 * Copyright (c) 2007, Yahoo! Inc. All rights reserved.
4 * YUI licensed under the BSD License:
5 * http://developer.yahoo.net/yui/license.txt
6 * <script type="text/javascript">
9 </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">() {
10 </span><span class="jsdoc-var">Roo.lib.Motion </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">el</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attributes</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">duration</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">method</span><span class="jsdoc-syntax">) {
11 </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">el</span><span class="jsdoc-syntax">) {
12 </span><span class="jsdoc-var">Roo.lib.Motion.superclass.constructor.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">el</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attributes</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">duration</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">method</span><span class="jsdoc-syntax">);
16 </span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.lib.Motion</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.lib.ColorAnim</span><span class="jsdoc-syntax">);
19 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">Y </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.lib</span><span class="jsdoc-syntax">;
20 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">superclass </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Y.Motion.superclass</span><span class="jsdoc-syntax">;
21 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">proto </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Y.Motion.prototype</span><span class="jsdoc-syntax">;
23 </span><span class="jsdoc-var">proto.toString </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">() {
24 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">el </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.getEl</span><span class="jsdoc-syntax">();
25 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">id </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">el.id </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">el.tagName</span><span class="jsdoc-syntax">;
26 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">"Motion " </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">id</span><span class="jsdoc-syntax">);
29 </span><span class="jsdoc-var">proto.patterns.points </span><span class="jsdoc-syntax">= /^points$/i;
31 </span><span class="jsdoc-var">proto.setAttribute </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">val</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">unit</span><span class="jsdoc-syntax">) {
32 </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.patterns.points.test</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">)) {
33 </span><span class="jsdoc-var">unit </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">unit </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-string">'px'</span><span class="jsdoc-syntax">;
34 </span><span class="jsdoc-var">superclass.setAttribute.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'left'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">val</span><span class="jsdoc-syntax">[0], </span><span class="jsdoc-var">unit</span><span class="jsdoc-syntax">);
35 </span><span class="jsdoc-var">superclass.setAttribute.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'top'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">val</span><span class="jsdoc-syntax">[1], </span><span class="jsdoc-var">unit</span><span class="jsdoc-syntax">);
36 } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
37 </span><span class="jsdoc-var">superclass.setAttribute.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">val</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">unit</span><span class="jsdoc-syntax">);
41 </span><span class="jsdoc-var">proto.getAttribute </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">) {
42 </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.patterns.points.test</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">)) {
43 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">val </span><span class="jsdoc-syntax">= [
44 </span><span class="jsdoc-var">superclass.getAttribute.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'left'</span><span class="jsdoc-syntax">),
45 </span><span class="jsdoc-var">superclass.getAttribute.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'top'</span><span class="jsdoc-syntax">)
47 } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
48 </span><span class="jsdoc-var">val </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">superclass.getAttribute.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">);
51 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">val</span><span class="jsdoc-syntax">;
54 </span><span class="jsdoc-var">proto.doMethod </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">start</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">end</span><span class="jsdoc-syntax">) {
55 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">val </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">;
57 </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.patterns.points.test</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">)) {
58 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">t </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.method</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.currentFrame</span><span class="jsdoc-syntax">, 0, 100, </span><span class="jsdoc-var">this.totalFrames</span><span class="jsdoc-syntax">) / 100;
59 </span><span class="jsdoc-var">val </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Y.Bezier.getPosition</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.runtimeAttributes</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">], </span><span class="jsdoc-var">t</span><span class="jsdoc-syntax">);
60 } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
61 </span><span class="jsdoc-var">val </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">superclass.doMethod.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">start</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">end</span><span class="jsdoc-syntax">);
63 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">val</span><span class="jsdoc-syntax">;
66 </span><span class="jsdoc-var">proto.setRuntimeAttribute </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">) {
67 </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.patterns.points.test</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">)) {
68 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">el </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.getEl</span><span class="jsdoc-syntax">();
69 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">attributes </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.attributes</span><span class="jsdoc-syntax">;
70 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">start</span><span class="jsdoc-syntax">;
71 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">control </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">attributes</span><span class="jsdoc-syntax">[</span><span class="jsdoc-string">'points'</span><span class="jsdoc-syntax">][</span><span class="jsdoc-string">'control'</span><span class="jsdoc-syntax">] || [];
72 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">end</span><span class="jsdoc-syntax">;
73 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">len</span><span class="jsdoc-syntax">;
75 </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">control.length </span><span class="jsdoc-syntax">> 0 && !(</span><span class="jsdoc-var">control</span><span class="jsdoc-syntax">[0] </span><span class="jsdoc-keyword">instanceof </span><span class="jsdoc-var">Array</span><span class="jsdoc-syntax">)) {
76 </span><span class="jsdoc-var">control </span><span class="jsdoc-syntax">= [</span><span class="jsdoc-var">control</span><span class="jsdoc-syntax">];
77 } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
78 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">tmp </span><span class="jsdoc-syntax">= [];
79 </span><span class="jsdoc-keyword">for </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= 0,</span><span class="jsdoc-var">len </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">control.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">< </span><span class="jsdoc-var">len</span><span class="jsdoc-syntax">; ++</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">) {
80 </span><span class="jsdoc-var">tmp</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">control</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">];
82 </span><span class="jsdoc-var">control </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">tmp</span><span class="jsdoc-syntax">;
85 </span><span class="jsdoc-var">Roo.fly</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">el</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.position</span><span class="jsdoc-syntax">();
87 </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">isset</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attributes</span><span class="jsdoc-syntax">[</span><span class="jsdoc-string">'points'</span><span class="jsdoc-syntax">][</span><span class="jsdoc-string">'from'</span><span class="jsdoc-syntax">])) {
88 </span><span class="jsdoc-var">Roo.lib.Dom.setXY</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">el</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attributes</span><span class="jsdoc-syntax">[</span><span class="jsdoc-string">'points'</span><span class="jsdoc-syntax">][</span><span class="jsdoc-string">'from'</span><span class="jsdoc-syntax">]);
90 </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
91 </span><span class="jsdoc-var">Roo.lib.Dom.setXY</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">el</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.lib.Dom.getXY</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">el</span><span class="jsdoc-syntax">));
94 </span><span class="jsdoc-var">start </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.getAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'points'</span><span class="jsdoc-syntax">);
97 </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">isset</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attributes</span><span class="jsdoc-syntax">[</span><span class="jsdoc-string">'points'</span><span class="jsdoc-syntax">][</span><span class="jsdoc-string">'to'</span><span class="jsdoc-syntax">])) {
98 </span><span class="jsdoc-var">end </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">translateValues.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attributes</span><span class="jsdoc-syntax">[</span><span class="jsdoc-string">'points'</span><span class="jsdoc-syntax">][</span><span class="jsdoc-string">'to'</span><span class="jsdoc-syntax">], </span><span class="jsdoc-var">start</span><span class="jsdoc-syntax">);
100 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">pageXY </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.lib.Dom.getXY</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.getEl</span><span class="jsdoc-syntax">());
101 </span><span class="jsdoc-keyword">for </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= 0,</span><span class="jsdoc-var">len </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">control.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">< </span><span class="jsdoc-var">len</span><span class="jsdoc-syntax">; ++</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">) {
102 </span><span class="jsdoc-var">control</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">translateValues.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">control</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">], </span><span class="jsdoc-var">start</span><span class="jsdoc-syntax">);
106 } </span><span class="jsdoc-keyword">else if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">isset</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attributes</span><span class="jsdoc-syntax">[</span><span class="jsdoc-string">'points'</span><span class="jsdoc-syntax">][</span><span class="jsdoc-string">'by'</span><span class="jsdoc-syntax">])) {
107 </span><span class="jsdoc-var">end </span><span class="jsdoc-syntax">= [ </span><span class="jsdoc-var">start</span><span class="jsdoc-syntax">[0] + </span><span class="jsdoc-var">attributes</span><span class="jsdoc-syntax">[</span><span class="jsdoc-string">'points'</span><span class="jsdoc-syntax">][</span><span class="jsdoc-string">'by'</span><span class="jsdoc-syntax">][0], </span><span class="jsdoc-var">start</span><span class="jsdoc-syntax">[1] + </span><span class="jsdoc-var">attributes</span><span class="jsdoc-syntax">[</span><span class="jsdoc-string">'points'</span><span class="jsdoc-syntax">][</span><span class="jsdoc-string">'by'</span><span class="jsdoc-syntax">][1] ];
109 </span><span class="jsdoc-keyword">for </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">= 0,</span><span class="jsdoc-var">len </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">control.length</span><span class="jsdoc-syntax">; </span><span class="jsdoc-var">i </span><span class="jsdoc-syntax">< </span><span class="jsdoc-var">len</span><span class="jsdoc-syntax">; ++</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">) {
110 </span><span class="jsdoc-var">control</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">] = [ </span><span class="jsdoc-var">start</span><span class="jsdoc-syntax">[0] + </span><span class="jsdoc-var">control</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">][0], </span><span class="jsdoc-var">start</span><span class="jsdoc-syntax">[1] + </span><span class="jsdoc-var">control</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">][1] ];
114 </span><span class="jsdoc-var">this.runtimeAttributes</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">] = [</span><span class="jsdoc-var">start</span><span class="jsdoc-syntax">];
116 </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">control.length </span><span class="jsdoc-syntax">> 0) {
117 </span><span class="jsdoc-var">this.runtimeAttributes</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">this.runtimeAttributes</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.concat</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">control</span><span class="jsdoc-syntax">);
120 </span><span class="jsdoc-var">this.runtimeAttributes</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">][</span><span class="jsdoc-var">this.runtimeAttributes</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.length</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">end</span><span class="jsdoc-syntax">;
122 </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
123 </span><span class="jsdoc-var">superclass.setRuntimeAttribute.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">);
127 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">translateValues </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">val</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">start</span><span class="jsdoc-syntax">) {
128 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">pageXY </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.lib.Dom.getXY</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.getEl</span><span class="jsdoc-syntax">());
129 </span><span class="jsdoc-var">val </span><span class="jsdoc-syntax">= [ </span><span class="jsdoc-var">val</span><span class="jsdoc-syntax">[0] - </span><span class="jsdoc-var">pageXY</span><span class="jsdoc-syntax">[0] + </span><span class="jsdoc-var">start</span><span class="jsdoc-syntax">[0], </span><span class="jsdoc-var">val</span><span class="jsdoc-syntax">[1] - </span><span class="jsdoc-var">pageXY</span><span class="jsdoc-syntax">[1] + </span><span class="jsdoc-var">start</span><span class="jsdoc-syntax">[1] ];
131 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">val</span><span class="jsdoc-syntax">;
134 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">isset </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">prop</span><span class="jsdoc-syntax">) {
135 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof </span><span class="jsdoc-var">prop </span><span class="jsdoc-syntax">!== </span><span class="jsdoc-string">'undefined'</span><span class="jsdoc-syntax">);
138 </span></code></body></html>