diff --git a/ReleaseNotes.wiki b/ReleaseNotes.wiki index d68b84e..510edee 100644 --- a/ReleaseNotes.wiki +++ b/ReleaseNotes.wiki @@ -1,3 +1,6 @@ +; Version 2.1.3 (Oct 1, 2025) +* Improved keyboard keystroke behaviour, removed support for delete button due to complexity + ; Version 2.1.2 (Aug 14, 2025) * Added image validation * Fixed a bug on the special page where pages with a different namespace couldn't be filtered diff --git a/extension.json b/extension.json index 12afbf4..e9cf310 100644 --- a/extension.json +++ b/extension.json @@ -6,7 +6,7 @@ "Robin van der Wiel", "Yvar Nanlohij" ], - "version": "2.1.2", + "version": "2.1.3", "url": "https://www.archixl.nl", "descriptionmsg": "sic-desc", "license-name": "GPL-2.0+", diff --git a/resources/frontend/dist/smartcomments.min.js b/resources/frontend/dist/smartcomments.min.js index e952a2c..2b09c68 100644 --- a/resources/frontend/dist/smartcomments.min.js +++ b/resources/frontend/dist/smartcomments.min.js @@ -29,5 +29,5 @@ function Tt(A){return e=>{St(A,e.appContext.app,e.uid,e.parent?e.parent.uid:void OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ -var nc=function(A,e){return(nc=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(A,e){A.__proto__=e}||function(A,e){for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(A[t]=e[t])})(A,e)};function rc(A,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function t(){this.constructor=A}nc(A,e),A.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}var oc=function(){return oc=Object.assign||function(A){for(var e,t=1,n=arguments.length;t0&&r[r.length-1])||6!==o[0]&&2!==o[0])){i=0;continue}if(3===o[0]&&(!r||o[1]>r[0]&&o[1]=55296&&r<=56319&&t>10),i%1024+56320)),(r+1===t||n.length>16384)&&(o+=String.fromCharCode.apply(String,n),n.length=0)}return o},gc="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",hc="undefined"==typeof Uint8Array?[]:new Uint8Array(256),pc=0;pc<64;pc++)hc[gc.charCodeAt(pc)]=pc;for(var Bc="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",fc="undefined"==typeof Uint8Array?[]:new Uint8Array(256),mc=0;mc<64;mc++)fc[Bc.charCodeAt(mc)]=mc;for(var wc=function(A,e,t){return A.slice?A.slice(e,t):new Uint16Array(Array.prototype.slice.call(A,e,t))},Cc=function(){function A(A,e,t,n,r,o){this.initialValue=A,this.errorValue=e,this.highStart=t,this.highValueIndex=n,this.index=r,this.data=o}return A.prototype.get=function(A){var e;if(A>=0){if(A<55296||A>56319&&A<=65535)return e=((e=this.index[A>>5])<<2)+(31&A),this.data[e];if(A<=65535)return e=((e=this.index[2048+(A-55296>>5)])<<2)+(31&A),this.data[e];if(A>11),e=this.index[e],e+=A>>5&63,e=((e=this.index[e])<<2)+(31&A),this.data[e];if(A<=1114111)return this.data[this.highValueIndex]}return this.errorValue},A}(),Qc="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",yc="undefined"==typeof Uint8Array?[]:new Uint8Array(256),Ec=0;Ec<64;Ec++)yc[Qc.charCodeAt(Ec)]=Ec;var vc,Uc,Fc,bc,Hc,Ic,Sc,Nc,xc=10,Dc=13,Oc=15,Tc=17,Lc=18,_c=19,Rc=20,Kc=21,kc=22,Mc=24,Vc=25,Pc=26,Gc=27,Wc=28,Xc=30,Jc=32,$c=33,Yc=34,jc=35,Zc=37,zc=38,qc=39,Al=40,el=42,tl=[9001,65288],nl="×",rl="÷",ol=(bc=function(A){var e,t,n,r,o,i=.75*A.length,s=A.length,a=0;"="===A[A.length-1]&&(i--,"="===A[A.length-2]&&i--);var c="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8Array&&void 0!==Uint8Array.prototype.slice?new ArrayBuffer(i):new Array(i),l=Array.isArray(c)?c:new Uint8Array(c);for(e=0;e>4,l[a++]=(15&n)<<4|r>>2,l[a++]=(3&r)<<6|63&o;return c}("KwAAAAAAAAAACA4AUD0AADAgAAACAAAAAAAIABAAGABAAEgAUABYAGAAaABgAGgAYgBqAF8AZwBgAGgAcQB5AHUAfQCFAI0AlQCdAKIAqgCyALoAYABoAGAAaABgAGgAwgDKAGAAaADGAM4A0wDbAOEA6QDxAPkAAQEJAQ8BFwF1AH0AHAEkASwBNAE6AUIBQQFJAVEBWQFhAWgBcAF4ATAAgAGGAY4BlQGXAZ8BpwGvAbUBvQHFAc0B0wHbAeMB6wHxAfkBAQIJAvEBEQIZAiECKQIxAjgCQAJGAk4CVgJeAmQCbAJ0AnwCgQKJApECmQKgAqgCsAK4ArwCxAIwAMwC0wLbAjAA4wLrAvMC+AIAAwcDDwMwABcDHQMlAy0DNQN1AD0DQQNJA0kDSQNRA1EDVwNZA1kDdQB1AGEDdQBpA20DdQN1AHsDdQCBA4kDkQN1AHUAmQOhA3UAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AKYDrgN1AHUAtgO+A8YDzgPWAxcD3gPjA+sD8wN1AHUA+wMDBAkEdQANBBUEHQQlBCoEFwMyBDgEYABABBcDSARQBFgEYARoBDAAcAQzAXgEgASIBJAEdQCXBHUAnwSnBK4EtgS6BMIEyAR1AHUAdQB1AHUAdQCVANAEYABgAGAAYABgAGAAYABgANgEYADcBOQEYADsBPQE/AQEBQwFFAUcBSQFLAU0BWQEPAVEBUsFUwVbBWAAYgVgAGoFcgV6BYIFigWRBWAAmQWfBaYFYABgAGAAYABgAKoFYACxBbAFuQW6BcEFwQXHBcEFwQXPBdMF2wXjBeoF8gX6BQIGCgYSBhoGIgYqBjIGOgZgAD4GRgZMBmAAUwZaBmAAYABgAGAAYABgAGAAYABgAGAAYABgAGIGYABpBnAGYABgAGAAYABgAGAAYABgAGAAYAB4Bn8GhQZgAGAAYAB1AHcDFQSLBmAAYABgAJMGdQA9A3UAmwajBqsGqwaVALMGuwbDBjAAywbSBtIG1QbSBtIG0gbSBtIG0gbdBuMG6wbzBvsGAwcLBxMHAwcbByMHJwcsBywHMQcsB9IGOAdAB0gHTgfSBkgHVgfSBtIG0gbSBtIG0gbSBtIG0gbSBiwHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAdgAGAALAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAdbB2MHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsB2kH0gZwB64EdQB1AHUAdQB1AHUAdQB1AHUHfQdgAIUHjQd1AHUAlQedB2AAYAClB6sHYACzB7YHvgfGB3UAzgfWBzMB3gfmB1EB7gf1B/0HlQENAQUIDQh1ABUIHQglCBcDLQg1CD0IRQhNCEEDUwh1AHUAdQBbCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIcAh3CHoIMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIgggwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAALAcsBywHLAcsBywHLAcsBywHLAcsB4oILAcsB44I0gaWCJ4Ipgh1AHUAqgiyCHUAdQB1AHUAdQB1AHUAdQB1AHUAtwh8AXUAvwh1AMUIyQjRCNkI4AjoCHUAdQB1AO4I9gj+CAYJDgkTCS0HGwkjCYIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiAAIAAAAFAAYABgAGIAXwBgAHEAdQBFAJUAogCyAKAAYABgAEIA4ABGANMA4QDxAMEBDwE1AFwBLAE6AQEBUQF4QkhCmEKoQrhCgAHIQsAB0MLAAcABwAHAAeDC6ABoAHDCwMMAAcABwAHAAdDDGMMAAcAB6MM4wwjDWMNow3jDaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAEjDqABWw6bDqABpg6gAaABoAHcDvwOPA+gAaABfA/8DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DpcPAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcAB9cPKwkyCToJMAB1AHUAdQBCCUoJTQl1AFUJXAljCWcJawkwADAAMAAwAHMJdQB2CX4JdQCECYoJjgmWCXUAngkwAGAAYABxAHUApgn3A64JtAl1ALkJdQDACTAAMAAwADAAdQB1AHUAdQB1AHUAdQB1AHUAowYNBMUIMAAwADAAMADICcsJ0wnZCRUE4QkwAOkJ8An4CTAAMAB1AAAKvwh1AAgKDwoXCh8KdQAwACcKLgp1ADYKqAmICT4KRgowADAAdQB1AE4KMAB1AFYKdQBeCnUAZQowADAAMAAwADAAMAAwADAAMAAVBHUAbQowADAAdQC5CXUKMAAwAHwBxAijBogEMgF9CoQKiASMCpQKmgqIBKIKqgquCogEDQG2Cr4KxgrLCjAAMADTCtsKCgHjCusK8Qr5CgELMAAwADAAMAB1AIsECQsRC3UANAEZCzAAMAAwADAAMAB1ACELKQswAHUANAExCzkLdQBBC0kLMABRC1kLMAAwADAAMAAwADAAdQBhCzAAMAAwAGAAYABpC3ELdwt/CzAAMACHC4sLkwubC58Lpwt1AK4Ltgt1APsDMAAwADAAMAAwADAAMAAwAL4LwwvLC9IL1wvdCzAAMADlC+kL8Qv5C/8LSQswADAAMAAwADAAMAAwADAAMAAHDDAAMAAwADAAMAAODBYMHgx1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1ACYMMAAwADAAdQB1AHUALgx1AHUAdQB1AHUAdQA2DDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AD4MdQBGDHUAdQB1AHUAdQB1AEkMdQB1AHUAdQB1AFAMMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQBYDHUAdQB1AF8MMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUA+wMVBGcMMAAwAHwBbwx1AHcMfwyHDI8MMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAYABgAJcMMAAwADAAdQB1AJ8MlQClDDAAMACtDCwHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsB7UMLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AA0EMAC9DDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAsBywHLAcsBywHLAcsBywHLQcwAMEMyAwsBywHLAcsBywHLAcsBywHLAcsBywHzAwwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1ANQM2QzhDDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMABgAGAAYABgAGAAYABgAOkMYADxDGAA+AwADQYNYABhCWAAYAAODTAAMAAwADAAFg1gAGAAHg37AzAAMAAwADAAYABgACYNYAAsDTQNPA1gAEMNPg1LDWAAYABgAGAAYABgAGAAYABgAGAAUg1aDYsGVglhDV0NcQBnDW0NdQ15DWAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAlQCBDZUAiA2PDZcNMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAnw2nDTAAMAAwADAAMAAwAHUArw23DTAAMAAwADAAMAAwADAAMAAwADAAMAB1AL8NMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAB1AHUAdQB1AHUAdQDHDTAAYABgAM8NMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA1w11ANwNMAAwAD0B5A0wADAAMAAwADAAMADsDfQN/A0EDgwOFA4wABsOMAAwADAAMAAwADAAMAAwANIG0gbSBtIG0gbSBtIG0gYjDigOwQUuDsEFMw7SBjoO0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGQg5KDlIOVg7SBtIGXg5lDm0OdQ7SBtIGfQ6EDooOjQ6UDtIGmg6hDtIG0gaoDqwO0ga0DrwO0gZgAGAAYADEDmAAYAAkBtIGzA5gANIOYADaDokO0gbSBt8O5w7SBu8O0gb1DvwO0gZgAGAAxA7SBtIG0gbSBtIGYABgAGAAYAAED2AAsAUMD9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGFA8sBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAccD9IGLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHJA8sBywHLAcsBywHLAccDywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywPLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAc0D9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAccD9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGFA8sBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHPA/SBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gYUD0QPlQCVAJUAMAAwADAAMACVAJUAlQCVAJUAlQCVAEwPMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA//8EAAQABAAEAAQABAAEAAQABAANAAMAAQABAAIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQACgATABcAHgAbABoAHgAXABYAEgAeABsAGAAPABgAHABLAEsASwBLAEsASwBLAEsASwBLABgAGAAeAB4AHgATAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABYAGwASAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAWAA0AEQAeAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAFAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJABYAGgAbABsAGwAeAB0AHQAeAE8AFwAeAA0AHgAeABoAGwBPAE8ADgBQAB0AHQAdAE8ATwAXAE8ATwBPABYAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAFAATwBAAE8ATwBPAEAATwBQAFAATwBQAB4AHgAeAB4AHgAeAB0AHQAdAB0AHgAdAB4ADgBQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgBQAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAkACQAJAAkACQAJAAkABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAFAAHgAeAB4AKwArAFAAUABQAFAAGABQACsAKwArACsAHgAeAFAAHgBQAFAAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUAAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAYAA0AKwArAB4AHgAbACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAB4ABAAEAB4ABAAEABMABAArACsAKwArACsAKwArACsAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAKwArACsAKwBWAFYAVgBWAB4AHgArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AGgAaABoAGAAYAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQAEwAEACsAEwATAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABLAEsASwBLAEsASwBLAEsASwBLABoAGQAZAB4AUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABMAUAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABABQAFAABAAEAB4ABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUAAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAFAABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQAUABQAB4AHgAYABMAUAArACsABAAbABsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAFAABAAEAAQABAAEAFAABAAEAAQAUAAEAAQABAAEAAQAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArACsAHgArAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAUAAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEAA0ADQBLAEsASwBLAEsASwBLAEsASwBLAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUAArACsAKwBQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABABQACsAKwArACsAKwArACsAKwAEACsAKwArACsAUABQACsAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUAAaABoAUABQAFAAUABQAEwAHgAbAFAAHgAEACsAKwAEAAQABAArAFAAUABQAFAAUABQACsAKwArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQACsAUABQACsAKwAEACsABAAEAAQABAAEACsAKwArACsABAAEACsAKwAEAAQABAArACsAKwAEACsAKwArACsAKwArACsAUABQAFAAUAArAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLAAQABABQAFAAUAAEAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAArACsAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAB4AGwArACsAKwArACsAKwArAFAABAAEAAQABAAEAAQAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAKwArACsAKwArAAQABAAEACsAKwArACsAUABQACsAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAB4AUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAAQAUAArAFAAUABQAFAAUABQACsAKwArAFAAUABQACsAUABQAFAAUAArACsAKwBQAFAAKwBQACsAUABQACsAKwArAFAAUAArACsAKwBQAFAAUAArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArAAQABAAEAAQABAArACsAKwAEAAQABAArAAQABAAEAAQAKwArAFAAKwArACsAKwArACsABAArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAHgAeAB4AHgAeAB4AGwAeACsAKwArACsAKwAEAAQABAAEAAQAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAUAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAAEACsAKwArACsAKwArACsABAAEACsAUABQAFAAKwArACsAKwArAFAAUAAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwAOAFAAUABQAFAAUABQAFAAHgBQAAQABAAEAA4AUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAKwArAAQAUAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAAEACsAKwArACsAKwArACsABAAEACsAKwArACsAKwArACsAUAArAFAAUAAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwBQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABABQAB4AKwArACsAKwBQAFAAUAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQABoAUABQAFAAUABQAFAAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQACsAUAArACsAUABQAFAAUABQAFAAUAArACsAKwAEACsAKwArACsABAAEAAQABAAEAAQAKwAEACsABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArAAQABAAeACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAXAAqACoAKgAqACoAKgAqACsAKwArACsAGwBcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAeAEsASwBLAEsASwBLAEsASwBLAEsADQANACsAKwArACsAKwBcAFwAKwBcACsAXABcAFwAXABcACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAXAArAFwAXABcAFwAXABcAFwAXABcAFwAKgBcAFwAKgAqACoAKgAqACoAKgAqACoAXAArACsAXABcAFwAXABcACsAXAArACoAKgAqACoAKgAqACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwBcAFwAXABcAFAADgAOAA4ADgAeAA4ADgAJAA4ADgANAAkAEwATABMAEwATAAkAHgATAB4AHgAeAAQABAAeAB4AHgAeAB4AHgBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQAFAADQAEAB4ABAAeAAQAFgARABYAEQAEAAQAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAAQABAAEAAQADQAEAAQAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAA0ADQAeAB4AHgAeAB4AHgAEAB4AHgAeAB4AHgAeACsAHgAeAA4ADgANAA4AHgAeAB4AHgAeAAkACQArACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgBcAEsASwBLAEsASwBLAEsASwBLAEsADQANAB4AHgAeAB4AXABcAFwAXABcAFwAKgAqACoAKgBcAFwAXABcACoAKgAqAFwAKgAqACoAXABcACoAKgAqACoAKgAqACoAXABcAFwAKgAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKgAqAFwAKgBLAEsASwBLAEsASwBLAEsASwBLACoAKgAqACoAKgAqAFAAUABQAFAAUABQACsAUAArACsAKwArACsAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgBQAFAAUABQAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAKwBQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsABAAEAAQAHgANAB4AHgAeAB4AHgAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUAArACsADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAWABEAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAA0ADQANAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAANAA0AKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUAArAAQABAArACsAKwArACsAKwArACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqAA0ADQAVAFwADQAeAA0AGwBcACoAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwAeAB4AEwATAA0ADQAOAB4AEwATAB4ABAAEAAQACQArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUAAEAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAHgArACsAKwATABMASwBLAEsASwBLAEsASwBLAEsASwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAXABcAFwAXABcACsAKwArACsAKwArACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAXAArACsAKwAqACoAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsAHgAeAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKwAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKwArAAQASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACoAKgAqACoAKgAqACoAXAAqACoAKgAqACoAKgArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABABQAFAAUABQAFAAUABQACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwANAA0AHgANAA0ADQANAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQAHgAeAB4AHgAeAB4AHgAeAB4AKwArACsABAAEAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwAeAB4AHgAeAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArAA0ADQANAA0ADQBLAEsASwBLAEsASwBLAEsASwBLACsAKwArAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAA0ADQBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUAAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArAAQABAAEAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAAQAUABQAFAAUABQAFAABABQAFAABAAEAAQAUAArACsAKwArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAKwBQACsAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAFAAUABQACsAHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQACsAKwAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQACsAHgAeAB4AHgAeAB4AHgAOAB4AKwANAA0ADQANAA0ADQANAAkADQANAA0ACAAEAAsABAAEAA0ACQANAA0ADAAdAB0AHgAXABcAFgAXABcAFwAWABcAHQAdAB4AHgAUABQAFAANAAEAAQAEAAQABAAEAAQACQAaABoAGgAaABoAGgAaABoAHgAXABcAHQAVABUAHgAeAB4AHgAeAB4AGAAWABEAFQAVABUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ADQAeAA0ADQANAA0AHgANAA0ADQAHAB4AHgAeAB4AKwAEAAQABAAEAAQABAAEAAQABAAEAFAAUAArACsATwBQAFAAUABQAFAAHgAeAB4AFgARAE8AUABPAE8ATwBPAFAAUABQAFAAUAAeAB4AHgAWABEAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArABsAGwAbABsAGwAbABsAGgAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGgAbABsAGwAbABoAGwAbABoAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHgAeAFAAGgAeAB0AHgBQAB4AGgAeAB4AHgAeAB4AHgAeAB4AHgBPAB4AUAAbAB4AHgBQAFAAUABQAFAAHgAeAB4AHQAdAB4AUAAeAFAAHgBQAB4AUABPAFAAUAAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAHgBQAFAAUABQAE8ATwBQAFAAUABQAFAATwBQAFAATwBQAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAFAAUABQAFAATwBPAE8ATwBPAE8ATwBPAE8ATwBQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABPAB4AHgArACsAKwArAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHQAdAB4AHgAeAB0AHQAeAB4AHQAeAB4AHgAdAB4AHQAbABsAHgAdAB4AHgAeAB4AHQAeAB4AHQAdAB0AHQAeAB4AHQAeAB0AHgAdAB0AHQAdAB0AHQAeAB0AHgAeAB4AHgAeAB0AHQAdAB0AHgAeAB4AHgAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeAB0AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAeAB0AHQAdAB0AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAWABEAHgAeAB4AHgAeAB4AHQAeAB4AHgAeAB4AHgAeACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAWABEAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAFAAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeAB4AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AHQAdAB0AHgAeAB0AHgAeAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlAB4AHQAdAB4AHgAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AJQAlAB0AHQAlAB4AJQAlACUAIAAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAeAB4AHgAeAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAdAB0AHQAeAB0AJQAdAB0AHgAdAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAdAB0AHQAdACUAHgAlACUAJQAdACUAJQAdAB0AHQAlACUAHQAdACUAHQAdACUAJQAlAB4AHQAeAB4AHgAeAB0AHQAlAB0AHQAdAB0AHQAdACUAJQAlACUAJQAdACUAJQAgACUAHQAdACUAJQAlACUAJQAlACUAJQAeAB4AHgAlACUAIAAgACAAIAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AFwAXABcAFwAXABcAHgATABMAJQAeAB4AHgAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARABYAEQAWABEAFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAEAAQABAAeAB4AKwArACsAKwArABMADQANAA0AUAATAA0AUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUAANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAA0ADQANAA0ADQANAA0ADQAeAA0AFgANAB4AHgAXABcAHgAeABcAFwAWABEAFgARABYAEQAWABEADQANAA0ADQATAFAADQANAB4ADQANAB4AHgAeAB4AHgAMAAwADQANAA0AHgANAA0AFgANAA0ADQANAA0ADQANAA0AHgANAB4ADQANAB4AHgAeACsAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArAA0AEQARACUAJQBHAFcAVwAWABEAFgARABYAEQAWABEAFgARACUAJQAWABEAFgARABYAEQAWABEAFQAWABEAEQAlAFcAVwBXAFcAVwBXAFcAVwBXAAQABAAEAAQABAAEACUAVwBXAFcAVwA2ACUAJQBXAFcAVwBHAEcAJQAlACUAKwBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBRAFcAUQBXAFEAVwBXAFcAVwBXAFcAUQBXAFcAVwBXAFcAVwBRAFEAKwArAAQABAAVABUARwBHAFcAFQBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBRAFcAVwBXAFcAVwBXAFEAUQBXAFcAVwBXABUAUQBHAEcAVwArACsAKwArACsAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwAlACUAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACsAKwArACsAKwArACsAKwArACsAKwArAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBPAE8ATwBPAE8ATwBPAE8AJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADQATAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABLAEsASwBLAEsASwBLAEsASwBLAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAABAAEAAQABAAeAAQABAAEAAQABAAEAAQABAAEAAQAHgBQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAeAA0ADQANAA0ADQArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAAQAUABQAFAABABQAFAAUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAeAB4AHgAeAAQAKwArACsAUABQAFAAUABQAFAAHgAeABoAHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADgAOABMAEwArACsAKwArACsAKwArACsABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwANAA0ASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUAAeAB4AHgBQAA4AUABQAAQAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArAB4AWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYACsAKwArAAQAHgAeAB4AHgAeAB4ADQANAA0AHgAeAB4AHgArAFAASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArAB4AHgBcAFwAXABcAFwAKgBcAFwAXABcAFwAXABcAFwAXABcAEsASwBLAEsASwBLAEsASwBLAEsAXABcAFwAXABcACsAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAFAAUABQAAQAUABQAFAAUABQAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAHgANAA0ADQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAXAAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAKgAqACoAXABcACoAKgBcAFwAXABcAFwAKgAqAFwAKgBcACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcACoAKgBQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAA0ADQBQAFAAUAAEAAQAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQADQAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAVABVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBUAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVACsAKwArACsAKwArACsAKwArACsAKwArAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAKwArACsAKwBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAKwArACsAKwAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAKwArACsAKwArAFYABABWAFYAVgBWAFYAVgBWAFYAVgBWAB4AVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgArAFYAVgBWAFYAVgArAFYAKwBWAFYAKwBWAFYAKwBWAFYAVgBWAFYAVgBWAFYAVgBWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAEQAWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAaAB4AKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAARABEAGAAYABMAEwAWABEAFAArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACUAJQAlACUAJQAWABEAFgARABYAEQAWABEAFgARABYAEQAlACUAFgARACUAJQAlACUAJQAlACUAEQAlABEAKwAVABUAEwATACUAFgARABYAEQAWABEAJQAlACUAJQAlACUAJQAlACsAJQAbABoAJQArACsAKwArAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAcAKwATACUAJQAbABoAJQAlABYAEQAlACUAEQAlABEAJQBXAFcAVwBXAFcAVwBXAFcAVwBXABUAFQAlACUAJQATACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXABYAJQARACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAWACUAEQAlABYAEQARABYAEQARABUAVwBRAFEAUQBRAFEAUQBRAFEAUQBRAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcARwArACsAVwBXAFcAVwBXAFcAKwArAFcAVwBXAFcAVwBXACsAKwBXAFcAVwBXAFcAVwArACsAVwBXAFcAKwArACsAGgAbACUAJQAlABsAGwArAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAAQAB0AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsADQANAA0AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAAQAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAA0AUABQAFAAUAArACsAKwArAFAAUABQAFAAUABQAFAAUAANAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAKwArAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArACsAKwBQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAUABQAFAAUABQAAQABAAEACsABAAEACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAKwBQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAA0ADQANAA0ADQANAA0ADQAeACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAArACsAKwArAFAAUABQAFAAUAANAA0ADQANAA0ADQAUACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsADQANAA0ADQANAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAAQABAAEAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArAAQABAANACsAKwBQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAB4AHgAeAB4AHgArACsAKwArACsAKwAEAAQABAAEAAQABAAEAA0ADQAeAB4AHgAeAB4AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwAeACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsASwBLAEsASwBLAEsASwBLAEsASwANAA0ADQANAFAABAAEAFAAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAeAA4AUAArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAADQANAB4ADQAEAAQABAAEAB4ABAAEAEsASwBLAEsASwBLAEsASwBLAEsAUAAOAFAADQANAA0AKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAANAA0AHgANAA0AHgAEACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAA0AKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsABAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQACsABAAEAFAABAAEAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAUAArACsAKwArACsAKwAEACsAKwArACsAKwBQAFAAUABQAFAABAAEACsAKwAEAAQABAAEAAQABAAEACsAKwArAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABABQAFAAUABQAA0ADQANAA0AHgBLAEsASwBLAEsASwBLAEsASwBLAA0ADQArAB4ABABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAFAAUAAeAFAAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABAAEAAQADgANAA0AEwATAB4AHgAeAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAFAAUABQAFAABAAEACsAKwAEAA0ADQAeAFAAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKwArACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBcAFwADQANAA0AKgBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAKwArAFAAKwArAFAAUABQAFAAUABQAFAAUAArAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQAKwAEAAQAKwArAAQABAAEAAQAUAAEAFAABAAEAA0ADQANACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABABQAA4AUAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAFAABAAEAAQABAAOAB4ADQANAA0ADQAOAB4ABAArACsAKwArACsAKwArACsAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAA0ADQANAFAADgAOAA4ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAAQABAAEAFAADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAOABMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAArACsAKwAEACsABAAEACsABAAEAAQABAAEAAQABABQAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAKwAEAAQAKwAEAAQABAAEAAQAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAaABoAGgAaAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABIAEgAQwBDAEMAUABQAFAAUABDAFAAUABQAEgAQwBIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABDAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAJAAkACQAJAAkACQAJABYAEQArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwANAA0AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAANACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAA0ADQANAB4AHgAeAB4AHgAeAFAAUABQAFAADQAeACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAA0AHgAeACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAARwBHABUARwAJACsAKwArACsAKwArACsAKwArACsAKwAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUQBRAFEAKwArACsAKwArACsAKwArACsAKwArACsAKwBRAFEAUQBRACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArACsAHgAEAAQADQAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAAQABAAEAAQABAAeAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQAHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQAFAAKwArAFAAKwArAFAAUAArACsAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUAArAFAAUABQAFAAUABQAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAHgAeAFAAUABQAFAAUAArAFAAKwArACsAUABQAFAAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeACsAKwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4ABAAeAB4AHgAeAB4AHgAeAB4AHgAeAAQAHgAeAA0ADQANAA0AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAAQAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArAAQABAAEAAQABAAEAAQAKwAEAAQAKwAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwBQAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArABsAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAB4AHgAeAB4ABAAEAAQABAAEAAQABABQACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArABYAFgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAGgBQAFAAUAAaAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQACsAKwBQACsAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwBQACsAUAArACsAKwArACsAKwBQACsAKwArACsAUAArAFAAKwBQACsAUABQAFAAKwBQAFAAKwBQACsAKwBQACsAUAArAFAAKwBQACsAUAArAFAAUAArAFAAKwArAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUAArAFAAUABQAFAAKwBQACsAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAKwBQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AJQAlACUAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB4AHgAeACUAJQAlAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAlACUAJQAlACUAHgAlACUAJQAlACUAIAAgACAAJQAlACAAJQAlACAAIAAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACEAIQAhACEAIQAlACUAIAAgACUAJQAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAIAAlACUAJQAlACAAIAAgACUAIAAgACAAJQAlACUAJQAlACUAJQAgACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAlAB4AJQAeACUAJQAlACUAJQAgACUAJQAlACUAHgAlAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACAAIAAgACUAJQAlACAAIAAgACAAIAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABcAFwAXABUAFQAVAB4AHgAeAB4AJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAgACUAJQAgACUAJQAlACUAJQAlACUAJQAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAgACAAIAAgACAAIAAgACAAIAAgACUAJQAgACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAlACAAIAAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAgACAAIAAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAA=="),Hc=Array.isArray(bc)?function(A){for(var e=A.length,t=[],n=0;n0;){var i=n[--o];if(Array.isArray(A)?-1!==A.indexOf(i):A===i)for(var s=t;s<=n.length;){var a;if((a=n[++s])===e)return!0;if(a!==xc)break}if(i!==xc)break}return!1},hl=function(A,e){for(var t=A;t>=0;){var n=e[t];if(n!==xc)return n;t--}return 0},pl=function(A,e,t,n,r){if(0===t[n])return nl;var o=n-1;if(Array.isArray(r)&&!0===r[o])return nl;var i=o-1,s=o+1,a=e[o],c=i>=0?e[i]:0,l=e[s];if(2===a&&3===l)return nl;if(-1!==sl.indexOf(a))return"!";if(-1!==sl.indexOf(l))return nl;if(-1!==al.indexOf(l))return nl;if(8===hl(o,e))return rl;if(11===ol.get(A[o]))return nl;if((a===Jc||a===$c)&&11===ol.get(A[s]))return nl;if(7===a||7===l)return nl;if(9===a)return nl;if(-1===[xc,Dc,Oc].indexOf(a)&&9===l)return nl;if(-1!==[Tc,Lc,_c,Mc,Wc].indexOf(l))return nl;if(hl(o,e)===kc)return nl;if(gl(23,kc,o,e))return nl;if(gl([Tc,Lc],Kc,o,e))return nl;if(gl(12,12,o,e))return nl;if(a===xc)return rl;if(23===a||23===l)return nl;if(16===l||16===a)return rl;if(-1!==[Dc,Oc,Kc].indexOf(l)||14===a)return nl;if(36===c&&-1!==dl.indexOf(a))return nl;if(a===Wc&&36===l)return nl;if(l===Rc)return nl;if(-1!==il.indexOf(l)&&a===Vc||-1!==il.indexOf(a)&&l===Vc)return nl;if(a===Gc&&-1!==[Zc,Jc,$c].indexOf(l)||-1!==[Zc,Jc,$c].indexOf(a)&&l===Pc)return nl;if(-1!==il.indexOf(a)&&-1!==cl.indexOf(l)||-1!==cl.indexOf(a)&&-1!==il.indexOf(l))return nl;if(-1!==[Gc,Pc].indexOf(a)&&(l===Vc||-1!==[kc,Oc].indexOf(l)&&e[s+1]===Vc)||-1!==[kc,Oc].indexOf(a)&&l===Vc||a===Vc&&-1!==[Vc,Wc,Mc].indexOf(l))return nl;if(-1!==[Vc,Wc,Mc,Tc,Lc].indexOf(l))for(var u=o;u>=0;){if((d=e[u])===Vc)return nl;if(-1===[Wc,Mc].indexOf(d))break;u--}if(-1!==[Gc,Pc].indexOf(l))for(u=-1!==[Tc,Lc].indexOf(a)?i:o;u>=0;){var d;if((d=e[u])===Vc)return nl;if(-1===[Wc,Mc].indexOf(d))break;u--}if(zc===a&&-1!==[zc,qc,Yc,jc].indexOf(l)||-1!==[qc,Yc].indexOf(a)&&-1!==[qc,Al].indexOf(l)||-1!==[Al,jc].indexOf(a)&&l===Al)return nl;if(-1!==ul.indexOf(a)&&-1!==[Rc,Pc].indexOf(l)||-1!==ul.indexOf(l)&&a===Gc)return nl;if(-1!==il.indexOf(a)&&-1!==il.indexOf(l))return nl;if(a===Mc&&-1!==il.indexOf(l))return nl;if(-1!==il.concat(Vc).indexOf(a)&&l===kc&&-1===tl.indexOf(A[s])||-1!==il.concat(Vc).indexOf(l)&&a===Lc)return nl;if(41===a&&41===l){for(var g=t[o],h=1;g>0&&41===e[--g];)h++;if(h%2!=0)return nl}return a===Jc&&l===$c?nl:rl},Bl=function(A,e){e||(e={lineBreak:"normal",wordBreak:"normal"});var t=function(A,e){void 0===e&&(e="strict");var t=[],n=[],r=[];return A.forEach((function(A,o){var i=ol.get(A);if(i>50?(r.push(!0),i-=50):r.push(!1),-1!==["normal","auto","loose"].indexOf(e)&&-1!==[8208,8211,12316,12448].indexOf(A))return n.push(o),t.push(16);if(4===i||11===i){if(0===o)return n.push(o),t.push(Xc);var s=t[o-1];return-1===ll.indexOf(s)?(n.push(n[o-1]),t.push(s)):(n.push(o),t.push(Xc))}return n.push(o),31===i?t.push("strict"===e?Kc:Zc):i===el||29===i?t.push(Xc):43===i?A>=131072&&A<=196605||A>=196608&&A<=262141?t.push(Zc):t.push(Xc):void t.push(i)})),[n,t,r]}(A,e.lineBreak),n=t[0],r=t[1],o=t[2];return"break-all"!==e.wordBreak&&"break-word"!==e.wordBreak||(r=r.map((function(A){return-1!==[Vc,Xc,el].indexOf(A)?Zc:A}))),[n,r,"keep-all"===e.wordBreak?o.map((function(e,t){return e&&A[t]>=19968&&A[t]<=40959})):void 0]},fl=function(){function A(A,e,t,n){this.codePoints=A,this.required="!"===e,this.start=t,this.end=n}return A.prototype.slice=function(){return dc.apply(void 0,this.codePoints.slice(this.start,this.end))},A}(),ml=45,wl=43,Cl=-1,Ql=function(A){return A>=48&&A<=57},yl=function(A){return Ql(A)||A>=65&&A<=70||A>=97&&A<=102},El=function(A){return 10===A||9===A||32===A},vl=function(A){return function(A){return function(A){return A>=97&&A<=122}(A)||function(A){return A>=65&&A<=90}(A)}(A)||function(A){return A>=128}(A)||95===A},Ul=function(A){return vl(A)||Ql(A)||A===ml},Fl=function(A){return A>=0&&A<=8||11===A||A>=14&&A<=31||127===A},bl=function(A,e){return 92===A&&10!==e},Hl=function(A,e,t){return A===ml?vl(e)||bl(e,t):!!vl(A)||!(92!==A||!bl(A,e))},Il=function(A,e,t){return A===wl||A===ml?!!Ql(e)||46===e&&Ql(t):Ql(46===A?e:A)},Sl=function(A){var e=0,t=1;A[e]!==wl&&A[e]!==ml||(A[e]===ml&&(t=-1),e++);for(var n=[];Ql(A[e]);)n.push(A[e++]);var r=n.length?parseInt(dc.apply(void 0,n),10):0;46===A[e]&&e++;for(var o=[];Ql(A[e]);)o.push(A[e++]);var i=o.length,s=i?parseInt(dc.apply(void 0,o),10):0;69!==A[e]&&101!==A[e]||e++;var a=1;A[e]!==wl&&A[e]!==ml||(A[e]===ml&&(a=-1),e++);for(var c=[];Ql(A[e]);)c.push(A[e++]);var l=c.length?parseInt(dc.apply(void 0,c),10):0;return t*(r+s*Math.pow(10,-i))*Math.pow(10,a*l)},Nl={type:2},xl={type:3},Dl={type:4},Ol={type:13},Tl={type:8},Ll={type:21},_l={type:9},Rl={type:10},Kl={type:11},kl={type:12},Ml={type:14},Vl={type:23},Pl={type:1},Gl={type:25},Wl={type:24},Xl={type:26},Jl={type:27},$l={type:28},Yl={type:29},jl={type:31},Zl={type:32},zl=function(){function A(){this._value=[]}return A.prototype.write=function(A){this._value=this._value.concat(uc(A))},A.prototype.read=function(){for(var A=[],e=this.consumeToken();e!==Zl;)A.push(e),e=this.consumeToken();return A},A.prototype.consumeToken=function(){var A=this.consumeCodePoint();switch(A){case 34:return this.consumeStringToken(34);case 35:var e=this.peekCodePoint(0),t=this.peekCodePoint(1),n=this.peekCodePoint(2);if(Ul(e)||bl(t,n)){var r=Hl(e,t,n)?2:1;return{type:5,value:this.consumeName(),flags:r}}break;case 36:if(61===this.peekCodePoint(0))return this.consumeCodePoint(),Ol;break;case 39:return this.consumeStringToken(39);case 40:return Nl;case 41:return xl;case 42:if(61===this.peekCodePoint(0))return this.consumeCodePoint(),Ml;break;case wl:if(Il(A,this.peekCodePoint(0),this.peekCodePoint(1)))return this.reconsumeCodePoint(A),this.consumeNumericToken();break;case 44:return Dl;case ml:var o=A,i=this.peekCodePoint(0),s=this.peekCodePoint(1);if(Il(o,i,s))return this.reconsumeCodePoint(A),this.consumeNumericToken();if(Hl(o,i,s))return this.reconsumeCodePoint(A),this.consumeIdentLikeToken();if(i===ml&&62===s)return this.consumeCodePoint(),this.consumeCodePoint(),Wl;break;case 46:if(Il(A,this.peekCodePoint(0),this.peekCodePoint(1)))return this.reconsumeCodePoint(A),this.consumeNumericToken();break;case 47:if(42===this.peekCodePoint(0))for(this.consumeCodePoint();;){var a=this.consumeCodePoint();if(42===a&&47===(a=this.consumeCodePoint()))return this.consumeToken();if(a===Cl)return this.consumeToken()}break;case 58:return Xl;case 59:return Jl;case 60:if(33===this.peekCodePoint(0)&&this.peekCodePoint(1)===ml&&this.peekCodePoint(2)===ml)return this.consumeCodePoint(),this.consumeCodePoint(),Gl;break;case 64:var c=this.peekCodePoint(0),l=this.peekCodePoint(1),u=this.peekCodePoint(2);if(Hl(c,l,u))return{type:7,value:this.consumeName()};break;case 91:return $l;case 92:if(bl(A,this.peekCodePoint(0)))return this.reconsumeCodePoint(A),this.consumeIdentLikeToken();break;case 93:return Yl;case 61:if(61===this.peekCodePoint(0))return this.consumeCodePoint(),Tl;break;case 123:return Kl;case 125:return kl;case 117:case 85:var d=this.peekCodePoint(0),g=this.peekCodePoint(1);return d!==wl||!yl(g)&&63!==g||(this.consumeCodePoint(),this.consumeUnicodeRangeToken()),this.reconsumeCodePoint(A),this.consumeIdentLikeToken();case 124:if(61===this.peekCodePoint(0))return this.consumeCodePoint(),_l;if(124===this.peekCodePoint(0))return this.consumeCodePoint(),Ll;break;case 126:if(61===this.peekCodePoint(0))return this.consumeCodePoint(),Rl;break;case Cl:return Zl}return El(A)?(this.consumeWhiteSpace(),jl):Ql(A)?(this.reconsumeCodePoint(A),this.consumeNumericToken()):vl(A)?(this.reconsumeCodePoint(A),this.consumeIdentLikeToken()):{type:6,value:dc(A)}},A.prototype.consumeCodePoint=function(){var A=this._value.shift();return void 0===A?-1:A},A.prototype.reconsumeCodePoint=function(A){this._value.unshift(A)},A.prototype.peekCodePoint=function(A){return A>=this._value.length?-1:this._value[A]},A.prototype.consumeUnicodeRangeToken=function(){for(var A=[],e=this.consumeCodePoint();yl(e)&&A.length<6;)A.push(e),e=this.consumeCodePoint();for(var t=!1;63===e&&A.length<6;)A.push(e),e=this.consumeCodePoint(),t=!0;if(t)return{type:30,start:parseInt(dc.apply(void 0,A.map((function(A){return 63===A?48:A}))),16),end:parseInt(dc.apply(void 0,A.map((function(A){return 63===A?70:A}))),16)};var n=parseInt(dc.apply(void 0,A),16);if(this.peekCodePoint(0)===ml&&yl(this.peekCodePoint(1))){this.consumeCodePoint(),e=this.consumeCodePoint();for(var r=[];yl(e)&&r.length<6;)r.push(e),e=this.consumeCodePoint();return{type:30,start:n,end:parseInt(dc.apply(void 0,r),16)}}return{type:30,start:n,end:n}},A.prototype.consumeIdentLikeToken=function(){var A=this.consumeName();return"url"===A.toLowerCase()&&40===this.peekCodePoint(0)?(this.consumeCodePoint(),this.consumeUrlToken()):40===this.peekCodePoint(0)?(this.consumeCodePoint(),{type:19,value:A}):{type:20,value:A}},A.prototype.consumeUrlToken=function(){var A=[];if(this.consumeWhiteSpace(),this.peekCodePoint(0)===Cl)return{type:22,value:""};var e=this.peekCodePoint(0);if(39===e||34===e){var t=this.consumeStringToken(this.consumeCodePoint());return 0===t.type&&(this.consumeWhiteSpace(),this.peekCodePoint(0)===Cl||41===this.peekCodePoint(0))?(this.consumeCodePoint(),{type:22,value:t.value}):(this.consumeBadUrlRemnants(),Vl)}for(;;){var n=this.consumeCodePoint();if(n===Cl||41===n)return{type:22,value:dc.apply(void 0,A)};if(El(n))return this.consumeWhiteSpace(),this.peekCodePoint(0)===Cl||41===this.peekCodePoint(0)?(this.consumeCodePoint(),{type:22,value:dc.apply(void 0,A)}):(this.consumeBadUrlRemnants(),Vl);if(34===n||39===n||40===n||Fl(n))return this.consumeBadUrlRemnants(),Vl;if(92===n){if(!bl(n,this.peekCodePoint(0)))return this.consumeBadUrlRemnants(),Vl;A.push(this.consumeEscapedCodePoint())}else A.push(n)}},A.prototype.consumeWhiteSpace=function(){for(;El(this.peekCodePoint(0));)this.consumeCodePoint()},A.prototype.consumeBadUrlRemnants=function(){for(;;){var A=this.consumeCodePoint();if(41===A||A===Cl)return;bl(A,this.peekCodePoint(0))&&this.consumeEscapedCodePoint()}},A.prototype.consumeStringSlice=function(A){for(var e="";A>0;){var t=Math.min(5e4,A);e+=dc.apply(void 0,this._value.splice(0,t)),A-=t}return this._value.shift(),e},A.prototype.consumeStringToken=function(A){for(var e="",t=0;;){var n=this._value[t];if(n===Cl||void 0===n||n===A)return{type:0,value:e+=this.consumeStringSlice(t)};if(10===n)return this._value.splice(0,t),Pl;if(92===n){var r=this._value[t+1];r!==Cl&&void 0!==r&&(10===r?(e+=this.consumeStringSlice(t),t=-1,this._value.shift()):bl(n,r)&&(e+=this.consumeStringSlice(t),e+=dc(this.consumeEscapedCodePoint()),t=-1))}t++}},A.prototype.consumeNumber=function(){var A=[],e=4,t=this.peekCodePoint(0);for(t!==wl&&t!==ml||A.push(this.consumeCodePoint());Ql(this.peekCodePoint(0));)A.push(this.consumeCodePoint());t=this.peekCodePoint(0);var n=this.peekCodePoint(1);if(46===t&&Ql(n))for(A.push(this.consumeCodePoint(),this.consumeCodePoint()),e=8;Ql(this.peekCodePoint(0));)A.push(this.consumeCodePoint());t=this.peekCodePoint(0),n=this.peekCodePoint(1);var r=this.peekCodePoint(2);if((69===t||101===t)&&((n===wl||n===ml)&&Ql(r)||Ql(n)))for(A.push(this.consumeCodePoint(),this.consumeCodePoint()),e=8;Ql(this.peekCodePoint(0));)A.push(this.consumeCodePoint());return[Sl(A),e]},A.prototype.consumeNumericToken=function(){var A=this.consumeNumber(),e=A[0],t=A[1],n=this.peekCodePoint(0),r=this.peekCodePoint(1),o=this.peekCodePoint(2);return Hl(n,r,o)?{type:15,number:e,flags:t,unit:this.consumeName()}:37===n?(this.consumeCodePoint(),{type:16,number:e,flags:t}):{type:17,number:e,flags:t}},A.prototype.consumeEscapedCodePoint=function(){var A=this.consumeCodePoint();if(yl(A)){for(var e=dc(A);yl(this.peekCodePoint(0))&&e.length<6;)e+=dc(this.consumeCodePoint());El(this.peekCodePoint(0))&&this.consumeCodePoint();var t=parseInt(e,16);return 0===t||function(A){return A>=55296&&A<=57343}(t)||t>1114111?65533:t}return A===Cl?65533:A},A.prototype.consumeName=function(){for(var A="";;){var e=this.consumeCodePoint();if(Ul(e))A+=dc(e);else{if(!bl(e,this.peekCodePoint(0)))return this.reconsumeCodePoint(e),A;A+=dc(this.consumeEscapedCodePoint())}}},A}(),ql=function(){function A(A){this._tokens=A}return A.create=function(e){var t=new zl;return t.write(e),new A(t.read())},A.parseValue=function(e){return A.create(e).parseComponentValue()},A.parseValues=function(e){return A.create(e).parseComponentValues()},A.prototype.parseComponentValue=function(){for(var A=this.consumeToken();31===A.type;)A=this.consumeToken();if(32===A.type)throw new SyntaxError("Error parsing CSS component value, unexpected EOF");this.reconsumeToken(A);var e=this.consumeComponentValue();do{A=this.consumeToken()}while(31===A.type);if(32===A.type)return e;throw new SyntaxError("Error parsing CSS component value, multiple values found when expecting only one")},A.prototype.parseComponentValues=function(){for(var A=[];;){var e=this.consumeComponentValue();if(32===e.type)return A;A.push(e),A.push()}},A.prototype.consumeComponentValue=function(){var A=this.consumeToken();switch(A.type){case 11:case 28:case 2:return this.consumeSimpleBlock(A.type);case 19:return this.consumeFunction(A)}return A},A.prototype.consumeSimpleBlock=function(A){for(var e={type:A,values:[]},t=this.consumeToken();;){if(32===t.type||au(t,A))return e;this.reconsumeToken(t),e.values.push(this.consumeComponentValue()),t=this.consumeToken()}},A.prototype.consumeFunction=function(A){for(var e={name:A.value,values:[],type:18};;){var t=this.consumeToken();if(32===t.type||3===t.type)return e;this.reconsumeToken(t),e.values.push(this.consumeComponentValue())}},A.prototype.consumeToken=function(){var A=this._tokens.shift();return void 0===A?Zl:A},A.prototype.reconsumeToken=function(A){this._tokens.unshift(A)},A}(),Au=function(A){return 15===A.type},eu=function(A){return 17===A.type},tu=function(A){return 20===A.type},nu=function(A){return 0===A.type},ru=function(A,e){return tu(A)&&A.value===e},ou=function(A){return 31!==A.type},iu=function(A){return 31!==A.type&&4!==A.type},su=function(A){var e=[],t=[];return A.forEach((function(A){if(4===A.type){if(0===t.length)throw new Error("Error parsing function args, zero tokens for arg");return e.push(t),void(t=[])}31!==A.type&&t.push(A)})),t.length&&e.push(t),e},au=function(A,e){return 11===e&&12===A.type||(28===e&&29===A.type||2===e&&3===A.type)},cu=function(A){return 17===A.type||15===A.type},lu=function(A){return 16===A.type||cu(A)},uu=function(A){return A.length>1?[A[0],A[1]]:[A[0]]},du={type:17,number:0,flags:4},gu={type:16,number:50,flags:4},hu={type:16,number:100,flags:4},pu=function(A,e,t){var n=A[0],r=A[1];return[Bu(n,e),Bu(void 0!==r?r:n,t)]},Bu=function(A,e){if(16===A.type)return A.number/100*e;if(Au(A))switch(A.unit){case"rem":case"em":return 16*A.number;default:return A.number}return A.number},fu="grad",mu="turn",wu=function(A,e){if(15===e.type)switch(e.unit){case"deg":return Math.PI*e.number/180;case fu:return Math.PI/200*e.number;case"rad":return e.number;case mu:return 2*Math.PI*e.number}throw new Error("Unsupported angle type")},Cu=function(A){return 15===A.type&&("deg"===A.unit||A.unit===fu||"rad"===A.unit||A.unit===mu)},Qu=function(A){switch(A.filter(tu).map((function(A){return A.value})).join(" ")){case"to bottom right":case"to right bottom":case"left top":case"top left":return[du,du];case"to top":case"bottom":return yu(0);case"to bottom left":case"to left bottom":case"right top":case"top right":return[du,hu];case"to right":case"left":return yu(90);case"to top left":case"to left top":case"right bottom":case"bottom right":return[hu,hu];case"to bottom":case"top":return yu(180);case"to top right":case"to right top":case"left bottom":case"bottom left":return[hu,du];case"to left":case"right":return yu(270)}return 0},yu=function(A){return Math.PI*A/180},Eu=function(A,e){if(18===e.type){var t=Nu[e.name];if(void 0===t)throw new Error('Attempting to parse an unsupported color function "'+e.name+'"');return t(A,e.values)}if(5===e.type){if(3===e.value.length){var n=e.value.substring(0,1),r=e.value.substring(1,2),o=e.value.substring(2,3);return Fu(parseInt(n+n,16),parseInt(r+r,16),parseInt(o+o,16),1)}if(4===e.value.length){n=e.value.substring(0,1),r=e.value.substring(1,2),o=e.value.substring(2,3);var i=e.value.substring(3,4);return Fu(parseInt(n+n,16),parseInt(r+r,16),parseInt(o+o,16),parseInt(i+i,16)/255)}if(6===e.value.length){n=e.value.substring(0,2),r=e.value.substring(2,4),o=e.value.substring(4,6);return Fu(parseInt(n,16),parseInt(r,16),parseInt(o,16),1)}if(8===e.value.length){n=e.value.substring(0,2),r=e.value.substring(2,4),o=e.value.substring(4,6),i=e.value.substring(6,8);return Fu(parseInt(n,16),parseInt(r,16),parseInt(o,16),parseInt(i,16)/255)}}if(20===e.type){var s=Du[e.value.toUpperCase()];if(void 0!==s)return s}return Du.TRANSPARENT},vu=function(A){return!(255&A)},Uu=function(A){var e=255&A,t=255&A>>8,n=255&A>>16,r=255&A>>24;return e<255?"rgba("+r+","+n+","+t+","+e/255+")":"rgb("+r+","+n+","+t+")"},Fu=function(A,e,t,n){return(A<<24|e<<16|t<<8|Math.round(255*n))>>>0},bu=function(A,e){if(17===A.type)return A.number;if(16===A.type){var t=3===e?1:255;return 3===e?A.number/100*t:Math.round(A.number/100*t)}return 0},Hu=function(A,e){var t=e.filter(iu);if(3===t.length){var n=t.map(bu),r=n[0],o=n[1],i=n[2];return Fu(r,o,i,1)}if(4===t.length){var s=t.map(bu),a=(r=s[0],o=s[1],i=s[2],s[3]);return Fu(r,o,i,a)}return 0};function Iu(A,e,t){return t<0&&(t+=1),t>=1&&(t-=1),t<1/6?(e-A)*t*6+A:t<.5?e:t<2/3?6*(e-A)*(2/3-t)+A:A}var Su=function(A,e){var t=e.filter(iu),n=t[0],r=t[1],o=t[2],i=t[3],s=(17===n.type?yu(n.number):wu(A,n))/(2*Math.PI),a=lu(r)?r.number/100:0,c=lu(o)?o.number/100:0,l=void 0!==i&&lu(i)?Bu(i,1):1;if(0===a)return Fu(255*c,255*c,255*c,1);var u=c<=.5?c*(a+1):c+a-c*a,d=2*c-u,g=Iu(d,u,s+1/3),h=Iu(d,u,s),p=Iu(d,u,s-1/3);return Fu(255*g,255*h,255*p,l)},Nu={hsl:Su,hsla:Su,rgb:Hu,rgba:Hu},xu=function(A,e){return Eu(A,ql.create(e).parseComponentValue())},Du={ALICEBLUE:4042850303,ANTIQUEWHITE:4209760255,AQUA:16777215,AQUAMARINE:2147472639,AZURE:4043309055,BEIGE:4126530815,BISQUE:4293182719,BLACK:255,BLANCHEDALMOND:4293643775,BLUE:65535,BLUEVIOLET:2318131967,BROWN:2771004159,BURLYWOOD:3736635391,CADETBLUE:1604231423,CHARTREUSE:2147418367,CHOCOLATE:3530104575,CORAL:4286533887,CORNFLOWERBLUE:1687547391,CORNSILK:4294499583,CRIMSON:3692313855,CYAN:16777215,DARKBLUE:35839,DARKCYAN:9145343,DARKGOLDENROD:3095837695,DARKGRAY:2846468607,DARKGREEN:6553855,DARKGREY:2846468607,DARKKHAKI:3182914559,DARKMAGENTA:2332068863,DARKOLIVEGREEN:1433087999,DARKORANGE:4287365375,DARKORCHID:2570243327,DARKRED:2332033279,DARKSALMON:3918953215,DARKSEAGREEN:2411499519,DARKSLATEBLUE:1211993087,DARKSLATEGRAY:793726975,DARKSLATEGREY:793726975,DARKTURQUOISE:13554175,DARKVIOLET:2483082239,DEEPPINK:4279538687,DEEPSKYBLUE:12582911,DIMGRAY:1768516095,DIMGREY:1768516095,DODGERBLUE:512819199,FIREBRICK:2988581631,FLORALWHITE:4294635775,FORESTGREEN:579543807,FUCHSIA:4278255615,GAINSBORO:3705462015,GHOSTWHITE:4177068031,GOLD:4292280575,GOLDENROD:3668254975,GRAY:2155905279,GREEN:8388863,GREENYELLOW:2919182335,GREY:2155905279,HONEYDEW:4043305215,HOTPINK:4285117695,INDIANRED:3445382399,INDIGO:1258324735,IVORY:4294963455,KHAKI:4041641215,LAVENDER:3873897215,LAVENDERBLUSH:4293981695,LAWNGREEN:2096890111,LEMONCHIFFON:4294626815,LIGHTBLUE:2916673279,LIGHTCORAL:4034953471,LIGHTCYAN:3774873599,LIGHTGOLDENRODYELLOW:4210742015,LIGHTGRAY:3553874943,LIGHTGREEN:2431553791,LIGHTGREY:3553874943,LIGHTPINK:4290167295,LIGHTSALMON:4288707327,LIGHTSEAGREEN:548580095,LIGHTSKYBLUE:2278488831,LIGHTSLATEGRAY:2005441023,LIGHTSLATEGREY:2005441023,LIGHTSTEELBLUE:2965692159,LIGHTYELLOW:4294959359,LIME:16711935,LIMEGREEN:852308735,LINEN:4210091775,MAGENTA:4278255615,MAROON:2147483903,MEDIUMAQUAMARINE:1724754687,MEDIUMBLUE:52735,MEDIUMORCHID:3126187007,MEDIUMPURPLE:2473647103,MEDIUMSEAGREEN:1018393087,MEDIUMSLATEBLUE:2070474495,MEDIUMSPRINGGREEN:16423679,MEDIUMTURQUOISE:1221709055,MEDIUMVIOLETRED:3340076543,MIDNIGHTBLUE:421097727,MINTCREAM:4127193855,MISTYROSE:4293190143,MOCCASIN:4293178879,NAVAJOWHITE:4292783615,NAVY:33023,OLDLACE:4260751103,OLIVE:2155872511,OLIVEDRAB:1804477439,ORANGE:4289003775,ORANGERED:4282712319,ORCHID:3664828159,PALEGOLDENROD:4008225535,PALEGREEN:2566625535,PALETURQUOISE:2951671551,PALEVIOLETRED:3681588223,PAPAYAWHIP:4293907967,PEACHPUFF:4292524543,PERU:3448061951,PINK:4290825215,PLUM:3718307327,POWDERBLUE:2967529215,PURPLE:2147516671,REBECCAPURPLE:1714657791,RED:4278190335,ROSYBROWN:3163525119,ROYALBLUE:1097458175,SADDLEBROWN:2336560127,SALMON:4202722047,SANDYBROWN:4104413439,SEAGREEN:780883967,SEASHELL:4294307583,SIENNA:2689740287,SILVER:3233857791,SKYBLUE:2278484991,SLATEBLUE:1784335871,SLATEGRAY:1887473919,SLATEGREY:1887473919,SNOW:4294638335,SPRINGGREEN:16744447,STEELBLUE:1182971135,TAN:3535047935,TEAL:8421631,THISTLE:3636451583,TOMATO:4284696575,TRANSPARENT:0,TURQUOISE:1088475391,VIOLET:4001558271,WHEAT:4125012991,WHITE:4294967295,WHITESMOKE:4126537215,YELLOW:4294902015,YELLOWGREEN:2597139199},Ou={name:"background-clip",initialValue:"border-box",prefix:!1,type:1,parse:function(A,e){return e.map((function(A){if(tu(A))switch(A.value){case"padding-box":return 1;case"content-box":return 2}return 0}))}},Tu={name:"background-color",initialValue:"transparent",prefix:!1,type:3,format:"color"},Lu=function(A,e){var t=Eu(A,e[0]),n=e[1];return n&&lu(n)?{color:t,stop:n}:{color:t,stop:null}},_u=function(A,e){var t=A[0],n=A[A.length-1];null===t.stop&&(t.stop=du),null===n.stop&&(n.stop=hu);for(var r=[],o=0,i=0;io?r.push(a):r.push(o),o=a}else r.push(null)}var c=null;for(i=0;iA.optimumDistance)?{optimumCorner:e,optimumDistance:s}:A}),{optimumDistance:r?1/0:-1/0,optimumCorner:null}).optimumCorner},Mu=function(A,e){var t=yu(180),n=[];return su(e).forEach((function(e,r){if(0===r){var o=e[0];if(20===o.type&&-1!==["top","left","right","bottom"].indexOf(o.value))return void(t=Qu(e));if(Cu(o))return void(t=(wu(A,o)+yu(270))%yu(360))}var i=Lu(A,e);n.push(i)})),{angle:t,stops:n,type:1}},Vu="closest-side",Pu="farthest-side",Gu="closest-corner",Wu="farthest-corner",Xu="circle",Ju="ellipse",$u="cover",Yu="contain",ju=function(A,e){var t=0,n=3,r=[],o=[];return su(e).forEach((function(e,i){var s=!0;if(0===i?s=e.reduce((function(A,e){if(tu(e))switch(e.value){case"center":return o.push(gu),!1;case"top":case"left":return o.push(du),!1;case"right":case"bottom":return o.push(hu),!1}else if(lu(e)||cu(e))return o.push(e),!1;return A}),s):1===i&&(s=e.reduce((function(A,e){if(tu(e))switch(e.value){case Xu:return t=0,!1;case Ju:return t=1,!1;case Yu:case Vu:return n=0,!1;case Pu:return n=1,!1;case Gu:return n=2,!1;case $u:case Wu:return n=3,!1}else if(cu(e)||lu(e))return Array.isArray(n)||(n=[]),n.push(e),!1;return A}),s)),s){var a=Lu(A,e);r.push(a)}})),{size:n,shape:t,stops:r,position:o,type:2}},Zu=function(A,e){if(22===e.type){var t={url:e.value,type:0};return A.cache.addImage(e.value),t}if(18===e.type){var n=Ad[e.name];if(void 0===n)throw new Error('Attempting to parse an unsupported image function "'+e.name+'"');return n(A,e.values)}throw new Error("Unsupported image type "+e.type)};var zu,qu,Ad={"linear-gradient":function(A,e){var t=yu(180),n=[];return su(e).forEach((function(e,r){if(0===r){var o=e[0];if(20===o.type&&"to"===o.value)return void(t=Qu(e));if(Cu(o))return void(t=wu(A,o))}var i=Lu(A,e);n.push(i)})),{angle:t,stops:n,type:1}},"-moz-linear-gradient":Mu,"-ms-linear-gradient":Mu,"-o-linear-gradient":Mu,"-webkit-linear-gradient":Mu,"radial-gradient":function(A,e){var t=0,n=3,r=[],o=[];return su(e).forEach((function(e,i){var s=!0;if(0===i){var a=!1;s=e.reduce((function(A,e){if(a)if(tu(e))switch(e.value){case"center":return o.push(gu),A;case"top":case"left":return o.push(du),A;case"right":case"bottom":return o.push(hu),A}else(lu(e)||cu(e))&&o.push(e);else if(tu(e))switch(e.value){case Xu:return t=0,!1;case Ju:return t=1,!1;case"at":return a=!0,!1;case Vu:return n=0,!1;case $u:case Pu:return n=1,!1;case Yu:case Gu:return n=2,!1;case Wu:return n=3,!1}else if(cu(e)||lu(e))return Array.isArray(n)||(n=[]),n.push(e),!1;return A}),s)}if(s){var c=Lu(A,e);r.push(c)}})),{size:n,shape:t,stops:r,position:o,type:2}},"-moz-radial-gradient":ju,"-ms-radial-gradient":ju,"-o-radial-gradient":ju,"-webkit-radial-gradient":ju,"-webkit-gradient":function(A,e){var t=yu(180),n=[],r=1;return su(e).forEach((function(e,t){var o=e[0];if(0===t){if(tu(o)&&"linear"===o.value)return void(r=1);if(tu(o)&&"radial"===o.value)return void(r=2)}if(18===o.type)if("from"===o.name){var i=Eu(A,o.values[0]);n.push({stop:du,color:i})}else if("to"===o.name){i=Eu(A,o.values[0]);n.push({stop:hu,color:i})}else if("color-stop"===o.name){var s=o.values.filter(iu);if(2===s.length){i=Eu(A,s[1]);var a=s[0];eu(a)&&n.push({stop:{type:16,number:100*a.number,flags:a.flags},color:i})}}})),1===r?{angle:(t+yu(180))%yu(360),stops:n,type:r}:{size:3,shape:0,stops:n,position:[],type:r}}},ed={name:"background-image",initialValue:"none",type:1,prefix:!1,parse:function(A,e){if(0===e.length)return[];var t=e[0];return 20===t.type&&"none"===t.value?[]:e.filter((function(A){return iu(A)&&function(A){return!(20===A.type&&"none"===A.value||18===A.type&&!Ad[A.name])}(A)})).map((function(e){return Zu(A,e)}))}},td={name:"background-origin",initialValue:"border-box",prefix:!1,type:1,parse:function(A,e){return e.map((function(A){if(tu(A))switch(A.value){case"padding-box":return 1;case"content-box":return 2}return 0}))}},nd={name:"background-position",initialValue:"0% 0%",type:1,prefix:!1,parse:function(A,e){return su(e).map((function(A){return A.filter(lu)})).map(uu)}},rd={name:"background-repeat",initialValue:"repeat",prefix:!1,type:1,parse:function(A,e){return su(e).map((function(A){return A.filter(tu).map((function(A){return A.value})).join(" ")})).map(od)}},od=function(A){switch(A){case"no-repeat":return 1;case"repeat-x":case"repeat no-repeat":return 2;case"repeat-y":case"no-repeat repeat":return 3;default:return 0}};(qu=zu||(zu={})).AUTO="auto",qu.CONTAIN="contain",qu.COVER="cover";var id,sd,ad={name:"background-size",initialValue:"0",prefix:!1,type:1,parse:function(A,e){return su(e).map((function(A){return A.filter(cd)}))}},cd=function(A){return tu(A)||lu(A)},ld=function(A){return{name:"border-"+A+"-color",initialValue:"transparent",prefix:!1,type:3,format:"color"}},ud=ld("top"),dd=ld("right"),gd=ld("bottom"),hd=ld("left"),pd=function(A){return{name:"border-radius-"+A,initialValue:"0 0",prefix:!1,type:1,parse:function(A,e){return uu(e.filter(lu))}}},Bd=pd("top-left"),fd=pd("top-right"),md=pd("bottom-right"),wd=pd("bottom-left"),Cd=function(A){return{name:"border-"+A+"-style",initialValue:"solid",prefix:!1,type:2,parse:function(A,e){switch(e){case"none":return 0;case"dashed":return 2;case"dotted":return 3;case"double":return 4}return 1}}},Qd=Cd("top"),yd=Cd("right"),Ed=Cd("bottom"),vd=Cd("left"),Ud=function(A){return{name:"border-"+A+"-width",initialValue:"0",type:0,prefix:!1,parse:function(A,e){return Au(e)?e.number:0}}},Fd=Ud("top"),bd=Ud("right"),Hd=Ud("bottom"),Id=Ud("left"),Sd={name:"color",initialValue:"transparent",prefix:!1,type:3,format:"color"},Nd={name:"direction",initialValue:"ltr",prefix:!1,type:2,parse:function(A,e){return"rtl"===e?1:0}},xd={name:"display",initialValue:"inline-block",prefix:!1,type:1,parse:function(A,e){return e.filter(tu).reduce((function(A,e){return A|Dd(e.value)}),0)}},Dd=function(A){switch(A){case"block":case"-webkit-box":return 2;case"inline":return 4;case"run-in":return 8;case"flow":return 16;case"flow-root":return 32;case"table":return 64;case"flex":case"-webkit-flex":return 128;case"grid":case"-ms-grid":return 256;case"ruby":return 512;case"subgrid":return 1024;case"list-item":return 2048;case"table-row-group":return 4096;case"table-header-group":return 8192;case"table-footer-group":return 16384;case"table-row":return 32768;case"table-cell":return 65536;case"table-column-group":return 131072;case"table-column":return 262144;case"table-caption":return 524288;case"ruby-base":return 1048576;case"ruby-text":return 2097152;case"ruby-base-container":return 4194304;case"ruby-text-container":return 8388608;case"contents":return 16777216;case"inline-block":return 33554432;case"inline-list-item":return 67108864;case"inline-table":return 134217728;case"inline-flex":return 268435456;case"inline-grid":return 536870912}return 0},Od={name:"float",initialValue:"none",prefix:!1,type:2,parse:function(A,e){switch(e){case"left":return 1;case"right":return 2;case"inline-start":return 3;case"inline-end":return 4}return 0}},Td={name:"letter-spacing",initialValue:"0",prefix:!1,type:0,parse:function(A,e){return 20===e.type&&"normal"===e.value?0:17===e.type||15===e.type?e.number:0}};(sd=id||(id={})).NORMAL="normal",sd.STRICT="strict";var Ld,_d,Rd={name:"line-break",initialValue:"normal",prefix:!1,type:2,parse:function(A,e){return"strict"===e?id.STRICT:id.NORMAL}},Kd={name:"line-height",initialValue:"normal",prefix:!1,type:4},kd=function(A,e){return tu(A)&&"normal"===A.value?1.2*e:17===A.type?e*A.number:lu(A)?Bu(A,e):e},Md={name:"list-style-image",initialValue:"none",type:0,prefix:!1,parse:function(A,e){return 20===e.type&&"none"===e.value?null:Zu(A,e)}},Vd={name:"list-style-position",initialValue:"outside",prefix:!1,type:2,parse:function(A,e){return"inside"===e?0:1}},Pd={name:"list-style-type",initialValue:"none",prefix:!1,type:2,parse:function(A,e){switch(e){case"disc":return 0;case"circle":return 1;case"square":return 2;case"decimal":return 3;case"cjk-decimal":return 4;case"decimal-leading-zero":return 5;case"lower-roman":return 6;case"upper-roman":return 7;case"lower-greek":return 8;case"lower-alpha":return 9;case"upper-alpha":return 10;case"arabic-indic":return 11;case"armenian":return 12;case"bengali":return 13;case"cambodian":return 14;case"cjk-earthly-branch":return 15;case"cjk-heavenly-stem":return 16;case"cjk-ideographic":return 17;case"devanagari":return 18;case"ethiopic-numeric":return 19;case"georgian":return 20;case"gujarati":return 21;case"gurmukhi":case"hebrew":return 22;case"hiragana":return 23;case"hiragana-iroha":return 24;case"japanese-formal":return 25;case"japanese-informal":return 26;case"kannada":return 27;case"katakana":return 28;case"katakana-iroha":return 29;case"khmer":return 30;case"korean-hangul-formal":return 31;case"korean-hanja-formal":return 32;case"korean-hanja-informal":return 33;case"lao":return 34;case"lower-armenian":return 35;case"malayalam":return 36;case"mongolian":return 37;case"myanmar":return 38;case"oriya":return 39;case"persian":return 40;case"simp-chinese-formal":return 41;case"simp-chinese-informal":return 42;case"tamil":return 43;case"telugu":return 44;case"thai":return 45;case"tibetan":return 46;case"trad-chinese-formal":return 47;case"trad-chinese-informal":return 48;case"upper-armenian":return 49;case"disclosure-open":return 50;case"disclosure-closed":return 51;default:return-1}}},Gd=function(A){return{name:"margin-"+A,initialValue:"0",prefix:!1,type:4}},Wd=Gd("top"),Xd=Gd("right"),Jd=Gd("bottom"),$d=Gd("left"),Yd={name:"overflow",initialValue:"visible",prefix:!1,type:1,parse:function(A,e){return e.filter(tu).map((function(A){switch(A.value){case"hidden":return 1;case"scroll":return 2;case"clip":return 3;case"auto":return 4;default:return 0}}))}},jd={name:"overflow-wrap",initialValue:"normal",prefix:!1,type:2,parse:function(A,e){return"break-word"===e?"break-word":"normal"}},Zd=function(A){return{name:"padding-"+A,initialValue:"0",prefix:!1,type:3,format:"length-percentage"}},zd=Zd("top"),qd=Zd("right"),Ag=Zd("bottom"),eg=Zd("left"),tg={name:"text-align",initialValue:"left",prefix:!1,type:2,parse:function(A,e){switch(e){case"right":return 2;case"center":case"justify":return 1;default:return 0}}},ng={name:"position",initialValue:"static",prefix:!1,type:2,parse:function(A,e){switch(e){case"relative":return 1;case"absolute":return 2;case"fixed":return 3;case"sticky":return 4}return 0}},rg={name:"text-shadow",initialValue:"none",type:1,prefix:!1,parse:function(A,e){return 1===e.length&&ru(e[0],"none")?[]:su(e).map((function(e){for(var t={color:Du.TRANSPARENT,offsetX:du,offsetY:du,blur:du},n=0,r=0;r1?1:0],this.overflowWrap=_g(A,jd,e.overflowWrap),this.paddingTop=_g(A,zd,e.paddingTop),this.paddingRight=_g(A,qd,e.paddingRight),this.paddingBottom=_g(A,Ag,e.paddingBottom),this.paddingLeft=_g(A,eg,e.paddingLeft),this.paintOrder=_g(A,Ng,e.paintOrder),this.position=_g(A,ng,e.position),this.textAlign=_g(A,tg,e.textAlign),this.textDecorationColor=_g(A,Bg,null!==(t=e.textDecorationColor)&&void 0!==t?t:e.color),this.textDecorationLine=_g(A,fg,null!==(n=e.textDecorationLine)&&void 0!==n?n:e.textDecoration),this.textShadow=_g(A,rg,e.textShadow),this.textTransform=_g(A,og,e.textTransform),this.transform=_g(A,ig,e.transform),this.transformOrigin=_g(A,lg,e.transformOrigin),this.visibility=_g(A,ug,e.visibility),this.webkitTextStrokeColor=_g(A,xg,e.webkitTextStrokeColor),this.webkitTextStrokeWidth=_g(A,Dg,e.webkitTextStrokeWidth),this.wordBreak=_g(A,dg,e.wordBreak),this.zIndex=_g(A,gg,e.zIndex)}return A.prototype.isVisible=function(){return this.display>0&&this.opacity>0&&0===this.visibility},A.prototype.isTransparent=function(){return vu(this.backgroundColor)},A.prototype.isTransformed=function(){return null!==this.transform},A.prototype.isPositioned=function(){return 0!==this.position},A.prototype.isPositionedWithZIndex=function(){return this.isPositioned()&&!this.zIndex.auto},A.prototype.isFloating=function(){return 0!==this.float},A.prototype.isInlineLevel=function(){return Eg(this.display,4)||Eg(this.display,33554432)||Eg(this.display,268435456)||Eg(this.display,536870912)||Eg(this.display,67108864)||Eg(this.display,134217728)},A}(),Tg=function(){return function(A,e){this.content=_g(A,vg,e.content),this.quotes=_g(A,Hg,e.quotes)}}(),Lg=function(){return function(A,e){this.counterIncrement=_g(A,Ug,e.counterIncrement),this.counterReset=_g(A,Fg,e.counterReset)}}(),_g=function(A,e,t){var n=new zl,r=null!=t?t.toString():e.initialValue;n.write(r);var o=new ql(n.read());switch(e.type){case 2:var i=o.parseComponentValue();return e.parse(A,tu(i)?i.value:e.initialValue);case 0:return e.parse(A,o.parseComponentValue());case 1:return e.parse(A,o.parseComponentValues());case 4:return o.parseComponentValue();case 3:switch(e.format){case"angle":return wu(A,o.parseComponentValue());case"color":return Eu(A,o.parseComponentValue());case"image":return Zu(A,o.parseComponentValue());case"length":var s=o.parseComponentValue();return cu(s)?s:du;case"length-percentage":var a=o.parseComponentValue();return lu(a)?a:du;case"time":return hg(A,o.parseComponentValue())}}},Rg=function(A,e){var t=function(A){switch(A.getAttribute("data-html2canvas-debug")){case"all":return 1;case"clone":return 2;case"parse":return 3;case"render":return 4;default:return 0}}(A);return 1===t||e===t},Kg=function(){return function(A,e){this.context=A,this.textNodes=[],this.elements=[],this.flags=0,Rg(e,3),this.styles=new Og(A,window.getComputedStyle(e,null)),Gh(e)&&(this.styles.animationDuration.some((function(A){return A>0}))&&(e.style.animationDuration="0s"),null!==this.styles.transform&&(e.style.transform="none")),this.bounds=lc(this.context,e),Rg(e,4)&&(this.flags|=16)}}(),kg="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Mg="undefined"==typeof Uint8Array?[]:new Uint8Array(256),Vg=0;Vg<64;Vg++)Mg[kg.charCodeAt(Vg)]=Vg;for(var Pg=function(A,e,t){return A.slice?A.slice(e,t):new Uint16Array(Array.prototype.slice.call(A,e,t))},Gg=function(){function A(A,e,t,n,r,o){this.initialValue=A,this.errorValue=e,this.highStart=t,this.highValueIndex=n,this.index=r,this.data=o}return A.prototype.get=function(A){var e;if(A>=0){if(A<55296||A>56319&&A<=65535)return e=((e=this.index[A>>5])<<2)+(31&A),this.data[e];if(A<=65535)return e=((e=this.index[2048+(A-55296>>5)])<<2)+(31&A),this.data[e];if(A>11),e=this.index[e],e+=A>>5&63,e=((e=this.index[e])<<2)+(31&A),this.data[e];if(A<=1114111)return this.data[this.highValueIndex]}return this.errorValue},A}(),Wg="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Xg="undefined"==typeof Uint8Array?[]:new Uint8Array(256),Jg=0;Jg<64;Jg++)Xg[Wg.charCodeAt(Jg)]=Jg;var $g,Yg,jg=8,Zg=9,zg=11,qg=12,Ah=function(){for(var A=[],e=0;e>10),i%1024+56320)),(r+1===t||n.length>16384)&&(o+=String.fromCharCode.apply(String,n),n.length=0)}return o},eh=function(A){var e=function(A){var e,t,n,r,o,i=.75*A.length,s=A.length,a=0;"="===A[A.length-1]&&(i--,"="===A[A.length-2]&&i--);var c="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8Array&&void 0!==Uint8Array.prototype.slice?new ArrayBuffer(i):new Array(i),l=Array.isArray(c)?c:new Uint8Array(c);for(e=0;e>4,l[a++]=(15&n)<<4|r>>2,l[a++]=(3&r)<<6|63&o;return c}(A),t=Array.isArray(e)?function(A){for(var e=A.length,t=[],n=0;n=55296&&r<=56319&&t=t)return{done:!0,value:null};for(var A=th;ni.x||r.y>i.y;return i=r,0===e||s}));return A.body.removeChild(e),s}(document);return Object.defineProperty(ch,"SUPPORT_WORD_BREAKING",{value:A}),A},get SUPPORT_SVG_DRAWING(){var A=function(A){var e=new Image,t=A.createElement("canvas"),n=t.getContext("2d");if(!n)return!1;e.src="data:image/svg+xml,";try{n.drawImage(e,0,0),t.toDataURL()}catch(Em){return!1}return!0}(document);return Object.defineProperty(ch,"SUPPORT_SVG_DRAWING",{value:A}),A},get SUPPORT_FOREIGNOBJECT_DRAWING(){var A="function"==typeof Array.from&&"function"==typeof window.fetch?function(A){var e=A.createElement("canvas"),t=100;e.width=t,e.height=t;var n=e.getContext("2d");if(!n)return Promise.reject(!1);n.fillStyle="rgb(0, 255, 0)",n.fillRect(0,0,t,t);var r=new Image,o=e.toDataURL();r.src=o;var i=sh(t,t,0,0,r);return n.fillStyle="red",n.fillRect(0,0,t,t),ah(i).then((function(e){n.drawImage(e,0,0);var r=n.getImageData(0,0,t,t).data;n.fillStyle="red",n.fillRect(0,0,t,t);var i=A.createElement("div");return i.style.backgroundImage="url("+o+")",i.style.height=t+"px",ih(r)?ah(sh(t,t,0,0,i)):Promise.reject(!1)})).then((function(A){return n.drawImage(A,0,0),ih(n.getImageData(0,0,t,t).data)})).catch((function(){return!1}))}(document):Promise.resolve(!1);return Object.defineProperty(ch,"SUPPORT_FOREIGNOBJECT_DRAWING",{value:A}),A},get SUPPORT_CORS_IMAGES(){var A=void 0!==(new Image).crossOrigin;return Object.defineProperty(ch,"SUPPORT_CORS_IMAGES",{value:A}),A},get SUPPORT_RESPONSE_TYPE(){var A="string"==typeof(new XMLHttpRequest).responseType;return Object.defineProperty(ch,"SUPPORT_RESPONSE_TYPE",{value:A}),A},get SUPPORT_CORS_XHR(){var A="withCredentials"in new XMLHttpRequest;return Object.defineProperty(ch,"SUPPORT_CORS_XHR",{value:A}),A},get SUPPORT_NATIVE_TEXT_SEGMENTATION(){var A=!("undefined"==typeof Intl||!Intl.Segmenter);return Object.defineProperty(ch,"SUPPORT_NATIVE_TEXT_SEGMENTATION",{value:A}),A}},lh=function(){return function(A,e){this.text=A,this.bounds=e}}(),uh=function(A,e){var t=e.ownerDocument;if(t){var n=t.createElement("html2canvaswrapper");n.appendChild(e.cloneNode(!0));var r=e.parentNode;if(r){r.replaceChild(n,e);var o=lc(A,n);return n.firstChild&&r.replaceChild(n.firstChild,n),o}}return cc.EMPTY},dh=function(A,e,t){var n=A.ownerDocument;if(!n)throw new Error("Node has no owner document");var r=n.createRange();return r.setStart(A,e),r.setEnd(A,e+t),r},gh=function(A){if(ch.SUPPORT_NATIVE_TEXT_SEGMENTATION){var e=new Intl.Segmenter(void 0,{granularity:"grapheme"});return Array.from(e.segment(A)).map((function(A){return A.segment}))}return function(A){for(var e,t=oh(A),n=[];!(e=t.next()).done;)e.value&&n.push(e.value.slice());return n}(A)},hh=function(A,e){return 0!==e.letterSpacing?gh(A):function(A,e){if(ch.SUPPORT_NATIVE_TEXT_SEGMENTATION){var t=new Intl.Segmenter(void 0,{granularity:"word"});return Array.from(t.segment(A)).map((function(A){return A.segment}))}return Bh(A,e)}(A,e)},ph=[32,160,4961,65792,65793,4153,4241],Bh=function(A,e){for(var t,n=function(A,e){var t=uc(A),n=Bl(t,e),r=n[0],o=n[1],i=n[2],s=t.length,a=0,c=0;return{next:function(){if(c>=s)return{done:!0,value:null};for(var A=nl;c0)if(ch.SUPPORT_RANGE_BOUNDS){var r=dh(n,i,e.length).getClientRects();if(r.length>1){var s=gh(e),a=0;s.forEach((function(e){o.push(new lh(e,cc.fromDOMRectList(A,dh(n,a+i,e.length).getClientRects()))),a+=e.length}))}else o.push(new lh(e,cc.fromDOMRectList(A,r)))}else{var c=n.splitText(e.length);o.push(new lh(e,uh(A,n))),n=c}else ch.SUPPORT_RANGE_BOUNDS||(n=n.splitText(e.length));i+=e.length})),o}(A,this.text,t,e)}}(),mh=function(A,e){switch(e){case 1:return A.toLowerCase();case 3:return A.replace(wh,Ch);case 2:return A.toUpperCase();default:return A}},wh=/(^|\s|:|-|\(|\))([a-z])/g,Ch=function(A,e,t){return A.length>0?e+t.toUpperCase():A},Qh=function(A){function e(e,t){var n=A.call(this,e,t)||this;return n.src=t.currentSrc||t.src,n.intrinsicWidth=t.naturalWidth,n.intrinsicHeight=t.naturalHeight,n.context.cache.addImage(n.src),n}return rc(e,A),e}(Kg),yh=function(A){function e(e,t){var n=A.call(this,e,t)||this;return n.canvas=t,n.intrinsicWidth=t.width,n.intrinsicHeight=t.height,n}return rc(e,A),e}(Kg),Eh=function(A){function e(e,t){var n=A.call(this,e,t)||this,r=new XMLSerializer,o=lc(e,t);return t.setAttribute("width",o.width+"px"),t.setAttribute("height",o.height+"px"),n.svg="data:image/svg+xml,"+encodeURIComponent(r.serializeToString(t)),n.intrinsicWidth=t.width.baseVal.value,n.intrinsicHeight=t.height.baseVal.value,n.context.cache.addImage(n.svg),n}return rc(e,A),e}(Kg),vh=function(A){function e(e,t){var n=A.call(this,e,t)||this;return n.value=t.value,n}return rc(e,A),e}(Kg),Uh=function(A){function e(e,t){var n=A.call(this,e,t)||this;return n.start=t.start,n.reversed="boolean"==typeof t.reversed&&!0===t.reversed,n}return rc(e,A),e}(Kg),Fh=[{type:15,flags:0,unit:"px",number:3}],bh=[{type:16,flags:0,number:50}],Hh="checkbox",Ih="radio",Sh="password",Nh=707406591,xh=function(A){function e(e,t){var n,r,o,i=A.call(this,e,t)||this;switch(i.type=t.type.toLowerCase(),i.checked=t.checked,i.value=0===(r=(n=t).type===Sh?new Array(n.value.length+1).join("•"):n.value).length?n.placeholder||"":r,i.type!==Hh&&i.type!==Ih||(i.styles.backgroundColor=3739148031,i.styles.borderTopColor=i.styles.borderRightColor=i.styles.borderBottomColor=i.styles.borderLeftColor=2779096575,i.styles.borderTopWidth=i.styles.borderRightWidth=i.styles.borderBottomWidth=i.styles.borderLeftWidth=1,i.styles.borderTopStyle=i.styles.borderRightStyle=i.styles.borderBottomStyle=i.styles.borderLeftStyle=1,i.styles.backgroundClip=[0],i.styles.backgroundOrigin=[0],i.bounds=(o=i.bounds).width>o.height?new cc(o.left+(o.width-o.height)/2,o.top,o.height,o.height):o.width0)t.textNodes.push(new fh(A,r,t.styles));else if(Ph(r))if(rp(r)&&r.assignedNodes)r.assignedNodes().forEach((function(e){return _h(A,e,t,n)}));else{var i=Rh(A,r);i.styles.isVisible()&&(kh(r,i,n)?i.flags|=4:Mh(i.styles)&&(i.flags|=2),-1!==Lh.indexOf(r.tagName)&&(i.flags|=8),t.elements.push(i),r.slot,r.shadowRoot?_h(A,r.shadowRoot,i,n):tp(r)||Yh(r)||np(r)||_h(A,r,i,n))}},Rh=function(A,e){return qh(e)?new Qh(A,e):Zh(e)?new yh(A,e):Yh(e)?new Eh(A,e):Xh(e)?new vh(A,e):Jh(e)?new Uh(A,e):$h(e)?new xh(A,e):np(e)?new Dh(A,e):tp(e)?new Oh(A,e):Ap(e)?new Th(A,e):new Kg(A,e)},Kh=function(A,e){var t=Rh(A,e);return t.flags|=4,_h(A,e,t,t),t},kh=function(A,e,t){return e.styles.isPositionedWithZIndex()||e.styles.opacity<1||e.styles.isTransformed()||jh(A)&&t.styles.isTransparent()},Mh=function(A){return A.isPositioned()||A.isFloating()},Vh=function(A){return A.nodeType===Node.TEXT_NODE},Ph=function(A){return A.nodeType===Node.ELEMENT_NODE},Gh=function(A){return Ph(A)&&void 0!==A.style&&!Wh(A)},Wh=function(A){return"object"==typeof A.className},Xh=function(A){return"LI"===A.tagName},Jh=function(A){return"OL"===A.tagName},$h=function(A){return"INPUT"===A.tagName},Yh=function(A){return"svg"===A.tagName},jh=function(A){return"BODY"===A.tagName},Zh=function(A){return"CANVAS"===A.tagName},zh=function(A){return"VIDEO"===A.tagName},qh=function(A){return"IMG"===A.tagName},Ap=function(A){return"IFRAME"===A.tagName},ep=function(A){return"STYLE"===A.tagName},tp=function(A){return"TEXTAREA"===A.tagName},np=function(A){return"SELECT"===A.tagName},rp=function(A){return"SLOT"===A.tagName},op=function(A){return A.tagName.indexOf("-")>0},ip=function(){function A(){this.counters={}}return A.prototype.getCounterValue=function(A){var e=this.counters[A];return e&&e.length?e[e.length-1]:1},A.prototype.getCounterValues=function(A){var e=this.counters[A];return e||[]},A.prototype.pop=function(A){var e=this;A.forEach((function(A){return e.counters[A].pop()}))},A.prototype.parse=function(A){var e=this,t=A.counterIncrement,n=A.counterReset,r=!0;null!==t&&t.forEach((function(A){var t=e.counters[A.counter];t&&0!==A.increment&&(r=!1,t.length||t.push(1),t[Math.max(0,t.length-1)]+=A.increment)}));var o=[];return r&&n.forEach((function(A){var t=e.counters[A.counter];o.push(A.counter),t||(t=e.counters[A.counter]=[]),t.push(A.reset)})),o},A}(),sp={integers:[1e3,900,500,400,100,90,50,40,10,9,5,4,1],values:["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"]},ap={integers:[9e3,8e3,7e3,6e3,5e3,4e3,3e3,2e3,1e3,900,800,700,600,500,400,300,200,100,90,80,70,60,50,40,30,20,10,9,8,7,6,5,4,3,2,1],values:["Ք","Փ","Ւ","Ց","Ր","Տ","Վ","Ս","Ռ","Ջ","Պ","Չ","Ո","Շ","Ն","Յ","Մ","Ճ","Ղ","Ձ","Հ","Կ","Ծ","Խ","Լ","Ի","Ժ","Թ","Ը","Է","Զ","Ե","Դ","Գ","Բ","Ա"]},cp={integers:[1e4,9e3,8e3,7e3,6e3,5e3,4e3,3e3,2e3,1e3,400,300,200,100,90,80,70,60,50,40,30,20,19,18,17,16,15,10,9,8,7,6,5,4,3,2,1],values:["י׳","ט׳","ח׳","ז׳","ו׳","ה׳","ד׳","ג׳","ב׳","א׳","ת","ש","ר","ק","צ","פ","ע","ס","נ","מ","ל","כ","יט","יח","יז","טז","טו","י","ט","ח","ז","ו","ה","ד","ג","ב","א"]},lp={integers:[1e4,9e3,8e3,7e3,6e3,5e3,4e3,3e3,2e3,1e3,900,800,700,600,500,400,300,200,100,90,80,70,60,50,40,30,20,10,9,8,7,6,5,4,3,2,1],values:["ჵ","ჰ","ჯ","ჴ","ხ","ჭ","წ","ძ","ც","ჩ","შ","ყ","ღ","ქ","ფ","ჳ","ტ","ს","რ","ჟ","პ","ო","ჲ","ნ","მ","ლ","კ","ი","თ","ჱ","ზ","ვ","ე","დ","გ","ბ","ა"]},up=function(A,e,t,n,r,o){return At?Cp(A,r,o.length>0):n.integers.reduce((function(e,t,r){for(;A>=t;)A-=t,e+=n.values[r];return e}),"")+o},dp=function(A,e,t,n){var r="";do{t||A--,r=n(A)+r,A/=e}while(A*e>=e);return r},gp=function(A,e,t,n,r){var o=t-e+1;return(A<0?"-":"")+(dp(Math.abs(A),o,n,(function(A){return dc(Math.floor(A%o)+e)}))+r)},hp=function(A,e,t){void 0===t&&(t=". ");var n=e.length;return dp(Math.abs(A),n,!1,(function(A){return e[Math.floor(A%n)]}))+t},pp=function(A,e,t,n,r,o){if(A<-9999||A>9999)return Cp(A,4,r.length>0);var i=Math.abs(A),s=r;if(0===i)return e[0]+s;for(var a=0;i>0&&a<=4;a++){var c=i%10;0===c&&Eg(o,1)&&""!==s?s=e[c]+s:c>1||1===c&&0===a||1===c&&1===a&&Eg(o,2)||1===c&&1===a&&Eg(o,4)&&A>100||1===c&&a>1&&Eg(o,8)?s=e[c]+(a>0?t[a-1]:"")+s:1===c&&a>0&&(s=t[a-1]+s),i=Math.floor(i/10)}return(A<0?n:"")+s},Bp="十百千萬",fp="拾佰仟萬",mp="マイナス",wp="마이너스",Cp=function(A,e,t){var n=t?". ":"",r=t?"、":"",o=t?", ":"",i=t?" ":"";switch(e){case 0:return"•"+i;case 1:return"◦"+i;case 2:return"◾"+i;case 5:var s=gp(A,48,57,!0,n);return s.length<4?"0"+s:s;case 4:return hp(A,"〇一二三四五六七八九",r);case 6:return up(A,1,3999,sp,3,n).toLowerCase();case 7:return up(A,1,3999,sp,3,n);case 8:return gp(A,945,969,!1,n);case 9:return gp(A,97,122,!1,n);case 10:return gp(A,65,90,!1,n);case 11:return gp(A,1632,1641,!0,n);case 12:case 49:return up(A,1,9999,ap,3,n);case 35:return up(A,1,9999,ap,3,n).toLowerCase();case 13:return gp(A,2534,2543,!0,n);case 14:case 30:return gp(A,6112,6121,!0,n);case 15:return hp(A,"子丑寅卯辰巳午未申酉戌亥",r);case 16:return hp(A,"甲乙丙丁戊己庚辛壬癸",r);case 17:case 48:return pp(A,"零一二三四五六七八九",Bp,"負",r,14);case 47:return pp(A,"零壹貳參肆伍陸柒捌玖",fp,"負",r,15);case 42:return pp(A,"零一二三四五六七八九",Bp,"负",r,14);case 41:return pp(A,"零壹贰叁肆伍陆柒捌玖",fp,"负",r,15);case 26:return pp(A,"〇一二三四五六七八九","十百千万",mp,r,0);case 25:return pp(A,"零壱弐参四伍六七八九","拾百千万",mp,r,7);case 31:return pp(A,"영일이삼사오육칠팔구","십백천만",wp,o,7);case 33:return pp(A,"零一二三四五六七八九","十百千萬",wp,o,0);case 32:return pp(A,"零壹貳參四五六七八九","拾百千",wp,o,7);case 18:return gp(A,2406,2415,!0,n);case 20:return up(A,1,19999,lp,3,n);case 21:return gp(A,2790,2799,!0,n);case 22:return gp(A,2662,2671,!0,n);case 22:return up(A,1,10999,cp,3,n);case 23:return hp(A,"あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをん");case 24:return hp(A,"いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす");case 27:return gp(A,3302,3311,!0,n);case 28:return hp(A,"アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲン",r);case 29:return hp(A,"イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス",r);case 34:return gp(A,3792,3801,!0,n);case 37:return gp(A,6160,6169,!0,n);case 38:return gp(A,4160,4169,!0,n);case 39:return gp(A,2918,2927,!0,n);case 40:return gp(A,1776,1785,!0,n);case 43:return gp(A,3046,3055,!0,n);case 44:return gp(A,3174,3183,!0,n);case 45:return gp(A,3664,3673,!0,n);case 46:return gp(A,3872,3881,!0,n);default:return gp(A,48,57,!0,n)}},Qp="data-html2canvas-ignore",yp=function(){function A(A,e,t){if(this.context=A,this.options=t,this.scrolledElements=[],this.referenceElement=e,this.counters=new ip,this.quoteDepth=0,!e.ownerDocument)throw new Error("Cloned element does not have an owner document");this.documentElement=this.cloneNode(e.ownerDocument.documentElement,!1)}return A.prototype.toIFrame=function(A,e){var t=this,n=Up(A,e);if(!n.contentWindow)return Promise.reject("Unable to find iframe window");var r=A.defaultView.pageXOffset,o=A.defaultView.pageYOffset,i=n.contentWindow,s=i.document,a=Hp(n).then((function(){return ic(t,0,void 0,(function(){var A,t;return sc(this,(function(r){switch(r.label){case 0:return this.scrolledElements.forEach(Dp),i&&(i.scrollTo(e.left,e.top),!/(iPad|iPhone|iPod)/g.test(navigator.userAgent)||i.scrollY===e.top&&i.scrollX===e.left||(this.context.logger.warn("Unable to restore scroll position for cloned document"),this.context.windowBounds=this.context.windowBounds.add(i.scrollX-e.left,i.scrollY-e.top,0,0))),A=this.options.onclone,void 0===(t=this.clonedReferenceElement)?[2,Promise.reject("Error finding the "+this.referenceElement.nodeName+" in the cloned document")]:s.fonts&&s.fonts.ready?[4,s.fonts.ready]:[3,2];case 1:r.sent(),r.label=2;case 2:return/(AppleWebKit)/g.test(navigator.userAgent)?[4,bp(s)]:[3,4];case 3:r.sent(),r.label=4;case 4:return"function"==typeof A?[2,Promise.resolve().then((function(){return A(s,t)})).then((function(){return n}))]:[2,n]}}))}))}));return s.open(),s.write(Np(document.doctype)+""),xp(this.referenceElement.ownerDocument,r,o),s.replaceChild(s.adoptNode(this.documentElement),s.documentElement),s.close(),a},A.prototype.createElementClone=function(A){if(Rg(A,2),Zh(A))return this.createCanvasClone(A);if(zh(A))return this.createVideoClone(A);if(ep(A))return this.createStyleClone(A);var e=A.cloneNode(!1);return qh(e)&&(qh(A)&&A.currentSrc&&A.currentSrc!==A.src&&(e.src=A.currentSrc,e.srcset=""),"lazy"===e.loading&&(e.loading="eager")),op(e)?this.createCustomElementClone(e):e},A.prototype.createCustomElementClone=function(A){var e=document.createElement("html2canvascustomelement");return Sp(A.style,e),e},A.prototype.createStyleClone=function(A){try{var e=A.sheet;if(e&&e.cssRules){var t=[].slice.call(e.cssRules,0).reduce((function(A,e){return e&&"string"==typeof e.cssText?A+e.cssText:A}),""),n=A.cloneNode(!1);return n.textContent=t,n}}catch(Em){if(this.context.logger.error("Unable to access cssRules property",Em),"SecurityError"!==Em.name)throw Em}return A.cloneNode(!1)},A.prototype.createCanvasClone=function(A){var e;if(this.options.inlineImages&&A.ownerDocument){var t=A.ownerDocument.createElement("img");try{return t.src=A.toDataURL(),t}catch(Em){this.context.logger.info("Unable to inline canvas contents, canvas is tainted",A)}}var n=A.cloneNode(!1);try{n.width=A.width,n.height=A.height;var r=A.getContext("2d"),o=n.getContext("2d");if(o)if(!this.options.allowTaint&&r)o.putImageData(r.getImageData(0,0,A.width,A.height),0,0);else{var i=null!==(e=A.getContext("webgl2"))&&void 0!==e?e:A.getContext("webgl");if(i){var s=i.getContextAttributes();!1===(null==s?void 0:s.preserveDrawingBuffer)&&this.context.logger.warn("Unable to clone WebGL context as it has preserveDrawingBuffer=false",A)}o.drawImage(A,0,0)}return n}catch(Em){this.context.logger.info("Unable to clone canvas as it is tainted",A)}return n},A.prototype.createVideoClone=function(A){var e=A.ownerDocument.createElement("canvas");e.width=A.offsetWidth,e.height=A.offsetHeight;var t=e.getContext("2d");try{return t&&(t.drawImage(A,0,0,e.width,e.height),this.options.allowTaint||t.getImageData(0,0,e.width,e.height)),e}catch(Em){this.context.logger.info("Unable to clone video as it is tainted",A)}var n=A.ownerDocument.createElement("canvas");return n.width=A.offsetWidth,n.height=A.offsetHeight,n},A.prototype.appendChildNode=function(A,e,t){Ph(e)&&("SCRIPT"===e.tagName||e.hasAttribute(Qp)||"function"==typeof this.options.ignoreElements&&this.options.ignoreElements(e))||this.options.copyStyles&&Ph(e)&&ep(e)||A.appendChild(this.cloneNode(e,t))},A.prototype.cloneChildNodes=function(A,e,t){for(var n=this,r=A.shadowRoot?A.shadowRoot.firstChild:A.firstChild;r;r=r.nextSibling)if(Ph(r)&&rp(r)&&"function"==typeof r.assignedNodes){var o=r.assignedNodes();o.length&&o.forEach((function(A){return n.appendChildNode(e,A,t)}))}else this.appendChildNode(e,r,t)},A.prototype.cloneNode=function(A,e){if(Vh(A))return document.createTextNode(A.data);if(!A.ownerDocument)return A.cloneNode(!1);var t=A.ownerDocument.defaultView;if(t&&Ph(A)&&(Gh(A)||Wh(A))){var n=this.createElementClone(A);n.style.transitionProperty="none";var r=t.getComputedStyle(A),o=t.getComputedStyle(A,":before"),i=t.getComputedStyle(A,":after");this.referenceElement===A&&Gh(n)&&(this.clonedReferenceElement=n),jh(n)&&_p(n);var s=this.counters.parse(new Lg(this.context,r)),a=this.resolvePseudoContent(A,n,o,$g.BEFORE);op(A)&&(e=!0),zh(A)||this.cloneChildNodes(A,n,e),a&&n.insertBefore(a,n.firstChild);var c=this.resolvePseudoContent(A,n,i,$g.AFTER);return c&&n.appendChild(c),this.counters.pop(s),(r&&(this.options.copyStyles||Wh(A))&&!Ap(A)||e)&&Sp(r,n),0===A.scrollTop&&0===A.scrollLeft||this.scrolledElements.push([n,A.scrollLeft,A.scrollTop]),(tp(A)||np(A))&&(tp(n)||np(n))&&(n.value=A.value),n}return A.cloneNode(!1)},A.prototype.resolvePseudoContent=function(A,e,t,n){var r=this;if(t){var o=t.content,i=e.ownerDocument;if(i&&o&&"none"!==o&&"-moz-alt-content"!==o&&"none"!==t.display){this.counters.parse(new Lg(this.context,t));var s=new Tg(this.context,t),a=i.createElement("html2canvaspseudoelement");Sp(t,a),s.content.forEach((function(e){if(0===e.type)a.appendChild(i.createTextNode(e.value));else if(22===e.type){var t=i.createElement("img");t.src=e.value,t.style.opacity="1",a.appendChild(t)}else if(18===e.type){if("attr"===e.name){var n=e.values.filter(tu);n.length&&a.appendChild(i.createTextNode(A.getAttribute(n[0].value)||""))}else if("counter"===e.name){var o=e.values.filter(iu),c=o[0],l=o[1];if(c&&tu(c)){var u=r.counters.getCounterValue(c.value),d=l&&tu(l)?Pd.parse(r.context,l.value):3;a.appendChild(i.createTextNode(Cp(u,d,!1)))}}else if("counters"===e.name){var g=e.values.filter(iu),h=(c=g[0],g[1]);l=g[2];if(c&&tu(c)){var p=r.counters.getCounterValues(c.value),B=l&&tu(l)?Pd.parse(r.context,l.value):3,f=h&&0===h.type?h.value:"",m=p.map((function(A){return Cp(A,B,!1)})).join(f);a.appendChild(i.createTextNode(m))}}}else if(20===e.type)switch(e.value){case"open-quote":a.appendChild(i.createTextNode(Ig(s.quotes,r.quoteDepth++,!0)));break;case"close-quote":a.appendChild(i.createTextNode(Ig(s.quotes,--r.quoteDepth,!1)));break;default:a.appendChild(i.createTextNode(e.value))}})),a.className=Op+" "+Tp;var c=n===$g.BEFORE?" "+Op:" "+Tp;return Wh(e)?e.className.baseValue+=c:e.className+=c,a}}},A.destroy=function(A){return!!A.parentNode&&(A.parentNode.removeChild(A),!0)},A}();(Yg=$g||($g={}))[Yg.BEFORE=0]="BEFORE",Yg[Yg.AFTER=1]="AFTER";var Ep,vp,Up=function(A,e){var t=A.createElement("iframe");return t.className="html2canvas-container",t.style.visibility="hidden",t.style.position="fixed",t.style.left="-10000px",t.style.top="0px",t.style.border="0",t.width=e.width.toString(),t.height=e.height.toString(),t.scrolling="no",t.setAttribute(Qp,"true"),A.body.appendChild(t),t},Fp=function(A){return new Promise((function(e){A.complete?e():A.src?(A.onload=e,A.onerror=e):e()}))},bp=function(A){return Promise.all([].slice.call(A.images,0).map(Fp))},Hp=function(A){return new Promise((function(e,t){var n=A.contentWindow;if(!n)return t("No window assigned for iframe");var r=n.document;n.onload=A.onload=function(){n.onload=A.onload=null;var t=setInterval((function(){r.body.childNodes.length>0&&"complete"===r.readyState&&(clearInterval(t),e(A))}),50)}}))},Ip=["all","d","content"],Sp=function(A,e){for(var t=A.length-1;t>=0;t--){var n=A.item(t);-1===Ip.indexOf(n)&&e.style.setProperty(n,A.getPropertyValue(n))}return e},Np=function(A){var e="";return A&&(e+=""),e},xp=function(A,e,t){A&&A.defaultView&&(e!==A.defaultView.pageXOffset||t!==A.defaultView.pageYOffset)&&A.defaultView.scrollTo(e,t)},Dp=function(A){var e=A[0],t=A[1],n=A[2];e.scrollLeft=t,e.scrollTop=n},Op="___html2canvas___pseudoelement_before",Tp="___html2canvas___pseudoelement_after",Lp='{\n content: "" !important;\n display: none !important;\n}',_p=function(A){Rp(A,"."+Op+":before"+Lp+"\n ."+Tp+":after"+Lp)},Rp=function(A,e){var t=A.ownerDocument;if(t){var n=t.createElement("style");n.textContent=e,A.appendChild(n)}},Kp=function(){function A(){}return A.getOrigin=function(e){var t=A._link;return t?(t.href=e,t.href=t.href,t.protocol+t.hostname+t.port):"about:blank"},A.isSameOrigin=function(e){return A.getOrigin(e)===A._origin},A.setContext=function(e){A._link=e.document.createElement("a"),A._origin=A.getOrigin(e.location.href)},A._origin="about:blank",A}(),kp=function(){function A(A,e){this.context=A,this._options=e,this._cache={}}return A.prototype.addImage=function(A){var e=Promise.resolve();return this.has(A)?e:Jp(A)||Gp(A)?((this._cache[A]=this.loadImage(A)).catch((function(){})),e):e},A.prototype.match=function(A){return this._cache[A]},A.prototype.loadImage=function(A){return ic(this,0,void 0,(function(){var e,t,n,r,o=this;return sc(this,(function(i){switch(i.label){case 0:return e=Kp.isSameOrigin(A),t=!Wp(A)&&!0===this._options.useCORS&&ch.SUPPORT_CORS_IMAGES&&!e,n=!Wp(A)&&!e&&!Jp(A)&&"string"==typeof this._options.proxy&&ch.SUPPORT_CORS_XHR&&!t,e||!1!==this._options.allowTaint||Wp(A)||Jp(A)||n||t?(r=A,n?[4,this.proxy(r)]:[3,2]):[2];case 1:r=i.sent(),i.label=2;case 2:return this.context.logger.debug("Added image "+A.substring(0,256)),[4,new Promise((function(A,e){var n=new Image;n.onload=function(){return A(n)},n.onerror=e,(Xp(r)||t)&&(n.crossOrigin="anonymous"),n.src=r,!0===n.complete&&setTimeout((function(){return A(n)}),500),o._options.imageTimeout>0&&setTimeout((function(){return e("Timed out ("+o._options.imageTimeout+"ms) loading image")}),o._options.imageTimeout)}))];case 3:return[2,i.sent()]}}))}))},A.prototype.has=function(A){return void 0!==this._cache[A]},A.prototype.keys=function(){return Promise.resolve(Object.keys(this._cache))},A.prototype.proxy=function(A){var e=this,t=this._options.proxy;if(!t)throw new Error("No proxy defined");var n=A.substring(0,256);return new Promise((function(r,o){var i=ch.SUPPORT_RESPONSE_TYPE?"blob":"text",s=new XMLHttpRequest;s.onload=function(){if(200===s.status)if("text"===i)r(s.response);else{var A=new FileReader;A.addEventListener("load",(function(){return r(A.result)}),!1),A.addEventListener("error",(function(A){return o(A)}),!1),A.readAsDataURL(s.response)}else o("Failed to proxy resource "+n+" with status code "+s.status)},s.onerror=o;var a=t.indexOf("?")>-1?"&":"?";if(s.open("GET",""+t+a+"url="+encodeURIComponent(A)+"&responseType="+i),"text"!==i&&s instanceof XMLHttpRequest&&(s.responseType=i),e._options.imageTimeout){var c=e._options.imageTimeout;s.timeout=c,s.ontimeout=function(){return o("Timed out ("+c+"ms) proxying "+n)}}s.send()}))},A}(),Mp=/^data:image\/svg\+xml/i,Vp=/^data:image\/.*;base64,/i,Pp=/^data:image\/.*/i,Gp=function(A){return ch.SUPPORT_SVG_DRAWING||!$p(A)},Wp=function(A){return Pp.test(A)},Xp=function(A){return Vp.test(A)},Jp=function(A){return"blob"===A.substr(0,4)},$p=function(A){return"svg"===A.substr(-3).toLowerCase()||Mp.test(A)},Yp=function(){function A(A,e){this.type=0,this.x=A,this.y=e}return A.prototype.add=function(e,t){return new A(this.x+e,this.y+t)},A}(),jp=function(A,e,t){return new Yp(A.x+(e.x-A.x)*t,A.y+(e.y-A.y)*t)},Zp=function(){function A(A,e,t,n){this.type=1,this.start=A,this.startControl=e,this.endControl=t,this.end=n}return A.prototype.subdivide=function(e,t){var n=jp(this.start,this.startControl,e),r=jp(this.startControl,this.endControl,e),o=jp(this.endControl,this.end,e),i=jp(n,r,e),s=jp(r,o,e),a=jp(i,s,e);return t?new A(this.start,n,i,a):new A(a,s,o,this.end)},A.prototype.add=function(e,t){return new A(this.start.add(e,t),this.startControl.add(e,t),this.endControl.add(e,t),this.end.add(e,t))},A.prototype.reverse=function(){return new A(this.end,this.endControl,this.startControl,this.start)},A}(),zp=function(A){return 1===A.type},qp=function(){return function(A){var e=A.styles,t=A.bounds,n=pu(e.borderTopLeftRadius,t.width,t.height),r=n[0],o=n[1],i=pu(e.borderTopRightRadius,t.width,t.height),s=i[0],a=i[1],c=pu(e.borderBottomRightRadius,t.width,t.height),l=c[0],u=c[1],d=pu(e.borderBottomLeftRadius,t.width,t.height),g=d[0],h=d[1],p=[];p.push((r+s)/t.width),p.push((g+l)/t.width),p.push((o+h)/t.height),p.push((a+u)/t.height);var B=Math.max.apply(Math,p);B>1&&(r/=B,o/=B,s/=B,a/=B,l/=B,u/=B,g/=B,h/=B);var f=t.width-s,m=t.height-u,w=t.width-l,C=t.height-h,Q=e.borderTopWidth,y=e.borderRightWidth,E=e.borderBottomWidth,v=e.borderLeftWidth,U=Bu(e.paddingTop,A.bounds.width),F=Bu(e.paddingRight,A.bounds.width),b=Bu(e.paddingBottom,A.bounds.width),H=Bu(e.paddingLeft,A.bounds.width);this.topLeftBorderDoubleOuterBox=r>0||o>0?AB(t.left+v/3,t.top+Q/3,r-v/3,o-Q/3,Ep.TOP_LEFT):new Yp(t.left+v/3,t.top+Q/3),this.topRightBorderDoubleOuterBox=r>0||o>0?AB(t.left+f,t.top+Q/3,s-y/3,a-Q/3,Ep.TOP_RIGHT):new Yp(t.left+t.width-y/3,t.top+Q/3),this.bottomRightBorderDoubleOuterBox=l>0||u>0?AB(t.left+w,t.top+m,l-y/3,u-E/3,Ep.BOTTOM_RIGHT):new Yp(t.left+t.width-y/3,t.top+t.height-E/3),this.bottomLeftBorderDoubleOuterBox=g>0||h>0?AB(t.left+v/3,t.top+C,g-v/3,h-E/3,Ep.BOTTOM_LEFT):new Yp(t.left+v/3,t.top+t.height-E/3),this.topLeftBorderDoubleInnerBox=r>0||o>0?AB(t.left+2*v/3,t.top+2*Q/3,r-2*v/3,o-2*Q/3,Ep.TOP_LEFT):new Yp(t.left+2*v/3,t.top+2*Q/3),this.topRightBorderDoubleInnerBox=r>0||o>0?AB(t.left+f,t.top+2*Q/3,s-2*y/3,a-2*Q/3,Ep.TOP_RIGHT):new Yp(t.left+t.width-2*y/3,t.top+2*Q/3),this.bottomRightBorderDoubleInnerBox=l>0||u>0?AB(t.left+w,t.top+m,l-2*y/3,u-2*E/3,Ep.BOTTOM_RIGHT):new Yp(t.left+t.width-2*y/3,t.top+t.height-2*E/3),this.bottomLeftBorderDoubleInnerBox=g>0||h>0?AB(t.left+2*v/3,t.top+C,g-2*v/3,h-2*E/3,Ep.BOTTOM_LEFT):new Yp(t.left+2*v/3,t.top+t.height-2*E/3),this.topLeftBorderStroke=r>0||o>0?AB(t.left+v/2,t.top+Q/2,r-v/2,o-Q/2,Ep.TOP_LEFT):new Yp(t.left+v/2,t.top+Q/2),this.topRightBorderStroke=r>0||o>0?AB(t.left+f,t.top+Q/2,s-y/2,a-Q/2,Ep.TOP_RIGHT):new Yp(t.left+t.width-y/2,t.top+Q/2),this.bottomRightBorderStroke=l>0||u>0?AB(t.left+w,t.top+m,l-y/2,u-E/2,Ep.BOTTOM_RIGHT):new Yp(t.left+t.width-y/2,t.top+t.height-E/2),this.bottomLeftBorderStroke=g>0||h>0?AB(t.left+v/2,t.top+C,g-v/2,h-E/2,Ep.BOTTOM_LEFT):new Yp(t.left+v/2,t.top+t.height-E/2),this.topLeftBorderBox=r>0||o>0?AB(t.left,t.top,r,o,Ep.TOP_LEFT):new Yp(t.left,t.top),this.topRightBorderBox=s>0||a>0?AB(t.left+f,t.top,s,a,Ep.TOP_RIGHT):new Yp(t.left+t.width,t.top),this.bottomRightBorderBox=l>0||u>0?AB(t.left+w,t.top+m,l,u,Ep.BOTTOM_RIGHT):new Yp(t.left+t.width,t.top+t.height),this.bottomLeftBorderBox=g>0||h>0?AB(t.left,t.top+C,g,h,Ep.BOTTOM_LEFT):new Yp(t.left,t.top+t.height),this.topLeftPaddingBox=r>0||o>0?AB(t.left+v,t.top+Q,Math.max(0,r-v),Math.max(0,o-Q),Ep.TOP_LEFT):new Yp(t.left+v,t.top+Q),this.topRightPaddingBox=s>0||a>0?AB(t.left+Math.min(f,t.width-y),t.top+Q,f>t.width+y?0:Math.max(0,s-y),Math.max(0,a-Q),Ep.TOP_RIGHT):new Yp(t.left+t.width-y,t.top+Q),this.bottomRightPaddingBox=l>0||u>0?AB(t.left+Math.min(w,t.width-v),t.top+Math.min(m,t.height-E),Math.max(0,l-y),Math.max(0,u-E),Ep.BOTTOM_RIGHT):new Yp(t.left+t.width-y,t.top+t.height-E),this.bottomLeftPaddingBox=g>0||h>0?AB(t.left+v,t.top+Math.min(C,t.height-E),Math.max(0,g-v),Math.max(0,h-E),Ep.BOTTOM_LEFT):new Yp(t.left+v,t.top+t.height-E),this.topLeftContentBox=r>0||o>0?AB(t.left+v+H,t.top+Q+U,Math.max(0,r-(v+H)),Math.max(0,o-(Q+U)),Ep.TOP_LEFT):new Yp(t.left+v+H,t.top+Q+U),this.topRightContentBox=s>0||a>0?AB(t.left+Math.min(f,t.width+v+H),t.top+Q+U,f>t.width+v+H?0:s-v+H,a-(Q+U),Ep.TOP_RIGHT):new Yp(t.left+t.width-(y+F),t.top+Q+U),this.bottomRightContentBox=l>0||u>0?AB(t.left+Math.min(w,t.width-(v+H)),t.top+Math.min(m,t.height+Q+U),Math.max(0,l-(y+F)),u-(E+b),Ep.BOTTOM_RIGHT):new Yp(t.left+t.width-(y+F),t.top+t.height-(E+b)),this.bottomLeftContentBox=g>0||h>0?AB(t.left+v+H,t.top+C,Math.max(0,g-(v+H)),h-(E+b),Ep.BOTTOM_LEFT):new Yp(t.left+v+H,t.top+t.height-(E+b))}}();(vp=Ep||(Ep={}))[vp.TOP_LEFT=0]="TOP_LEFT",vp[vp.TOP_RIGHT=1]="TOP_RIGHT",vp[vp.BOTTOM_RIGHT=2]="BOTTOM_RIGHT",vp[vp.BOTTOM_LEFT=3]="BOTTOM_LEFT";var AB=function(A,e,t,n,r){var o=(Math.sqrt(2)-1)/3*4,i=t*o,s=n*o,a=A+t,c=e+n;switch(r){case Ep.TOP_LEFT:return new Zp(new Yp(A,c),new Yp(A,c-s),new Yp(a-i,e),new Yp(a,e));case Ep.TOP_RIGHT:return new Zp(new Yp(A,e),new Yp(A+i,e),new Yp(a,c-s),new Yp(a,c));case Ep.BOTTOM_RIGHT:return new Zp(new Yp(a,e),new Yp(a,e+s),new Yp(A+i,c),new Yp(A,c));case Ep.BOTTOM_LEFT:default:return new Zp(new Yp(a,c),new Yp(a-i,c),new Yp(A,e+s),new Yp(A,e))}},eB=function(A){return[A.topLeftBorderBox,A.topRightBorderBox,A.bottomRightBorderBox,A.bottomLeftBorderBox]},tB=function(A){return[A.topLeftPaddingBox,A.topRightPaddingBox,A.bottomRightPaddingBox,A.bottomLeftPaddingBox]},nB=function(){return function(A,e,t){this.offsetX=A,this.offsetY=e,this.matrix=t,this.type=0,this.target=6}}(),rB=function(){return function(A,e){this.path=A,this.target=e,this.type=1}}(),oB=function(){return function(A){this.opacity=A,this.type=2,this.target=6}}(),iB=function(A){return 1===A.type},sB=function(A,e){return A.length===e.length&&A.some((function(A,t){return A===e[t]}))},aB=function(){return function(A){this.element=A,this.inlineLevel=[],this.nonInlineLevel=[],this.negativeZIndex=[],this.zeroOrAutoZIndexOrTransformedOrOpacity=[],this.positiveZIndex=[],this.nonPositionedFloats=[],this.nonPositionedInlineLevel=[]}}(),cB=function(){function A(A,e){if(this.container=A,this.parent=e,this.effects=[],this.curves=new qp(this.container),this.container.styles.opacity<1&&this.effects.push(new oB(this.container.styles.opacity)),null!==this.container.styles.transform){var t=this.container.bounds.left+this.container.styles.transformOrigin[0].number,n=this.container.bounds.top+this.container.styles.transformOrigin[1].number,r=this.container.styles.transform;this.effects.push(new nB(t,n,r))}if(0!==this.container.styles.overflowX){var o=eB(this.curves),i=tB(this.curves);sB(o,i)?this.effects.push(new rB(o,6)):(this.effects.push(new rB(o,2)),this.effects.push(new rB(i,4)))}}return A.prototype.getEffects=function(A){for(var e=-1===[2,3].indexOf(this.container.styles.position),t=this.parent,n=this.effects.slice(0);t;){var r=t.effects.filter((function(A){return!iB(A)}));if(e||0!==t.container.styles.position||!t.parent){if(n.unshift.apply(n,r),e=-1===[2,3].indexOf(t.container.styles.position),0!==t.container.styles.overflowX){var o=eB(t.curves),i=tB(t.curves);sB(o,i)||n.unshift(new rB(i,6))}}else n.unshift.apply(n,r);t=t.parent}return n.filter((function(e){return Eg(e.target,A)}))},A}(),lB=function(A,e,t,n){A.container.elements.forEach((function(r){var o=Eg(r.flags,4),i=Eg(r.flags,2),s=new cB(r,A);Eg(r.styles.display,2048)&&n.push(s);var a=Eg(r.flags,8)?[]:n;if(o||i){var c=o||r.styles.isPositioned()?t:e,l=new aB(s);if(r.styles.isPositioned()||r.styles.opacity<1||r.styles.isTransformed()){var u=r.styles.zIndex.order;if(u<0){var d=0;c.negativeZIndex.some((function(A,e){return u>A.element.container.styles.zIndex.order?(d=e,!1):d>0})),c.negativeZIndex.splice(d,0,l)}else if(u>0){var g=0;c.positiveZIndex.some((function(A,e){return u>=A.element.container.styles.zIndex.order?(g=e+1,!1):g>0})),c.positiveZIndex.splice(g,0,l)}else c.zeroOrAutoZIndexOrTransformedOrOpacity.push(l)}else r.styles.isFloating()?c.nonPositionedFloats.push(l):c.nonPositionedInlineLevel.push(l);lB(s,l,o?l:t,a)}else r.styles.isInlineLevel()?e.inlineLevel.push(s):e.nonInlineLevel.push(s),lB(s,e,t,a);Eg(r.flags,8)&&uB(r,a)}))},uB=function(A,e){for(var t=A instanceof Uh?A.start:1,n=A instanceof Uh&&A.reversed,r=0;r0&&A.intrinsicHeight>0){var n=BB(A),r=tB(e);this.path(r),this.ctx.save(),this.ctx.clip(),this.ctx.drawImage(t,0,0,A.intrinsicWidth,A.intrinsicHeight,n.left,n.top,n.width,n.height),this.ctx.restore()}},e.prototype.renderNodeContent=function(A){return ic(this,0,void 0,(function(){var t,n,r,o,i,s,a,c,l,u,d,g,h,p,B,f,m,w;return sc(this,(function(C){switch(C.label){case 0:this.applyEffects(A.getEffects(4)),t=A.container,n=A.curves,r=t.styles,o=0,i=t.textNodes,C.label=1;case 1:return o0&&E>0&&(f=n.ctx.createPattern(h,"repeat"),n.renderRepeat(w,f,U,F))):function(A){return 2===A.type}(t)&&(m=fB(A,e,[null,null,null]),w=m[0],C=m[1],Q=m[2],y=m[3],E=m[4],v=0===t.position.length?[gu]:t.position,U=Bu(v[0],y),F=Bu(v[v.length-1],E),b=function(A,e,t,n,r){var o=0,i=0;switch(A.size){case 0:0===A.shape?o=i=Math.min(Math.abs(e),Math.abs(e-n),Math.abs(t),Math.abs(t-r)):1===A.shape&&(o=Math.min(Math.abs(e),Math.abs(e-n)),i=Math.min(Math.abs(t),Math.abs(t-r)));break;case 2:if(0===A.shape)o=i=Math.min(Ku(e,t),Ku(e,t-r),Ku(e-n,t),Ku(e-n,t-r));else if(1===A.shape){var s=Math.min(Math.abs(t),Math.abs(t-r))/Math.min(Math.abs(e),Math.abs(e-n)),a=ku(n,r,e,t,!0),c=a[0],l=a[1];i=s*(o=Ku(c-e,(l-t)/s))}break;case 1:0===A.shape?o=i=Math.max(Math.abs(e),Math.abs(e-n),Math.abs(t),Math.abs(t-r)):1===A.shape&&(o=Math.max(Math.abs(e),Math.abs(e-n)),i=Math.max(Math.abs(t),Math.abs(t-r)));break;case 3:if(0===A.shape)o=i=Math.max(Ku(e,t),Ku(e,t-r),Ku(e-n,t),Ku(e-n,t-r));else if(1===A.shape){s=Math.max(Math.abs(t),Math.abs(t-r))/Math.max(Math.abs(e),Math.abs(e-n));var u=ku(n,r,e,t,!1);c=u[0],l=u[1],i=s*(o=Ku(c-e,(l-t)/s))}}return Array.isArray(A.size)&&(o=Bu(A.size[0],n),i=2===A.size.length?Bu(A.size[1],r):o),[o,i]}(t,U,F,y,E),H=b[0],I=b[1],H>0&&I>0&&(S=n.ctx.createRadialGradient(C+U,Q+F,0,C+U,Q+F,H),_u(t.stops,2*H).forEach((function(A){return S.addColorStop(A.stop,Uu(A.color))})),n.path(w),n.ctx.fillStyle=S,H!==I?(N=A.bounds.left+.5*A.bounds.width,x=A.bounds.top+.5*A.bounds.height,O=1/(D=I/H),n.ctx.save(),n.ctx.translate(N,x),n.ctx.transform(1,0,0,D,0,0),n.ctx.translate(-N,-x),n.ctx.fillRect(C,O*(Q-x)+x,y,E*O),n.ctx.restore()):n.ctx.fill())),T.label=6;case 6:return e--,[2]}}))},n=this,r=0,o=A.styles.backgroundImage.slice(0).reverse(),s.label=1;case 1:return r0?2!==a.style?[3,5]:[4,this.renderDashedDottedBorder(a.color,a.width,o,A.curves,2)]:[3,11]:[3,13];case 4:return l.sent(),[3,11];case 5:return 3!==a.style?[3,7]:[4,this.renderDashedDottedBorder(a.color,a.width,o,A.curves,3)];case 6:return l.sent(),[3,11];case 7:return 4!==a.style?[3,9]:[4,this.renderDoubleBorder(a.color,a.width,o,A.curves)];case 8:return l.sent(),[3,11];case 9:return[4,this.renderSolidBorder(a.color,o,A.curves)];case 10:l.sent(),l.label=11;case 11:o++,l.label=12;case 12:return i++,[3,3];case 13:return[2]}}))}))},e.prototype.renderDashedDottedBorder=function(A,e,t,n,r){return ic(this,0,void 0,(function(){var o,i,s,a,c,l,u,d,g,h,p,B,f,m,w,C;return sc(this,(function(Q){return this.ctx.save(),o=function(A,e){switch(e){case 0:return gB(A.topLeftBorderStroke,A.topRightBorderStroke);case 1:return gB(A.topRightBorderStroke,A.bottomRightBorderStroke);case 2:return gB(A.bottomRightBorderStroke,A.bottomLeftBorderStroke);default:return gB(A.bottomLeftBorderStroke,A.topLeftBorderStroke)}}(n,t),i=dB(n,t),2===r&&(this.path(i),this.ctx.clip()),zp(i[0])?(s=i[0].start.x,a=i[0].start.y):(s=i[0].x,a=i[0].y),zp(i[1])?(c=i[1].end.x,l=i[1].end.y):(c=i[1].x,l=i[1].y),u=0===t||2===t?Math.abs(s-c):Math.abs(a-l),this.ctx.beginPath(),3===r?this.formatPath(o):this.formatPath(i.slice(0,2)),d=e<3?3*e:2*e,g=e<3?2*e:e,3===r&&(d=e,g=e),h=!0,u<=2*d?h=!1:u<=2*d+g?(d*=p=u/(2*d+g),g*=p):(B=Math.floor((u+g)/(d+g)),f=(u-B*d)/(B-1),g=(m=(u-(B+1)*d)/B)<=0||Math.abs(g-f)"image"===A.tagName,...e},i=await LB(t,o);i.classList.add(pa);const s=i.toDataURL(zs,Zs);return i.remove(),s}catch(n){return console.error("Screenshot failed:",n),null}}async function e(){const e=document.querySelector(`.${Ba}`);return e?A(e):null}return{screenshotSelectionArea:async function(t,n){const r=await e();if(r)return r;const o={x:n.x-250+window.scrollX,y:n.y-75+window.scrollY,width:500,height:150};return A(document.body,o)},screenshotTargetElement:e}}class kB{constructor(A){this.selectionType=A,this.screenshot=function(){const{screenshotSelectionArea:A,screenshotTargetElement:e}=KB();return{captureSelectionScreenshot:async(t,n={},r)=>{try{const t=await e();if(t)return t;const n={x:(null==r?void 0:r.clientX)||0,y:(null==r?void 0:r.clientY)||0};return await A(n,n)}catch(o){return console.error("Failed to capture selection screenshot:",o),null}}}}(),this.errorHandler=Ya}async processSelection(A,e,t={}){throw new Error(`processSelection must be implemented by ${this.constructor.name}`)}validateTarget(A){return null!=A}async preProcess(A,e,t){return!!va()&&(!!this.validateTarget(A)||(this.errorHandler.handleSelectionError(this.selectionType,new Error("Invalid selection target"),{target:A,event:e}),!1))}async postProcess(A,e,t,n){if(!A)return null;if(A.type=this.selectionType,A.timestamp=Date.now(),A.index=A.index??-1,n.captureScreenshot&&!A.image){document.body.classList.add("smartcomments-creating-screenshot");try{const n=(null==e?void 0:e.getBoundingClientRect)?e:null;A.image=await this.screenshot.captureSelectionScreenshot(n,null,t)}catch(r){this.errorHandler.handleScreenshotError(this.selectionType,r,A)}document.body.classList.remove("smartcomments-creating-screenshot")}if(!this.validateSelectionData(A))throw this.errorHandler.createContextualError("Selection data validation failed",this.selectionType,{selectionData:A,target:e});return A}validateSelectionData(A){return!(!A||"object"!=typeof A)&&(!(!A.text||0===A.text.length)&&(!(A.text.length>Ms)&&A.type===this.selectionType))}createBaseSelectionData(A,e=null,t=-1){return{text:this.sanitizeText(A),index:t,type:this.selectionType,element:e,timestamp:Date.now(),image:null}}sanitizeText(A){return Ca(A)}sanitizeHTML(A){return Ca(A)}getType(){return this.selectionType}getName(){return this.constructor.name}}class MB extends kB{constructor(){super("text"),this.rangyInitialized=!1,this.highlighter=null}validateTarget(A){return!!A&&(void 0!==A.rangeCount?A.rangeCount>0&&!A.isCollapsed:!(!A.toString||!A.toHtml))}async processSelection(A,e,t={}){if(!(await this.preProcess(A,e,t)))return null;try{if(!this.ensureRangyInitialized())throw new Error("Rangy library not available");const n=void 0!==A.rangeCount?A.getRangeAt(0):A,r=ya(n);if(!this.errorHandler.handleValidationError(r,this.selectionType))return null;const o=await this.extractTextAndIndex(n);return o.element=this.getSelectionElement(n),await this.postProcess(o,n,e,t)}catch(n){return this.errorHandler.handleSelectionError(this.selectionType,n,{target:A,event:e,options:t}),null}}prepareScreenshotParams(A,e,t){this.applyTemporaryHighlight(A);const n=A.getBoundingClientRect?A.getBoundingClientRect():this.getRangeRect(A);return{selectionPosition:{x:(null==e?void 0:e.clientX)||n.right,y:(null==e?void 0:e.clientY)||n.bottom},startPosition:{x:n.left,y:n.top},text:t.text,cleanupCallback:()=>this.clearTemporaryHighlight()}}async postProcess(A,e,t,n){let r=!1,o=null;try{n.captureScreenshot&&(o=this.applyTemporaryHighlight(e),r=!0,await new Promise((A=>setTimeout(A,50))),o&&(A.element=o));return await super.postProcess(A,e,t,n)}finally{r&&setTimeout((()=>{this.clearTemporaryHighlight()}),100)}}async extractTextAndIndex(A){return new Promise(((e,t)=>{try{const n=wa();if(!n)return void t(new Error("MediaWiki content root not found"));const r=rangy.serializeRange(A),o=A.toString(),i=this.sanitizeText(o),s=A.toHtml();if(i.length>Ms)return void t(new Error(`Selection too long: ${i.length} characters`));if(!o&&!s)return void t(new Error("Selection is empty"));Gs.HTML_TAG_REGEX.test(s)?this.searchHTMLContent(n,A,o,s,e,t,i):this.searchPlainText(n,A,o,r,e,t,i)}catch(n){t(n)}}))}searchPlainText(A,e,t,n,r,o,i){const s=rangy.createRange();s.selectNodeContents(A);const a={caseSensitive:!0,withinRange:s},c=rangy.createRange();c.selectNodeContents(A),c.findText(t,a)?this.findTextOccurrence(A,t,n,0,r,o,i||t):o(new Error(`Text "${t}" not found in content`))}searchHTMLContent(A,e,t,n,r,o,i){const s=document.createTreeWalker(A,NodeFilter.SHOW_TEXT,null,!1);let a,c=0,l=0;const u=t;for(;a=s.nextNode();){const A=a.textContent;for(let t=0;t{if(n>Ps)o(new Error("Search iteration limit exceeded"));else try{if(s.findText(e,c)){if(rangy.serializeRange(s)===t)return void r({text:i||e,index:n,type:"text"});s.collapse(!1),n++,requestAnimationFrame(l)}else o(new Error(`Text not found at position after ${n} occurrences`))}catch(A){o(A)}};l()}isTargetMatch(A,e){return A.parentNode.contains(e.endContainer)&&A.parentNode.contains(e.startContainer)}getSelectionElement(A){return A.startContainer.nodeType===Node.ELEMENT_NODE?A.startContainer:A.startContainer.parentElement||A.startContainer.parentNode}getRangeRect(A){try{return A.getBoundingClientRect()}catch(e){const t=this.getSelectionElement(A);return t?t.getBoundingClientRect():{left:0,top:0,right:0,bottom:0}}}applyTemporaryHighlight(A){try{const e=document.createElement("span");if(e.className=Ws,e.style.backgroundColor="#ffffe0",e.style.borderTop="1px solid rgba(0,0,0,0.2)",e.style.borderBottom="1px solid rgba(0,0,0,0.2)",A.canSurroundContents())return A.surroundContents(e),tc(e),e;{const t=A.extractContents();return e.appendChild(t),A.insertNode(e),tc(e),e}}catch(e){return console.warn("Failed to apply temporary highlight:",e),null}}clearTemporaryHighlight(){try{document.querySelectorAll(`.${Ws}`).forEach((A=>{!function(A){Ac(A,ma.TEMP_HIGHLIGHT_CLASSES[1],!1)}(A);const e=A.parentNode;e&&(e.replaceChild(document.createTextNode(A.textContent),A),e.normalize())}))}catch(A){console.warn("Failed to clear temporary highlight:",A)}}ensureRangyInitialized(){return this.rangyInitialized||(this.rangyInitialized=function(){if(window.rangy&&window.rangy.initialized)return!0;if(void 0===window.rangy)return console.error("Rangy library not found. Text selection may not work properly."),!1;try{return!window.rangy.initialized&&window.rangy.init&&window.rangy.init(),!0}catch(A){return console.error("Failed to initialize Rangy:",A),!1}}()),this.rangyInitialized}}class VB extends kB{constructor(){super("image"),this.setupCompleted=!1}validateTarget(A){if(!A||A.nodeType!==Node.ELEMENT_NODE)return!1;if("IMG"===A.tagName)return this.isValidImageElement(A);const e=A.querySelector("img");return e&&this.isValidImageElement(e)}isValidImageElement(A){if(!A.src)return!1;if(A.closest(`.${Ys}`)||A.closest(`.${js}`))return!1;const e=A.closest(`.${Js}`);return!e||e===A.parentElement}async processSelection(A,e,t={}){if(!(await this.preProcess(A,e,t)))return null;try{const n="IMG"===A.tagName?A:A.querySelector("img");if(!n)throw new Error("No image element found in target");if(!this.isValidImageElement(n))throw new Error("Invalid image element for selection");const r=ya(n.outerHTML);if(r!==sa&&r!==la&&!this.errorHandler.handleValidationError(r,this.selectionType))return null;const o=this.createImageSelectionData(n);return await this.postProcess(o,n,e,t)}catch(n){return this.errorHandler.handleSelectionError(this.selectionType,n,{target:A,event:e,options:t}),null}}createImageSelectionData(A){const e=Fa(A.src,A.width,A.height),t=A.alt||"",n=A.title||"",r=this.extractFilename(A.src);let o=t||n||`Image: ${r}`;return e&&(o=t||`Image: ${e}`),this.createBaseSelectionData(o,A,-1,{imageHash:e,src:A.src,width:A.width,height:A.height,alt:t,title:n,filename:r})}createBaseSelectionData(A,e,t,n={}){return{...super.createBaseSelectionData(A,e,t),imageHash:n.imageHash,src:n.src,metadata:{width:n.width,height:n.height,alt:n.alt,title:n.title,filename:n.filename,aspectRatio:n.width&&n.height?(n.width/n.height).toFixed(2):null}}}extractFilename(A){try{const e=new URL(A).pathname;return e.split("/").pop()||"unknown"}catch(e){return"unknown"}}setupImageSelection(){if(!this.setupCompleted)try{const A=wa();if(!A)return void console.error("Cannot setup image selection: content root not found.");const e=A.querySelectorAll("img");let t=0;e.forEach((A=>{this.shouldWrapImage(A)&&(this.wrapImageInDynamicBlock(A),t++)})),this.setupCompleted=!0}catch(A){console.error("Error during image selection setup:",A)}}shouldWrapImage(A){return(!A.parentElement||!A.parentElement.classList.contains(Js))&&(!A.closest(`.${Ys}`)&&!A.closest(`.${js}`)&&!!A.src)}wrapImageInDynamicBlock(A){try{const e=Fa(A.src,A.width,A.height),t=document.createElement("div");t.className=Js+" "+$s,t.dataset.hash=`${Gs.IMAGE_POSITION_PREFIX}${e}]`,t.dataset.type="image",A.alt&&t.setAttribute("aria-label",`Image: ${A.alt}`),A.parentNode?(A.parentNode.insertBefore(t,A),t.appendChild(A)):console.warn("Image has no parentNode, cannot wrap:",A)}catch(e){console.error("Error wrapping image:",e,A)}}prepareScreenshotParams(A,e,t){return{element:A,selectionPosition:this.screenshot.calculatePositionData(A,e).selectionPosition,startPosition:this.screenshot.calculatePositionData(A,e).startPosition}}resetSetup(){this.setupCompleted=!1}isSetupCompleted(){return this.setupCompleted}}class PB extends kB{constructor(){super("svg")}validateTarget(A){if(!A||A.nodeType!==Node.ELEMENT_NODE)return!1;return null!==this.findSVGLink(A)}async processSelection(A,e,t={}){if(!(await this.preProcess(A,e,t)))return null;try{const n=this.findSVGLink(A);if(!n)throw new Error("SVG element is not within a clickable link");const r=this.generateSVGUniqueId(n);r||(console.warn("SVGSelectionStrategy: uniqueId is undefined/null for svgLink:",n),console.warn("SVGSelectionStrategy: svgLink attributes:",{href:n.getAttribute("href"),xlinkHref:n.getAttribute("xlink:href"),innerHTML:n.innerHTML,outerHTML:n.outerHTML}));const o=this.extractSVGTextContent(n),i=n.getAttribute("xlink:href")||n.getAttribute("href"),s=this.extractSVGMetadata(n),a=ya(o||i||r);if(a!==sa&&a!==la&&!this.errorHandler.handleValidationError(a,this.selectionType))return null;const c=this.createSVGSelectionData(r,o,i,s,n);return await this.postProcess(c,n,e,t)}catch(n){return this.errorHandler.handleSelectionError(this.selectionType,n,{target:A,event:e,options:t}),null}}createSVGSelectionData(A,e,t,n,r){const o=function(A,e,t){return Ua([A||"",e||"",(t||"").trim()].filter(Boolean).join("|"))}(A,t,e),i=`${Gs.SVG_POSITION_PREFIX}${A}]`.trim(),s=e||(t?`SVG Link: ${this.extractPathFromHref(t)}`:A);return{...this.createBaseSelectionData(i,r,-1),svgId:A,svgHash:o,href:t,position:i,textContent:s,metadata:this.enhanceMetadata(n,r)}}generateSVGUniqueId(A){const e=A.getAttribute("xlink:href")||A.getAttribute("href");if(e){return this.generateIdFromHref(e)}const t=this.extractSVGTextContent(A);if(t){return this.generateIdFromTextAndPosition(A,t)}return this.generateFallbackId(A)}generateIdFromHref(A){try{const e=new URL(A).pathname.split("/").filter(Boolean),t=e[e.length-1];if(t&&"index.php"!==t){return`svg-href-${Qa(t)}`}}catch(Em){return`svg-href-${Qa(A)}`}return`svg-href-${Qa(A)}`}generateIdFromTextAndPosition(A,e){const t=A.getBoundingClientRect(),n=`${Math.round(t.left)}-${Math.round(t.top)}`;return`svg-text-${Qa(e.toLowerCase())}-${n}`}generateFallbackId(A){const e={tagName:A.tagName,position:A.getBoundingClientRect(),childCount:A.children.length,timestamp:Date.now()};return`svg-fallback-${btoa(JSON.stringify(e)).replace(/[^a-zA-Z0-9]/g,"").substring(0,16)}`}extractPathFromHref(A){try{return new URL(A).pathname.split("/").pop()||A}catch(Em){return A}}extractSVGTextContent(A){const e=[],t=A.querySelector("title");t&&t.textContent.trim()&&e.push(t.textContent.trim());A.querySelectorAll("text, tspan").forEach((A=>{const t=A.textContent.trim();t&&!e.includes(t)&&e.push(t)}));const n=A.querySelector("desc");if(n&&n.textContent.trim()){const A=n.textContent.trim();e.includes(A)||e.push(A)}return e.join(" ")}extractSVGMetadata(A){const e={},t=A.getAttribute("xlink:href")||A.getAttribute("href");t&&(e.href=t);const n=A.querySelector("metadata rdf\\:description, metadata description");if(n){const A=n.getAttribute("rdf:about")||n.getAttribute("about");A&&(e.rdfAbout=A)}const r=A.querySelector("rect, circle, ellipse, polygon, path");r&&(e.visual=this.extractVisualProperties(r));const o=A.getAttribute("class");o&&(e.classes=o.split(" ").filter(Boolean));const i=A.closest("svg");return i&&(e.svg={viewBox:i.getAttribute("viewBox"),width:i.getAttribute("width"),height:i.getAttribute("height")}),e}extractVisualProperties(A){const e={};return["x","y","width","height","r","cx","cy","fill","stroke","stroke-width"].forEach((t=>{const n=A.getAttribute(t)||A.style[t];n&&(e[t]=n)})),e}enhanceMetadata(A,e){const t={...A};return t.computed={boundingBox:e.getBoundingClientRect(),childElementCount:e.children.length,hasText:this.extractSVGTextContent(e).length>0,hasVisualElements:null!==e.querySelector("rect, circle, ellipse, polygon, path")},t.accessibility={hasTitle:null!==e.querySelector("title"),hasDesc:null!==e.querySelector("desc"),ariaLabel:e.getAttribute("aria-label"),role:e.getAttribute("role")},t}findSVGLink(A){if("a"===A.tagName&&A.closest("svg"))return A;return A.closest("svg a")}}class GB extends kB{constructor(){super("dynamic-block")}validateTarget(A){return!(!A||A.nodeType!==Node.ELEMENT_NODE)&&(A.classList.contains(Js)||null!==A.closest(`.${Js}`))}async processSelection(A,e,t={}){if(!(await this.preProcess(A,e,t)))return null;try{const n=this.getDynamicBlockElement(A);if(!n)throw new Error("No dynamic block element found");if(this.isAlreadyCommented(n))throw new Error("Dynamic block already has comments");const r=this.createDynamicBlockSelectionData(n);return await this.postProcess(r,n,e,t)}catch(n){return this.errorHandler.handleSelectionError(this.selectionType,n,{target:A,event:e,options:t}),null}}getDynamicBlockElement(A){return A.classList.contains(Js)?A:A.closest(`.${Js}`)}isAlreadyCommented(A){return A.outerHTML.includes(Xs)}createDynamicBlockSelectionData(A){let e=this.determineSelectionText(A);const t=this.extractBlockMetadata(A);return{...this.createBaseSelectionData(e,A,-1),blockType:this.getBlockType(A),blockHash:A.dataset.hash||null,metadata:t}}determineSelectionText(A){if(A.classList.contains($s)&&A.dataset.hash)return A.dataset.hash;const e=A.outerHTML;if(e.length>500){const A=e.substring(0,500)+"...";return this.sanitizeHTML(A)}return this.sanitizeHTML(e)}sanitizeHTML(A){return A.replace(/)<[^<]*)*<\/script>/gi,"").replace(/javascript:/gi,"").replace(/on\w+\s*=/gi,"").trim()}getBlockType(A){return A.classList.contains($s)?"image":A.dataset.type?A.dataset.type:A.querySelector("img")?"image":A.querySelector("table")?"table":A.querySelector("video")?"video":A.querySelector("iframe")?"iframe":"generic"}extractBlockMetadata(A){const e={classes:Array.from(A.classList),datasets:{...A.dataset},dimensions:{width:A.offsetWidth,height:A.offsetHeight},position:A.getBoundingClientRect(),childCount:A.children.length};switch(this.getBlockType(A)){case"image":e.image=this.extractImageMetadata(A);break;case"table":e.table=this.extractTableMetadata(A);break;case"video":e.video=this.extractVideoMetadata(A);break;case"iframe":e.iframe=this.extractIframeMetadata(A)}return e}extractImageMetadata(A){const e=A.querySelector("img");return e?{src:e.src,alt:e.alt,title:e.title,width:e.width||e.naturalWidth,height:e.height||e.naturalHeight,aspectRatio:e.naturalWidth&&e.naturalHeight?(e.naturalWidth/e.naturalHeight).toFixed(2):null}:{}}extractTableMetadata(A){const e=A.querySelector("table");return e?{rows:e.rows.length,columns:e.rows[0]?e.rows[0].cells.length:0,hasHeader:null!==e.querySelector("thead, th"),hasCaption:null!==e.querySelector("caption")}:{}}extractVideoMetadata(A){const e=A.querySelector("video");return e?{src:e.src||(e.querySelector("source")?e.querySelector("source").src:""),duration:e.duration,width:e.videoWidth||e.width,height:e.videoHeight||e.height,controls:e.controls,autoplay:e.autoplay,loop:e.loop,muted:e.muted}:{}}extractIframeMetadata(A){const e=A.querySelector("iframe");return e?{src:e.src,width:e.width||e.offsetWidth,height:e.height||e.offsetHeight,title:e.title,sandbox:e.sandbox.toString(),loading:e.loading}:{}}prepareScreenshotParams(A,e,t){return{...this.screenshot.calculatePositionData(A,e),text:t.text,element:A}}getAllDynamicBlocks(){return document.querySelectorAll(`.${Js}`)}getBlockStatistics(){const A=this.getAllDynamicBlocks(),e={total:A.length,byType:{},commented:0,uncommented:0};return A.forEach((A=>{const t=this.getBlockType(A);e.byType[t]=(e.byType[t]||0)+1,this.isAlreadyCommented(A)?e.commented++:e.uncommented++})),e}}const WB=new class{constructor(){this.strategies=new Map,this.defaultStrategy=null,this.initialized=!1}initialize(){if(!this.initialized)try{this.registerStrategy("text",new MB),this.registerStrategy("image",new VB),this.registerStrategy("svg",new PB),this.registerStrategy("dynamic-block",new GB),this.defaultStrategy=this.strategies.get("text"),this.initialized=!0}catch(A){console.error("Failed to initialize Selection Strategy Factory:",A),this.initialized=!1}}registerStrategy(A,e){if(!A||!e)throw new Error("Both type and strategy are required for registration");this.strategies.has(A)&&console.warn(`Strategy type '${A}' already registered, overwriting`),this.strategies.set(A,e)}getStrategy(A){return this.ensureInitialized(),this.strategies.get(A)||null}determineStrategy(A,e){return this.ensureInitialized(),this.isTextSelection(A)?this.getStrategy("text"):A&&A.nodeType===Node.ELEMENT_NODE?this.determineElementStrategy(A):(console.warn("Could not determine appropriate strategy for target:",A),this.defaultStrategy)}determineElementStrategy(A){const e=this.getStrategy("svg");if(e&&e.validateTarget(A))return e;const t=this.getStrategy("dynamic-block");if(t&&t.validateTarget(A))return t;const n=this.getStrategy("image");return n&&n.validateTarget(A)?n:this.getStrategy("text")}isTextSelection(A){return A&&"object"==typeof A&&void 0!==A.rangeCount?A.rangeCount>0&&!A.isCollapsed:!(!A||"object"!=typeof A||"function"!=typeof A.toString||"function"!=typeof A.toHtml)}async processSelection(A,e,t={}){var n;if(this.ensureInitialized(),null==(n=null==e?void 0:e.target)?void 0:n.closest(`[class*="${ga}"]`))return null;const r=this.determineStrategy(A,e);if(!r)return console.error("No strategy available for target:",A),null;try{const n=await r.processSelection(A,e,t);return n&&(n._strategy={type:r.getType(),name:r.getName()}),n}catch(o){return console.error(`Strategy ${r.getName()} failed:`,o),null}}getRegisteredTypes(){return this.ensureInitialized(),Array.from(this.strategies.keys())}getStatistics(){return{initialized:this.initialized,strategyCount:this.strategies.size,registeredTypes:this.getRegisteredTypes(),defaultStrategy:this.defaultStrategy?this.defaultStrategy.getName():null}}reset(){this.strategies.clear(),this.defaultStrategy=null,this.initialized=!1}ensureInitialized(){this.initialized||this.initialize()}setupStrategies(){this.ensureInitialized();const A=this.getStrategy("image");A&&"function"==typeof A.setupImageSelection&&A.setupImageSelection()}validateStrategy(A){if(!A||"object"!=typeof A)return!1;return["processSelection","validateTarget","getType","getName"].every((e=>"function"==typeof A[e]))}getStrategyByElement(A){this.ensureInitialized();for(const[e,t]of this.strategies)if(t.validateTarget(A))return t;return this.defaultStrategy}};function XB(){const A=Se(!1),e=Se(null),t=Se(null),n=fe({x:0,y:0}),r=fe({x:0,y:0}),o=Se(!1);async function i(r,i,a={}){if(o.value)return console.warn("Selection processing already in progress"),null;o.value=!0;try{const o=await WB.processSelection(r,i,a);return o?(e.value=o,function(A,e){if("text"===A.type&&window.rangy&&rangy.getSelection){const A=rangy.getSelection();A.rangeCount&&(t.value=A.getRangeAt(0).cloneRange())}else t.value=null;if(e)n.x=e.clientX||e.pageX||0,n.y=e.clientY||e.pageY||0;else if(A.element){const e=A.element.getBoundingClientRect();n.x=e.left+e.width/2,n.y=e.top+e.height/2}}(o,i),A.value=!0,o):(s(),null)}finally{o.value=!1}}function s(){if(e.value=null,t.value=null,A.value=!1,o.value=!1,window.getSelection)try{window.getSelection().removeAllRanges()}catch(n){console.warn("Failed to clear browser selection:",n)}if(window.rangy&&rangy.getSelection)try{rangy.getSelection().removeAllRanges()}catch(n){console.warn("Failed to clear rangy selection:",n)}}return WB.initialize(),{isSelectionActive:A,currentSelection:e,lastRange:t,selectionPosition:n,startPosition:r,isCapturing:o,processSelection:i,processTextSelection:async function(A,e={}){if(await new Promise((A=>setTimeout(A,ks))),!window.rangy||!rangy.getSelection)return console.error("Rangy library not available for text selection"),null;const t=rangy.getSelection();if(!t.rangeCount||t.isCollapsed)return null;const n=t.getRangeAt(0);return await i(n,A,e)},processDynamicBlockSelection:async function(A,e,t={}){return await i(A,e,t)},processImageSelection:async function(A,e,t={}){return await i(A,e,t)},processSVGSelection:async function(A,e,t={}){return await i(A,e,t)},clearSelection:s,formatSelectionForAPI:function(A){if(!A)return null;wa();let e=null;if(A.element){const t=A.element.closest("[data-comment-id]");t&&(e=t.dataset.commentId)}const n={text:A.text||"",index:A.index??-1,type:A.type||"text",image:A.image||null,parentId:e,src:A.src||null,imageHash:A.imageHash||null,svgId:A.svgId||null,svgHash:A.svgHash||null,href:A.href||null};switch(A.type){case"dynamic-block":A.element&&(n.elementData={hash:A.element.dataset.hash,type:A.element.dataset.type,blockType:A.blockType});break;case"image":A.metadata&&(n.elementData={src:A.src,width:A.metadata.width,height:A.metadata.height,alt:A.metadata.alt,aspectRatio:A.metadata.aspectRatio});break;case"svg":n.elementData={svgId:A.svgId,href:A.href,textContent:A.textContent,metadata:A.metadata};break;case"text":t.value&&(n.elementData={hasRange:!0,rangeInfo:"Available"})}return n},setupSelection:function(){try{WB.setupStrategies()}catch(A){console.error("Failed to setup selection system:",A)}},setupImageSelection:function(){const A=WB.getStrategy("image");if(A&&"function"==typeof A.setupImageSelection)return A.setupImageSelection();console.warn("Image strategy not available for setup")},findSVGLink:function(A){const e=WB.getStrategy("svg");return e&&"function"==typeof e.findSVGLink?e.findSVGLink(A):null},getSelectionStats:function(){var t;return{factory:WB.getStatistics(),currentState:{isActive:A.value,isCapturing:o.value,hasSelection:null!==e.value,selectionType:(null==(t=e.value)?void 0:t.type)||null},position:{selection:{...n},start:{...r}}}},canSelectElement:function(A){const e=WB.getStrategyByElement(A);return!!e&&e.validateTarget(A)},getElementSelectionType:function(A){const e=WB.getStrategyByElement(A);return e?e.getType():null},getMediaWikiContentRoot:wa}}const JB=Object.freeze(Object.defineProperty({__proto__:null,useSelection:XB},Symbol.toStringTag,{value:"Module"}));function $B(){let A=!1;const e=new Set;function t(A){if(!va())return;const t=A.target.closest(`.${Js}`);t&&(t.parentElement&&Array.from(t.parentElement.classList).some((A=>A.startsWith("smartcomment-hl-")))||(t.classList.add("hover"),e.add(t)))}function n(A){if(!va())return;const t=A.target.closest(`.${Js}`);t&&(t.classList.remove("hover"),e.delete(t))}function r(A){if(!va())return;const t=A.target;let n=null;n="a"===t.tagName&&t.closest("svg")?t:t.closest("svg a"),n&&(n.classList.contains("smartcomment-hl-")||Array.from(n.classList).some((A=>A.startsWith("smartcomment-hl-")))||(n.classList.add("sc-svg-hover"),e.add(n),function(A){try{if(!A.dataset.originalStyles){const e={};A.querySelectorAll("rect, path, circle, polygon, ellipse").forEach(((A,t)=>{e[`shape_${t}`]={fill:A.style.fill||A.getAttribute("fill"),stroke:A.style.stroke||A.getAttribute("stroke"),strokeWidth:A.style.strokeWidth||A.getAttribute("stroke-width")}})),A.dataset.originalStyles=JSON.stringify(e)}}catch(e){console.warn("Failed to apply SVG hover effects:",e)}}(n)))}function o(A){if(!va())return;const t=A.target;let n=null;n="a"===t.tagName&&t.closest("svg")?t:t.closest("svg a"),n&&(n.classList.remove("sc-svg-hover"),e.delete(n),i(n))}function i(A){try{A.dataset.originalStyles&&delete A.dataset.originalStyles}catch(e){console.warn("Failed to remove SVG hover effects:",e)}}function s(){e.forEach((A=>{A.classList.contains(Js)?A.classList.remove("hover"):A.closest("svg")&&(A.classList.remove("sc-svg-hover"),i(A))})),e.clear()}return{initializeHoverEffects:function(){if(!A)try{document.addEventListener("mouseover",t,!0),document.addEventListener("mouseout",n,!0),document.addEventListener("mouseover",r,!0),document.addEventListener("mouseout",o,!0),A=!0}catch(e){console.error("Failed to initialize hover effects:",e)}},destroyHoverEffects:function(){if(A)try{document.removeEventListener("mouseover",t,!0),document.removeEventListener("mouseout",n,!0),document.removeEventListener("mouseover",r,!0),document.removeEventListener("mouseout",o,!0),s(),A=!1}catch(e){console.error("Failed to destroy hover effects:",e)}},clearAllHoverEffects:s,getHoverStats:function(){return{isInitialized:A,activeHovers:e.size,hoveredElements:Array.from(e).map((A=>({tagName:A.tagName,classes:Array.from(A.classList),type:A.closest("svg")?"svg":"dynamic-block"})))}},get isInitialized(){return A},get hoveredElementsCount(){return e.size}}}const YB={SELECTION_ACTIVE:"sc-selection-active",COMMENT_GROUP_OPEN:"sc-comment-group-open",COMMENT_GROUP_CLOSE:"sc-comment-group-close",DEBUG_MODE:"sc-debug-mode",OPEN_COMMENT_ID:"sc-open-comment",OPEN_COMMENT_WITH_POSITION:"sc-open-comment-with-position",COMMENT_CREATED:"sc-comment-created",COMMENT_UPDATED:"sc-comment-updated",COMMENT_DELETED:"sc-comment-deleted",COMMENT_COMPLETED:"sc-comment-completed",HIGHLIGHT_CLICKED:"sc-highlight-clicked",SELECTION_CHANGED:"sc-selection-changed",COMMENTS_ENABLED:"sc-comments-enabled",COMMENTS_DISABLED:"sc-comments-disabled",REFRESH_HIGHLIGHTS:"smartcomments:refresh-highlights",REFRESH_TIMELINE:"smartcomments:refresh-timeline"};const jB=new class{constructor(){this.listeners=new Map,this.debugMode=!1,this.checkDebugMode(),this.setupLegacyCompatibility()}checkDebugMode(){"1"!==new URLSearchParams(window.location.search).get("scenabled")&&-1===window.location.href.indexOf("scenabled=1")||this.enableDebugMode()}enableDebugMode(){this.debugMode=!0,this.trigger(YB.DEBUG_MODE,{enabled:!0})}disableDebugMode(){this.debugMode=!1,this.trigger(YB.DEBUG_MODE,{enabled:!1})}trigger(A,e={},t=window){const n=new CustomEvent(A,{detail:e,bubbles:!0,cancelable:!0});return t.dispatchEvent(n),t!==window&&window.dispatchEvent(n),n}on(A,e,t=window){const n=A=>{e(A)};t.addEventListener(A,n);const r=`${A}_${Date.now()}_${Math.random()}`;return this.listeners.set(r,{target:t,eventName:A,callback:n}),()=>{t.removeEventListener(A,n),this.listeners.delete(r)}}once(A,e,t=window){const n=this.on(A,(A=>{n(),e(A)}),t);return n}removeAllListeners(){for(const[A,e]of this.listeners)e.target.removeEventListener(e.eventName,e.callback);this.listeners.clear()}setupLegacyCompatibility(){"undefined"!=typeof $&&$.fn&&Object.values(YB).forEach((A=>{this.on(A,(e=>{$(window).trigger(A,e.detail)}))}))}triggerCommentGroupOpen(A,e={}){return this.trigger(YB.COMMENT_GROUP_OPEN,{comment:A,position:e,timestamp:Date.now()})}triggerCommentGroupClose(){return this.trigger(YB.COMMENT_GROUP_CLOSE,{timestamp:Date.now()})}triggerSelectionActive(A){return this.trigger(YB.SELECTION_ACTIVE,{selection:A,timestamp:Date.now()})}triggerOpenComment(A){return this.trigger(YB.OPEN_COMMENT_ID,{commentId:A,timestamp:Date.now()})}triggerOpenCommentWithPosition(A,e){return this.trigger(YB.OPEN_COMMENT_WITH_POSITION,{commentId:A,position:e,timestamp:Date.now()})}triggerHighlightClicked(A,e){return this.trigger(YB.HIGHLIGHT_CLICKED,{comment:A,position:e,timestamp:Date.now()})}triggerCommentCreated(A){return this.trigger(YB.COMMENT_CREATED,{comment:A,timestamp:Date.now()})}triggerCommentUpdated(A){return this.trigger(YB.COMMENT_UPDATED,{comment:A,timestamp:Date.now()})}triggerCommentDeleted(A){return this.trigger(YB.COMMENT_DELETED,{comment:A,timestamp:Date.now()})}triggerCommentCompleted(A){return this.trigger(YB.COMMENT_COMPLETED,{comment:A,timestamp:Date.now()})}triggerCommentsEnabled(){return this.trigger(YB.COMMENTS_ENABLED,{timestamp:Date.now()})}triggerCommentsDisabled(){return this.trigger(YB.COMMENTS_DISABLED,{timestamp:Date.now()})}triggerRefreshHighlights(){return this.trigger(YB.REFRESH_HIGHLIGHTS,{timestamp:Date.now()})}triggerRefreshTimeline(){return this.trigger(YB.REFRESH_TIMELINE,{timestamp:Date.now()})}};function ZB(){const A=XB(),e=Ja(),t=$B();let n,r,o,i,s=!1;function a(){try{return Rs().isEnabled}catch(A){return console.warn("Could not check selection enabled state:",A),!1}}async function c(t,n,r={}){if(!a())return null;const o={captureScreenshot:!0,...r};try{const r=await A.processSelection(t,n,o);return r?(await async function(t,n){try{const r=function(A){return{data_id:p(),text:A.text,index:A.index,type:A.type,element:A.element||null,screenshot:A.image||null,timestamp:Date.now(),metadata:A.metadata||null,pos:A.pos||A.selector||null}}(t);e.addHighlight(t.type,r);const o=A.formatSelectionForAPI(t),i={selection:t,screenshot:t.image||null,apiData:o,position:{x:(null==n?void 0:n.pageX)||0,y:(null==n?void 0:n.pageY)||0},highlight:r,timestamp:Date.now()};jB.triggerSelectionActive(i);const s=new CustomEvent("smartcomments:selection",{detail:i});document.dispatchEvent(s)}catch(r){console.error("Failed to handle successful selection:",r),Ya.handleSelectionError("event-handling",r,{selectionResult:t,event:n})}}(r,n),r):null}catch(i){return Ya.handleSelectionError("universal",i,{target:t,event:n,options:o}),null}}async function l(A,e){if(a())try{await c(A,e)}catch(t){console.error("SVG selection failed:",t),Ya.handleSelectionError("svg",t,{svgLink:A,event:e})}}function u(e){a()&&(A.startPosition.x=e.pageX,A.startPosition.y=e.pageY)}function d(e){a()&&(A.isCapturing.value||(A.selectionPosition.x=e.pageX,A.selectionPosition.y=e.pageY))}function g(A){a()&&setTimeout((async()=>{if(!window.rangy||!rangy.getSelection)return;const e=rangy.getSelection();if(!e.isCollapsed&&e.rangeCount>0)try{const t=e.getRangeAt(0);await c(t,A)}catch(t){console.error("Text selection processing failed:",t),Ya.handleSelectionError("text",t,{event:A})}}),ks)}async function h(e){if(!a())return;const t=e.target;try{A.canSelectElement(t)&&(e.preventDefault(),await c(t,e))}catch(n){console.error("Click selection processing failed:",n),Ya.handleSelectionError("click",n,{target:t,event:e})}}function p(){return`temp_${Date.now()}_${Math.random().toString(36).substr(2,9)}`}function B(){if(s)try{n&&document.removeEventListener("mousedown",n),r&&document.removeEventListener("mouseup",r),o&&document.removeEventListener("mousemove",o),i&&document.removeEventListener("click",i),n=null,r=null,o=null,i=null,t.destroyHoverEffects(),s=!1}catch(A){console.error("Failed to unbind selection events:",A)}}return{bindEvents:function(){if(s)console.warn("Selection events already bound");else try{n=u.bind(this),r=g.bind(this),o=d.bind(this),i=h.bind(this),document.addEventListener("mousedown",n),document.addEventListener("mouseup",r),document.addEventListener("mousemove",o),document.addEventListener("click",i),t.initializeHoverEffects(),s=!0}catch(A){console.error("Failed to bind selection events:",A),s=!1}},unbindEvents:B,onSelectionCreate:function(A){if("function"!=typeof A)throw new Error("Selection create callback must be a function");const e=e=>{A(e.detail)};return document.addEventListener("smartcomments:selection",e),()=>{document.removeEventListener("smartcomments:selection",e)}},processUniversalSelection:c,createSelectionFromElement:function(e){const t=e.target,n=A.findSVGLink(t);if(n)return e.preventDefault(),void l(n,e);if(!window.rangy||!rangy.getSelection)return void console.warn("Rangy not available for text selection creation");const r=rangy.getSelection(),o=t.textContent||t.innerText||"";if(o.trim())try{const A=rangy.createRange();A.selectNodeContents(t),A.findText&&A.findText(o.trim())||A.selectNodeContents(t),r.setSingleRange(A)}catch(i){console.warn("Failed to create selection from element:",i);const A=rangy.createRange();A.selectNodeContents(t),r.setSingleRange(A)}},handleSVGSelection:l,handleMouseDown:u,handleMouseMove:d,handleMouseUp:g,handleClick:h,isSelectionEnabled:a,showSelectionError:function(A,e="unknown"){Ya.handleSelectionError(e,A)},getEventStats:function(){return{isEventsBound:s,selectionStats:A.getSelectionStats(),errorStats:Ya.getErrorStats(),timestamp:Date.now()}},resetEventSystem:function(){B(),A.clearSelection(),Ya.clearErrorStats()},get isEventsBound(){return s}}}function zB(){let A=null,e=!1;const{messages:t}=Ha();function n(A){var e;const n=Rs(),r=null==(e=mw.config.get("wgSmartComments"))?void 0:e.selectLinksOnClick;if(!n.isEnabled)return;const o=A.target;const i=function(A){let e=A;for(;e&&e!==document;){if("A"===e.tagName&&e.href||"a"===e.tagName&&e.getAttributeNS("http://www.w3.org/1999/xlink","href"))return e;e=e.parentElement}return null}(o);if(i){let e=i.href||i.getAttributeNS("http://www.w3.org/1999/xlink","href");if(void 0!==(null==e?void 0:e.baseVal)&&(e=e.baseVal),!e||"string"!=typeof e)return;const n=document.getElementById(qs);if(!n||!n.contains(i))return;if(o.closest(".smartcomments")||o.closest(".sic-timeline-container"))return;if(o.closest(".mw-editsection"))return;if(o.closest(`[class*="${ga}"]`)||i.classList.toString().includes(ga))return;if(o.closest(`.${ha}`))return;if(e.includes("#")&&e.split("#")[0]===window.location.href.split("#")[0])return;if(i.querySelector(`[class*="${ga}"]`))return A.preventDefault(),A.stopPropagation(),void mw.notify(t.linkCommentHighlightWarn(),{type:"warn",autoHide:!0,autoHideSeconds:4});if(A.preventDefault(),A.stopPropagation(),r){const{createSelectionFromElement:e}=ZB();return void e(A)}mw.notify(t.linkDisabledWarn(),{type:"warn",autoHide:!0,autoHideSeconds:3})}}return{bindEvents:function(){e||(A=n.bind(null),document.addEventListener("click",A,!0),e=!0)},unbindEvents:function(){e&&A&&(document.removeEventListener("click",A,!0),A=null,e=!1)},isLinkPreventionActive:function(){return Rs().isEnabled},isEventsBound:()=>e}}function qB(A,e=[]){if(A.nodeType===Node.TEXT_NODE)""!==A.nodeValue.trim()&&e.push(A);else for(let t=0,n=A.childNodes.length;t")}function ef(){return{applyTextHighlight:function(A,e,t,n){if(!window.rangy)return void console.error("Rangy not initialized. Cannot apply text highlights.");const r=String(e.comment.data_id);let o=window.rangy.createClassApplier(t,{ignoreWhiteSpace:!0,elementTagName:"span",normalize:!0,onElementCreate:(A,t)=>{A.setAttribute("data-comment-id",r),n(A,e.comment)}});!function(A,e,t){const{comment:n}=e;if(!n||!n.pos)return void console.warn("applyTextIndexHighlight: Missing comment or comment.pos",e);const r=String(n.pos),o=r.lastIndexOf("|");if(-1===o)return void console.warn("applyTextIndexHighlight: Invalid pos string format (missing |)",r);let i=r.substring(0,o);i=Af(i);const s=parseInt(r.substring(o+1),10);if(isNaN(s)||s<0)return void console.warn("applyTextIndexHighlight: Invalid index (NaN or negative)",s,"for pos:",r);window.rangy.createRange().selectNodeContents(A);let a=0,c=!1;const l=qB(A);for(const u of l){let A=u.data.indexOf(i);for(;-1!==A;){if(a===s){const n=window.rangy.createRange();n.setStart(u,A),n.setEnd(u,A+i.length);try{t.applyToRange(n)}catch(Em){console.error("Error applying classApplier to range:",Em,{textNode:u,localIndex:A,textToFind:i,highlightData:e})}c=!0;break}a++,A=u.data.indexOf(i,A+i.length)}if(c)break}c||console.warn("applyTextIndexHighlight: Text index highlight not found or applied for:",{textToFind:i,index:s,posString:r})}(A,e,o);const i=A.querySelectorAll(`.${t}`);i.length>0&&i.forEach((A=>{A.getAttribute("data-comment-id")||A.setAttribute("data-comment-id",r),n(A,e.comment)}))},removeTextHighlight:function(A,e,t){if(!window.rangy)return void console.warn("removeTextHighlight: Rangy not available");const n=window.rangy.createClassApplier(A,{ignoreWhiteSpace:!0,elementTagName:"span",normalize:!0});t.forEach((e=>{const t=Array.from(e.classList).some((e=>e.startsWith("smartcomment-hl-")&&e!==A));if("SPAN"===e.tagName&&e.hasAttribute("data-comment-id"))try{const A=window.rangy.createRange();A.selectNodeContents(e),n.undoToRange(A),t||e.removeAttribute("data-comment-id")}catch(Em){console.warn("removeTextHighlight: Error using Rangy undoToRange, falling back to manual removal:",Em),function(A,e,t){A.classList.remove(e),t||A.removeAttribute("data-comment-id");if("SPAN"===A.tagName){if(!t&&(0===A.classList.length||!Array.from(A.classList).some((A=>A.startsWith("smartcomment-"))))&&(!A.hasAttributes()||1===A.attributes.length&&A.hasAttribute("class")&&0===A.classList.length)){const e=A.parentNode;if(e){for(;A.firstChild;)e.insertBefore(A.firstChild,A);e.removeChild(A);try{e.normalize()}catch(n){console.warn("manuallyRemoveTextHighlight: Error normalizing parent node:",n)}}}}}(e,A,t)}}))},getTextNodesIn:qB,decodeHtmlEntities:Af}}function tf(){return{applySelectorHighlight:function(A,e,t,n){const{comment:r}=e;if(!r||!r.pos)return void console.warn("applySelectorHighlight: Missing comment or comment.pos",e);let o=r.pos;const i=t.split(" "),s=String(r.data_id);o.startsWith("img[")?function(A,e,t,n,r,o){const i=e.replace("img[","").replace("]",""),s=A.querySelectorAll(`[data-hash="${e}"]`);if(s.length>0)return void s.forEach((A=>{A.classList.add(...n),A.setAttribute("data-comment-id",r),o(A,t)}));const a=A.querySelectorAll("img");a.forEach((e=>{if(e.getAttribute("data-original-hash")===i||e.src.includes(i)||t.image_hash&&e.src.includes(t.image_hash)){const i=e.closest("figure")||e.parentElement;i&&i!==A?(i.classList.add(...n),i.setAttribute("data-comment-id",r),o(i,t)):(e.classList.add(...n),e.setAttribute("data-comment-id",r),o(e,t))}}))}(A,o,r,i,s,n):function(A,e,t,n,r,o){try{A.querySelectorAll(e).forEach((A=>{A.classList.add(...n),A.setAttribute("data-comment-id",r),o(A,t)}))}catch(Em){console.error("Error applying selector highlight with selector:",e,Em)}}(A,o,r,i,s,n)},removeSelectorHighlight:function(A,e,t){t.forEach((e=>{const t=Array.from(e.classList).some((e=>e.startsWith("smartcomment-hl-")&&e!==A));e.classList.remove(A),t||e.removeAttribute("data-comment-id")}))}}}const nf=new Map;class rf{static initialize(){if(this.strategies)return this.strategies;const{applyTextHighlight:A,removeTextHighlight:e}=ef(),{applySelectorHighlight:t,removeSelectorHighlight:n}=tf(),{applySVGHighlight:r,removeSVGHighlight:o}=function(){function A(A,t,n,r,o,i){let s=!1;const a=A.querySelectorAll(`[data-svg-id="${t}"]`);return a.length>0&&a.forEach((A=>{A.classList.add(...r),A.setAttribute("data-comment-id",o),i(A,n),s=!0})),s||A.querySelectorAll("svg a").forEach(((A,a)=>{e(A,t)&&(A.setAttribute("data-svg-id",t),A.classList.add(...r),A.setAttribute("data-comment-id",o),i(A,n),s=!0)})),s||A.querySelectorAll("svg *[href], svg *[xlink\\:href]").forEach(((A,a)=>{if(e(A,t)){const e=A.closest("a")||A;e.setAttribute("data-svg-id",t),e.classList.add(...r),e.setAttribute("data-comment-id",o),i(e,n),s=!0}})),s||console.warn("applySVGHighlight: SVG element not found for ID:",t),s}function e(A,e){if(A.getAttribute("data-svg-id")===e)return!0;const t=A.getAttribute("xlink:href")||A.getAttribute("href");if(e.startsWith("svg-href-")&&t)try{const A=new URL(t).pathname.split("/").filter(Boolean),n=A[A.length-1];if(n&&"index.php"!==n){const A=`svg-href-${Qa(n)}`.trim();if(e.trim()===A)return!0}}catch(Em){const n=`svg-href-${Qa(t)}`.trim();if(e.trim()===n)return!0}if(e.startsWith("svg-text-")){const t=function(A){const e=A.querySelectorAll("text, tspan"),t=[];e.forEach((A=>{const e=A.textContent.trim();e&&!t.includes(e)&&t.push(e)}));const n=A.querySelector("title");if(n&&n.textContent.trim()){const A=n.textContent.trim();t.includes(A)||t.unshift(A)}return t.join(" ")}(A);if(t){const n=A.getBoundingClientRect(),r=`${Math.round(n.left)}-${Math.round(n.top)}`;if(e===`svg-text-${Qa(t.toLowerCase())}-${r}`)return!0}}if(e.startsWith("svg-fallback-"))try{const t={tagName:A.tagName,position:A.getBoundingClientRect(),childCount:A.children.length};if(e===`svg-fallback-${btoa(JSON.stringify(t)).replace(/[^a-zA-Z0-9]/g,"").substring(0,16)}`)return!0}catch(Em){}return!1}return{applySVGHighlight:function(e,t,n,r){const{comment:o}=t;if(!o||!o.pos)return void console.warn("applySVGHighlight: Missing comment or comment.pos",t);const i=o.pos,s=n.split(" "),a=String(o.data_id);if(!i.startsWith("svg[")||!i.endsWith("]"))return void console.warn("applySVGHighlight: Invalid SVG selector format:",i);const c=i.slice(4,-1);A(e,c,o,s,a,r)||setTimeout((()=>{A(e,c,o,s,a,r)}),100)},removeSVGHighlight:function(A,e,t){t.forEach((e=>{const t=Array.from(e.classList).some((e=>e.startsWith("smartcomment-hl-")&&e!==A));e.classList.remove(A),t||e.removeAttribute("data-comment-id")}))}}}();return this.strategies={wordIndex:{apply:A,remove:e},selector:{apply:t,remove:n},svg:{apply:r,remove:o}},this.strategies}static getStrategy(A){const e=this.initialize()[A];return e||ka.handleValidationError(`Unknown highlight type: ${A}`,{type:A}),e}}function of(){const{ensureClickListenerIsAttached:A,clearListenersForCommentId:e,clearAllListeners:t}={ensureClickListenerIsAttached:function(A,e,t){const n=String(e.data_id);let r=nf.get(n);if((!r||!r.some((e=>e.element===A&&"click"===e.type)))&&t&&"function"==typeof t){const r=n=>{n.stopPropagation();const r=A.getBoundingClientRect(),o={top:r.top+window.scrollY,left:r.left+window.scrollX,bottom:r.bottom+window.scrollY,right:r.right+window.scrollX,width:r.width,height:r.height};t(n,e,o)};A.addEventListener("click",r),A.style.cursor="pointer",nf.has(n)||nf.set(n,[]),nf.get(n).push({element:A,handler:r,type:"click"})}},clearListenersForCommentId:function(A){nf.has(A)&&(nf.get(A).forEach((({element:A,handler:e,type:t})=>{A.removeEventListener(t,e),A.style.cursor=""})),nf.delete(A))},clearAllListeners:function(){nf.forEach(((A,e)=>{A.forEach((({element:A,handler:e,type:t})=>{A.removeEventListener(t,e),A&&(A.style.cursor="")}))})),nf.clear()},getAttachedListeners:function(){return nf},hasListenerAttached:function(A,e,t="click"){const n=String(e),r=nf.get(n);return r&&r.some((e=>e.element===A&&e.type===t))}};return{applyHighlights:function(e,t,n){t&&Array.isArray(t)?window.rangy?t.forEach((t=>{var r;ka.safeExecute((()=>{ka.validateHighlightData(t);const r=Ga(t.comment.data_id);rf.getStrategy(t.type).apply(e,t,r,((e,t)=>{A(e,t,n)}))}),`apply ${(null==t?void 0:t.type)||"unknown"} highlight`,{commentId:null==(r=null==t?void 0:t.comment)?void 0:r.data_id,type:null==t?void 0:t.type})})):ka.handleRangyError("Rangy not initialized. Cannot apply highlights"):ka.handleValidationError("Highlights must be an array of highlight objects",{highlights:t})},clearHighlights:function(A,t){t&&Array.isArray(t)?window.rangy?t.forEach((t=>{var n;ka.safeExecute((()=>{var n;if(!(null==(n=null==t?void 0:t.comment)?void 0:n.data_id))return;const r=String(t.comment.data_id),o=Ga(r);e(r);const i=Xa(A,r);if(0===i.length)return;rf.getStrategy(t.type).remove(o,A,Array.from(i))}),`clear ${(null==t?void 0:t.type)||"unknown"} highlight`,{commentId:null==(n=null==t?void 0:t.comment)?void 0:n.data_id,type:null==t?void 0:t.type})})):ka.handleRangyError("Rangy not available for clearing highlights"):ka.handleValidationError("highlightsToClear must be an array",{highlightsToClear:t})},clearAllHighlights:function(A){ka.safeExecute((()=>{t();A.querySelectorAll(`[data-comment-id], [class*="${Ma}"]`).forEach((A=>{Array.from(A.classList).filter((A=>A.startsWith(Ma))).forEach((e=>{Wa(A,e)})),"SPAN"===A.tagName&&function(A){if("SPAN"!==A.tagName)return;if(0===A.classList.length&&!A.hasAttributes()&&A.innerHTML===A.textContent){const e=A.parentNode;if(e){for(;A.firstChild;)e.insertBefore(A.firstChild,A);e.removeChild(A);try{e.normalize()}catch(Em){console.warn("Error normalizing parent after span unwrap:",Em)}}}}(A)}))}),"clear all highlights",{scopeElement:null==A?void 0:A.tagName})},removeCommentHighlight:function(A,t=null){const n=t||document.getElementById("mw-content-text")||document.body;ka.safeExecute((()=>{if(!window.rangy)return void ka.handleRangyError("Rangy not available for comment highlight removal",{commentId:A});const t=String(A);e(t);const r=Xa(n,t);if(0===r.length)return;const o=function(A){const e=A.some((A=>"SPAN"===A.tagName&&A.hasAttribute("data-comment-id"))),t=A.some((A=>A.hasAttribute("data-svg-id")||A.closest("svg")||"a"===A.tagName&&A.closest("svg")));return e?"wordIndex":t?"svg":"selector"}(Array.from(r));if(o){const A=rf.getStrategy(o),e=Ga(t);A.remove(e,n,Array.from(r))}else{const A=Ga(t);!function(A,e,t=null){A.querySelectorAll(`.${e}`).forEach((A=>{t&&"function"==typeof t?t(A,e):Wa(A,e)}))}(n,A)}}),"remove comment highlight",{commentId:A,scopeElement:null==n?void 0:n.tagName})}}}__publicField(rf,"strategies",null);const sf=Ls("commentsStore",{state:()=>({comments:[],currentCommentId:null,isLoading:!1,error:null,activeComment:null,commentPosition:null,isCommentDialogVisible:!1,isNewCommentDialogVisible:!1,newCommentSelection:null,isImageModalVisible:!1}),getters:{getCurrentComment:A=>A.comments.find((e=>e.id&&e.id===A.currentCommentId||e.data_id&&e.data_id===A.currentCommentId))||null,getCommentsSortedByPosition:A=>A.comments.filter((A=>"completed"!==A.status)).slice().sort(((e,t)=>A.getCommentDocumentPosition(e)-A.getCommentDocumentPosition(t))),getCurrentCommentIndex:A=>A.getCommentsSortedByPosition.findIndex((e=>e.id&&e.id===A.currentCommentId||e.data_id&&e.data_id===A.currentCommentId)),hasNextComment:A=>{const e=A.getCommentsSortedByPosition,t=e.findIndex((e=>e.id&&e.id===A.currentCommentId||e.data_id&&e.data_id===A.currentCommentId));return-1!==t&&tA.getCommentsSortedByPosition.findIndex((e=>e.id&&e.id===A.currentCommentId||e.data_id&&e.data_id===A.currentCommentId))>0,getNextComment:A=>{const e=A.getCommentsSortedByPosition,t=e.findIndex((e=>e.id&&e.id===A.currentCommentId||e.data_id&&e.data_id===A.currentCommentId));return-1!==t&&t{const e=A.getCommentsSortedByPosition,t=e.findIndex((e=>e.id&&e.id===A.currentCommentId||e.data_id&&e.data_id===A.currentCommentId));return t>0?e[t-1]:null},getCommentDocumentPosition:()=>A=>{try{const e=A.id||A.data_id,t=document.querySelector(`.smartcomment-hl-${e}, [data-comment-id="${e}"]`);if(t)return af(t);if(A.parsedSelection){const e=A.parsedSelection;if("text"===e.type&&e.text&&"number"==typeof e.index)return function(A,e=0){if(!A)return Number.MAX_SAFE_INTEGER;try{const t=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT,null,!1);let n,r=0;for(;n=t.nextNode();){const t=(n.textContent||"").indexOf(A);if(-1!==t){if(r===e){const e=document.createRange();e.setStart(n,t),e.setEnd(n,t+A.length);const r=e.getBoundingClientRect(),o=window.scrollY||window.pageYOffset;return r.top+o}r++}}return Number.MAX_SAFE_INTEGER}catch(t){return console.warn("Error finding text position:",t),Number.MAX_SAFE_INTEGER}}(e.text,e.index);if("image"===e.type||"dynamic-block"===e.type||"svg"===e.type){const A=function(A){if(!A)return null;try{let e=A;return A.startsWith("img:")&&(e=A.substring(4)),A.startsWith("svg:")&&(e=A.substring(4)),document.querySelector(e)}catch(e){return console.warn("Invalid selector:",A,e),null}}(e.text);if(A)return af(A)}}return console.warn("Could not determine position for comment:",e),Number.MAX_SAFE_INTEGER}catch(e){return console.warn("Error calculating comment position:",e),Number.MAX_SAFE_INTEGER}}},actions:{setComments(A){this.comments=A},setCurrentComment(A){this.currentCommentId=A},addComment(A){this.comments.push(A)},updateComment(A,e){const t=this.comments.findIndex((e=>e.id&&e.id===A||e.data_id&&e.data_id===A));-1!==t&&(this.comments[t]={...this.comments[t],...e})},removeComment(A){const e=this.comments.length;this.comments=this.comments.filter((e=>{const t=e.id&&e.id==A,n=e.data_id&&e.data_id==A;return!t&&!n})),this.comments.length===e&&console.warn("CommentsStore: removeComment called but no comment was removed",{commentId:A,totalComments:e}),this.currentCommentId==A&&(this.currentCommentId=null)},goToNextComment(){const A=this.getNextComment;return A?(this.currentCommentId=A.id||A.data_id,A):null},goToPreviousComment(){const A=this.getPreviousComment;return A?(this.currentCommentId=A.id||A.data_id,A):null},setLoading(A){this.isLoading=A},setError(A){this.error=A},clearError(){this.error=null},async openCommentDialog(A,e){this.setLoading(!0),this.clearError();try{const{getComment:t}=Ia(),n=await t(A.data_id);n?(this.activeComment=n,this.commentPosition=e,this.isCommentDialogVisible=!0,this.setCurrentComment(n.id||n.data_id),this.setActiveHighlight(n.data_id||n.id)):(this.setError("Comment not found"),console.error("CommentsStore: Comment not found:",A.data_id))}catch(t){this.setError("Error fetching comment"),console.error("CommentsStore: Error fetching comment:",t)}finally{this.setLoading(!1)}},closeCommentDialog(){jB.triggerCommentGroupClose(),this.clearActiveHighlight(),this.activeComment=null,this.commentPosition=null,this.isCommentDialogVisible=!1,this.setCurrentComment(null)},async navigateComment(A){const e="next"===A?this.goToNextComment():this.goToPreviousComment();if(e)try{const{getComment:t}=Ia(),n=await t(e.data_id||e.id);n?(this.activeComment=n,this.setCurrentComment(n.id||n.data_id),this.setActiveHighlight(n.data_id||n.id,!0)):(this.setError(`Could not fetch ${A} comment`),console.error("CommentsStore: Could not fetch",A,"comment:",e))}catch(t){this.setError(`Error navigating to ${A} comment`),console.error("CommentsStore: Error navigating to",A,"comment:",t)}},openNewCommentDialog(A){this.newCommentSelection={text:A.selection.text,index:A.selection.index,type:A.selection.type,image:A.selection.image||null},this.isNewCommentDialogVisible=!0},closeNewCommentDialog(){this.newCommentSelection=null,this.isNewCommentDialogVisible=!1},openImageModal(){this.isImageModalVisible=!0},closeImageModal(){this.isImageModalVisible=!1},async handleCommentSaved(A){this.closeNewCommentDialog(),jB.triggerCommentCreated(A),"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("smartcomments:refresh-highlights",{detail:{savedComment:A}}))},async deleteComment(A){this.setLoading(!0);try{const{deleteComment:e}=Ia(),t=await e(A.id||A.data_id);if("1"===t.success||!0===t.success){this.removeComment(A.id||A.data_id),jB.triggerCommentDeleted(A);const{removeCommentHighlight:e}=of();e(A.id||A.data_id),this.closeCommentDialog(),"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("smartcomments:refresh-highlights",{detail:{deletedComment:A}}))}else this.setError(t.message||"Failed to delete comment")}catch(e){this.setError("Error deleting comment"),console.error("CommentsStore: Error deleting comment:",e)}finally{this.setLoading(!1)}},async completeComment(A){this.setLoading(!0);try{const{updateComment:e}=Ia(),t=await e(A.id||A.data_id,"completed","");if("1"===t.success||!0===t.success){this.updateComment(A.id||A.data_id,{status:"completed"}),jB.triggerCommentCompleted(A);const{removeCommentHighlight:e}=of();e(A.id||A.data_id),"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("smartcomments:refresh-highlights",{detail:{completedComment:A}})),this.closeCommentDialog()}else this.setError(t.message||"Failed to complete comment")}catch(e){this.setError("Error completing comment"),console.error("CommentsStore: Error completing comment:",e)}finally{this.setLoading(!1)}},viewPage(A){const e=mw.util.getUrl("Special:SmartComments",{page:mw.config.get("wgPageName")});window.open(e,"_blank")},closeAllDialogs(){this.closeCommentDialog(),this.closeNewCommentDialog()},setActiveHighlight(A,e=!1){this.clearActiveHighlight();const t=`smartcomment-hl-${A}`,n=document.querySelectorAll(`.${t}`);n.forEach((A=>{A.classList.add("active")}));const r=document.querySelectorAll(`[data-comment-id="${A}"]`);if(r.forEach((A=>{A.classList.add("active")})),e){const A=n[0]||r[0];A&&A.scrollIntoView({behavior:"smooth",block:"center"})}},clearActiveHighlight(){document.querySelectorAll('[class*="smartcomment-hl-"].active, [data-comment-id].active').forEach((A=>{A.classList.remove("active")}))},handleReplyAdded(A){if(this.activeComment&&A.comment){const e=A.comment.id||A.comment.data_id;this.updateComment(e,{replies:A.comment.replies})}"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("smartcomments:refresh-highlights",{detail:{replyAdded:!0,replyData:A}}))},async openCommentDialogById(A){if(A){this.setLoading(!0),this.clearError();try{const{getComment:e}=Ia(),t=await e(A);if(t){const e=document.querySelector(`.smartcomment-hl-${A}`);let n;if(e){const A=e.getBoundingClientRect();n={top:A.top+window.scrollY,left:A.left+window.scrollX,bottom:A.bottom+window.scrollY,right:A.right+window.scrollX,width:A.width,height:A.height}}else n={top:100,left:100,bottom:150,right:400,width:300,height:50};this.activeComment=t,this.commentPosition=n,this.isCommentDialogVisible=!0,this.setCurrentComment(t.id||t.data_id),this.setActiveHighlight(t.data_id||t.id,!0);-1===this.comments.findIndex((e=>e.id&&e.id===A||e.data_id&&e.data_id===A))&&this.comments.push(t)}else this.setError("Comment not found"),console.error("CommentsStore: Comment not found for ID:",A)}catch(e){this.setError("Error fetching comment"),console.error("CommentsStore: Error fetching comment by ID:",e)}finally{this.setLoading(!1)}}},async checkAndOpenCommentFromUrl(){const A=new URLSearchParams(window.location.search),e=A.get("commentId")||A.get("focusId");e&&await this.openCommentDialogById(e)},async openCommentDialogByIdWithPosition(A,e){if(A&&e){this.setLoading(!0),this.clearError();try{const{getComment:t}=Ia(),n=await t(A);if(n){this.activeComment=n,this.commentPosition=e,this.isCommentDialogVisible=!0,this.setCurrentComment(n.id||n.data_id),this.setActiveHighlight(n.data_id||n.id,!1);-1===this.comments.findIndex((e=>e.id&&e.id===A||e.data_id&&e.data_id===A))&&this.comments.push(n)}else this.setError("Comment not found"),console.error("CommentsStore: Comment not found for ID:",A)}catch(t){this.setError("Error fetching comment"),console.error("CommentsStore: Error fetching comment by ID:",t)}finally{this.setLoading(!1)}}},async openCommentById(A){return await this.openCommentDialogById(A)}}});function af(A){if(!A)return Number.MAX_SAFE_INTEGER;const e=A.getBoundingClientRect(),t=window.scrollY||window.pageYOffset;return e.top+t}const{applyHighlights:cf,clearAllHighlights:lf}=of();const uf=(A,e)=>{const t=A.__vccOpts||A;for(const[n,r]of e)t[n]=r;return t},df={class:"smartcomments-reply-form"},gf={class:"smartcomments-reply-form-header"},hf={class:"smartcomments-reply-form-body"},pf=["placeholder","aria-label"],Bf={class:"smartcomments-reply-form-footer"},ff={class:"smartcomments-reply-form-actions"},mf=["disabled"];const wf=uf(Jt({name:"ReplyForm",data:()=>({reply:"",isFocused:!1,hasContent:!1,isSubmitting:!1}),props:{comment:{type:Object,required:!0}},emits:["reply-submitted"],setup(A){const{messages:e,msg:t}=Ha();return{messages:e,replyAriaLabel:Ro((()=>{const e=A.comment.author?A.comment.author.replace(/<[^>]*>/g,""):"comment";return t("sic-reply-aria-label",`Reply to ${e}`,e)}))}},computed:{showActions(){return this.isFocused||this.hasContent||this.isSubmitting},canSubmit(){return this.reply.trim().length>0&&!this.isSubmitting}},methods:{onFocus(){this.isFocused=!0},onBlur(){this.isFocused=!1},onInput(){this.hasContent=this.reply.trim().length>0},async submitReply(){if(this.canSubmit){this.isSubmitting=!0;try{if(this.comment.reply&&"function"==typeof this.comment.reply){if(await this.comment.reply(this.reply)){const A={text:this.reply,author:mw.config.get("wgUserName"),datetime:(new Date).toISOString()};this.$emit("reply-submitted",A),this.reply="",this.hasContent=!1,this.isFocused=!1}else console.error("Failed to submit reply")}else console.error("Comment object does not have a reply method")}catch(A){console.error("Error submitting reply:",A)}finally{this.isSubmitting=!1}}},cancelReply(){this.reply="",this.hasContent=!1,this.isFocused=!1,this.$refs.textarea.blur()}}}),[["render",function(A,e,t,n,r,o){return $r(),zr("div",df,[ro("div",gf,[ro("p",null,q(A.messages.replyHeader()),1)]),ro("div",hf,[Pt(ro("textarea",{class:W(["smartcomments-reply-form-body-textarea",{"has-content":A.hasContent}]),"onUpdate:modelValue":e[0]||(e[0]=e=>A.reply=e),placeholder:A.messages.replyPlaceholder(),onFocus:e[1]||(e[1]=(...e)=>A.onFocus&&A.onFocus(...e)),onBlur:e[2]||(e[2]=(...e)=>A.onBlur&&A.onBlur(...e)),onInput:e[3]||(e[3]=(...e)=>A.onInput&&A.onInput(...e)),"aria-label":A.replyAriaLabel,ref:"textarea"},null,42,pf),[[yi,A.reply]])]),Pt(ro("div",Bf,[ro("div",ff,[ro("button",{class:"smartcomments-reply-form-cancel",onClick:e[4]||(e[4]=(...e)=>A.cancelReply&&A.cancelReply(...e)),type:"button"},q(A.messages.cancel()),1),ro("button",{class:"smartcomments-reply-form-submit",onClick:e[5]||(e[5]=(...e)=>A.submitReply&&A.submitReply(...e)),disabled:!A.canSubmit,type:"submit"},q(A.messages.replySubmit()),9,mf)])],512),[[Zo,A.showActions]])])}]]);const Cf={class:"smartcomments-message"},Qf={class:"smartcomments-message-header"},yf=["innerHTML"],Ef=["innerHTML"],vf=["innerHTML"];const Uf=uf(Jt({name:"CommentMessage",props:{comment:{type:Object,required:!0}},computed:{commentText(){return this.comment&&"string"==typeof this.comment.text?function(A){if("string"!=typeof A)return A;const e=document.createElement("textarea");return e.innerHTML=A,e.value}(this.comment.text):""}}}),[["render",function(A,e,t,n,r,o){return $r(),zr("div",Cf,[ro("div",Qf,[ro("div",{class:"smartcomments-message-header-author",innerHTML:A.comment.author},null,8,yf),ro("div",{class:"smartcomments-message-header-date",innerHTML:A.comment.datetime},null,8,Ef)]),ro("div",{class:"smartcomments-message-body",innerHTML:A.commentText},null,8,vf)])}]]),Ff={class:"smartcomments-reply-list"};const bf=uf(Jt({name:"ReplyList",components:{CommentMessage:Uf},props:{replies:{type:Array,required:!0}}}),[["render",function(A,e,t,n,r,o){const i=Bn("comment-message");return $r(),zr("div",Ff,[($r(!0),zr(Vr,null,wn(A.replies,(A=>($r(),zr("div",{class:"smartcomments-reply-list-item",key:A.id},[oo(i,{comment:A},null,8,["comment"])])))),128))])}]]),Hf={class:"smartcomments-comment-actions"},If=["onClick","data-tooltip"],Sf=["innerHTML"],Nf=["onClick","data-tooltip"],xf=["innerHTML"],Df={key:0,class:"smartcomments-dropdown-menu"},Of=["onClick"],Tf=["innerHTML"];const Lf=uf(Jt({name:"CommentActions",props:{comment:{type:Object,required:!0}},setup(A,{emit:e}){const t=_s(),n=sf(),{messages:r}=Ha(),o=Ro((()=>[{icon:"oo-ui-icon-arrowPrevious",label:r.previousComment(),align:"left",action:()=>{e("previous")},when:()=>n.hasPreviousComment},{icon:"oo-ui-icon-arrowNext",label:r.nextComment(),align:"left",action:()=>{e("next")},when:()=>n.hasNextComment},{icon:"oo-ui-icon-ellipsis",label:r.actions(),align:"right",items:[{icon:"oo-ui-icon-check",label:r.markComplete(),style:"",action:()=>{e("complete",A.comment)}},{icon:"oo-ui-icon-trash",label:r.markDelete(),style:"",action:()=>{e("delete",A.comment)}},{icon:"oo-ui-icon-articles",label:r.viewOverview(),style:"",action:()=>{e("view",A.comment)}}],when:()=>t.canManageComments},{icon:"oo-ui-icon-close",label:r.close(),align:"right",action:()=>{e("close")},when:()=>!0}])),i=Ro((()=>o.value.filter((A=>A.when())))),s=Se({});return{filteredActions:i,dropdownStates:s,toggleDropdown:A=>{s.value[A]=!s.value[A]},handleSubItemClick:(A,e)=>{A.action(),s.value[e]=!1}}}}),[["render",function(A,e,t,n,r,o){return $r(),zr("div",Hf,[($r(!0),zr(Vr,null,wn(A.filteredActions,(e=>($r(),zr("div",{class:W(["smartcomments-comment-actions-item",`align-${e.align}`]),key:e.icon,style:k(e.style)},[e.items?($r(),zr("div",{key:1,class:W(["smartcomments-dropdown",{"is-open":A.dropdownStates[e.icon]}])},[ro("button",{class:"smartcomments-comment-actions-item-button smartcomments-dropdown-toggle",onClick:t=>A.toggleDropdown(e.icon),"data-tooltip":e.label},[ro("span",{class:W(["oo-ui-iconElement-icon",e.icon])},null,2),ro("span",{class:"smartcomments-visually-hidden",innerHTML:e.label},null,8,xf)],8,Nf),A.dropdownStates[e.icon]?($r(),zr("div",Df,[($r(!0),zr(Vr,null,wn(e.items,(t=>($r(),zr("button",{key:t.icon,class:"smartcomments-dropdown-item",onClick:n=>A.handleSubItemClick(t,e.icon),style:k(t.style)},[ro("span",{class:W(["oo-ui-iconElement-icon",t.icon])},null,2),ro("span",{innerHTML:t.label},null,8,Tf)],12,Of)))),128))])):lo("",!0)],2)):($r(),zr("button",{key:0,class:"smartcomments-comment-actions-item-button",onClick:e.action,"data-tooltip":e.label},[ro("span",{class:W(["oo-ui-iconElement-icon",e.icon])},null,2),ro("span",{class:"smartcomments-visually-hidden",innerHTML:e.label},null,8,Sf)],8,If))],6)))),128))])}]]),_f={class:"smartcomments-comment-body"};const Rf=uf(Jt({name:"CommentBody",components:{CommentMessage:Uf},props:{comment:{type:Object,required:!0}}}),[["render",function(A,e,t,n,r,o){const i=Bn("comment-message");return $r(),zr("div",_f,[oo(i,{comment:A.comment},null,8,["comment"])])}]]),Kf=Jt({name:"ImageModal",props:{show:{type:Boolean,default:!1},imageSrc:{type:String,required:!0},imageAlt:{type:String,default:"Image"}},emits:["close"],setup:(A,{emit:e})=>({handleImageError:A=>{console.warn("Failed to load modal image:",A.target.src),e("close")}})}),kf=["src","alt"];const Mf=Jt({name:"Comment",components:{ReplyForm:wf,ReplyList:bf,CommentActions:Lf,CommentBody:Rf,ImageModal:uf(Kf,[["render",function(A,e,t,n,r,o){return A.show?($r(),zr("div",{key:0,class:"smartcomments-image-modal",onClick:e[3]||(e[3]=e=>A.$emit("close"))},[ro("div",{class:"smartcomments-image-modal-content",onClick:e[2]||(e[2]=Ui((()=>{}),["stop"]))},[ro("button",{class:"smartcomments-image-modal-close",onClick:e[0]||(e[0]=e=>A.$emit("close"))},"×"),ro("img",{src:A.imageSrc,alt:A.imageAlt,class:"smartcomments-image-modal-image",onError:e[1]||(e[1]=(...e)=>A.handleImageError&&A.handleImageError(...e))},null,40,kf)])])):lo("",!0)}],["__scopeId","data-v-606b1f51"]])},props:{comment:{type:Object,required:!0},position:{type:Object,default:null},allowReplies:{type:Boolean,default:!0}},emits:["close","delete","complete","view","navigate","reply-added"],setup(A,{emit:e}){const{messages:t}=Ha(),n=sf(),r=Rs(),o=Ro((()=>{const e=null!==document.querySelector('div.sic-timeline-item.broken[data-comment-id="'+A.comment.id+'"]');return r.isSpecialPageMode||e})),i=Ro((()=>{if(!A.position)return console.warn("Comment panel: No position data, using default positioning"),{top:"0"};const e=window.innerHeight;let t;t=A.position.top;const n=window.scrollY+e-200-20;return t>n&&(t=Math.max(window.scrollY+10,n)),{top:`${t}px`}})),s=Ro((()=>({...A.comment,reply:a}))),a=async n=>{if(!n||""===n.trim())return console.warn("Cannot submit empty reply"),!1;try{const{saveComment:r}=Ia(),o={text:n,parentId:A.comment.id||A.comment.data_id,type:"reply"},i=await r(n,o);if("1"===i.success||!0===i.success){const r={id:i.comment||Date.now(),text:`

${n}

`,author:`${mw.config.get("wgUserName")}`,datetime:t.justNow(),modifiedBy:mw.config.get("wgUserName"),modifiedDateTime:t.justNow()};return A.comment.replies||(A.comment.replies=[]),A.comment.replies.push(r),e("reply-added",{comment:A.comment,reply:r}),!0}return console.error("Failed to submit reply:",i.message),!1}catch(r){return console.error("Error submitting reply:",r),!1}};return{panelStyle:i,enhancedComment:s,handleNext:()=>{e("navigate",{direction:"next"})},handlePrevious:()=>{e("navigate",{direction:"previous"})},handleReplySubmitted:e=>{"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("smartcomments:refresh-highlights",{detail:{replyAdded:!0,comment:A.comment,reply:e}}))},handleImageError:A=>{console.warn("Failed to load comment screenshot:",A.target.src),A.target.style.display="none"},openImageModal:()=>{n.openImageModal()},shouldShowScreenshot:o,commentsStore:n,messages:t}}}),Vf={class:"smartcomments-commentgroup"},Pf=["data-tooltip"],Gf=["src"];const Wf=uf(Mf,[["render",function(A,e,t,n,r,o){const i=Bn("comment-actions"),s=Bn("image-modal"),a=Bn("comment-body"),c=Bn("reply-list"),l=Bn("reply-form");return $r(),zr("div",{class:"smartcomments-side-panel",style:k(A.panelStyle)},[ro("div",Vf,[oo(i,{onClose:e[0]||(e[0]=e=>A.$emit("close")),onDelete:e[1]||(e[1]=e=>A.$emit("delete",e)),onComplete:e[2]||(e[2]=e=>A.$emit("complete",e)),onView:e[3]||(e[3]=e=>A.$emit("view",e)),onNext:A.handleNext,onPrevious:A.handlePrevious,comment:A.comment},null,8,["onNext","onPrevious","comment"]),A.shouldShowScreenshot?($r(),zr("div",{key:0,class:"smartcomments-screenshot tt-center","data-tooltip":A.messages.sicShowScreenshotFullSize()},[ro("img",{src:A.comment.positionImage,alt:"Comment screenshot",class:"smartcomments-screenshot-image",onError:e[4]||(e[4]=(...e)=>A.handleImageError&&A.handleImageError(...e)),onClick:e[5]||(e[5]=(...e)=>A.openImageModal&&A.openImageModal(...e))},null,40,Gf)],8,Pf)):lo("",!0),oo(s,{show:A.commentsStore.isImageModalVisible,"image-src":A.comment.positionImage,"image-alt":"Comment screenshot - full size",onClose:A.commentsStore.closeImageModal},null,8,["show","image-src","onClose"]),oo(a,{comment:A.comment},null,8,["comment"]),oo(c,{replies:A.comment.replies||[]},null,8,["replies"]),A.allowReplies?($r(),qr(l,{key:1,comment:A.enhancedComment,onReplySubmitted:A.handleReplySubmitted},null,8,["comment","onReplySubmitted"])):lo("",!0)])],4)}]]),Xf=Jt({name:"NewCommentDialog",props:{isVisible:{type:Boolean,default:!1},selectionData:{type:Object,default:null},title:{type:String,default:""}},emits:["close","save","cancel"],setup(A,{emit:e}){const t=Se(""),n=Se(""),r=Se(!1),o=Se(null),{saveComment:i}=Ia(),{messages:s,msg:a}=Ha(),c=Ro((()=>A.title||s.newCommentTitle())),l=Ro((()=>t.value.trim().length>0)),u=Ro((()=>({position:"fixed",top:"50%",left:"50%",transform:"translate(-50%, -50%)"}))),d=()=>{t.value="",n.value="",e("cancel"),e("close")},g=async()=>{if(l.value){r.value=!0,n.value="";try{const r=await i(t.value,A.selectionData);"1"===r.success||!0===r.success?(e("save",{text:t.value,result:r}),t.value="",window.mw&&window.mw.notify&&window.mw.notify(s.commentAdded(),{type:"success"}),e("close")):n.value=r.message||s.apiError()}catch(o){n.value=s.apiError(),console.error("Error saving comment:",o)}finally{r.value=!1}}else n.value=s.errorEmpty()},h=e=>{"Escape"===e.key&&A.isVisible&&d()};sn((()=>{document.addEventListener("keydown",h)})),un((()=>{document.removeEventListener("keydown",h),document.body.classList.remove("smartcomments-dialog-open")}));return{commentText:t,error:n,isSaving:r,commentInput:o,canSave:l,dialogStyle:u,handleCancel:d,handleSave:g,handleKeydown:A=>{"Escape"===A.key?d():"Enter"===A.key&&(A.ctrlKey||A.metaKey)&&(A.preventDefault(),g())},focusInput:async()=>{A.isVisible&&o.value&&(await ut(),o.value.focus())},handleBackdropClick:()=>{d()},manageBodyClass:()=>{A.isVisible?document.body.classList.add("smartcomments-dialog-open"):document.body.classList.remove("smartcomments-dialog-open")},messages:s,t:A=>({selectedText:a("sic-selected-text","Selected text"),selectedImage:a("sic-selected-image","Selected image"),commentPlaceholder:a("sic-comment-placeholder","Enter your comment..."),saving:a("sic-saving","Saving...")}[A]||A),title:c}},watch:{isVisible:{handler(A){this.manageBodyClass(),A&&this.focusInput()},immediate:!0}}}),Jf={class:"smartcomments-new-comment-content"},$f={class:"smartcomments-dialog-header"},Yf={class:"smartcomments-dialog-title"},jf=["data-tooltip"],Zf={key:0,class:"smartcomments-selected-content"},zf={class:"smartcomments-selected-text"},qf={class:"smartcomments-selection-preview"},Am=["src","alt"],em={class:"smartcomments-comment-input-wrapper"},tm={for:"smartcomments-comment-input",class:"smartcomments-input-label"},nm=["placeholder"],rm={key:0,class:"smartcomments-error-message"},om={class:"smartcomments-dialog-actions"},im=["disabled"],sm=["disabled"],am={key:0},cm={key:1};const lm=uf(Xf,[["render",function(A,e,t,n,r,o){return A.isVisible?($r(),zr("div",{key:0,class:"smartcomments-dialog-overlay",onClick:e[6]||(e[6]=(...e)=>A.handleBackdropClick&&A.handleBackdropClick(...e))},[ro("div",{class:"smartcomments-new-comment-dialog",style:k(A.dialogStyle),onClick:e[5]||(e[5]=Ui((()=>{}),["stop"]))},[ro("div",Jf,[ro("div",$f,[ro("span",Yf,q(A.title),1),ro("button",{class:"smartcomments-dialog-close",onClick:e[0]||(e[0]=(...e)=>A.handleCancel&&A.handleCancel(...e)),"data-tooltip":A.messages.close()},e[7]||(e[7]=[ro("span",{class:"oo-ui-iconElement-icon oo-ui-icon-close"},null,-1)]),8,jf)]),A.selectionData?($r(),zr("div",Zf,[ro("div",zf,[ro("strong",null,q(A.t("selectedText"))+":",1),ro("div",qf,q(A.selectionData.text),1)]),A.selectionData.image?($r(),zr("img",{key:0,class:"smartcomments-selected-image",src:A.selectionData.image,alt:A.t("selectedImage")},null,8,Am)):lo("",!0)])):lo("",!0),ro("div",em,[ro("label",tm,q(A.messages.commentInput()),1),Pt(ro("textarea",{id:"smartcomments-comment-input","onUpdate:modelValue":e[1]||(e[1]=e=>A.commentText=e),class:"smartcomments-comment-input",placeholder:A.t("commentPlaceholder"),rows:"4",ref:"commentInput",onKeydown:e[2]||(e[2]=(...e)=>A.handleKeydown&&A.handleKeydown(...e))},null,40,nm),[[yi,A.commentText]]),A.error?($r(),zr("div",rm,q(A.error),1)):lo("",!0)]),ro("div",om,[ro("button",{class:"smartcomments-button smartcomments-button-cancel",onClick:e[3]||(e[3]=(...e)=>A.handleCancel&&A.handleCancel(...e)),disabled:A.isSaving},q(A.messages.cancel()),9,im),ro("button",{class:"smartcomments-button smartcomments-button-save",onClick:e[4]||(e[4]=(...e)=>A.handleSave&&A.handleSave(...e)),disabled:!A.canSave||A.isSaving},[A.isSaving?($r(),zr("span",am,q(A.t("saving")),1)):($r(),zr("span",cm,q(A.messages.save()),1))],8,sm)])])],4)])):lo("",!0)}]]),um=Jt({name:"CommentTimeline",setup(){const A=sf(),e=Rs(),{messages:t,msgWithFallback:n}=Ha(),r=Se([]),o=Se(0),i=Se({visible:!1,style:{},selection:null});sn((()=>{window.addEventListener("resize",s),window.addEventListener("scroll",a)})),ln((()=>{window.removeEventListener("resize",s),window.removeEventListener("scroll",a)}));const s=()=>{r.value=[]},a=()=>{i.value.visible&&(i.value.visible=!1),o.value=window.scrollY,r.value=[]},c=A=>A.data_id||A.id,l=A=>document.querySelector(`.smartcomment-hl-${A}`),u=()=>(()=>{const A=document.getElementById("content");return(null==A?void 0:A.scrollHeight)||document.body.scrollHeight})()-150,d=A=>{const e=c(A);return!l(e)},g=Ro((()=>e.isEnabled)),h=Ro((()=>Array.isArray(A.comments)?A.comments.filter((A=>A&&"completed"!==A.status)):(console.warn("CommentTimeline: commentsStore.comments is not an array:",A.comments),[]))),p=Ro((()=>t.unlocalizedComment())),B=Ro((()=>{var A;return(null==(A=h.value)?void 0:A.length)?h.value.filter(d):[]})),f=Ro((()=>B.value.length)),m=Ro((()=>{const A=f.value;if(0===A)return"";return n("sic-broken-comments-below",`${A} broken comment${A>1?"s":""} below`).replace("$1",A.toString())})),w=Ro((()=>{const A=document.querySelector(".mw-body")||document.querySelector("body");if(!A)return console.warn("CommentTimeline: Could not find body element"),{top:"0px"};return{top:`${-A.getBoundingClientRect().top-80}px`}})),C=Ro((()=>{if(0===f.value)return!1;o.value;const A=window.innerHeight,e=window.scrollY+A;if(!document.getElementById("content"))return!1;return u()>e-100})),Q=Ro((()=>{var A;if(!(null==(A=h.value)?void 0:A.length))return[];const{normalComments:e,brokenCommentsArray:t}=(A=>{const e=[],t=[];return A.forEach((A=>{const n=c(A),r=l(n);if(r){const t=r.getBoundingClientRect().top+window.scrollY;e.push({...A,isBroken:!1,positionTop:t})}else t.push({...A,isBroken:!0})})),{normalComments:e,brokenCommentsArray:t}})(h.value),n=(A=>{const e=[],t=[];return A.forEach((A=>{let n=A.positionTop;for(;t.includes(n);)n+=10;t.push(n),e.push({...A,itemStyle:{top:`${n}px`,right:"0px",position:"absolute"}})})),e})(e),r=(A=>{const e=[],t=u();return A.forEach(((A,n)=>{const r=t-10*n;e.push({...A,itemStyle:{top:`${r}px`,right:"0px",position:"absolute"}})})),e})(t);return[...n,...r]}));return{isEnabled:g,comments:h,positionedComments:Q,containerStyle:w,brokenCommentHover:i,brokenCommentMessage:p,brokenCommentCount:f,brokenIndicatorText:m,showBrokenIndicator:C,handleCommentClick:e=>{const t=c(e),n=l(t);e.isBroken?(e=>{const t=document.querySelector(`.sic-timeline-item[data-selection="${e.posimg}"]`);if(t){const n=t.getBoundingClientRect(),r={top:n.top+window.scrollY,left:n.left+window.scrollX,bottom:n.bottom+window.scrollY,right:n.right+window.scrollX,width:n.width,height:n.height};A.openCommentDialog(e,r)}})(e):n&&(A=>{A.dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0,view:window}))})(n)},handleMouseOver:(A,e)=>{const t=c(A),n=l(t);n&&n.classList.add("active"),A.isBroken&&A.posimg&&((A,e)=>{i.value={visible:!0,selection:A.posimg,style:{position:"absolute",right:"30px",top:e.pageY-50+"px",border:"2px solid #ff000050",background:"white",padding:"10px",borderRadius:"5px",boxShadow:"0 2px 10px rgba(0,0,0,0.1)",zIndex:1e3}}})(A,e)},handleMouseOut:A=>{const e=c(A),t=l(e);t&&t.classList.remove("active"),A.isBroken&&(i.value.visible=!1)},scrollToBrokenComments:()=>{const A=u();window.scrollTo({top:A-window.innerHeight+100,behavior:"smooth"})}}}}),dm=["data-selection","data-comment-id","onClick","onMouseover","onMouseout"],gm=["src"],hm={class:"sic-broken-text"};const pm={key:0,class:"smartcomments"};const Bm=uf(Jt({name:"SmartComments",components:{Comment:Wf,NewCommentDialog:lm,CommentTimeline:uf(um,[["render",function(A,e,t,n,r,o){return A.isEnabled&&A.positionedComments.length>0?($r(),zr("div",{key:0,class:"sic-timeline-container",style:k(A.containerStyle)},[($r(!0),zr(Vr,null,wn(A.positionedComments,(t=>($r(),zr("div",{key:t.id||t.data_id,class:W(["sic-timeline-item",{broken:t.isBroken,"sic-timeline-item-hasreplies":"true"===t.hasReplies||!0===t.hasReplies||t.replies&&t.replies.length>0}]),style:k(t.itemStyle),"data-selection":t.posimg,"data-comment-id":t.data_id,onClick:e=>A.handleCommentClick(t),onMouseover:e=>A.handleMouseOver(t,e),onMouseout:e=>A.handleMouseOut(t)},e[1]||(e[1]=[ro("span",{class:"oo-ui-iconElement-icon oo-ui-icon-speechBubbles"},null,-1)]),46,dm)))),128)),A.brokenCommentHover.visible?($r(),zr("div",{key:0,class:"sic-timeline-item-hover",style:k(A.brokenCommentHover.style)},[ro("h2",null,q(A.brokenCommentMessage),1),A.brokenCommentHover.selection?($r(),zr("img",{key:0,src:A.brokenCommentHover.selection,width:"500",alt:"Comment selection preview"},null,8,gm)):lo("",!0)],4)):lo("",!0),ro("div",{class:W(["sic-broken-indicator",{visible:A.showBrokenIndicator}]),onClick:e[0]||(e[0]=(...e)=>A.scrollToBrokenComments&&A.scrollToBrokenComments(...e))},[e[2]||(e[2]=ro("span",{class:"sic-broken-icon"},"⚠️",-1)),ro("span",hm,q(A.brokenIndicatorText),1),e[3]||(e[3]=ro("span",{class:"sic-broken-arrow"},"↓",-1))],2)],4)):lo("",!0)}]])},setup(){const A=$a(),e=Rs(),t=sf(),n=Ha(),r=e.isSpecialPageMode?null:zB(),o=function(A,e,t){const n=Se(!1),r=()=>document.getElementById("mw-content-text")||document.body,o=(A,n,r)=>{A&&A.preventDefault&&A.preventDefault(),t.triggerHighlightClicked(n,r),t.triggerCommentGroupOpen(n,r),e.openCommentDialog(n,r)},i=async()=>{var t,i,s;if(!n.value)try{n.value=!0;const a=r();if((null==(t=A.highlightedAnchors)?void 0:t.value)&&lf(a,A.highlightedAnchors.value),await A.loadAndSetHighlights(),void 0!==(null==(i=A.comments)?void 0:i.value)?e.setComments(A.comments.value):(console.warn("useHighlightOrchestrator: comments.value is undefined after loadAndSetHighlights, setting empty array"),e.setComments([])),(null==(s=A.highlightedAnchors)?void 0:s.value)&&cf(a,A.highlightedAnchors.value,o),e.isCommentDialogVisible&&e.activeComment){const A=e.activeComment.data_id||e.activeComment.id;e.setActiveHighlight(A)}}catch(a){console.error("useHighlightOrchestrator: Error reloading highlights:",a)}finally{n.value=!1}},s=()=>{var e;const t=r();(null==(e=A.highlightedAnchors)?void 0:e.value)&&lf(t,A.highlightedAnchors.value)};return{isRefreshing:n,reloadHighlightsAndComments:i,clearHighlights:s,setupHighlightRefreshListener:()=>{const A=async()=>{await i()};return document.addEventListener("smartcomments:refresh-highlights",A),()=>{document.removeEventListener("smartcomments:refresh-highlights",A)}},reloadHighlights:async e=>{if(e)if(null==A?void 0:A.loadAndSetHighlights)try{s(),await i()}catch(t){console.error("useHighlightOrchestrator reloadHighlights: Error:",t)}else console.error("useHighlightOrchestrator: smartCommentsSetup.loadAndSetHighlights not available.");else console.warn("useHighlightOrchestrator: Cannot reload highlights, system is disabled.")},handleHighlightClick:o}}(A,t,jB),i=function(A){const e=e=>{"Escape"===e.key&&A.isCommentDialogVisible?A.isImageModalVisible?A.closeImageModal():A.closeCommentDialog():"Delete"===e.key&&A.activeComment?A.deleteComment(A.activeComment):"ArrowDown"===e.key&&A.hasNextComment?A.navigateComment("next"):"ArrowUp"===e.key&&A.hasPreviousComment&&A.navigateComment("previous")};return{setupKeyboardShortcuts:()=>(document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)})}}(t),s=function(A){const e=A=>{document.documentElement.style.setProperty("--smartcomments-annotate-text",`"${A}"`)},t=A=>{document.documentElement.style.setProperty("--smartcomments-button-open-text",`"${A}"`)};return{setupCustomPropertiesWatchers:()=>{const n=()=>A.msg("sic-annotate-tooltip"),r=()=>A.msg("sic-button-open");e(n()),t(r());const o=vr(n,(A=>{e(A)})),i=vr(r,(A=>{t(A)}));return()=>{o(),i()}},updateAnnotateTooltipText:e,updateButtonOpenText:t}}(n),a=function(A,e,t,n,r){return{setupSmartCommentsEvents:()=>{const o=[];return o.push(A.on(e.DEBUG_MODE,(A=>{A.detail.enabled&&!t.isEnabled&&t.setEnabled(!0)}))),o.push(A.on(e.SELECTION_ACTIVE,(A=>{n.isCommentDialogVisible&&n.closeCommentDialog()}))),o.push(A.on(e.OPEN_COMMENT_ID,(A=>{A.detail.commentId&&n.openCommentDialogById(A.detail.commentId)}))),o.push(A.on(e.OPEN_COMMENT_WITH_POSITION,(A=>{A.detail.commentId&&A.detail.position&&n.openCommentDialogByIdWithPosition(A.detail.commentId,A.detail.position)}))),o.push(A.on(e.COMMENT_CREATED,(A=>{r&&r.reloadHighlightsAndComments()}))),()=>{o.forEach((A=>A()))}}}}(jB,YB,e,t,o),c=function(A){return{setupUrlNavigation:e=>{const t=async()=>{e()&&await A.checkAndOpenCommentFromUrl()};return window.addEventListener("popstate",t),()=>{window.removeEventListener("popstate",t)}},checkUrlParameters:async e=>{e()?await A.checkAndOpenCommentFromUrl():console.warn("useUrlNavigation: Cannot check URL parameters, system is disabled.")}}}(t);return{smartCommentsSetup:A,store:e,commentsStore:t,smartCommentsEvents:jB,EVENTS:YB,messages:n,linkPrevention:r,highlightsManager:o,keyboardShortcuts:i,customProperties:s,eventHandlers:a,urlNavigation:c}},data:()=>({selectionEvents:null,cleanupFunctions:[]}),computed:{isEnabled(){return this.store.isEnabled}},mounted(){this.store.isSpecialPageMode||(this.selectionEvents=ZB(),this.cleanupFunctions.push(this.selectionEvents.onSelectionCreate(this.handleNewSelection))),this.setupSystems(),this.$watch((()=>this.isEnabled),(async A=>{A?await this.enableSmartComments():await this.disableSmartComments()}),{immediate:!0})},beforeUnmount(){this.highlightsManager.clearHighlights(),this.selectionEvents&&this.selectionEvents.unbindEvents(),this.linkPrevention&&this.linkPrevention.unbindEvents(),this.cleanupFunctions.forEach((A=>A()))},methods:{setupSystems(){this.cleanupFunctions.push(this.highlightsManager.setupHighlightRefreshListener()),this.cleanupFunctions.push(this.eventHandlers.setupSmartCommentsEvents()),this.cleanupFunctions.push(this.keyboardShortcuts.setupKeyboardShortcuts()),this.cleanupFunctions.push(this.customProperties.setupCustomPropertiesWatchers()),this.cleanupFunctions.push(this.urlNavigation.setupUrlNavigation((()=>this.isEnabled)))},async enableSmartComments(){try{if(this.smartCommentsEvents.triggerCommentsEnabled(),!this.store.isSpecialPageMode){this.selectionEvents&&this.selectionEvents.bindEvents();try{const{useSelection:A}=await Promise.resolve().then((()=>JB));A().setupSelection()}catch(A){console.error("Failed to setup selection strategies:",A)}this.linkPrevention&&this.linkPrevention.bindEvents(),this.highlightsManager.clearHighlights(),await this.highlightsManager.reloadHighlightsAndComments()}await this.commentsStore.checkAndOpenCommentFromUrl()}catch(Em){console.error("SmartComments.vue enableSmartComments: Error:",Em)}},async disableSmartComments(){this.smartCommentsEvents.triggerCommentsDisabled(),this.store.isSpecialPageMode||(this.selectionEvents&&this.selectionEvents.unbindEvents(),this.linkPrevention&&this.linkPrevention.unbindEvents(),this.highlightsManager.clearHighlights()),this.commentsStore.closeAllDialogs()},handleNewSelection(A){this.smartCommentsEvents.triggerSelectionActive(A),this.commentsStore.openNewCommentDialog(A)},handleCommentNavigation(A){const{direction:e}=A;this.commentsStore.navigateComment(e)},async reloadHighlights(){await this.highlightsManager.reloadHighlights(this.isEnabled)},async checkUrlParameters(){await this.urlNavigation.checkUrlParameters((()=>this.isEnabled))}}}),[["render",function(A,e,t,n,r,o){const i=Bn("comment"),s=Bn("new-comment-dialog"),a=Bn("comment-timeline");return A.isEnabled?($r(),zr("div",pm,[A.commentsStore.isCommentDialogVisible?($r(),qr(i,{key:0,comment:A.commentsStore.activeComment,position:A.commentsStore.commentPosition,"allow-replies":!0,onClose:A.commentsStore.closeCommentDialog,onDelete:A.commentsStore.deleteComment,onComplete:A.commentsStore.completeComment,onView:A.commentsStore.viewPage,onNavigate:A.handleCommentNavigation,onReplyAdded:A.commentsStore.handleReplyAdded},null,8,["comment","position","onClose","onDelete","onComplete","onView","onNavigate","onReplyAdded"])):lo("",!0),A.store.isSpecialPageMode?lo("",!0):($r(),qr(s,{key:1,"is-visible":A.commentsStore.isNewCommentDialogVisible,"selection-data":A.commentsStore.newCommentSelection,onClose:A.commentsStore.closeNewCommentDialog,onSave:A.commentsStore.handleCommentSaved,onCancel:A.commentsStore.closeNewCommentDialog},null,8,["is-visible","selection-data","onClose","onSave","onCancel"])),A.store.isSpecialPageMode?lo("",!0):($r(),qr(a,{key:2}))])):lo("",!0)}]]);function fm(A){return A&&A.__esModule&&Object.prototype.hasOwnProperty.call(A,"default")?A.default:A}var mm,wm={exports:{}};function Cm(){return mm||(mm=1,wm.exports=function(){var A="object",e="function",t="undefined",n=["startContainer","startOffset","endContainer","endOffset","collapsed","commonAncestorContainer"],r=["setStart","setStartBefore","setStartAfter","setEnd","setEndBefore","setEndAfter","collapse","selectNode","selectNodeContents","compareBoundaryPoints","deleteContents","extractContents","cloneContents","insertNode","surroundContents","cloneRange","toString","detach"],o=["boundingHeight","boundingLeft","boundingTop","boundingWidth","htmlText","text"],i=["collapse","compareEndPoints","duplicate","moveToElementText","parentElement","select","setEndPoint","getBoundingClientRect"];function s(t,n){var r=typeof t[n];return r==e||!(r!=A||!t[n])||"unknown"==r}function a(e,t){return!(typeof e[t]!=A||!e[t])}function c(A,e){return typeof A[e]!=t}function l(A){return function(e,t){for(var n=t.length;n--;)if(!A(e,t[n]))return!1;return!0}}var u=l(s),d=l(a),g=l(c);function h(A){return A&&u(A,i)&&g(A,o)}function p(A){return a(A,"body")?A.body:A.getElementsByTagName("body")[0]}var B,f,m={},w=typeof window!=t&&typeof document!=t,C={isHostMethod:s,isHostObject:a,isHostProperty:c,areHostMethods:u,areHostObjects:d,areHostProperties:g,isTextRange:h,getBody:p,forEach:[].forEach?function(A,e){A.forEach(e)}:function(A,e){for(var t=0,n=A.length;te?(r.node=n,r.offset-=e):r.node==A.parentNode&&r.offset>l(A)&&++r.offset;return n}function C(A){if(9==A.nodeType)return A;if(typeof A.ownerDocument!=t)return A.ownerDocument;if(typeof A.document!=t)return A.document;if(A.parentNode)return C(A.parentNode);throw e.createError("getDocument: no document found for node")}function Q(A){var n=C(A);if(typeof n.defaultView!=t)return n.defaultView;if(typeof n.parentWindow!=t)return n.parentWindow;throw e.createError("Cannot get a window object for node")}function y(A){if(typeof A.contentDocument!=t)return A.contentDocument;if(typeof A.contentWindow!=t)return A.contentWindow.document;throw e.createError("getIframeDocument: No Document object found for iframe element")}function E(A){if(typeof A.contentWindow!=t)return A.contentWindow;if(typeof A.contentDocument!=t)return A.contentDocument.defaultView;throw e.createError("getIframeWindow: No Window object found for iframe element")}function v(A){return A&&n.isHostMethod(A,"setTimeout")&&n.isHostObject(A,"document")}function U(A,e,t){var r;if(A?n.isHostProperty(A,"nodeType")?r=1==A.nodeType&&"iframe"==A.tagName.toLowerCase()?y(A):C(A):v(A)&&(r=A.document):r=document,!r)throw e.createError(t+"(): Parameter must be a Window object or DOM node");return r}function F(A){for(var e;e=A.parentNode;)A=e;return A}function b(A,t,n,r){var o,i,s,a,c;if(A==n)return t===r?0:t[index:"+l(A)+",length:"+A.childNodes.length+"]["+(A.innerHTML||"[innerHTML not supported]").slice(0,25)+"]"}return A.nodeName}function x(A){for(var e,t=C(A).createDocumentFragment();e=A.firstChild;)t.appendChild(e);return t}function D(A,e,t){var n=r(A),o=A.createElement("div");o.contentEditable=""+!!t,e&&(o.innerHTML=e);var i=n.firstChild;return i?n.insertBefore(o,i):n.appendChild(o),o}function O(A){return A.parentNode.removeChild(A)}function T(A){this.root=A,this._next=A}function L(A){return new T(A)}function _(A,e){this.node=A,this.offset=e}function R(A){this.code=this[A],this.codeName=A,this.message="DOMException: "+this.codeName}!function(){var e=document.createElement("b");e.innerHTML="1";var t=e.firstChild;e.innerHTML="
",I=S(t),A.features.crashyTextNodes=I}(),typeof window.getComputedStyle!=t?H=function(A,e){return Q(A).getComputedStyle(A,null)[e]}:typeof document.documentElement.currentStyle!=t?H=function(A,e){return A.currentStyle?A.currentStyle[e]:""}:e.fail("No means of obtaining computed style properties found"),T.prototype={_current:null,hasNext:function(){return!!this._next},next:function(){var A,e,t=this._current=this._next;if(this._current)if(A=t.firstChild)this._next=A;else{for(e=null;t!==this.root&&!(e=t.nextSibling);)t=t.parentNode;this._next=e}return this._current},detach:function(){this._current=this._next=this.root=null}},_.prototype={equals:function(A){return!!A&&this.node===A.node&&this.offset==A.offset},inspect:function(){return"[DomPosition("+N(this.node)+":"+this.offset+")]"},toString:function(){return this.inspect()}},R.prototype={INDEX_SIZE_ERR:1,HIERARCHY_REQUEST_ERR:3,WRONG_DOCUMENT_ERR:4,NO_MODIFICATION_ALLOWED_ERR:7,NOT_FOUND_ERR:8,NOT_SUPPORTED_ERR:9,INVALID_STATE_ERR:11,INVALID_NODE_TYPE_ERR:24},R.prototype.toString=function(){return this.message},A.dom={arrayContains:s,isHtmlNamespace:a,parentElement:c,getNodeIndex:l,getNodeLength:u,getCommonAncestor:d,isAncestorOf:g,isOrIsAncestorOf:h,getClosestAncestorIn:p,isCharacterDataNode:B,isTextOrCommentNode:f,insertAfter:m,splitDataNode:w,getDocument:C,getWindow:Q,getIframeWindow:E,getIframeDocument:y,getBody:r,isWindow:v,getContentDocument:U,getRootContainer:F,comparePoints:b,isBrokenNode:S,inspectNode:N,getComputedStyleProperty:H,createTestElement:D,removeNode:O,fragmentFromNodeChildren:x,createIterator:L,DomPosition:_},A.DOMException=R})),Q.createCoreModule("DomRange",["DomUtil"],(function(A,e){var t=A.dom,n=A.util,r=t.DomPosition,o=A.DOMException,i=t.isCharacterDataNode,s=t.getNodeIndex,a=t.isOrIsAncestorOf,c=t.getDocument,l=t.comparePoints,u=t.splitDataNode,d=t.getClosestAncestorIn,g=t.getNodeLength,h=t.arrayContains,p=t.getRootContainer,B=A.features.crashyTextNodes,f=t.removeNode;function m(A,e){return 3!=A.nodeType&&(a(A,e.startContainer)||a(A,e.endContainer))}function w(A){return A.document||c(A.startContainer)}function C(A){return p(A.startContainer)}function Q(A){return new r(A.parentNode,s(A))}function y(A){return new r(A.parentNode,s(A)+1)}function E(A,e,n){var r=11==A.nodeType?A.firstChild:A;return i(e)?n==e.length?t.insertAfter(A,e):e.parentNode.insertBefore(A,0==n?e:u(e,n)):n>=e.childNodes.length?e.appendChild(A):e.insertBefore(A,e.childNodes[n]),r}function v(A,e,t){if(j(A),j(e),w(e)!=w(A))throw new o("WRONG_DOCUMENT_ERR");var n=l(A.startContainer,A.startOffset,e.endContainer,e.endOffset),r=l(A.endContainer,A.endOffset,e.startContainer,e.startOffset);return t?n<=0&&r>=0:n<0&&r>0}function U(A){for(var e,t,n,r=w(A.range).createDocumentFragment();t=A.next();){if(e=A.isPartiallySelectedSubtree(),t=t.cloneNode(!e),e&&(n=A.getSubtreeIterator(),t.appendChild(U(n)),n.detach()),10==t.nodeType)throw new o("HIERARCHY_REQUEST_ERR");r.appendChild(t)}return r}function F(A,e,n){var r,o,i,s;for(n=n||{stop:!1};i=A.next();)if(A.isPartiallySelectedSubtree()){if(!1===e(i))return void(n.stop=!0);if(F(s=A.getSubtreeIterator(),e,n),s.detach(),n.stop)return}else for(r=t.createIterator(i);o=r.next();)if(!1===e(o))return void(n.stop=!0)}function b(A){for(var e;A.next();)A.isPartiallySelectedSubtree()?(b(e=A.getSubtreeIterator()),e.detach()):A.remove()}function H(A){for(var e,t,n=w(A.range).createDocumentFragment();e=A.next();){if(A.isPartiallySelectedSubtree()?(e=e.cloneNode(!1),t=A.getSubtreeIterator(),e.appendChild(H(t)),t.detach()):A.remove(),10==e.nodeType)throw new o("HIERARCHY_REQUEST_ERR");n.appendChild(e)}return n}function I(A,e,t){var n,r=!(!e||!e.length),o=!!t;r&&(n=new RegExp("^("+e.join("|")+")$"));var s=[];return F(new N(A,!1),(function(e){if((!r||n.test(e.nodeType))&&(!o||t(e))){var a=A.startContainer;if(e!=a||!i(a)||A.startOffset!=a.length){var c=A.endContainer;e==c&&i(c)&&0==A.endOffset||s.push(e)}}})),s}function S(A){return"["+(void 0===A.getName?"Range":A.getName())+"("+t.inspectNode(A.startContainer)+":"+A.startOffset+", "+t.inspectNode(A.endContainer)+":"+A.endOffset+")]"}function N(A,e){if(this.range=A,this.clonePartiallySelectedTextNodes=e,!A.collapsed){this.sc=A.startContainer,this.so=A.startOffset,this.ec=A.endContainer,this.eo=A.endOffset;var t=A.commonAncestorContainer;this.sc===this.ec&&i(this.sc)?(this.isSingleCharacterDataNode=!0,this._first=this._last=this._next=this.sc):(this._first=this._next=this.sc!==t||i(this.sc)?d(this.sc,t,!0):this.sc.childNodes[this.so],this._last=this.ec!==t||i(this.ec)?d(this.ec,t,!0):this.ec.childNodes[this.eo-1])}}N.prototype={_current:null,_next:null,_first:null,_last:null,isSingleCharacterDataNode:!1,reset:function(){this._current=null,this._next=this._first},hasNext:function(){return!!this._next},next:function(){var A=this._current=this._next;return A&&(this._next=A!==this._last?A.nextSibling:null,i(A)&&this.clonePartiallySelectedTextNodes&&(A===this.ec&&(A=A.cloneNode(!0)).deleteData(this.eo,A.length-this.eo),this._current===this.sc&&(A=A.cloneNode(!0)).deleteData(0,this.so))),A},remove:function(){var A,e,t=this._current;!i(t)||t!==this.sc&&t!==this.ec?t.parentNode&&f(t):(A=t===this.sc?this.so:0)!=(e=t===this.ec?this.eo:t.length)&&t.deleteData(A,e-A)},isPartiallySelectedSubtree:function(){return m(this._current,this.range)},getSubtreeIterator:function(){var A;if(this.isSingleCharacterDataNode)(A=this.range.cloneRange()).collapse(!1);else{A=new fA(w(this.range));var e=this._current,t=e,n=0,r=e,o=g(e);a(e,this.sc)&&(t=this.sc,n=this.so),a(e,this.ec)&&(r=this.ec,o=this.eo),BA(A,t,n,r,o)}return new N(A,this.clonePartiallySelectedTextNodes)},detach:function(){this.range=this._current=this._next=this._first=this._last=this.sc=this.so=this.ec=this.eo=null}};var x=[1,3,4,5,7,8,10],D=[2,9,11],O=[5,6,10,12],T=[1,3,4,5,7,8,10,11],L=[1,3,4,5,7,8];function _(A){return function(e,t){for(var n,r=t?e:e.parentNode;r;){if(n=r.nodeType,h(A,n))return r;r=r.parentNode}return null}}var R=_([9,11]),K=_(O),k=_([6,10,12]),M=_([1]);function V(A,e){if(k(A,e))throw new o("INVALID_NODE_TYPE_ERR")}function P(A,e){if(!h(e,A.nodeType))throw new o("INVALID_NODE_TYPE_ERR")}function G(A,e){if(e<0||e>(i(A)?A.length:A.childNodes.length))throw new o("INDEX_SIZE_ERR")}function W(A,e){if(R(A,!0)!==R(e,!0))throw new o("WRONG_DOCUMENT_ERR")}function X(A){if(K(A,!0))throw new o("NO_MODIFICATION_ALLOWED_ERR")}function J(A,e){if(!A)throw new o(e)}function $(A,e){return e<=(i(A)?A.length:A.childNodes.length)}function Y(A){return!!A.startContainer&&!!A.endContainer&&!(B&&(t.isBrokenNode(A.startContainer)||t.isBrokenNode(A.endContainer)))&&p(A.startContainer)==p(A.endContainer)&&$(A.startContainer,A.startOffset)&&$(A.endContainer,A.endOffset)}function j(A){if(!Y(A))throw new Error("Range error: Range is not valid. This usually happens after DOM mutation. Range: ("+A.inspect()+")")}var Z=document.createElement("style"),z=!1;try{Z.innerHTML="x",z=3==Z.firstChild.nodeType}catch(Em){}A.features.htmlParsingConforms=z;var q=z?function(A){var e=this.startContainer,n=c(e);if(!e)throw new o("INVALID_STATE_ERR");var r=null;return 1==e.nodeType?r=e:i(e)&&(r=t.parentElement(e)),(r=null===r||"HTML"==r.nodeName&&t.isHtmlNamespace(c(r).documentElement)&&t.isHtmlNamespace(r)?n.createElement("body"):r.cloneNode(!1)).innerHTML=A,t.fragmentFromNodeChildren(r)}:function(A){var e=w(this).createElement("body");return e.innerHTML=A,t.fragmentFromNodeChildren(e)};function AA(A,e){j(A);var t=A.startContainer,n=A.startOffset,r=A.endContainer,o=A.endOffset,a=t===r;i(r)&&o>0&&o0&&n=s(t)&&o++,n=0),A.setStartAndEnd(t,n,r,o)}function eA(A){j(A);var e=A.commonAncestorContainer.parentNode.cloneNode(!1);return e.appendChild(A.cloneContents()),e.innerHTML}var tA=["startContainer","startOffset","endContainer","endOffset","collapsed","commonAncestorContainer"],nA=0,rA=1,oA=2,iA=3,sA=0,aA=1,cA=2,lA=3;function uA(A){A.START_TO_START=nA,A.START_TO_END=rA,A.END_TO_END=oA,A.END_TO_START=iA,A.NODE_BEFORE=sA,A.NODE_AFTER=aA,A.NODE_BEFORE_AND_AFTER=cA,A.NODE_INSIDE=lA}function dA(A){uA(A),uA(A.prototype)}function gA(A,e){return function(){j(this);var t,n=this.startContainer,r=this.startOffset,o=this.commonAncestorContainer,i=new N(this,!0);n!==o&&(n=(t=y(d(n,o,!0))).node,r=t.offset),F(i,X),i.reset();var s=A(i);return i.detach(),e(this,n,r,n,r),s}}function hA(e,t){function r(A,e){return function(t){P(t,x),P(p(t),D);var n=(A?Q:y)(t);(e?o:a)(this,n.node,n.offset)}}function o(A,e,n){var r=A.endContainer,o=A.endOffset;e===A.startContainer&&n===A.startOffset||(p(e)==p(r)&&1!=l(e,n,r,o)||(r=e,o=n),t(A,e,n,r,o))}function a(A,e,n){var r=A.startContainer,o=A.startOffset;e===A.endContainer&&n===A.endOffset||(p(e)==p(r)&&-1!=l(e,n,r,o)||(r=e,o=n),t(A,r,o,e,n))}var c=function(){};c.prototype=A.rangePrototype,e.prototype=new c,n.extend(e.prototype,{setStart:function(A,e){V(A,!0),G(A,e),o(this,A,e)},setEnd:function(A,e){V(A,!0),G(A,e),a(this,A,e)},setStartAndEnd:function(){var A=arguments,e=A[0],n=A[1],r=e,o=n;switch(A.length){case 3:o=A[2];break;case 4:r=A[2],o=A[3]}V(e,!0),G(e,n),V(r,!0),G(r,o),t(this,e,n,r,o)},setBoundary:function(A,e,t){this["set"+(t?"Start":"End")](A,e)},setStartBefore:r(!0,!0),setStartAfter:r(!1,!0),setEndBefore:r(!0,!1),setEndAfter:r(!1,!1),collapse:function(A){j(this),A?t(this,this.startContainer,this.startOffset,this.startContainer,this.startOffset):t(this,this.endContainer,this.endOffset,this.endContainer,this.endOffset)},selectNodeContents:function(A){V(A,!0),t(this,A,0,A,g(A))},selectNode:function(A){V(A,!1),P(A,x);var e=Q(A),n=y(A);t(this,e.node,e.offset,n.node,n.offset)},extractContents:gA(H,t),deleteContents:gA(b,t),canSurroundContents:function(){j(this),X(this.startContainer),X(this.endContainer);var A=new N(this,!0),e=A._first&&m(A._first,this)||A._last&&m(A._last,this);return A.detach(),!e},splitBoundaries:function(){AA(this)},splitBoundariesPreservingPositions:function(A){AA(this,A)},normalizeBoundaries:function(){j(this);var A,e=this.startContainer,n=this.startOffset,r=this.endContainer,o=this.endOffset,a=function(A){var e=A.nextSibling;e&&e.nodeType==A.nodeType&&(r=A,o=A.length,A.appendData(e.data),f(e))},c=function(A){var t=A.previousSibling;if(t&&t.nodeType==A.nodeType){e=A;var i=A.length;if(n=t.length,A.insertData(0,t.data),f(t),e==r)o+=n,r=e;else if(r==A.parentNode){var a=s(A);o==a?(r=A,o=i):o>a&&o--}}},l=!0;if(i(r))o==r.length?a(r):0==o&&(A=r.previousSibling)&&A.nodeType==r.nodeType&&(o=A.length,e==r&&(l=!1),A.appendData(r.data),f(r),r=A);else{if(o>0){var u=r.childNodes[o-1];u&&i(u)&&a(u)}l=!this.collapsed}if(l){if(i(e))0==n?c(e):n==e.length&&(A=e.nextSibling)&&A.nodeType==e.nodeType&&(r==A&&(r=e,o+=e.length),e.appendData(A.data),f(A));else if(n0?cA:sA:r>0?aA:lA},comparePoint:function(A,e){return j(this),J(A,"HIERARCHY_REQUEST_ERR"),W(A,this.startContainer),l(A,e,this.startContainer,this.startOffset)<0?-1:l(A,e,this.endContainer,this.endOffset)>0?1:0},createContextualFragment:q,toHtml:function(){return eA(this)},intersectsNode:function(A,e){if(j(this),p(A)!=C(this))return!1;var t=A.parentNode,n=s(A);if(!t)return!0;var r=l(t,n,this.endContainer,this.endOffset),o=l(t,n+1,this.startContainer,this.startOffset);return e?r<=0&&o>=0:r<0&&o>0},isPointInRange:function(A,e){return j(this),J(A,"HIERARCHY_REQUEST_ERR"),W(A,this.startContainer),l(A,e,this.startContainer,this.startOffset)>=0&&l(A,e,this.endContainer,this.endOffset)<=0},intersectsRange:function(A){return v(this,A,!1)},intersectsOrTouchesRange:function(A){return v(this,A,!0)},intersection:function(A){if(this.intersectsRange(A)){var e=l(this.startContainer,this.startOffset,A.startContainer,A.startOffset),t=l(this.endContainer,this.endOffset,A.endContainer,A.endOffset),n=this.cloneRange();return-1==e&&n.setStart(A.startContainer,A.startOffset),1==t&&n.setEnd(A.endContainer,A.endOffset),n}return null},union:function(A){if(this.intersectsOrTouchesRange(A)){var e=this.cloneRange();return-1==l(A.startContainer,A.startOffset,this.startContainer,this.startOffset)&&e.setStart(A.startContainer,A.startOffset),1==l(A.endContainer,A.endOffset,this.endContainer,this.endOffset)&&e.setEnd(A.endContainer,A.endOffset),e}throw new o("Ranges do not intersect")},containsNode:function(A,e){return e?this.intersectsNode(A,!1):this.compareNode(A)==lA},containsNodeContents:function(A){return this.comparePoint(A,0)>=0&&this.comparePoint(A,g(A))<=0},containsRange:function(A){var e=this.intersection(A);return null!==e&&A.equals(e)},containsNodeText:function(A){var e=this.cloneRange();e.selectNode(A);var t=e.getNodes([3]);if(t.length>0){e.setStart(t[0],0);var n=t.pop();return e.setEnd(n,n.length),this.containsRange(e)}return this.containsNodeContents(A)},getNodes:function(A,e){return j(this),I(this,A,e)},getDocument:function(){return w(this)},collapseBefore:function(A){this.setEndBefore(A),this.collapse(!1)},collapseAfter:function(A){this.setStartAfter(A),this.collapse(!0)},getBookmark:function(e){var n=w(this),r=A.createRange(n);e=e||t.getBody(n),r.selectNodeContents(e);var o=this.intersection(r),i=0,s=0;return o&&(r.setEnd(o.startContainer,o.startOffset),s=(i=r.toString().length)+o.toString().length),{start:i,end:s,containerNode:e}},moveToBookmark:function(A){var e=A.containerNode,t=0;this.setStart(e,0),this.collapse(!0);for(var n,r,o,i,s=[e],a=!1,c=!1;!c&&(n=s.pop());)if(3==n.nodeType)r=t+n.length,!a&&A.start>=t&&A.start<=r&&(this.setStart(n,A.start-t),a=!0),a&&A.end>=t&&A.end<=r&&(this.setEnd(n,A.end-t),c=!0),t=r;else for(o=(i=n.childNodes).length;o--;)s.push(i[o])},getName:function(){return"DomRange"},equals:function(A){return fA.rangesEqual(this,A)},isValid:function(){return Y(this)},inspect:function(){return S(this)},detach:function(){}}),hA(fA,BA),n.extend(fA,{rangeProperties:tA,RangeIterator:N,copyComparisonConstants:dA,createPrototypeRange:hA,inspect:S,toHtml:eA,getRangeDocument:w,rangesEqual:function(A,e){return A.startContainer===e.startContainer&&A.startOffset===e.startOffset&&A.endContainer===e.endContainer&&A.endOffset===e.endOffset}}),A.DomRange=fA})),Q.createCoreModule("WrappedRange",["DomRange"],(function(A,e){var t,n,r=A.dom,o=A.util,i=r.DomPosition,s=A.DomRange,a=r.getBody,c=r.getContentDocument,l=r.isCharacterDataNode;if(A.features.implementsDomRange&&function(){var n,i,l=s.rangeProperties;function u(A){for(var e,t=l.length;t--;)A[e=l[t]]=A.nativeRange[e];A.collapsed=A.startContainer===A.endContainer&&A.startOffset===A.endOffset}function d(A,e,t,n,r){var o=A.startContainer!==e||A.startOffset!=t,i=A.endContainer!==n||A.endOffset!=r,s=!A.equals(A.nativeRange);(o||i||s)&&(A.setEnd(n,r),A.setStart(e,t))}t=function(A){if(!A)throw e.createError("WrappedRange: Range must be specified");this.nativeRange=A,u(this)},s.createPrototypeRange(t,d),(n=t.prototype).selectNode=function(A){this.nativeRange.selectNode(A),u(this)},n.cloneContents=function(){return this.nativeRange.cloneContents()},n.surroundContents=function(A){this.nativeRange.surroundContents(A),u(this)},n.collapse=function(A){this.nativeRange.collapse(A),u(this)},n.cloneRange=function(){return new t(this.nativeRange.cloneRange())},n.refresh=function(){u(this)},n.toString=function(){return this.nativeRange.toString()};var g=document.createTextNode("test");a(document).appendChild(g);var h=document.createRange();h.setStart(g,0),h.setEnd(g,0);try{h.setStart(g,1),n.setStart=function(A,e){this.nativeRange.setStart(A,e),u(this)},n.setEnd=function(A,e){this.nativeRange.setEnd(A,e),u(this)},i=function(A){return function(e){this.nativeRange[A](e),u(this)}}}catch(w){n.setStart=function(A,e){try{this.nativeRange.setStart(A,e)}catch(t){this.nativeRange.setEnd(A,e),this.nativeRange.setStart(A,e)}u(this)},n.setEnd=function(A,e){try{this.nativeRange.setEnd(A,e)}catch(t){this.nativeRange.setStart(A,e),this.nativeRange.setEnd(A,e)}u(this)},i=function(A,e){return function(t){try{this.nativeRange[A](t)}catch(n){this.nativeRange[e](t),this.nativeRange[A](t)}u(this)}}}n.setStartBefore=i("setStartBefore","setEndBefore"),n.setStartAfter=i("setStartAfter","setEndAfter"),n.setEndBefore=i("setEndBefore","setStartBefore"),n.setEndAfter=i("setEndAfter","setStartAfter"),n.selectNodeContents=function(A){this.setStartAndEnd(A,0,r.getNodeLength(A))},h.selectNodeContents(g),h.setEnd(g,3);var p=document.createRange();p.selectNodeContents(g),p.setEnd(g,4),p.setStart(g,2),-1==h.compareBoundaryPoints(h.START_TO_END,p)&&1==h.compareBoundaryPoints(h.END_TO_START,p)?n.compareBoundaryPoints=function(A,e){return A==(e=e.nativeRange||e).START_TO_END?A=e.END_TO_START:A==e.END_TO_START&&(A=e.START_TO_END),this.nativeRange.compareBoundaryPoints(A,e)}:n.compareBoundaryPoints=function(A,e){return this.nativeRange.compareBoundaryPoints(A,e.nativeRange||e)};var B=document.createElement("div");B.innerHTML="123";var f=B.firstChild,m=a(document);m.appendChild(B),h.setStart(f,1),h.setEnd(f,2),h.deleteContents(),"13"==f.data&&(n.deleteContents=function(){this.nativeRange.deleteContents(),u(this)},n.extractContents=function(){var A=this.nativeRange.extractContents();return u(this),A}),m.removeChild(B),m=null,o.isHostMethod(h,"createContextualFragment")&&(n.createContextualFragment=function(A){return this.nativeRange.createContextualFragment(A)}),a(document).removeChild(g),n.getName=function(){return"WrappedRange"},A.WrappedRange=t,A.createNativeRange=function(A){return(A=c(A,e,"createNativeRange")).createRange()}}(),A.features.implementsTextRange){var u=function(A){var e=A.parentElement(),t=A.duplicate();t.collapse(!0);var n=t.parentElement();(t=A.duplicate()).collapse(!1);var o=t.parentElement(),i=n==o?n:r.getCommonAncestor(n,o);return i==e?i:r.getCommonAncestor(e,i)},d=function(A){return 0==A.compareEndPoints("StartToEnd",A)},g=function(A,e,t,n,o){var s=A.duplicate();s.collapse(t);var a=s.parentElement();if(r.isOrIsAncestorOf(e,a)||(a=e),!a.canHaveHTML){var c=new i(a.parentNode,r.getNodeIndex(a));return{boundaryPosition:c,nodeInfo:{nodeIndex:c.offset,containerElement:c.node}}}var u=r.getDocument(a).createElement("span");u.parentNode&&r.removeNode(u);for(var d,g,h,p,B,f=t?"StartToStart":"StartToEnd",m=o&&o.containerElement==a?o.nodeIndex:0,w=a.childNodes.length,C=w,Q=C;Q==w?a.appendChild(u):a.insertBefore(u,a.childNodes[Q]),s.moveToElementText(u),0!=(d=s.compareEndPoints(f,A))&&m!=C;){if(-1==d){if(C==m+1)break;m=Q}else C=C==m+1?m:Q;Q=Math.floor((m+C)/2),a.removeChild(u)}if(B=u.nextSibling,-1==d&&B&&l(B)){var y;if(s.setEndPoint(t?"EndToStart":"EndToEnd",A),/[\r\n]/.test(B.data)){var E=s.duplicate(),v=E.text.replace(/\r\n/g,"\r").length;for(y=E.moveStart("character",v);-1==(d=E.compareEndPoints("StartToEnd",E));)y++,E.moveStart("character",1)}else y=s.text.length;p=new i(B,y)}else g=(n||!t)&&u.previousSibling,p=(h=(n||t)&&u.nextSibling)&&l(h)?new i(h,0):g&&l(g)?new i(g,g.data.length):new i(a,r.getNodeIndex(u));return r.removeNode(u),{boundaryPosition:p,nodeInfo:{nodeIndex:Q,containerElement:a}}},h=function(A,e){var t,n,o,i,s=A.offset,c=r.getDocument(A.node),u=a(c).createTextRange(),d=l(A.node);return d?n=(t=A.node).parentNode:(t=s<(i=A.node.childNodes).length?i[s]:null,n=A.node),(o=c.createElement("span")).innerHTML="&#feff;",t?n.insertBefore(o,t):n.appendChild(o),u.moveToElementText(o),u.collapse(!e),n.removeChild(o),d&&u[e?"moveStart":"moveEnd"]("character",s),u};(n=function(A){this.textRange=A,this.refresh()}).prototype=new s(document),n.prototype.refresh=function(){var A,e,t,n=u(this.textRange);d(this.textRange)?e=A=g(this.textRange,n,!0,!0).boundaryPosition:(A=(t=g(this.textRange,n,!0,!1)).boundaryPosition,e=g(this.textRange,n,!1,!1,t.nodeInfo).boundaryPosition),this.setStart(A.node,A.offset),this.setEnd(e.node,e.offset)},n.prototype.getName=function(){return"WrappedTextRange"},s.copyComparisonConstants(n);var p=function(A){if(A.collapsed)return h(new i(A.startContainer,A.startOffset),!0);var e=h(new i(A.startContainer,A.startOffset),!0),t=h(new i(A.endContainer,A.endOffset),!1),n=a(s.getRangeDocument(A)).createTextRange();return n.setEndPoint("StartToStart",e),n.setEndPoint("EndToEnd",t),n};if(n.rangeToTextRange=p,n.prototype.toTextRange=function(){return p(this)},A.WrappedTextRange=n,!A.features.implementsDomRange||A.config.preferTextRange){var B=Function("return this;")();void 0===B.Range&&(B.Range=n),A.createNativeRange=function(A){return A=c(A,e,"createNativeRange"),a(A).createTextRange()},A.WrappedRange=n}}A.createRange=function(t){return t=c(t,e,"createRange"),new A.WrappedRange(A.createNativeRange(t))},A.createRangyRange=function(A){return A=c(A,e,"createRangyRange"),new s(A)},o.createAliasForDeprecatedMethod(A,"createIframeRange","createRange"),o.createAliasForDeprecatedMethod(A,"createIframeRangyRange","createRangyRange"),A.addShimListener((function(e){var t=e.document;void 0===t.createRange&&(t.createRange=function(){return A.createRange(t)}),t=e=null}))})),Q.createCoreModule("WrappedSelection",["DomRange","WrappedRange"],(function(A,e){A.config.checkSelectionRanges=!0;var t,n,r="boolean",o="number",i=A.dom,s=A.util,a=s.isHostMethod,c=A.DomRange,l=A.WrappedRange,u=A.DOMException,d=i.DomPosition,g=A.features,h="Control",p=i.getDocument,B=i.getBody,f=c.rangesEqual;function m(A){return"string"==typeof A?/^backward(s)?$/i.test(A):!!A}function w(A,t){if(A){if(i.isWindow(A))return A;if(A instanceof j)return A.win;var n=i.getContentDocument(A,e,t);return i.getWindow(n)}return window}function C(A){return w(A,"getWinSelection").getSelection()}function Q(A){return w(A,"getDocSelection").document.selection}function y(A){var e=!1;return A.anchorNode&&(e=1==i.comparePoints(A.anchorNode,A.anchorOffset,A.focusNode,A.focusOffset)),e}var E=a(window,"getSelection"),v=s.isHostObject(document,"selection");g.implementsWinGetSelection=E,g.implementsDocSelection=v;var U=v&&(!E||A.config.preferTextRange);if(U)t=Q,A.isSelectionValid=function(A){var e=w(A,"isSelectionValid").document,t=e.selection;return"None"!=t.type||p(t.createRange().parentElement())==e};else{if(!E)return e.fail("Neither document.selection or window.getSelection() detected."),!1;t=C,A.isSelectionValid=function(){return!0}}A.getNativeSelection=t;var F=t();if(!F)return e.fail("Native selection was null (possibly issue 138?)"),!1;var b=A.createNativeRange(document),H=B(document),I=s.areHostProperties(F,["anchorNode","focusNode","anchorOffset","focusOffset"]);g.selectionHasAnchorAndFocus=I;var S=a(F,"extend");g.selectionHasExtend=S;var N=a(F,"setBaseAndExtent");g.selectionHasSetBaseAndExtent=N;var x=typeof F.rangeCount==o;g.selectionHasRangeCount=x;var D=!1,O=!0,T=S?function(e,t){var n=c.getRangeDocument(t),r=A.createRange(n);r.collapseToPoint(t.endContainer,t.endOffset),e.addRange(P(r)),e.extend(t.startContainer,t.startOffset)}:null;s.areHostMethods(F,["addRange","getRangeAt","removeAllRanges"])&&typeof F.rangeCount==o&&g.implementsDomRange&&function(){var e=window.getSelection();if(e){for(var t=e.rangeCount,n=t>1,r=[],o=y(e),s=0;s=36)D=!1;else{var d=l.cloneRange();l.setStart(c,0),d.setEnd(c,3),d.setStart(c,2),e.addRange(l),e.addRange(d),D=2==e.rangeCount}}for(i.removeNode(a),e.removeAllRanges(),s=0;s1)nA(this,A);else{this.removeAllRanges();for(var e=0,t=A.length;e1?nA(this,A):e&&this.addRange(A[0])}}if(tA.getRangeAt=function(A){if(A<0||A>=this.rangeCount)throw new u("INDEX_SIZE_ERR");return this._ranges[A].cloneRange()},U)eA=function(e){var t;A.isSelectionValid(e.win)?t=e.docSelection.createRange():(t=B(e.win.document).createTextRange()).collapse(!0),e.docSelection.type==h?$(e):X(t)?J(e,t):M(e)};else if(a(F,"getRangeAt")&&typeof F.rangeCount==o)eA=function(e){if(R&&v&&e.docSelection.type==h)$(e);else if(e._ranges.length=e.rangeCount=e.nativeSelection.rangeCount,e.rangeCount){for(var t=0,r=e.rangeCount;t(i.isCharacterDataNode(A)?A.length:A.childNodes.length))throw new u("INDEX_SIZE_ERR")}function cA(e){return function(t,n){var r;this.rangeCount?(r=this.getRangeAt(0))["set"+(e?"Start":"End")](t,n):(r=A.createRange(this.win.document)).setStartAndEnd(t,n),this.setSingleRange(r,this.isBackward())}}function lA(A){var e=[],t=new d(A.anchorNode,A.anchorOffset),n=new d(A.focusNode,A.focusOffset),r="function"==typeof A.getName?A.getName():"Selection";if(void 0!==A.rangeCount)for(var o=0,i=A.rangeCount;o0)return A.WrappedTextRange.rangeToTextRange(this.getRangeAt(0));throw e.createError("getNativeTextRange: selection contains no range")}),tA.getName=function(){return"WrappedSelection"},tA.inspect=function(){return lA(this)},tA.detach=function(){q(this.win,"delete"),Z(this)},j.detachAll=function(){q(null,"deleteAll")},j.inspect=lA,j.isDirectionBackward=m,A.Selection=j,A.selectionPrototype=tA,A.addShimListener((function(A){void 0===A.getSelection&&(A.getSelection=function(){return AA(A)}),A=null}))}));var _=!1,R=function(A){_||(_=!0,!Q.initialized&&Q.config.autoInitialize&&H())};return w&&("complete"==document.readyState?R():(s(document,"addEventListener")&&document.addEventListener("DOMContentLoaded",R,!1),f(window,"load",R))),Q}()),wm.exports}const Qm=fm(Cm());var ym;(ym=Cm()).createModule("ClassApplier",["WrappedSelection"],(function(A,e){var t=A.dom,n=t.DomPosition,r=t.arrayContains,o=A.util,i=o.forEach,s="span",a=o.isHostMethod(document,"createElementNS");function c(A,e){for(var t in A)if(A.hasOwnProperty(t)&&!1===e(t,A[t]))return!1;return!0}function l(A){return A.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}function u(A,e){return!!A&&new RegExp("(?:^|\\s)"+e+"(?:\\s|$)").test(A)}function d(A,e){return"object"==typeof A.classList?A.classList.contains(e):u("string"==typeof A.className?A.className:A.getAttribute("class"),e)}function g(A,e){if("object"==typeof A.classList)A.classList.add(e);else{var t="string"==typeof A.className,n=t?A.className:A.getAttribute("class");n?u(n,e)||(n+=" "+e):n=e,t?A.className=n:A.setAttribute("class",n)}}var h=function(){function A(A,e,t){return e&&t?" ":""}return function(e,t){if("object"==typeof e.classList)e.classList.remove(t);else{var n="string"==typeof e.className,r=n?e.className:e.getAttribute("class");r=r.replace(new RegExp("(^|\\s)"+t+"(\\s|$)"),A),n?e.className=r:e.setAttribute("class",r)}}}();function p(A){return"string"==typeof A.className?A.className:A.getAttribute("class")}function B(A){return A&&A.split(/\s+/).sort().join(" ")}function f(A){return B(p(A))}function m(A,e){return f(A)==f(e)}function w(A,e){for(var t=e.split(/\s+/),n=0,r=t.length;nr&&++a,o!=e||i!=t&&i!=t+1||(s=n,a+=r-t),o==e&&i>t+1&&--a,A.node=s,A.offset=a}function y(A,e,t){A.node==e&&A.offset>t&&--A.offset}function E(A,e,n,r){-1==n&&(n=e.childNodes.length);var o=A.parentNode,s=t.getNodeIndex(A);i(r,(function(A){Q(A,o,s,e,n)})),e.childNodes.length==n?e.appendChild(A):e.insertBefore(A,e.childNodes[n])}function v(A,e){var n=A.parentNode,r=t.getNodeIndex(A);i(e,(function(A){y(A,n,r)})),t.removeNode(A)}function U(A,e,t,n,r){for(var o,i=[];o=A.firstChild;)E(o,e,t++,r),i.push(o);return v(A,r),i}function F(A,e){return U(A,A.parentNode,t.getNodeIndex(A),!0,e)}function b(A,e){var t=A.cloneRange();t.selectNodeContents(e);var n=t.intersection(A);return""!=(n?n.toString():"")}function H(A){for(var e,t=A.getNodes([3]),n=0;(e=t[n])&&!b(A,e);)++n;for(var r=t.length-1;(e=t[r])&&!b(A,e);)--r;return t.slice(n,r+1)}function I(A,e){if(A.attributes.length!=e.attributes.length)return!1;for(var t,n,r,o=0,i=A.attributes.length;o0&&e1){var r,o=t.getNodeIndex(n),s=[],a=0;i(e,(function(c,l){r=c.parentNode,l>0&&(r.removeChild(c),r.hasChildNodes()||t.removeNode(r),A&&i(A,(function(A){A.node==c&&(A.node=n,A.offset+=a),A.node==r&&A.offset>o&&(--A.offset,A.offset==o+1&&lA.start},isContiguousWith:function(A){return this.start==A.end||this.end==A.start},union:function(A){return new h(Math.min(this.start,A.start),Math.max(this.end,A.end))},intersection:function(A){return new h(Math.max(this.start,A.start),Math.min(this.end,A.end))},getComplements:function(A){var e=[];if(this.start>=A.start){if(this.end<=A.end)return[];e.push(new h(A.end,this.end))}else e.push(new h(this.start,Math.min(this.end,A.start))),this.end>A.end&&e.push(new h(A.end,this.end));return e},toString:function(){return"[CharacterRange("+this.start+", "+this.end+")]"}},h.fromCharacterRange=function(A){return new h(A.start,A.end)};var p={rangeToCharacterRange:function(A,e){var t=A.getBookmark(e);return new h(t.start,t.end)},characterRangeToRange:function(e,t,n){var r=A.createRange(e);return r.moveToBookmark({start:t.start,end:t.end,containerNode:n}),r},serializeSelection:function(A,e){for(var t=A.getAllRanges(),n=[],r=1==t.length&&A.isBackward(),o=0,i=t.length;o0},serialize:function(A){var e,t,n,r,s=this,c=s.highlights;return c.sort(a),e=(A=o(A,{serializeHighlightText:!1,type:s.converter.type})).type,(n=e!=s.converter.type)&&(r=g(e)),t=["type:"+e],i(c,(function(e){var o,i=e.characterRange;n&&(o=e.getContainerElement(),i=r.rangeToCharacterRange(s.converter.characterRangeToRange(s.doc,i,o),o));var a=[i.start,i.end,e.id,e.classApplier.className,e.containerElementId];A.serializeHighlightText&&a.push(e.getText()),t.push(a.join("$"))})),t.join("|")},deserialize:function(A){var e,t,n,r,o,i,s,a,l=A.split("|"),u=[],d=l[0],p=!1;if(!d||!(e=/^type:(\w+)$/.exec(d)))throw new Error("Serialized highlights are invalid.");(t=e[1])!=this.converter.type&&(n=g(t),p=!0),l.shift();for(var f,m=l.length;m-- >0;){if(i=new h(+(f=l[m].split("$"))[0],+f[1]),s=f[4]||null,p&&(a=c(this.doc,s),i=this.converter.rangeToCharacterRange(n.characterRangeToRange(this.doc,i,a),a)),!(r=this.classAppliers[f[3]]))throw new Error("No class applier found for class '"+f[3]+"'");(o=new B(this.doc,i,r,this.converter,parseInt(f[2]),s)).apply(),u.push(o)}this.highlights=u}},A.Highlighter=f,A.createHighlighter=function(A,e){return new f(A,e)}})),A}(Cm())}({exports:{}});!function(A){A.exports=function(A){return A.createModule("Serializer",["WrappedSelection"],(function(A,e){var t="undefined",n=A.util;typeof encodeURIComponent!=t&&typeof decodeURIComponent!=t||e.fail("encodeURIComponent and/or decodeURIComponent method is missing");var r=function(){function A(A){for(var e,t=[],n=0,r=A.length;n>6|192,63&e|128):t.push(e>>12|224,e>>6&63|128,63&e|128);return t}var e=null;function t(){for(var A,e,t=[],n=0;n<256;++n){for(e=n,A=8;A--;)1&~e?e>>>=1:e=e>>>1^3988292384;t[n]=e>>>0}return t}function n(){return e||(e=t()),e}return function(e){for(var t=A(e),r=-1,o=n(),i=0,s=t.length;i>>8^o[255&(r^t[i])];return(-1^r)>>>0}}(),o=A.dom;function i(A){return A.replace(//g,">")}function s(A,e){e=e||[];var t=A.nodeType,n=A.childNodes,r=n.length,o=[t,A.nodeName,r].join(":"),a="",c="";switch(t){case 3:a=i(A.nodeValue);break;case 8:a="\x3c!--"+i(A.nodeValue)+"--\x3e";break;default:a="<"+o+">",c=""}a&&e.push(a);for(var l=0;la&&o(a,i,!1),e.includeTrailingSpace)for(;B.test(A[s]);)++s;o(i,s,!0),a=s}return a1

",!0),n=t.firstChild,(r=A.getSelection()).collapse(n.lastChild,2),r.setStart(n.firstChild,0),t.innerHTML="1
",r.collapse(t,2),r.setStart(t.firstChild,0),w=1==(""+r).length,t.innerHTML="1

1

",r.collapse(t,2),r.setStart(t.firstChild,0),C=1==(""+r).length,a.removeNode(t),r.removeAllRanges();var v={includeBlockContentTrailingSpace:!0,includeSpaceBeforeBr:!0,includeSpaceBeforeBlock:!0,includePreLineTrailingSpace:!0,ignoreCharacters:""};function U(A){var e=A||"",t="string"==typeof e?e.split(""):e;return t.sort((function(A,e){return A.charCodeAt(0)-e.charCodeAt(0)})),t.join("").replace(/(.)\1+/g,"$1")}var F={includeBlockContentTrailingSpace:!1,includeSpaceBeforeBr:!w,includeSpaceBeforeBlock:!C,includePreLineTrailingSpace:!0},b={en:{wordRegex:/[a-z0-9]+('[a-z0-9]+)*/gi,includeTrailingSpace:!1,tokenizer:Q}},H={caseSensitive:!1,withinRange:null,wholeWordsOnly:!1,wrap:!1,direction:"forward",wordOptions:null,characterOptions:null},I={wordOptions:null,characterOptions:null},S={wordOptions:null,characterOptions:null,trim:!1,trimStart:!0,trimEnd:!0},N={wordOptions:null,characterOptions:null,direction:"forward"};function x(A){var e,t;return A?(e=A.language||f,l(t={},b[e]||b[f]),l(t,A),t):b[f]}function D(A,e){var t=u(A,e);return e.hasOwnProperty("wordOptions")&&(t.wordOptions=x(t.wordOptions)),e.hasOwnProperty("characterOptions")&&(t.characterOptions=u(t.characterOptions,v)),t}var O,T,L,_=a.getComputedStyleProperty;T=document.createElement("table"),(L=d(document)).appendChild(T),O="block"==_(T,"display"),L.removeChild(T);var R={table:"table",caption:"table-caption",colgroup:"table-column-group",col:"table-column",thead:"table-header-group",tbody:"table-row-group",tfoot:"table-footer-group",tr:"table-row",td:"table-cell",th:"table-cell"};function K(A,e){var t=_(A,"display",e),n=A.tagName.toLowerCase();return"block"==t&&O&&R.hasOwnProperty(n)?R[n]:t}function k(A){for(var e=W(A),t=0,n=e.length;t0)if(3==e.nodeType){var i=e.data,s=i.charAt(t-1),a=A.nodeWrapper.getTextNodeInfo(),c=a.spaceRegex;a.collapseSpaces?c.test(s)?t>1&&c.test(i.charAt(t-2))||(a.preLine&&"\n"===i.charAt(t)?(n=" ",r=lA):(n=" ",r=iA)):(n=s,r=rA,o=!0):(n=s,r=oA,o=!0)}else{var l=e.childNodes[t-1];if(l&&1==l.nodeType&&!Z(l)&&("br"==l.tagName.toLowerCase()?(n="\n",A.isBr=!0,r=iA,o=!1):A.checkForTrailingSpace=!0),!n){var u=e.childNodes[t];u&&1==u.nodeType&&!Z(u)&&(A.checkForLeadingSpace=!0)}}A.prepopulatedChar=!0,A.character=n,A.characterType=r,A.isCharInvariant=o}},isDefinitelyNonEmpty:function(){var A=this.characterType;return A==rA||A==oA},resolveLeadingAndTrailingSpaces:function(){if(this.prepopulatedChar||this.prepopulateChar(),this.checkForTrailingSpace){var A=this.session.getNodeWrapper(this.node.childNodes[this.offset-1]).getTrailingSpace();A&&(this.isTrailingSpace=!0,this.character=A,this.characterType=iA),this.checkForTrailingSpace=!1}if(this.checkForLeadingSpace){var e=this.session.getNodeWrapper(this.node.childNodes[this.offset]).getLeadingSpace();e&&(this.isLeadingSpace=!0,this.character=e,this.characterType=iA),this.checkForLeadingSpace=!1}},getPrecedingUncollapsedPosition:function(A){for(var e=this;e=e.previousVisible();)if(""!==e.getCharacter(A))return e;return null},getCharacter:function(A){this.resolveLeadingAndTrailingSpaces();var e=this.character,t=U(A.ignoreCharacters),n=""!==e&&t.indexOf(e)>-1;if(this.isCharInvariant)return n?"":e;var r=["character",A.includeSpaceBeforeBr,A.includeBlockContentTrailingSpace,A.includePreLineTrailingSpace,t].join("_"),o=this.cache.get(r);if(null!==o)return o;var i,s,a="",c=this.characterType==iA,l=!1,u=this;function d(){return l||(s=u.getPrecedingUncollapsedPosition(A),l=!0),s}return c&&(this.type==dA?a="\n":" "==e&&(!d()||s.isTrailingSpace||"\n"==s.character||" "==s.character&&s.characterType==iA)||("\n"==e&&this.isLeadingSpace?d()&&"\n"!=s.character&&(a="\n"):(i=this.nextUncollapsed())&&(i.isBr?this.type=cA:i.isTrailingSpace&&"\n"==i.character?this.type=aA:i.isLeadingSpace&&"\n"==i.character&&(this.type=sA),"\n"==i.character?(this.type!=cA||A.includeSpaceBeforeBr)&&(this.type!=sA||A.includeSpaceBeforeBlock)&&(this.type==aA&&i.isTrailingSpace&&!A.includeBlockContentTrailingSpace||(this.type!=lA||i.type!=rA||A.includePreLineTrailingSpace)&&("\n"==e?i.isTrailingSpace?this.isTrailingSpace||this.isBr&&(i.type=uA,d()&&s.isLeadingSpace&&!s.isTrailingSpace&&"\n"==s.character?i.character="":i.type=dA):a="\n":" "==e&&(a=" "))):a=e))),t.indexOf(a)>-1&&(a=""),this.cache.set(r,a),a},equals:function(A){return!!A&&this.node===A.node&&this.offset===A.offset},inspect:hA,toString:function(){return this.character}};gA.prototype=pA,l(pA,{next:AA("nextPos",(function(A){var e,t,n,r=A.nodeWrapper,o=A.node,i=A.offset,s=r.session;return o?(i==r.getLength()?t=(e=o.parentNode)?r.getNodeIndex()+1:0:r.isCharacterDataNode()?(e=o,t=i+1):(n=o.childNodes[i],s.getNodeWrapper(n).containsPositions()?(e=n,t=0):(e=o,t=i+1)),e?s.getPosition(e,t):null):null})),previous:AA("previous",(function(A){var e,t,n,r=A.nodeWrapper,o=A.node,i=A.offset,s=r.session;return 0==i?t=(e=o.parentNode)?r.getNodeIndex():0:r.isCharacterDataNode()?(e=o,t=i-1):(n=o.childNodes[i-1],s.getNodeWrapper(n).containsPositions()?(e=n,t=a.getNodeLength(n)):(e=o,t=i-1)),e?s.getPosition(e,t):null})),nextVisible:AA("nextVisible",(function(A){var e=A.next();if(!e)return null;var t=e.nodeWrapper,n=e.node,r=e;return t.isCollapsed()&&(r=t.session.getPosition(n.parentNode,t.getNodeIndex()+1)),r})),nextUncollapsed:AA("nextUncollapsed",(function(A){for(var e=A;e=e.nextVisible();)if(e.resolveLeadingAndTrailingSpaces(),""!==e.character)return e;return null})),previousVisible:AA("previousVisible",(function(A){var e=A.previous();if(!e)return null;var t=e.nodeWrapper,n=e.node,r=e;return t.isCollapsed()&&(r=t.session.getPosition(n.parentNode,t.getNodeIndex())),r}))});var BA=null,fA=function(){function A(A){var e=new q;return{get:function(t){var n=e.get(t[A]);if(n)for(var r,o=0;r=n[o++];)if(r.node===t)return r;return null},set:function(t){var n=t.node[A];(e.get(n)||e.set(n,[])).push(t)}}}var e=c.isHostProperty(document.documentElement,"uniqueID");function t(){this.initCaches()}return t.prototype={initCaches:function(){var t;this.elementCache=e?(t=new q,{get:function(A){return t.get(A.uniqueID)},set:function(A){t.set(A.node.uniqueID,A)}}):A("tagName"),this.textNodeCache=A("data"),this.otherNodeCache=A("nodeName")},getNodeWrapper:function(A){var e;switch(A.nodeType){case 1:e=this.elementCache;break;case 3:e=this.textNodeCache;break;default:e=this.otherNodeCache}var t=e.get(A);return t||(t=new eA(A,this),e.set(t)),t},getPosition:function(A,e){return this.getNodeWrapper(A).getPosition(e)},getRangeBoundaryPosition:function(A,e){var t=e?"start":"end";return this.getPosition(A[t+"Container"],A[t+"Offset"])},detach:function(){this.elementCache=this.textNodeCache=this.otherNodeCache=null}},t}();function mA(){return CA(),BA=new fA}function wA(){return BA||mA()}function CA(){BA&&BA.detach(),BA=null}function QA(A,t,n,r){n&&(t?Z(n.node)&&(n=A.previousVisible()):Z(n.node)&&(n=n.nextVisible()));var o=A,i=!1;function s(){var A=null;return t?(A=o,i||(o=o.previousVisible(),i=!o||n&&o.equals(n))):i||(A=o=o.nextVisible(),i=!o||n&&o.equals(n)),i&&(o=null),A}var a,c=!1;return{next:function(){if(c)return c=!1,a;for(var A;A=s();)if(A.getCharacter(r))return a=A,A;return null},rewind:function(){if(!a)throw e.createError("createCharacterIterator: cannot rewind. Only one position can be rewound.");c=!0},dispose:function(){A=n=null}}}l(a,{nextNode:J,previousNode:$});var yA=Array.prototype.indexOf?function(A,e){return A.indexOf(e)}:function(A,e){for(var t=0,n=A.length;t0;)l=E(A.chars.concat(e),t,o);return l.shift()},previousStartToken:function(){for(var A,e;1==u.length&&!(A=u[0]).isWord&&(e=i(!1)).length>0;)u=E(e.reverse().concat(A.chars),t,o);return u.pop()},dispose:function(){n.dispose(),r.dispose(),l=u=null}}}function vA(A,e,t,n,r){var o,a,c,l,u=0,d=A,g=Math.abs(t);if(0!==t){var h=t<0;switch(e){case i:for(a=QA(A,h,null,n);(o=a.next())&&u0){p=B(s,a);break}}else l=!0}else if(-1!=(s=g.indexOf(e))){p=B(s,s+e.length);break}return l&&(p=B(s,a)),d.dispose(),p}function IA(A){return function(){var e=!!BA,t=[wA()].concat(c.toArray(arguments)),n=A.apply(this,t);return e||CA(),n}}function SA(A,e){return IA((function(t,n,r,s){typeof r==o&&(r=n,n=i),s=D(s,I);var a=A;e&&(a=r>=0,this.collapse(!a));var c=vA(t.getRangeBoundaryPosition(this,a),n,r,s.characterOptions,s.wordOptions),l=c.position;return this[a?"setStart":"setEnd"](l.node,l.offset),c.unitsMoved}))}function NA(A){return IA((function(e,t){for(var n,r=UA(e,this,t=u(t,v),!A),o=0;(n=r.next())&&p.test(n.character);)++o;r.dispose();var i=o>0;return i&&this[A?"moveStart":"moveEnd"]("character",A?o:-o,{characterOptions:t}),i}))}function xA(A){return IA((function(e,t){var n=!1;return this.changeEachRange((function(e){n=e[A](t)||n})),n}))}l(A.rangePrototype,{moveStart:SA(!0,!1),moveEnd:SA(!1,!1),move:SA(!0,!0),trimStart:NA(!0),trimEnd:NA(!1),trim:IA((function(A,e){var t=this.trimStart(e),n=this.trimEnd(e);return t||n})),expand:IA((function(A,e,t){var n=!1,r=(t=D(t,S)).characterOptions;if(e||(e=i),e==s){var o,a,c=t.wordOptions,l=A.getRangeBoundaryPosition(this,!0),u=A.getRangeBoundaryPosition(this,!1),d=EA(l,r,c).nextEndToken(),g=d.chars[0].previousVisible();return a=(o=this.collapsed?d:EA(u,r,c).previousStartToken()).chars[o.chars.length-1],g.equals(l)||(this.setStart(g.node,g.offset),n=!0),a&&!a.equals(u)&&(this.setEnd(a.node,a.offset),n=!0),t.trim&&(t.trimStart&&(n=this.trimStart(r)||n),t.trimEnd&&(n=this.trimEnd(r)||n)),n}return this.moveEnd(i,1,t)})),text:IA((function(A,e){return this.collapsed?"":FA(A,this,u(e,v)).join("")})),selectCharacters:IA((function(A,e,t,n,r){var o={characterOptions:r};e||(e=d(this.getDocument())),this.selectNodeContents(e),this.collapse(!0),this.moveStart("character",t,o),this.collapse(!0),this.moveEnd("character",n-t,o)})),toCharacterRange:IA((function(A,e,t){e||(e=d(this.getDocument()));var n,r=e.parentNode,o=a.getNodeIndex(e),i=-1==a.comparePoints(this.startContainer,this.endContainer,r,o),s=this.cloneRange();return i?(s.setStartAndEnd(this.startContainer,this.startOffset,r,o),n=-s.text(t).length):(s.setStartAndEnd(r,o,this.startContainer,this.startOffset),n=s.text(t).length),{start:n,end:n+this.text(t).length}})),findText:IA((function(e,t,n){(n=D(n,H)).wholeWordsOnly&&(n.wordOptions.includeTrailingSpace=!1);var r=m(n.direction),o=n.withinRange;o||(o=A.createRange()).selectNodeContents(this.getDocument());var i=t,s=!1;"string"==typeof i?n.caseSensitive||(i=i.toLowerCase()):s=!0;var a=e.getRangeBoundaryPosition(this,!r),c=o.comparePoint(a.node,a.offset);-1===c?a=e.getRangeBoundaryPosition(o,!0):1===c&&(a=e.getRangeBoundaryPosition(o,!1));for(var l,u=a,d=!1;;)if(l=HA(u,i,s,o,n)){if(l.valid)return this.setStartAndEnd(l.startPos.node,l.startPos.offset,l.endPos.node,l.endPos.offset),!0;u=r?l.startPos:l.endPos}else{if(!n.wrap||d)return!1;o=o.cloneRange(),u=e.getRangeBoundaryPosition(o,!r),o.setBoundary(a.node,a.offset,r),d=!0}})),pasteHtml:function(A){if(this.deleteContents(),A){var e=this.createContextualFragment(A),t=e.lastChild;this.insertNode(e),this.collapseAfter(t)}}}),l(A.selectionPrototype,{expand:IA((function(A,e,t){this.changeEachRange((function(A){A.expand(e,t)}))})),move:IA((function(A,e,t,n){var r=0;if(this.focusNode){this.collapse(this.focusNode,this.focusOffset);var o=this.getRangeAt(0);n||(n={}),n.characterOptions=u(n.characterOptions,F),r=o.move(e,t,n),this.setSingleRange(o)}return r})),trimStart:xA("trimStart"),trimEnd:xA("trimEnd"),trim:xA("trim"),selectCharacters:IA((function(e,t,n,r,o,i){var s=A.createRange(t);s.selectCharacters(t,n,r,i),this.setSingleRange(s,o)})),saveCharacterRanges:IA((function(A,e,t){for(var n=this.getAllRanges(),r=[],o=1==n.length&&this.isBackward(),i=0,s=n.length;i{const A=document.getElementById("smartcomments-app");if(A)try{const e=function(){const A=sA(!0),e=A.run((()=>Se({})));let t=[],n=[];const r=Fe({install(A){ki(r),r._a=A,A.provide(Mi,r),A.config.globalProperties.$pinia=r,"production"!==Ri.NODE_ENV&&"test"!==Ri.NODE_ENV&&Wi&&ms(A,r),n.forEach((A=>t.push(A))),n=[]},use(A){return this._a?t.push(A):n.push(A),this},_p:t,_a:null,_e:A,_s:new Map,state:e});return"production"!==Ri.NODE_ENV&&"test"!==Ri.NODE_ENV&&Wi&&"undefined"!=typeof Proxy&&r.use(ys),r}(),t=Hi(Bm);t.use(e),Promise.resolve().then((()=>Ks)).then((({useAppStateStore:e})=>{const n=e();if("SmartComments"===mw.config.get("wgCanonicalSpecialPageName"))n.initializeSpecialPageState();else{n.initializeState();"1"===mw.util.getParamValue("scenabled")?n.enableAppState():n.disableAppState()}t.mount(A)})).catch((A=>{mw.log.error("SmartComments: Failed to load store:",A)}))}catch(e){mw.log.error("SmartComments: Failed to initialize:",e)}else mw.log.error("SmartComments: Mount element #smartcomments-app not found.")}))}(); +var nc=function(A,e){return(nc=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(A,e){A.__proto__=e}||function(A,e){for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(A[t]=e[t])})(A,e)};function rc(A,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function t(){this.constructor=A}nc(A,e),A.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}var oc=function(){return oc=Object.assign||function(A){for(var e,t=1,n=arguments.length;t0&&r[r.length-1])||6!==o[0]&&2!==o[0])){i=0;continue}if(3===o[0]&&(!r||o[1]>r[0]&&o[1]=55296&&r<=56319&&t>10),i%1024+56320)),(r+1===t||n.length>16384)&&(o+=String.fromCharCode.apply(String,n),n.length=0)}return o},gc="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",hc="undefined"==typeof Uint8Array?[]:new Uint8Array(256),pc=0;pc<64;pc++)hc[gc.charCodeAt(pc)]=pc;for(var Bc="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",fc="undefined"==typeof Uint8Array?[]:new Uint8Array(256),mc=0;mc<64;mc++)fc[Bc.charCodeAt(mc)]=mc;for(var wc=function(A,e,t){return A.slice?A.slice(e,t):new Uint16Array(Array.prototype.slice.call(A,e,t))},Cc=function(){function A(A,e,t,n,r,o){this.initialValue=A,this.errorValue=e,this.highStart=t,this.highValueIndex=n,this.index=r,this.data=o}return A.prototype.get=function(A){var e;if(A>=0){if(A<55296||A>56319&&A<=65535)return e=((e=this.index[A>>5])<<2)+(31&A),this.data[e];if(A<=65535)return e=((e=this.index[2048+(A-55296>>5)])<<2)+(31&A),this.data[e];if(A>11),e=this.index[e],e+=A>>5&63,e=((e=this.index[e])<<2)+(31&A),this.data[e];if(A<=1114111)return this.data[this.highValueIndex]}return this.errorValue},A}(),Qc="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",yc="undefined"==typeof Uint8Array?[]:new Uint8Array(256),Ec=0;Ec<64;Ec++)yc[Qc.charCodeAt(Ec)]=Ec;var vc,Uc,Fc,bc,Hc,Ic,Sc,Nc,xc=10,Dc=13,Oc=15,Tc=17,Lc=18,_c=19,Rc=20,Kc=21,kc=22,Mc=24,Vc=25,Pc=26,Gc=27,Wc=28,Xc=30,Jc=32,$c=33,Yc=34,jc=35,Zc=37,zc=38,qc=39,Al=40,el=42,tl=[9001,65288],nl="×",rl="÷",ol=(bc=function(A){var e,t,n,r,o,i=.75*A.length,s=A.length,a=0;"="===A[A.length-1]&&(i--,"="===A[A.length-2]&&i--);var c="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8Array&&void 0!==Uint8Array.prototype.slice?new ArrayBuffer(i):new Array(i),l=Array.isArray(c)?c:new Uint8Array(c);for(e=0;e>4,l[a++]=(15&n)<<4|r>>2,l[a++]=(3&r)<<6|63&o;return c}("KwAAAAAAAAAACA4AUD0AADAgAAACAAAAAAAIABAAGABAAEgAUABYAGAAaABgAGgAYgBqAF8AZwBgAGgAcQB5AHUAfQCFAI0AlQCdAKIAqgCyALoAYABoAGAAaABgAGgAwgDKAGAAaADGAM4A0wDbAOEA6QDxAPkAAQEJAQ8BFwF1AH0AHAEkASwBNAE6AUIBQQFJAVEBWQFhAWgBcAF4ATAAgAGGAY4BlQGXAZ8BpwGvAbUBvQHFAc0B0wHbAeMB6wHxAfkBAQIJAvEBEQIZAiECKQIxAjgCQAJGAk4CVgJeAmQCbAJ0AnwCgQKJApECmQKgAqgCsAK4ArwCxAIwAMwC0wLbAjAA4wLrAvMC+AIAAwcDDwMwABcDHQMlAy0DNQN1AD0DQQNJA0kDSQNRA1EDVwNZA1kDdQB1AGEDdQBpA20DdQN1AHsDdQCBA4kDkQN1AHUAmQOhA3UAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AKYDrgN1AHUAtgO+A8YDzgPWAxcD3gPjA+sD8wN1AHUA+wMDBAkEdQANBBUEHQQlBCoEFwMyBDgEYABABBcDSARQBFgEYARoBDAAcAQzAXgEgASIBJAEdQCXBHUAnwSnBK4EtgS6BMIEyAR1AHUAdQB1AHUAdQCVANAEYABgAGAAYABgAGAAYABgANgEYADcBOQEYADsBPQE/AQEBQwFFAUcBSQFLAU0BWQEPAVEBUsFUwVbBWAAYgVgAGoFcgV6BYIFigWRBWAAmQWfBaYFYABgAGAAYABgAKoFYACxBbAFuQW6BcEFwQXHBcEFwQXPBdMF2wXjBeoF8gX6BQIGCgYSBhoGIgYqBjIGOgZgAD4GRgZMBmAAUwZaBmAAYABgAGAAYABgAGAAYABgAGAAYABgAGIGYABpBnAGYABgAGAAYABgAGAAYABgAGAAYAB4Bn8GhQZgAGAAYAB1AHcDFQSLBmAAYABgAJMGdQA9A3UAmwajBqsGqwaVALMGuwbDBjAAywbSBtIG1QbSBtIG0gbSBtIG0gbdBuMG6wbzBvsGAwcLBxMHAwcbByMHJwcsBywHMQcsB9IGOAdAB0gHTgfSBkgHVgfSBtIG0gbSBtIG0gbSBtIG0gbSBiwHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAdgAGAALAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAdbB2MHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsB2kH0gZwB64EdQB1AHUAdQB1AHUAdQB1AHUHfQdgAIUHjQd1AHUAlQedB2AAYAClB6sHYACzB7YHvgfGB3UAzgfWBzMB3gfmB1EB7gf1B/0HlQENAQUIDQh1ABUIHQglCBcDLQg1CD0IRQhNCEEDUwh1AHUAdQBbCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIcAh3CHoIMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIgggwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAALAcsBywHLAcsBywHLAcsBywHLAcsB4oILAcsB44I0gaWCJ4Ipgh1AHUAqgiyCHUAdQB1AHUAdQB1AHUAdQB1AHUAtwh8AXUAvwh1AMUIyQjRCNkI4AjoCHUAdQB1AO4I9gj+CAYJDgkTCS0HGwkjCYIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiAAIAAAAFAAYABgAGIAXwBgAHEAdQBFAJUAogCyAKAAYABgAEIA4ABGANMA4QDxAMEBDwE1AFwBLAE6AQEBUQF4QkhCmEKoQrhCgAHIQsAB0MLAAcABwAHAAeDC6ABoAHDCwMMAAcABwAHAAdDDGMMAAcAB6MM4wwjDWMNow3jDaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAEjDqABWw6bDqABpg6gAaABoAHcDvwOPA+gAaABfA/8DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DpcPAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcAB9cPKwkyCToJMAB1AHUAdQBCCUoJTQl1AFUJXAljCWcJawkwADAAMAAwAHMJdQB2CX4JdQCECYoJjgmWCXUAngkwAGAAYABxAHUApgn3A64JtAl1ALkJdQDACTAAMAAwADAAdQB1AHUAdQB1AHUAdQB1AHUAowYNBMUIMAAwADAAMADICcsJ0wnZCRUE4QkwAOkJ8An4CTAAMAB1AAAKvwh1AAgKDwoXCh8KdQAwACcKLgp1ADYKqAmICT4KRgowADAAdQB1AE4KMAB1AFYKdQBeCnUAZQowADAAMAAwADAAMAAwADAAMAAVBHUAbQowADAAdQC5CXUKMAAwAHwBxAijBogEMgF9CoQKiASMCpQKmgqIBKIKqgquCogEDQG2Cr4KxgrLCjAAMADTCtsKCgHjCusK8Qr5CgELMAAwADAAMAB1AIsECQsRC3UANAEZCzAAMAAwADAAMAB1ACELKQswAHUANAExCzkLdQBBC0kLMABRC1kLMAAwADAAMAAwADAAdQBhCzAAMAAwAGAAYABpC3ELdwt/CzAAMACHC4sLkwubC58Lpwt1AK4Ltgt1APsDMAAwADAAMAAwADAAMAAwAL4LwwvLC9IL1wvdCzAAMADlC+kL8Qv5C/8LSQswADAAMAAwADAAMAAwADAAMAAHDDAAMAAwADAAMAAODBYMHgx1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1ACYMMAAwADAAdQB1AHUALgx1AHUAdQB1AHUAdQA2DDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AD4MdQBGDHUAdQB1AHUAdQB1AEkMdQB1AHUAdQB1AFAMMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQBYDHUAdQB1AF8MMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUA+wMVBGcMMAAwAHwBbwx1AHcMfwyHDI8MMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAYABgAJcMMAAwADAAdQB1AJ8MlQClDDAAMACtDCwHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsB7UMLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AA0EMAC9DDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAsBywHLAcsBywHLAcsBywHLQcwAMEMyAwsBywHLAcsBywHLAcsBywHLAcsBywHzAwwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1ANQM2QzhDDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMABgAGAAYABgAGAAYABgAOkMYADxDGAA+AwADQYNYABhCWAAYAAODTAAMAAwADAAFg1gAGAAHg37AzAAMAAwADAAYABgACYNYAAsDTQNPA1gAEMNPg1LDWAAYABgAGAAYABgAGAAYABgAGAAUg1aDYsGVglhDV0NcQBnDW0NdQ15DWAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAlQCBDZUAiA2PDZcNMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAnw2nDTAAMAAwADAAMAAwAHUArw23DTAAMAAwADAAMAAwADAAMAAwADAAMAB1AL8NMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAB1AHUAdQB1AHUAdQDHDTAAYABgAM8NMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA1w11ANwNMAAwAD0B5A0wADAAMAAwADAAMADsDfQN/A0EDgwOFA4wABsOMAAwADAAMAAwADAAMAAwANIG0gbSBtIG0gbSBtIG0gYjDigOwQUuDsEFMw7SBjoO0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGQg5KDlIOVg7SBtIGXg5lDm0OdQ7SBtIGfQ6EDooOjQ6UDtIGmg6hDtIG0gaoDqwO0ga0DrwO0gZgAGAAYADEDmAAYAAkBtIGzA5gANIOYADaDokO0gbSBt8O5w7SBu8O0gb1DvwO0gZgAGAAxA7SBtIG0gbSBtIGYABgAGAAYAAED2AAsAUMD9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGFA8sBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAccD9IGLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHJA8sBywHLAcsBywHLAccDywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywPLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAc0D9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAccD9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGFA8sBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHPA/SBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gYUD0QPlQCVAJUAMAAwADAAMACVAJUAlQCVAJUAlQCVAEwPMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA//8EAAQABAAEAAQABAAEAAQABAANAAMAAQABAAIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQACgATABcAHgAbABoAHgAXABYAEgAeABsAGAAPABgAHABLAEsASwBLAEsASwBLAEsASwBLABgAGAAeAB4AHgATAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABYAGwASAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAWAA0AEQAeAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAFAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJABYAGgAbABsAGwAeAB0AHQAeAE8AFwAeAA0AHgAeABoAGwBPAE8ADgBQAB0AHQAdAE8ATwAXAE8ATwBPABYAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAFAATwBAAE8ATwBPAEAATwBQAFAATwBQAB4AHgAeAB4AHgAeAB0AHQAdAB0AHgAdAB4ADgBQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgBQAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAkACQAJAAkACQAJAAkABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAFAAHgAeAB4AKwArAFAAUABQAFAAGABQACsAKwArACsAHgAeAFAAHgBQAFAAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUAAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAYAA0AKwArAB4AHgAbACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAB4ABAAEAB4ABAAEABMABAArACsAKwArACsAKwArACsAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAKwArACsAKwBWAFYAVgBWAB4AHgArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AGgAaABoAGAAYAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQAEwAEACsAEwATAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABLAEsASwBLAEsASwBLAEsASwBLABoAGQAZAB4AUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABMAUAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABABQAFAABAAEAB4ABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUAAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAFAABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQAUABQAB4AHgAYABMAUAArACsABAAbABsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAFAABAAEAAQABAAEAFAABAAEAAQAUAAEAAQABAAEAAQAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArACsAHgArAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAUAAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEAA0ADQBLAEsASwBLAEsASwBLAEsASwBLAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUAArACsAKwBQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABABQACsAKwArACsAKwArACsAKwAEACsAKwArACsAUABQACsAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUAAaABoAUABQAFAAUABQAEwAHgAbAFAAHgAEACsAKwAEAAQABAArAFAAUABQAFAAUABQACsAKwArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQACsAUABQACsAKwAEACsABAAEAAQABAAEACsAKwArACsABAAEACsAKwAEAAQABAArACsAKwAEACsAKwArACsAKwArACsAUABQAFAAUAArAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLAAQABABQAFAAUAAEAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAArACsAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAB4AGwArACsAKwArACsAKwArAFAABAAEAAQABAAEAAQAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAKwArACsAKwArAAQABAAEACsAKwArACsAUABQACsAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAB4AUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAAQAUAArAFAAUABQAFAAUABQACsAKwArAFAAUABQACsAUABQAFAAUAArACsAKwBQAFAAKwBQACsAUABQACsAKwArAFAAUAArACsAKwBQAFAAUAArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArAAQABAAEAAQABAArACsAKwAEAAQABAArAAQABAAEAAQAKwArAFAAKwArACsAKwArACsABAArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAHgAeAB4AHgAeAB4AGwAeACsAKwArACsAKwAEAAQABAAEAAQAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAUAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAAEACsAKwArACsAKwArACsABAAEACsAUABQAFAAKwArACsAKwArAFAAUAAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwAOAFAAUABQAFAAUABQAFAAHgBQAAQABAAEAA4AUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAKwArAAQAUAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAAEACsAKwArACsAKwArACsABAAEACsAKwArACsAKwArACsAUAArAFAAUAAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwBQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABABQAB4AKwArACsAKwBQAFAAUAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQABoAUABQAFAAUABQAFAAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQACsAUAArACsAUABQAFAAUABQAFAAUAArACsAKwAEACsAKwArACsABAAEAAQABAAEAAQAKwAEACsABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArAAQABAAeACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAXAAqACoAKgAqACoAKgAqACsAKwArACsAGwBcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAeAEsASwBLAEsASwBLAEsASwBLAEsADQANACsAKwArACsAKwBcAFwAKwBcACsAXABcAFwAXABcACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAXAArAFwAXABcAFwAXABcAFwAXABcAFwAKgBcAFwAKgAqACoAKgAqACoAKgAqACoAXAArACsAXABcAFwAXABcACsAXAArACoAKgAqACoAKgAqACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwBcAFwAXABcAFAADgAOAA4ADgAeAA4ADgAJAA4ADgANAAkAEwATABMAEwATAAkAHgATAB4AHgAeAAQABAAeAB4AHgAeAB4AHgBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQAFAADQAEAB4ABAAeAAQAFgARABYAEQAEAAQAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAAQABAAEAAQADQAEAAQAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAA0ADQAeAB4AHgAeAB4AHgAEAB4AHgAeAB4AHgAeACsAHgAeAA4ADgANAA4AHgAeAB4AHgAeAAkACQArACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgBcAEsASwBLAEsASwBLAEsASwBLAEsADQANAB4AHgAeAB4AXABcAFwAXABcAFwAKgAqACoAKgBcAFwAXABcACoAKgAqAFwAKgAqACoAXABcACoAKgAqACoAKgAqACoAXABcAFwAKgAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKgAqAFwAKgBLAEsASwBLAEsASwBLAEsASwBLACoAKgAqACoAKgAqAFAAUABQAFAAUABQACsAUAArACsAKwArACsAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgBQAFAAUABQAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAKwBQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsABAAEAAQAHgANAB4AHgAeAB4AHgAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUAArACsADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAWABEAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAA0ADQANAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAANAA0AKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUAArAAQABAArACsAKwArACsAKwArACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqAA0ADQAVAFwADQAeAA0AGwBcACoAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwAeAB4AEwATAA0ADQAOAB4AEwATAB4ABAAEAAQACQArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUAAEAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAHgArACsAKwATABMASwBLAEsASwBLAEsASwBLAEsASwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAXABcAFwAXABcACsAKwArACsAKwArACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAXAArACsAKwAqACoAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsAHgAeAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKwAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKwArAAQASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACoAKgAqACoAKgAqACoAXAAqACoAKgAqACoAKgArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABABQAFAAUABQAFAAUABQACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwANAA0AHgANAA0ADQANAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQAHgAeAB4AHgAeAB4AHgAeAB4AKwArACsABAAEAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwAeAB4AHgAeAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArAA0ADQANAA0ADQBLAEsASwBLAEsASwBLAEsASwBLACsAKwArAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAA0ADQBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUAAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArAAQABAAEAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAAQAUABQAFAAUABQAFAABABQAFAABAAEAAQAUAArACsAKwArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAKwBQACsAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAFAAUABQACsAHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQACsAKwAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQACsAHgAeAB4AHgAeAB4AHgAOAB4AKwANAA0ADQANAA0ADQANAAkADQANAA0ACAAEAAsABAAEAA0ACQANAA0ADAAdAB0AHgAXABcAFgAXABcAFwAWABcAHQAdAB4AHgAUABQAFAANAAEAAQAEAAQABAAEAAQACQAaABoAGgAaABoAGgAaABoAHgAXABcAHQAVABUAHgAeAB4AHgAeAB4AGAAWABEAFQAVABUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ADQAeAA0ADQANAA0AHgANAA0ADQAHAB4AHgAeAB4AKwAEAAQABAAEAAQABAAEAAQABAAEAFAAUAArACsATwBQAFAAUABQAFAAHgAeAB4AFgARAE8AUABPAE8ATwBPAFAAUABQAFAAUAAeAB4AHgAWABEAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArABsAGwAbABsAGwAbABsAGgAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGgAbABsAGwAbABoAGwAbABoAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHgAeAFAAGgAeAB0AHgBQAB4AGgAeAB4AHgAeAB4AHgAeAB4AHgBPAB4AUAAbAB4AHgBQAFAAUABQAFAAHgAeAB4AHQAdAB4AUAAeAFAAHgBQAB4AUABPAFAAUAAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAHgBQAFAAUABQAE8ATwBQAFAAUABQAFAATwBQAFAATwBQAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAFAAUABQAFAATwBPAE8ATwBPAE8ATwBPAE8ATwBQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABPAB4AHgArACsAKwArAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHQAdAB4AHgAeAB0AHQAeAB4AHQAeAB4AHgAdAB4AHQAbABsAHgAdAB4AHgAeAB4AHQAeAB4AHQAdAB0AHQAeAB4AHQAeAB0AHgAdAB0AHQAdAB0AHQAeAB0AHgAeAB4AHgAeAB0AHQAdAB0AHgAeAB4AHgAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeAB0AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAeAB0AHQAdAB0AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAWABEAHgAeAB4AHgAeAB4AHQAeAB4AHgAeAB4AHgAeACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAWABEAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAFAAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeAB4AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AHQAdAB0AHgAeAB0AHgAeAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlAB4AHQAdAB4AHgAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AJQAlAB0AHQAlAB4AJQAlACUAIAAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAeAB4AHgAeAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAdAB0AHQAeAB0AJQAdAB0AHgAdAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAdAB0AHQAdACUAHgAlACUAJQAdACUAJQAdAB0AHQAlACUAHQAdACUAHQAdACUAJQAlAB4AHQAeAB4AHgAeAB0AHQAlAB0AHQAdAB0AHQAdACUAJQAlACUAJQAdACUAJQAgACUAHQAdACUAJQAlACUAJQAlACUAJQAeAB4AHgAlACUAIAAgACAAIAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AFwAXABcAFwAXABcAHgATABMAJQAeAB4AHgAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARABYAEQAWABEAFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAEAAQABAAeAB4AKwArACsAKwArABMADQANAA0AUAATAA0AUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUAANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAA0ADQANAA0ADQANAA0ADQAeAA0AFgANAB4AHgAXABcAHgAeABcAFwAWABEAFgARABYAEQAWABEADQANAA0ADQATAFAADQANAB4ADQANAB4AHgAeAB4AHgAMAAwADQANAA0AHgANAA0AFgANAA0ADQANAA0ADQANAA0AHgANAB4ADQANAB4AHgAeACsAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArAA0AEQARACUAJQBHAFcAVwAWABEAFgARABYAEQAWABEAFgARACUAJQAWABEAFgARABYAEQAWABEAFQAWABEAEQAlAFcAVwBXAFcAVwBXAFcAVwBXAAQABAAEAAQABAAEACUAVwBXAFcAVwA2ACUAJQBXAFcAVwBHAEcAJQAlACUAKwBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBRAFcAUQBXAFEAVwBXAFcAVwBXAFcAUQBXAFcAVwBXAFcAVwBRAFEAKwArAAQABAAVABUARwBHAFcAFQBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBRAFcAVwBXAFcAVwBXAFEAUQBXAFcAVwBXABUAUQBHAEcAVwArACsAKwArACsAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwAlACUAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACsAKwArACsAKwArACsAKwArACsAKwArAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBPAE8ATwBPAE8ATwBPAE8AJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADQATAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABLAEsASwBLAEsASwBLAEsASwBLAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAABAAEAAQABAAeAAQABAAEAAQABAAEAAQABAAEAAQAHgBQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAeAA0ADQANAA0ADQArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAAQAUABQAFAABABQAFAAUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAeAB4AHgAeAAQAKwArACsAUABQAFAAUABQAFAAHgAeABoAHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADgAOABMAEwArACsAKwArACsAKwArACsABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwANAA0ASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUAAeAB4AHgBQAA4AUABQAAQAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArAB4AWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYACsAKwArAAQAHgAeAB4AHgAeAB4ADQANAA0AHgAeAB4AHgArAFAASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArAB4AHgBcAFwAXABcAFwAKgBcAFwAXABcAFwAXABcAFwAXABcAEsASwBLAEsASwBLAEsASwBLAEsAXABcAFwAXABcACsAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAFAAUABQAAQAUABQAFAAUABQAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAHgANAA0ADQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAXAAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAKgAqACoAXABcACoAKgBcAFwAXABcAFwAKgAqAFwAKgBcACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcACoAKgBQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAA0ADQBQAFAAUAAEAAQAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQADQAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAVABVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBUAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVACsAKwArACsAKwArACsAKwArACsAKwArAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAKwArACsAKwBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAKwArACsAKwAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAKwArACsAKwArAFYABABWAFYAVgBWAFYAVgBWAFYAVgBWAB4AVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgArAFYAVgBWAFYAVgArAFYAKwBWAFYAKwBWAFYAKwBWAFYAVgBWAFYAVgBWAFYAVgBWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAEQAWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAaAB4AKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAARABEAGAAYABMAEwAWABEAFAArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACUAJQAlACUAJQAWABEAFgARABYAEQAWABEAFgARABYAEQAlACUAFgARACUAJQAlACUAJQAlACUAEQAlABEAKwAVABUAEwATACUAFgARABYAEQAWABEAJQAlACUAJQAlACUAJQAlACsAJQAbABoAJQArACsAKwArAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAcAKwATACUAJQAbABoAJQAlABYAEQAlACUAEQAlABEAJQBXAFcAVwBXAFcAVwBXAFcAVwBXABUAFQAlACUAJQATACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXABYAJQARACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAWACUAEQAlABYAEQARABYAEQARABUAVwBRAFEAUQBRAFEAUQBRAFEAUQBRAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcARwArACsAVwBXAFcAVwBXAFcAKwArAFcAVwBXAFcAVwBXACsAKwBXAFcAVwBXAFcAVwArACsAVwBXAFcAKwArACsAGgAbACUAJQAlABsAGwArAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAAQAB0AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsADQANAA0AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAAQAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAA0AUABQAFAAUAArACsAKwArAFAAUABQAFAAUABQAFAAUAANAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAKwArAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArACsAKwBQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAUABQAFAAUABQAAQABAAEACsABAAEACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAKwBQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAA0ADQANAA0ADQANAA0ADQAeACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAArACsAKwArAFAAUABQAFAAUAANAA0ADQANAA0ADQAUACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsADQANAA0ADQANAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAAQABAAEAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArAAQABAANACsAKwBQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAB4AHgAeAB4AHgArACsAKwArACsAKwAEAAQABAAEAAQABAAEAA0ADQAeAB4AHgAeAB4AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwAeACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsASwBLAEsASwBLAEsASwBLAEsASwANAA0ADQANAFAABAAEAFAAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAeAA4AUAArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAADQANAB4ADQAEAAQABAAEAB4ABAAEAEsASwBLAEsASwBLAEsASwBLAEsAUAAOAFAADQANAA0AKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAANAA0AHgANAA0AHgAEACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAA0AKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsABAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQACsABAAEAFAABAAEAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAUAArACsAKwArACsAKwAEACsAKwArACsAKwBQAFAAUABQAFAABAAEACsAKwAEAAQABAAEAAQABAAEACsAKwArAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABABQAFAAUABQAA0ADQANAA0AHgBLAEsASwBLAEsASwBLAEsASwBLAA0ADQArAB4ABABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAFAAUAAeAFAAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABAAEAAQADgANAA0AEwATAB4AHgAeAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAFAAUABQAFAABAAEACsAKwAEAA0ADQAeAFAAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKwArACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBcAFwADQANAA0AKgBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAKwArAFAAKwArAFAAUABQAFAAUABQAFAAUAArAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQAKwAEAAQAKwArAAQABAAEAAQAUAAEAFAABAAEAA0ADQANACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABABQAA4AUAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAFAABAAEAAQABAAOAB4ADQANAA0ADQAOAB4ABAArACsAKwArACsAKwArACsAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAA0ADQANAFAADgAOAA4ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAAQABAAEAFAADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAOABMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAArACsAKwAEACsABAAEACsABAAEAAQABAAEAAQABABQAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAKwAEAAQAKwAEAAQABAAEAAQAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAaABoAGgAaAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABIAEgAQwBDAEMAUABQAFAAUABDAFAAUABQAEgAQwBIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABDAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAJAAkACQAJAAkACQAJABYAEQArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwANAA0AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAANACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAA0ADQANAB4AHgAeAB4AHgAeAFAAUABQAFAADQAeACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAA0AHgAeACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAARwBHABUARwAJACsAKwArACsAKwArACsAKwArACsAKwAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUQBRAFEAKwArACsAKwArACsAKwArACsAKwArACsAKwBRAFEAUQBRACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArACsAHgAEAAQADQAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAAQABAAEAAQABAAeAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQAHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQAFAAKwArAFAAKwArAFAAUAArACsAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUAArAFAAUABQAFAAUABQAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAHgAeAFAAUABQAFAAUAArAFAAKwArACsAUABQAFAAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeACsAKwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4ABAAeAB4AHgAeAB4AHgAeAB4AHgAeAAQAHgAeAA0ADQANAA0AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAAQAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArAAQABAAEAAQABAAEAAQAKwAEAAQAKwAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwBQAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArABsAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAB4AHgAeAB4ABAAEAAQABAAEAAQABABQACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArABYAFgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAGgBQAFAAUAAaAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQACsAKwBQACsAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwBQACsAUAArACsAKwArACsAKwBQACsAKwArACsAUAArAFAAKwBQACsAUABQAFAAKwBQAFAAKwBQACsAKwBQACsAUAArAFAAKwBQACsAUAArAFAAUAArAFAAKwArAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUAArAFAAUABQAFAAKwBQACsAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAKwBQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AJQAlACUAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB4AHgAeACUAJQAlAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAlACUAJQAlACUAHgAlACUAJQAlACUAIAAgACAAJQAlACAAJQAlACAAIAAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACEAIQAhACEAIQAlACUAIAAgACUAJQAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAIAAlACUAJQAlACAAIAAgACUAIAAgACAAJQAlACUAJQAlACUAJQAgACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAlAB4AJQAeACUAJQAlACUAJQAgACUAJQAlACUAHgAlAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACAAIAAgACUAJQAlACAAIAAgACAAIAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABcAFwAXABUAFQAVAB4AHgAeAB4AJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAgACUAJQAgACUAJQAlACUAJQAlACUAJQAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAgACAAIAAgACAAIAAgACAAIAAgACUAJQAgACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAlACAAIAAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAgACAAIAAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAA=="),Hc=Array.isArray(bc)?function(A){for(var e=A.length,t=[],n=0;n0;){var i=n[--o];if(Array.isArray(A)?-1!==A.indexOf(i):A===i)for(var s=t;s<=n.length;){var a;if((a=n[++s])===e)return!0;if(a!==xc)break}if(i!==xc)break}return!1},hl=function(A,e){for(var t=A;t>=0;){var n=e[t];if(n!==xc)return n;t--}return 0},pl=function(A,e,t,n,r){if(0===t[n])return nl;var o=n-1;if(Array.isArray(r)&&!0===r[o])return nl;var i=o-1,s=o+1,a=e[o],c=i>=0?e[i]:0,l=e[s];if(2===a&&3===l)return nl;if(-1!==sl.indexOf(a))return"!";if(-1!==sl.indexOf(l))return nl;if(-1!==al.indexOf(l))return nl;if(8===hl(o,e))return rl;if(11===ol.get(A[o]))return nl;if((a===Jc||a===$c)&&11===ol.get(A[s]))return nl;if(7===a||7===l)return nl;if(9===a)return nl;if(-1===[xc,Dc,Oc].indexOf(a)&&9===l)return nl;if(-1!==[Tc,Lc,_c,Mc,Wc].indexOf(l))return nl;if(hl(o,e)===kc)return nl;if(gl(23,kc,o,e))return nl;if(gl([Tc,Lc],Kc,o,e))return nl;if(gl(12,12,o,e))return nl;if(a===xc)return rl;if(23===a||23===l)return nl;if(16===l||16===a)return rl;if(-1!==[Dc,Oc,Kc].indexOf(l)||14===a)return nl;if(36===c&&-1!==dl.indexOf(a))return nl;if(a===Wc&&36===l)return nl;if(l===Rc)return nl;if(-1!==il.indexOf(l)&&a===Vc||-1!==il.indexOf(a)&&l===Vc)return nl;if(a===Gc&&-1!==[Zc,Jc,$c].indexOf(l)||-1!==[Zc,Jc,$c].indexOf(a)&&l===Pc)return nl;if(-1!==il.indexOf(a)&&-1!==cl.indexOf(l)||-1!==cl.indexOf(a)&&-1!==il.indexOf(l))return nl;if(-1!==[Gc,Pc].indexOf(a)&&(l===Vc||-1!==[kc,Oc].indexOf(l)&&e[s+1]===Vc)||-1!==[kc,Oc].indexOf(a)&&l===Vc||a===Vc&&-1!==[Vc,Wc,Mc].indexOf(l))return nl;if(-1!==[Vc,Wc,Mc,Tc,Lc].indexOf(l))for(var u=o;u>=0;){if((d=e[u])===Vc)return nl;if(-1===[Wc,Mc].indexOf(d))break;u--}if(-1!==[Gc,Pc].indexOf(l))for(u=-1!==[Tc,Lc].indexOf(a)?i:o;u>=0;){var d;if((d=e[u])===Vc)return nl;if(-1===[Wc,Mc].indexOf(d))break;u--}if(zc===a&&-1!==[zc,qc,Yc,jc].indexOf(l)||-1!==[qc,Yc].indexOf(a)&&-1!==[qc,Al].indexOf(l)||-1!==[Al,jc].indexOf(a)&&l===Al)return nl;if(-1!==ul.indexOf(a)&&-1!==[Rc,Pc].indexOf(l)||-1!==ul.indexOf(l)&&a===Gc)return nl;if(-1!==il.indexOf(a)&&-1!==il.indexOf(l))return nl;if(a===Mc&&-1!==il.indexOf(l))return nl;if(-1!==il.concat(Vc).indexOf(a)&&l===kc&&-1===tl.indexOf(A[s])||-1!==il.concat(Vc).indexOf(l)&&a===Lc)return nl;if(41===a&&41===l){for(var g=t[o],h=1;g>0&&41===e[--g];)h++;if(h%2!=0)return nl}return a===Jc&&l===$c?nl:rl},Bl=function(A,e){e||(e={lineBreak:"normal",wordBreak:"normal"});var t=function(A,e){void 0===e&&(e="strict");var t=[],n=[],r=[];return A.forEach((function(A,o){var i=ol.get(A);if(i>50?(r.push(!0),i-=50):r.push(!1),-1!==["normal","auto","loose"].indexOf(e)&&-1!==[8208,8211,12316,12448].indexOf(A))return n.push(o),t.push(16);if(4===i||11===i){if(0===o)return n.push(o),t.push(Xc);var s=t[o-1];return-1===ll.indexOf(s)?(n.push(n[o-1]),t.push(s)):(n.push(o),t.push(Xc))}return n.push(o),31===i?t.push("strict"===e?Kc:Zc):i===el||29===i?t.push(Xc):43===i?A>=131072&&A<=196605||A>=196608&&A<=262141?t.push(Zc):t.push(Xc):void t.push(i)})),[n,t,r]}(A,e.lineBreak),n=t[0],r=t[1],o=t[2];return"break-all"!==e.wordBreak&&"break-word"!==e.wordBreak||(r=r.map((function(A){return-1!==[Vc,Xc,el].indexOf(A)?Zc:A}))),[n,r,"keep-all"===e.wordBreak?o.map((function(e,t){return e&&A[t]>=19968&&A[t]<=40959})):void 0]},fl=function(){function A(A,e,t,n){this.codePoints=A,this.required="!"===e,this.start=t,this.end=n}return A.prototype.slice=function(){return dc.apply(void 0,this.codePoints.slice(this.start,this.end))},A}(),ml=45,wl=43,Cl=-1,Ql=function(A){return A>=48&&A<=57},yl=function(A){return Ql(A)||A>=65&&A<=70||A>=97&&A<=102},El=function(A){return 10===A||9===A||32===A},vl=function(A){return function(A){return function(A){return A>=97&&A<=122}(A)||function(A){return A>=65&&A<=90}(A)}(A)||function(A){return A>=128}(A)||95===A},Ul=function(A){return vl(A)||Ql(A)||A===ml},Fl=function(A){return A>=0&&A<=8||11===A||A>=14&&A<=31||127===A},bl=function(A,e){return 92===A&&10!==e},Hl=function(A,e,t){return A===ml?vl(e)||bl(e,t):!!vl(A)||!(92!==A||!bl(A,e))},Il=function(A,e,t){return A===wl||A===ml?!!Ql(e)||46===e&&Ql(t):Ql(46===A?e:A)},Sl=function(A){var e=0,t=1;A[e]!==wl&&A[e]!==ml||(A[e]===ml&&(t=-1),e++);for(var n=[];Ql(A[e]);)n.push(A[e++]);var r=n.length?parseInt(dc.apply(void 0,n),10):0;46===A[e]&&e++;for(var o=[];Ql(A[e]);)o.push(A[e++]);var i=o.length,s=i?parseInt(dc.apply(void 0,o),10):0;69!==A[e]&&101!==A[e]||e++;var a=1;A[e]!==wl&&A[e]!==ml||(A[e]===ml&&(a=-1),e++);for(var c=[];Ql(A[e]);)c.push(A[e++]);var l=c.length?parseInt(dc.apply(void 0,c),10):0;return t*(r+s*Math.pow(10,-i))*Math.pow(10,a*l)},Nl={type:2},xl={type:3},Dl={type:4},Ol={type:13},Tl={type:8},Ll={type:21},_l={type:9},Rl={type:10},Kl={type:11},kl={type:12},Ml={type:14},Vl={type:23},Pl={type:1},Gl={type:25},Wl={type:24},Xl={type:26},Jl={type:27},$l={type:28},Yl={type:29},jl={type:31},Zl={type:32},zl=function(){function A(){this._value=[]}return A.prototype.write=function(A){this._value=this._value.concat(uc(A))},A.prototype.read=function(){for(var A=[],e=this.consumeToken();e!==Zl;)A.push(e),e=this.consumeToken();return A},A.prototype.consumeToken=function(){var A=this.consumeCodePoint();switch(A){case 34:return this.consumeStringToken(34);case 35:var e=this.peekCodePoint(0),t=this.peekCodePoint(1),n=this.peekCodePoint(2);if(Ul(e)||bl(t,n)){var r=Hl(e,t,n)?2:1;return{type:5,value:this.consumeName(),flags:r}}break;case 36:if(61===this.peekCodePoint(0))return this.consumeCodePoint(),Ol;break;case 39:return this.consumeStringToken(39);case 40:return Nl;case 41:return xl;case 42:if(61===this.peekCodePoint(0))return this.consumeCodePoint(),Ml;break;case wl:if(Il(A,this.peekCodePoint(0),this.peekCodePoint(1)))return this.reconsumeCodePoint(A),this.consumeNumericToken();break;case 44:return Dl;case ml:var o=A,i=this.peekCodePoint(0),s=this.peekCodePoint(1);if(Il(o,i,s))return this.reconsumeCodePoint(A),this.consumeNumericToken();if(Hl(o,i,s))return this.reconsumeCodePoint(A),this.consumeIdentLikeToken();if(i===ml&&62===s)return this.consumeCodePoint(),this.consumeCodePoint(),Wl;break;case 46:if(Il(A,this.peekCodePoint(0),this.peekCodePoint(1)))return this.reconsumeCodePoint(A),this.consumeNumericToken();break;case 47:if(42===this.peekCodePoint(0))for(this.consumeCodePoint();;){var a=this.consumeCodePoint();if(42===a&&47===(a=this.consumeCodePoint()))return this.consumeToken();if(a===Cl)return this.consumeToken()}break;case 58:return Xl;case 59:return Jl;case 60:if(33===this.peekCodePoint(0)&&this.peekCodePoint(1)===ml&&this.peekCodePoint(2)===ml)return this.consumeCodePoint(),this.consumeCodePoint(),Gl;break;case 64:var c=this.peekCodePoint(0),l=this.peekCodePoint(1),u=this.peekCodePoint(2);if(Hl(c,l,u))return{type:7,value:this.consumeName()};break;case 91:return $l;case 92:if(bl(A,this.peekCodePoint(0)))return this.reconsumeCodePoint(A),this.consumeIdentLikeToken();break;case 93:return Yl;case 61:if(61===this.peekCodePoint(0))return this.consumeCodePoint(),Tl;break;case 123:return Kl;case 125:return kl;case 117:case 85:var d=this.peekCodePoint(0),g=this.peekCodePoint(1);return d!==wl||!yl(g)&&63!==g||(this.consumeCodePoint(),this.consumeUnicodeRangeToken()),this.reconsumeCodePoint(A),this.consumeIdentLikeToken();case 124:if(61===this.peekCodePoint(0))return this.consumeCodePoint(),_l;if(124===this.peekCodePoint(0))return this.consumeCodePoint(),Ll;break;case 126:if(61===this.peekCodePoint(0))return this.consumeCodePoint(),Rl;break;case Cl:return Zl}return El(A)?(this.consumeWhiteSpace(),jl):Ql(A)?(this.reconsumeCodePoint(A),this.consumeNumericToken()):vl(A)?(this.reconsumeCodePoint(A),this.consumeIdentLikeToken()):{type:6,value:dc(A)}},A.prototype.consumeCodePoint=function(){var A=this._value.shift();return void 0===A?-1:A},A.prototype.reconsumeCodePoint=function(A){this._value.unshift(A)},A.prototype.peekCodePoint=function(A){return A>=this._value.length?-1:this._value[A]},A.prototype.consumeUnicodeRangeToken=function(){for(var A=[],e=this.consumeCodePoint();yl(e)&&A.length<6;)A.push(e),e=this.consumeCodePoint();for(var t=!1;63===e&&A.length<6;)A.push(e),e=this.consumeCodePoint(),t=!0;if(t)return{type:30,start:parseInt(dc.apply(void 0,A.map((function(A){return 63===A?48:A}))),16),end:parseInt(dc.apply(void 0,A.map((function(A){return 63===A?70:A}))),16)};var n=parseInt(dc.apply(void 0,A),16);if(this.peekCodePoint(0)===ml&&yl(this.peekCodePoint(1))){this.consumeCodePoint(),e=this.consumeCodePoint();for(var r=[];yl(e)&&r.length<6;)r.push(e),e=this.consumeCodePoint();return{type:30,start:n,end:parseInt(dc.apply(void 0,r),16)}}return{type:30,start:n,end:n}},A.prototype.consumeIdentLikeToken=function(){var A=this.consumeName();return"url"===A.toLowerCase()&&40===this.peekCodePoint(0)?(this.consumeCodePoint(),this.consumeUrlToken()):40===this.peekCodePoint(0)?(this.consumeCodePoint(),{type:19,value:A}):{type:20,value:A}},A.prototype.consumeUrlToken=function(){var A=[];if(this.consumeWhiteSpace(),this.peekCodePoint(0)===Cl)return{type:22,value:""};var e=this.peekCodePoint(0);if(39===e||34===e){var t=this.consumeStringToken(this.consumeCodePoint());return 0===t.type&&(this.consumeWhiteSpace(),this.peekCodePoint(0)===Cl||41===this.peekCodePoint(0))?(this.consumeCodePoint(),{type:22,value:t.value}):(this.consumeBadUrlRemnants(),Vl)}for(;;){var n=this.consumeCodePoint();if(n===Cl||41===n)return{type:22,value:dc.apply(void 0,A)};if(El(n))return this.consumeWhiteSpace(),this.peekCodePoint(0)===Cl||41===this.peekCodePoint(0)?(this.consumeCodePoint(),{type:22,value:dc.apply(void 0,A)}):(this.consumeBadUrlRemnants(),Vl);if(34===n||39===n||40===n||Fl(n))return this.consumeBadUrlRemnants(),Vl;if(92===n){if(!bl(n,this.peekCodePoint(0)))return this.consumeBadUrlRemnants(),Vl;A.push(this.consumeEscapedCodePoint())}else A.push(n)}},A.prototype.consumeWhiteSpace=function(){for(;El(this.peekCodePoint(0));)this.consumeCodePoint()},A.prototype.consumeBadUrlRemnants=function(){for(;;){var A=this.consumeCodePoint();if(41===A||A===Cl)return;bl(A,this.peekCodePoint(0))&&this.consumeEscapedCodePoint()}},A.prototype.consumeStringSlice=function(A){for(var e="";A>0;){var t=Math.min(5e4,A);e+=dc.apply(void 0,this._value.splice(0,t)),A-=t}return this._value.shift(),e},A.prototype.consumeStringToken=function(A){for(var e="",t=0;;){var n=this._value[t];if(n===Cl||void 0===n||n===A)return{type:0,value:e+=this.consumeStringSlice(t)};if(10===n)return this._value.splice(0,t),Pl;if(92===n){var r=this._value[t+1];r!==Cl&&void 0!==r&&(10===r?(e+=this.consumeStringSlice(t),t=-1,this._value.shift()):bl(n,r)&&(e+=this.consumeStringSlice(t),e+=dc(this.consumeEscapedCodePoint()),t=-1))}t++}},A.prototype.consumeNumber=function(){var A=[],e=4,t=this.peekCodePoint(0);for(t!==wl&&t!==ml||A.push(this.consumeCodePoint());Ql(this.peekCodePoint(0));)A.push(this.consumeCodePoint());t=this.peekCodePoint(0);var n=this.peekCodePoint(1);if(46===t&&Ql(n))for(A.push(this.consumeCodePoint(),this.consumeCodePoint()),e=8;Ql(this.peekCodePoint(0));)A.push(this.consumeCodePoint());t=this.peekCodePoint(0),n=this.peekCodePoint(1);var r=this.peekCodePoint(2);if((69===t||101===t)&&((n===wl||n===ml)&&Ql(r)||Ql(n)))for(A.push(this.consumeCodePoint(),this.consumeCodePoint()),e=8;Ql(this.peekCodePoint(0));)A.push(this.consumeCodePoint());return[Sl(A),e]},A.prototype.consumeNumericToken=function(){var A=this.consumeNumber(),e=A[0],t=A[1],n=this.peekCodePoint(0),r=this.peekCodePoint(1),o=this.peekCodePoint(2);return Hl(n,r,o)?{type:15,number:e,flags:t,unit:this.consumeName()}:37===n?(this.consumeCodePoint(),{type:16,number:e,flags:t}):{type:17,number:e,flags:t}},A.prototype.consumeEscapedCodePoint=function(){var A=this.consumeCodePoint();if(yl(A)){for(var e=dc(A);yl(this.peekCodePoint(0))&&e.length<6;)e+=dc(this.consumeCodePoint());El(this.peekCodePoint(0))&&this.consumeCodePoint();var t=parseInt(e,16);return 0===t||function(A){return A>=55296&&A<=57343}(t)||t>1114111?65533:t}return A===Cl?65533:A},A.prototype.consumeName=function(){for(var A="";;){var e=this.consumeCodePoint();if(Ul(e))A+=dc(e);else{if(!bl(e,this.peekCodePoint(0)))return this.reconsumeCodePoint(e),A;A+=dc(this.consumeEscapedCodePoint())}}},A}(),ql=function(){function A(A){this._tokens=A}return A.create=function(e){var t=new zl;return t.write(e),new A(t.read())},A.parseValue=function(e){return A.create(e).parseComponentValue()},A.parseValues=function(e){return A.create(e).parseComponentValues()},A.prototype.parseComponentValue=function(){for(var A=this.consumeToken();31===A.type;)A=this.consumeToken();if(32===A.type)throw new SyntaxError("Error parsing CSS component value, unexpected EOF");this.reconsumeToken(A);var e=this.consumeComponentValue();do{A=this.consumeToken()}while(31===A.type);if(32===A.type)return e;throw new SyntaxError("Error parsing CSS component value, multiple values found when expecting only one")},A.prototype.parseComponentValues=function(){for(var A=[];;){var e=this.consumeComponentValue();if(32===e.type)return A;A.push(e),A.push()}},A.prototype.consumeComponentValue=function(){var A=this.consumeToken();switch(A.type){case 11:case 28:case 2:return this.consumeSimpleBlock(A.type);case 19:return this.consumeFunction(A)}return A},A.prototype.consumeSimpleBlock=function(A){for(var e={type:A,values:[]},t=this.consumeToken();;){if(32===t.type||au(t,A))return e;this.reconsumeToken(t),e.values.push(this.consumeComponentValue()),t=this.consumeToken()}},A.prototype.consumeFunction=function(A){for(var e={name:A.value,values:[],type:18};;){var t=this.consumeToken();if(32===t.type||3===t.type)return e;this.reconsumeToken(t),e.values.push(this.consumeComponentValue())}},A.prototype.consumeToken=function(){var A=this._tokens.shift();return void 0===A?Zl:A},A.prototype.reconsumeToken=function(A){this._tokens.unshift(A)},A}(),Au=function(A){return 15===A.type},eu=function(A){return 17===A.type},tu=function(A){return 20===A.type},nu=function(A){return 0===A.type},ru=function(A,e){return tu(A)&&A.value===e},ou=function(A){return 31!==A.type},iu=function(A){return 31!==A.type&&4!==A.type},su=function(A){var e=[],t=[];return A.forEach((function(A){if(4===A.type){if(0===t.length)throw new Error("Error parsing function args, zero tokens for arg");return e.push(t),void(t=[])}31!==A.type&&t.push(A)})),t.length&&e.push(t),e},au=function(A,e){return 11===e&&12===A.type||(28===e&&29===A.type||2===e&&3===A.type)},cu=function(A){return 17===A.type||15===A.type},lu=function(A){return 16===A.type||cu(A)},uu=function(A){return A.length>1?[A[0],A[1]]:[A[0]]},du={type:17,number:0,flags:4},gu={type:16,number:50,flags:4},hu={type:16,number:100,flags:4},pu=function(A,e,t){var n=A[0],r=A[1];return[Bu(n,e),Bu(void 0!==r?r:n,t)]},Bu=function(A,e){if(16===A.type)return A.number/100*e;if(Au(A))switch(A.unit){case"rem":case"em":return 16*A.number;default:return A.number}return A.number},fu="grad",mu="turn",wu=function(A,e){if(15===e.type)switch(e.unit){case"deg":return Math.PI*e.number/180;case fu:return Math.PI/200*e.number;case"rad":return e.number;case mu:return 2*Math.PI*e.number}throw new Error("Unsupported angle type")},Cu=function(A){return 15===A.type&&("deg"===A.unit||A.unit===fu||"rad"===A.unit||A.unit===mu)},Qu=function(A){switch(A.filter(tu).map((function(A){return A.value})).join(" ")){case"to bottom right":case"to right bottom":case"left top":case"top left":return[du,du];case"to top":case"bottom":return yu(0);case"to bottom left":case"to left bottom":case"right top":case"top right":return[du,hu];case"to right":case"left":return yu(90);case"to top left":case"to left top":case"right bottom":case"bottom right":return[hu,hu];case"to bottom":case"top":return yu(180);case"to top right":case"to right top":case"left bottom":case"bottom left":return[hu,du];case"to left":case"right":return yu(270)}return 0},yu=function(A){return Math.PI*A/180},Eu=function(A,e){if(18===e.type){var t=Nu[e.name];if(void 0===t)throw new Error('Attempting to parse an unsupported color function "'+e.name+'"');return t(A,e.values)}if(5===e.type){if(3===e.value.length){var n=e.value.substring(0,1),r=e.value.substring(1,2),o=e.value.substring(2,3);return Fu(parseInt(n+n,16),parseInt(r+r,16),parseInt(o+o,16),1)}if(4===e.value.length){n=e.value.substring(0,1),r=e.value.substring(1,2),o=e.value.substring(2,3);var i=e.value.substring(3,4);return Fu(parseInt(n+n,16),parseInt(r+r,16),parseInt(o+o,16),parseInt(i+i,16)/255)}if(6===e.value.length){n=e.value.substring(0,2),r=e.value.substring(2,4),o=e.value.substring(4,6);return Fu(parseInt(n,16),parseInt(r,16),parseInt(o,16),1)}if(8===e.value.length){n=e.value.substring(0,2),r=e.value.substring(2,4),o=e.value.substring(4,6),i=e.value.substring(6,8);return Fu(parseInt(n,16),parseInt(r,16),parseInt(o,16),parseInt(i,16)/255)}}if(20===e.type){var s=Du[e.value.toUpperCase()];if(void 0!==s)return s}return Du.TRANSPARENT},vu=function(A){return!(255&A)},Uu=function(A){var e=255&A,t=255&A>>8,n=255&A>>16,r=255&A>>24;return e<255?"rgba("+r+","+n+","+t+","+e/255+")":"rgb("+r+","+n+","+t+")"},Fu=function(A,e,t,n){return(A<<24|e<<16|t<<8|Math.round(255*n))>>>0},bu=function(A,e){if(17===A.type)return A.number;if(16===A.type){var t=3===e?1:255;return 3===e?A.number/100*t:Math.round(A.number/100*t)}return 0},Hu=function(A,e){var t=e.filter(iu);if(3===t.length){var n=t.map(bu),r=n[0],o=n[1],i=n[2];return Fu(r,o,i,1)}if(4===t.length){var s=t.map(bu),a=(r=s[0],o=s[1],i=s[2],s[3]);return Fu(r,o,i,a)}return 0};function Iu(A,e,t){return t<0&&(t+=1),t>=1&&(t-=1),t<1/6?(e-A)*t*6+A:t<.5?e:t<2/3?6*(e-A)*(2/3-t)+A:A}var Su=function(A,e){var t=e.filter(iu),n=t[0],r=t[1],o=t[2],i=t[3],s=(17===n.type?yu(n.number):wu(A,n))/(2*Math.PI),a=lu(r)?r.number/100:0,c=lu(o)?o.number/100:0,l=void 0!==i&&lu(i)?Bu(i,1):1;if(0===a)return Fu(255*c,255*c,255*c,1);var u=c<=.5?c*(a+1):c+a-c*a,d=2*c-u,g=Iu(d,u,s+1/3),h=Iu(d,u,s),p=Iu(d,u,s-1/3);return Fu(255*g,255*h,255*p,l)},Nu={hsl:Su,hsla:Su,rgb:Hu,rgba:Hu},xu=function(A,e){return Eu(A,ql.create(e).parseComponentValue())},Du={ALICEBLUE:4042850303,ANTIQUEWHITE:4209760255,AQUA:16777215,AQUAMARINE:2147472639,AZURE:4043309055,BEIGE:4126530815,BISQUE:4293182719,BLACK:255,BLANCHEDALMOND:4293643775,BLUE:65535,BLUEVIOLET:2318131967,BROWN:2771004159,BURLYWOOD:3736635391,CADETBLUE:1604231423,CHARTREUSE:2147418367,CHOCOLATE:3530104575,CORAL:4286533887,CORNFLOWERBLUE:1687547391,CORNSILK:4294499583,CRIMSON:3692313855,CYAN:16777215,DARKBLUE:35839,DARKCYAN:9145343,DARKGOLDENROD:3095837695,DARKGRAY:2846468607,DARKGREEN:6553855,DARKGREY:2846468607,DARKKHAKI:3182914559,DARKMAGENTA:2332068863,DARKOLIVEGREEN:1433087999,DARKORANGE:4287365375,DARKORCHID:2570243327,DARKRED:2332033279,DARKSALMON:3918953215,DARKSEAGREEN:2411499519,DARKSLATEBLUE:1211993087,DARKSLATEGRAY:793726975,DARKSLATEGREY:793726975,DARKTURQUOISE:13554175,DARKVIOLET:2483082239,DEEPPINK:4279538687,DEEPSKYBLUE:12582911,DIMGRAY:1768516095,DIMGREY:1768516095,DODGERBLUE:512819199,FIREBRICK:2988581631,FLORALWHITE:4294635775,FORESTGREEN:579543807,FUCHSIA:4278255615,GAINSBORO:3705462015,GHOSTWHITE:4177068031,GOLD:4292280575,GOLDENROD:3668254975,GRAY:2155905279,GREEN:8388863,GREENYELLOW:2919182335,GREY:2155905279,HONEYDEW:4043305215,HOTPINK:4285117695,INDIANRED:3445382399,INDIGO:1258324735,IVORY:4294963455,KHAKI:4041641215,LAVENDER:3873897215,LAVENDERBLUSH:4293981695,LAWNGREEN:2096890111,LEMONCHIFFON:4294626815,LIGHTBLUE:2916673279,LIGHTCORAL:4034953471,LIGHTCYAN:3774873599,LIGHTGOLDENRODYELLOW:4210742015,LIGHTGRAY:3553874943,LIGHTGREEN:2431553791,LIGHTGREY:3553874943,LIGHTPINK:4290167295,LIGHTSALMON:4288707327,LIGHTSEAGREEN:548580095,LIGHTSKYBLUE:2278488831,LIGHTSLATEGRAY:2005441023,LIGHTSLATEGREY:2005441023,LIGHTSTEELBLUE:2965692159,LIGHTYELLOW:4294959359,LIME:16711935,LIMEGREEN:852308735,LINEN:4210091775,MAGENTA:4278255615,MAROON:2147483903,MEDIUMAQUAMARINE:1724754687,MEDIUMBLUE:52735,MEDIUMORCHID:3126187007,MEDIUMPURPLE:2473647103,MEDIUMSEAGREEN:1018393087,MEDIUMSLATEBLUE:2070474495,MEDIUMSPRINGGREEN:16423679,MEDIUMTURQUOISE:1221709055,MEDIUMVIOLETRED:3340076543,MIDNIGHTBLUE:421097727,MINTCREAM:4127193855,MISTYROSE:4293190143,MOCCASIN:4293178879,NAVAJOWHITE:4292783615,NAVY:33023,OLDLACE:4260751103,OLIVE:2155872511,OLIVEDRAB:1804477439,ORANGE:4289003775,ORANGERED:4282712319,ORCHID:3664828159,PALEGOLDENROD:4008225535,PALEGREEN:2566625535,PALETURQUOISE:2951671551,PALEVIOLETRED:3681588223,PAPAYAWHIP:4293907967,PEACHPUFF:4292524543,PERU:3448061951,PINK:4290825215,PLUM:3718307327,POWDERBLUE:2967529215,PURPLE:2147516671,REBECCAPURPLE:1714657791,RED:4278190335,ROSYBROWN:3163525119,ROYALBLUE:1097458175,SADDLEBROWN:2336560127,SALMON:4202722047,SANDYBROWN:4104413439,SEAGREEN:780883967,SEASHELL:4294307583,SIENNA:2689740287,SILVER:3233857791,SKYBLUE:2278484991,SLATEBLUE:1784335871,SLATEGRAY:1887473919,SLATEGREY:1887473919,SNOW:4294638335,SPRINGGREEN:16744447,STEELBLUE:1182971135,TAN:3535047935,TEAL:8421631,THISTLE:3636451583,TOMATO:4284696575,TRANSPARENT:0,TURQUOISE:1088475391,VIOLET:4001558271,WHEAT:4125012991,WHITE:4294967295,WHITESMOKE:4126537215,YELLOW:4294902015,YELLOWGREEN:2597139199},Ou={name:"background-clip",initialValue:"border-box",prefix:!1,type:1,parse:function(A,e){return e.map((function(A){if(tu(A))switch(A.value){case"padding-box":return 1;case"content-box":return 2}return 0}))}},Tu={name:"background-color",initialValue:"transparent",prefix:!1,type:3,format:"color"},Lu=function(A,e){var t=Eu(A,e[0]),n=e[1];return n&&lu(n)?{color:t,stop:n}:{color:t,stop:null}},_u=function(A,e){var t=A[0],n=A[A.length-1];null===t.stop&&(t.stop=du),null===n.stop&&(n.stop=hu);for(var r=[],o=0,i=0;io?r.push(a):r.push(o),o=a}else r.push(null)}var c=null;for(i=0;iA.optimumDistance)?{optimumCorner:e,optimumDistance:s}:A}),{optimumDistance:r?1/0:-1/0,optimumCorner:null}).optimumCorner},Mu=function(A,e){var t=yu(180),n=[];return su(e).forEach((function(e,r){if(0===r){var o=e[0];if(20===o.type&&-1!==["top","left","right","bottom"].indexOf(o.value))return void(t=Qu(e));if(Cu(o))return void(t=(wu(A,o)+yu(270))%yu(360))}var i=Lu(A,e);n.push(i)})),{angle:t,stops:n,type:1}},Vu="closest-side",Pu="farthest-side",Gu="closest-corner",Wu="farthest-corner",Xu="circle",Ju="ellipse",$u="cover",Yu="contain",ju=function(A,e){var t=0,n=3,r=[],o=[];return su(e).forEach((function(e,i){var s=!0;if(0===i?s=e.reduce((function(A,e){if(tu(e))switch(e.value){case"center":return o.push(gu),!1;case"top":case"left":return o.push(du),!1;case"right":case"bottom":return o.push(hu),!1}else if(lu(e)||cu(e))return o.push(e),!1;return A}),s):1===i&&(s=e.reduce((function(A,e){if(tu(e))switch(e.value){case Xu:return t=0,!1;case Ju:return t=1,!1;case Yu:case Vu:return n=0,!1;case Pu:return n=1,!1;case Gu:return n=2,!1;case $u:case Wu:return n=3,!1}else if(cu(e)||lu(e))return Array.isArray(n)||(n=[]),n.push(e),!1;return A}),s)),s){var a=Lu(A,e);r.push(a)}})),{size:n,shape:t,stops:r,position:o,type:2}},Zu=function(A,e){if(22===e.type){var t={url:e.value,type:0};return A.cache.addImage(e.value),t}if(18===e.type){var n=Ad[e.name];if(void 0===n)throw new Error('Attempting to parse an unsupported image function "'+e.name+'"');return n(A,e.values)}throw new Error("Unsupported image type "+e.type)};var zu,qu,Ad={"linear-gradient":function(A,e){var t=yu(180),n=[];return su(e).forEach((function(e,r){if(0===r){var o=e[0];if(20===o.type&&"to"===o.value)return void(t=Qu(e));if(Cu(o))return void(t=wu(A,o))}var i=Lu(A,e);n.push(i)})),{angle:t,stops:n,type:1}},"-moz-linear-gradient":Mu,"-ms-linear-gradient":Mu,"-o-linear-gradient":Mu,"-webkit-linear-gradient":Mu,"radial-gradient":function(A,e){var t=0,n=3,r=[],o=[];return su(e).forEach((function(e,i){var s=!0;if(0===i){var a=!1;s=e.reduce((function(A,e){if(a)if(tu(e))switch(e.value){case"center":return o.push(gu),A;case"top":case"left":return o.push(du),A;case"right":case"bottom":return o.push(hu),A}else(lu(e)||cu(e))&&o.push(e);else if(tu(e))switch(e.value){case Xu:return t=0,!1;case Ju:return t=1,!1;case"at":return a=!0,!1;case Vu:return n=0,!1;case $u:case Pu:return n=1,!1;case Yu:case Gu:return n=2,!1;case Wu:return n=3,!1}else if(cu(e)||lu(e))return Array.isArray(n)||(n=[]),n.push(e),!1;return A}),s)}if(s){var c=Lu(A,e);r.push(c)}})),{size:n,shape:t,stops:r,position:o,type:2}},"-moz-radial-gradient":ju,"-ms-radial-gradient":ju,"-o-radial-gradient":ju,"-webkit-radial-gradient":ju,"-webkit-gradient":function(A,e){var t=yu(180),n=[],r=1;return su(e).forEach((function(e,t){var o=e[0];if(0===t){if(tu(o)&&"linear"===o.value)return void(r=1);if(tu(o)&&"radial"===o.value)return void(r=2)}if(18===o.type)if("from"===o.name){var i=Eu(A,o.values[0]);n.push({stop:du,color:i})}else if("to"===o.name){i=Eu(A,o.values[0]);n.push({stop:hu,color:i})}else if("color-stop"===o.name){var s=o.values.filter(iu);if(2===s.length){i=Eu(A,s[1]);var a=s[0];eu(a)&&n.push({stop:{type:16,number:100*a.number,flags:a.flags},color:i})}}})),1===r?{angle:(t+yu(180))%yu(360),stops:n,type:r}:{size:3,shape:0,stops:n,position:[],type:r}}},ed={name:"background-image",initialValue:"none",type:1,prefix:!1,parse:function(A,e){if(0===e.length)return[];var t=e[0];return 20===t.type&&"none"===t.value?[]:e.filter((function(A){return iu(A)&&function(A){return!(20===A.type&&"none"===A.value||18===A.type&&!Ad[A.name])}(A)})).map((function(e){return Zu(A,e)}))}},td={name:"background-origin",initialValue:"border-box",prefix:!1,type:1,parse:function(A,e){return e.map((function(A){if(tu(A))switch(A.value){case"padding-box":return 1;case"content-box":return 2}return 0}))}},nd={name:"background-position",initialValue:"0% 0%",type:1,prefix:!1,parse:function(A,e){return su(e).map((function(A){return A.filter(lu)})).map(uu)}},rd={name:"background-repeat",initialValue:"repeat",prefix:!1,type:1,parse:function(A,e){return su(e).map((function(A){return A.filter(tu).map((function(A){return A.value})).join(" ")})).map(od)}},od=function(A){switch(A){case"no-repeat":return 1;case"repeat-x":case"repeat no-repeat":return 2;case"repeat-y":case"no-repeat repeat":return 3;default:return 0}};(qu=zu||(zu={})).AUTO="auto",qu.CONTAIN="contain",qu.COVER="cover";var id,sd,ad={name:"background-size",initialValue:"0",prefix:!1,type:1,parse:function(A,e){return su(e).map((function(A){return A.filter(cd)}))}},cd=function(A){return tu(A)||lu(A)},ld=function(A){return{name:"border-"+A+"-color",initialValue:"transparent",prefix:!1,type:3,format:"color"}},ud=ld("top"),dd=ld("right"),gd=ld("bottom"),hd=ld("left"),pd=function(A){return{name:"border-radius-"+A,initialValue:"0 0",prefix:!1,type:1,parse:function(A,e){return uu(e.filter(lu))}}},Bd=pd("top-left"),fd=pd("top-right"),md=pd("bottom-right"),wd=pd("bottom-left"),Cd=function(A){return{name:"border-"+A+"-style",initialValue:"solid",prefix:!1,type:2,parse:function(A,e){switch(e){case"none":return 0;case"dashed":return 2;case"dotted":return 3;case"double":return 4}return 1}}},Qd=Cd("top"),yd=Cd("right"),Ed=Cd("bottom"),vd=Cd("left"),Ud=function(A){return{name:"border-"+A+"-width",initialValue:"0",type:0,prefix:!1,parse:function(A,e){return Au(e)?e.number:0}}},Fd=Ud("top"),bd=Ud("right"),Hd=Ud("bottom"),Id=Ud("left"),Sd={name:"color",initialValue:"transparent",prefix:!1,type:3,format:"color"},Nd={name:"direction",initialValue:"ltr",prefix:!1,type:2,parse:function(A,e){return"rtl"===e?1:0}},xd={name:"display",initialValue:"inline-block",prefix:!1,type:1,parse:function(A,e){return e.filter(tu).reduce((function(A,e){return A|Dd(e.value)}),0)}},Dd=function(A){switch(A){case"block":case"-webkit-box":return 2;case"inline":return 4;case"run-in":return 8;case"flow":return 16;case"flow-root":return 32;case"table":return 64;case"flex":case"-webkit-flex":return 128;case"grid":case"-ms-grid":return 256;case"ruby":return 512;case"subgrid":return 1024;case"list-item":return 2048;case"table-row-group":return 4096;case"table-header-group":return 8192;case"table-footer-group":return 16384;case"table-row":return 32768;case"table-cell":return 65536;case"table-column-group":return 131072;case"table-column":return 262144;case"table-caption":return 524288;case"ruby-base":return 1048576;case"ruby-text":return 2097152;case"ruby-base-container":return 4194304;case"ruby-text-container":return 8388608;case"contents":return 16777216;case"inline-block":return 33554432;case"inline-list-item":return 67108864;case"inline-table":return 134217728;case"inline-flex":return 268435456;case"inline-grid":return 536870912}return 0},Od={name:"float",initialValue:"none",prefix:!1,type:2,parse:function(A,e){switch(e){case"left":return 1;case"right":return 2;case"inline-start":return 3;case"inline-end":return 4}return 0}},Td={name:"letter-spacing",initialValue:"0",prefix:!1,type:0,parse:function(A,e){return 20===e.type&&"normal"===e.value?0:17===e.type||15===e.type?e.number:0}};(sd=id||(id={})).NORMAL="normal",sd.STRICT="strict";var Ld,_d,Rd={name:"line-break",initialValue:"normal",prefix:!1,type:2,parse:function(A,e){return"strict"===e?id.STRICT:id.NORMAL}},Kd={name:"line-height",initialValue:"normal",prefix:!1,type:4},kd=function(A,e){return tu(A)&&"normal"===A.value?1.2*e:17===A.type?e*A.number:lu(A)?Bu(A,e):e},Md={name:"list-style-image",initialValue:"none",type:0,prefix:!1,parse:function(A,e){return 20===e.type&&"none"===e.value?null:Zu(A,e)}},Vd={name:"list-style-position",initialValue:"outside",prefix:!1,type:2,parse:function(A,e){return"inside"===e?0:1}},Pd={name:"list-style-type",initialValue:"none",prefix:!1,type:2,parse:function(A,e){switch(e){case"disc":return 0;case"circle":return 1;case"square":return 2;case"decimal":return 3;case"cjk-decimal":return 4;case"decimal-leading-zero":return 5;case"lower-roman":return 6;case"upper-roman":return 7;case"lower-greek":return 8;case"lower-alpha":return 9;case"upper-alpha":return 10;case"arabic-indic":return 11;case"armenian":return 12;case"bengali":return 13;case"cambodian":return 14;case"cjk-earthly-branch":return 15;case"cjk-heavenly-stem":return 16;case"cjk-ideographic":return 17;case"devanagari":return 18;case"ethiopic-numeric":return 19;case"georgian":return 20;case"gujarati":return 21;case"gurmukhi":case"hebrew":return 22;case"hiragana":return 23;case"hiragana-iroha":return 24;case"japanese-formal":return 25;case"japanese-informal":return 26;case"kannada":return 27;case"katakana":return 28;case"katakana-iroha":return 29;case"khmer":return 30;case"korean-hangul-formal":return 31;case"korean-hanja-formal":return 32;case"korean-hanja-informal":return 33;case"lao":return 34;case"lower-armenian":return 35;case"malayalam":return 36;case"mongolian":return 37;case"myanmar":return 38;case"oriya":return 39;case"persian":return 40;case"simp-chinese-formal":return 41;case"simp-chinese-informal":return 42;case"tamil":return 43;case"telugu":return 44;case"thai":return 45;case"tibetan":return 46;case"trad-chinese-formal":return 47;case"trad-chinese-informal":return 48;case"upper-armenian":return 49;case"disclosure-open":return 50;case"disclosure-closed":return 51;default:return-1}}},Gd=function(A){return{name:"margin-"+A,initialValue:"0",prefix:!1,type:4}},Wd=Gd("top"),Xd=Gd("right"),Jd=Gd("bottom"),$d=Gd("left"),Yd={name:"overflow",initialValue:"visible",prefix:!1,type:1,parse:function(A,e){return e.filter(tu).map((function(A){switch(A.value){case"hidden":return 1;case"scroll":return 2;case"clip":return 3;case"auto":return 4;default:return 0}}))}},jd={name:"overflow-wrap",initialValue:"normal",prefix:!1,type:2,parse:function(A,e){return"break-word"===e?"break-word":"normal"}},Zd=function(A){return{name:"padding-"+A,initialValue:"0",prefix:!1,type:3,format:"length-percentage"}},zd=Zd("top"),qd=Zd("right"),Ag=Zd("bottom"),eg=Zd("left"),tg={name:"text-align",initialValue:"left",prefix:!1,type:2,parse:function(A,e){switch(e){case"right":return 2;case"center":case"justify":return 1;default:return 0}}},ng={name:"position",initialValue:"static",prefix:!1,type:2,parse:function(A,e){switch(e){case"relative":return 1;case"absolute":return 2;case"fixed":return 3;case"sticky":return 4}return 0}},rg={name:"text-shadow",initialValue:"none",type:1,prefix:!1,parse:function(A,e){return 1===e.length&&ru(e[0],"none")?[]:su(e).map((function(e){for(var t={color:Du.TRANSPARENT,offsetX:du,offsetY:du,blur:du},n=0,r=0;r1?1:0],this.overflowWrap=_g(A,jd,e.overflowWrap),this.paddingTop=_g(A,zd,e.paddingTop),this.paddingRight=_g(A,qd,e.paddingRight),this.paddingBottom=_g(A,Ag,e.paddingBottom),this.paddingLeft=_g(A,eg,e.paddingLeft),this.paintOrder=_g(A,Ng,e.paintOrder),this.position=_g(A,ng,e.position),this.textAlign=_g(A,tg,e.textAlign),this.textDecorationColor=_g(A,Bg,null!==(t=e.textDecorationColor)&&void 0!==t?t:e.color),this.textDecorationLine=_g(A,fg,null!==(n=e.textDecorationLine)&&void 0!==n?n:e.textDecoration),this.textShadow=_g(A,rg,e.textShadow),this.textTransform=_g(A,og,e.textTransform),this.transform=_g(A,ig,e.transform),this.transformOrigin=_g(A,lg,e.transformOrigin),this.visibility=_g(A,ug,e.visibility),this.webkitTextStrokeColor=_g(A,xg,e.webkitTextStrokeColor),this.webkitTextStrokeWidth=_g(A,Dg,e.webkitTextStrokeWidth),this.wordBreak=_g(A,dg,e.wordBreak),this.zIndex=_g(A,gg,e.zIndex)}return A.prototype.isVisible=function(){return this.display>0&&this.opacity>0&&0===this.visibility},A.prototype.isTransparent=function(){return vu(this.backgroundColor)},A.prototype.isTransformed=function(){return null!==this.transform},A.prototype.isPositioned=function(){return 0!==this.position},A.prototype.isPositionedWithZIndex=function(){return this.isPositioned()&&!this.zIndex.auto},A.prototype.isFloating=function(){return 0!==this.float},A.prototype.isInlineLevel=function(){return Eg(this.display,4)||Eg(this.display,33554432)||Eg(this.display,268435456)||Eg(this.display,536870912)||Eg(this.display,67108864)||Eg(this.display,134217728)},A}(),Tg=function(){return function(A,e){this.content=_g(A,vg,e.content),this.quotes=_g(A,Hg,e.quotes)}}(),Lg=function(){return function(A,e){this.counterIncrement=_g(A,Ug,e.counterIncrement),this.counterReset=_g(A,Fg,e.counterReset)}}(),_g=function(A,e,t){var n=new zl,r=null!=t?t.toString():e.initialValue;n.write(r);var o=new ql(n.read());switch(e.type){case 2:var i=o.parseComponentValue();return e.parse(A,tu(i)?i.value:e.initialValue);case 0:return e.parse(A,o.parseComponentValue());case 1:return e.parse(A,o.parseComponentValues());case 4:return o.parseComponentValue();case 3:switch(e.format){case"angle":return wu(A,o.parseComponentValue());case"color":return Eu(A,o.parseComponentValue());case"image":return Zu(A,o.parseComponentValue());case"length":var s=o.parseComponentValue();return cu(s)?s:du;case"length-percentage":var a=o.parseComponentValue();return lu(a)?a:du;case"time":return hg(A,o.parseComponentValue())}}},Rg=function(A,e){var t=function(A){switch(A.getAttribute("data-html2canvas-debug")){case"all":return 1;case"clone":return 2;case"parse":return 3;case"render":return 4;default:return 0}}(A);return 1===t||e===t},Kg=function(){return function(A,e){this.context=A,this.textNodes=[],this.elements=[],this.flags=0,Rg(e,3),this.styles=new Og(A,window.getComputedStyle(e,null)),Gh(e)&&(this.styles.animationDuration.some((function(A){return A>0}))&&(e.style.animationDuration="0s"),null!==this.styles.transform&&(e.style.transform="none")),this.bounds=lc(this.context,e),Rg(e,4)&&(this.flags|=16)}}(),kg="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Mg="undefined"==typeof Uint8Array?[]:new Uint8Array(256),Vg=0;Vg<64;Vg++)Mg[kg.charCodeAt(Vg)]=Vg;for(var Pg=function(A,e,t){return A.slice?A.slice(e,t):new Uint16Array(Array.prototype.slice.call(A,e,t))},Gg=function(){function A(A,e,t,n,r,o){this.initialValue=A,this.errorValue=e,this.highStart=t,this.highValueIndex=n,this.index=r,this.data=o}return A.prototype.get=function(A){var e;if(A>=0){if(A<55296||A>56319&&A<=65535)return e=((e=this.index[A>>5])<<2)+(31&A),this.data[e];if(A<=65535)return e=((e=this.index[2048+(A-55296>>5)])<<2)+(31&A),this.data[e];if(A>11),e=this.index[e],e+=A>>5&63,e=((e=this.index[e])<<2)+(31&A),this.data[e];if(A<=1114111)return this.data[this.highValueIndex]}return this.errorValue},A}(),Wg="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Xg="undefined"==typeof Uint8Array?[]:new Uint8Array(256),Jg=0;Jg<64;Jg++)Xg[Wg.charCodeAt(Jg)]=Jg;var $g,Yg,jg=8,Zg=9,zg=11,qg=12,Ah=function(){for(var A=[],e=0;e>10),i%1024+56320)),(r+1===t||n.length>16384)&&(o+=String.fromCharCode.apply(String,n),n.length=0)}return o},eh=function(A){var e=function(A){var e,t,n,r,o,i=.75*A.length,s=A.length,a=0;"="===A[A.length-1]&&(i--,"="===A[A.length-2]&&i--);var c="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8Array&&void 0!==Uint8Array.prototype.slice?new ArrayBuffer(i):new Array(i),l=Array.isArray(c)?c:new Uint8Array(c);for(e=0;e>4,l[a++]=(15&n)<<4|r>>2,l[a++]=(3&r)<<6|63&o;return c}(A),t=Array.isArray(e)?function(A){for(var e=A.length,t=[],n=0;n=55296&&r<=56319&&t=t)return{done:!0,value:null};for(var A=th;ni.x||r.y>i.y;return i=r,0===e||s}));return A.body.removeChild(e),s}(document);return Object.defineProperty(ch,"SUPPORT_WORD_BREAKING",{value:A}),A},get SUPPORT_SVG_DRAWING(){var A=function(A){var e=new Image,t=A.createElement("canvas"),n=t.getContext("2d");if(!n)return!1;e.src="data:image/svg+xml,";try{n.drawImage(e,0,0),t.toDataURL()}catch(Em){return!1}return!0}(document);return Object.defineProperty(ch,"SUPPORT_SVG_DRAWING",{value:A}),A},get SUPPORT_FOREIGNOBJECT_DRAWING(){var A="function"==typeof Array.from&&"function"==typeof window.fetch?function(A){var e=A.createElement("canvas"),t=100;e.width=t,e.height=t;var n=e.getContext("2d");if(!n)return Promise.reject(!1);n.fillStyle="rgb(0, 255, 0)",n.fillRect(0,0,t,t);var r=new Image,o=e.toDataURL();r.src=o;var i=sh(t,t,0,0,r);return n.fillStyle="red",n.fillRect(0,0,t,t),ah(i).then((function(e){n.drawImage(e,0,0);var r=n.getImageData(0,0,t,t).data;n.fillStyle="red",n.fillRect(0,0,t,t);var i=A.createElement("div");return i.style.backgroundImage="url("+o+")",i.style.height=t+"px",ih(r)?ah(sh(t,t,0,0,i)):Promise.reject(!1)})).then((function(A){return n.drawImage(A,0,0),ih(n.getImageData(0,0,t,t).data)})).catch((function(){return!1}))}(document):Promise.resolve(!1);return Object.defineProperty(ch,"SUPPORT_FOREIGNOBJECT_DRAWING",{value:A}),A},get SUPPORT_CORS_IMAGES(){var A=void 0!==(new Image).crossOrigin;return Object.defineProperty(ch,"SUPPORT_CORS_IMAGES",{value:A}),A},get SUPPORT_RESPONSE_TYPE(){var A="string"==typeof(new XMLHttpRequest).responseType;return Object.defineProperty(ch,"SUPPORT_RESPONSE_TYPE",{value:A}),A},get SUPPORT_CORS_XHR(){var A="withCredentials"in new XMLHttpRequest;return Object.defineProperty(ch,"SUPPORT_CORS_XHR",{value:A}),A},get SUPPORT_NATIVE_TEXT_SEGMENTATION(){var A=!("undefined"==typeof Intl||!Intl.Segmenter);return Object.defineProperty(ch,"SUPPORT_NATIVE_TEXT_SEGMENTATION",{value:A}),A}},lh=function(){return function(A,e){this.text=A,this.bounds=e}}(),uh=function(A,e){var t=e.ownerDocument;if(t){var n=t.createElement("html2canvaswrapper");n.appendChild(e.cloneNode(!0));var r=e.parentNode;if(r){r.replaceChild(n,e);var o=lc(A,n);return n.firstChild&&r.replaceChild(n.firstChild,n),o}}return cc.EMPTY},dh=function(A,e,t){var n=A.ownerDocument;if(!n)throw new Error("Node has no owner document");var r=n.createRange();return r.setStart(A,e),r.setEnd(A,e+t),r},gh=function(A){if(ch.SUPPORT_NATIVE_TEXT_SEGMENTATION){var e=new Intl.Segmenter(void 0,{granularity:"grapheme"});return Array.from(e.segment(A)).map((function(A){return A.segment}))}return function(A){for(var e,t=oh(A),n=[];!(e=t.next()).done;)e.value&&n.push(e.value.slice());return n}(A)},hh=function(A,e){return 0!==e.letterSpacing?gh(A):function(A,e){if(ch.SUPPORT_NATIVE_TEXT_SEGMENTATION){var t=new Intl.Segmenter(void 0,{granularity:"word"});return Array.from(t.segment(A)).map((function(A){return A.segment}))}return Bh(A,e)}(A,e)},ph=[32,160,4961,65792,65793,4153,4241],Bh=function(A,e){for(var t,n=function(A,e){var t=uc(A),n=Bl(t,e),r=n[0],o=n[1],i=n[2],s=t.length,a=0,c=0;return{next:function(){if(c>=s)return{done:!0,value:null};for(var A=nl;c0)if(ch.SUPPORT_RANGE_BOUNDS){var r=dh(n,i,e.length).getClientRects();if(r.length>1){var s=gh(e),a=0;s.forEach((function(e){o.push(new lh(e,cc.fromDOMRectList(A,dh(n,a+i,e.length).getClientRects()))),a+=e.length}))}else o.push(new lh(e,cc.fromDOMRectList(A,r)))}else{var c=n.splitText(e.length);o.push(new lh(e,uh(A,n))),n=c}else ch.SUPPORT_RANGE_BOUNDS||(n=n.splitText(e.length));i+=e.length})),o}(A,this.text,t,e)}}(),mh=function(A,e){switch(e){case 1:return A.toLowerCase();case 3:return A.replace(wh,Ch);case 2:return A.toUpperCase();default:return A}},wh=/(^|\s|:|-|\(|\))([a-z])/g,Ch=function(A,e,t){return A.length>0?e+t.toUpperCase():A},Qh=function(A){function e(e,t){var n=A.call(this,e,t)||this;return n.src=t.currentSrc||t.src,n.intrinsicWidth=t.naturalWidth,n.intrinsicHeight=t.naturalHeight,n.context.cache.addImage(n.src),n}return rc(e,A),e}(Kg),yh=function(A){function e(e,t){var n=A.call(this,e,t)||this;return n.canvas=t,n.intrinsicWidth=t.width,n.intrinsicHeight=t.height,n}return rc(e,A),e}(Kg),Eh=function(A){function e(e,t){var n=A.call(this,e,t)||this,r=new XMLSerializer,o=lc(e,t);return t.setAttribute("width",o.width+"px"),t.setAttribute("height",o.height+"px"),n.svg="data:image/svg+xml,"+encodeURIComponent(r.serializeToString(t)),n.intrinsicWidth=t.width.baseVal.value,n.intrinsicHeight=t.height.baseVal.value,n.context.cache.addImage(n.svg),n}return rc(e,A),e}(Kg),vh=function(A){function e(e,t){var n=A.call(this,e,t)||this;return n.value=t.value,n}return rc(e,A),e}(Kg),Uh=function(A){function e(e,t){var n=A.call(this,e,t)||this;return n.start=t.start,n.reversed="boolean"==typeof t.reversed&&!0===t.reversed,n}return rc(e,A),e}(Kg),Fh=[{type:15,flags:0,unit:"px",number:3}],bh=[{type:16,flags:0,number:50}],Hh="checkbox",Ih="radio",Sh="password",Nh=707406591,xh=function(A){function e(e,t){var n,r,o,i=A.call(this,e,t)||this;switch(i.type=t.type.toLowerCase(),i.checked=t.checked,i.value=0===(r=(n=t).type===Sh?new Array(n.value.length+1).join("•"):n.value).length?n.placeholder||"":r,i.type!==Hh&&i.type!==Ih||(i.styles.backgroundColor=3739148031,i.styles.borderTopColor=i.styles.borderRightColor=i.styles.borderBottomColor=i.styles.borderLeftColor=2779096575,i.styles.borderTopWidth=i.styles.borderRightWidth=i.styles.borderBottomWidth=i.styles.borderLeftWidth=1,i.styles.borderTopStyle=i.styles.borderRightStyle=i.styles.borderBottomStyle=i.styles.borderLeftStyle=1,i.styles.backgroundClip=[0],i.styles.backgroundOrigin=[0],i.bounds=(o=i.bounds).width>o.height?new cc(o.left+(o.width-o.height)/2,o.top,o.height,o.height):o.width0)t.textNodes.push(new fh(A,r,t.styles));else if(Ph(r))if(rp(r)&&r.assignedNodes)r.assignedNodes().forEach((function(e){return _h(A,e,t,n)}));else{var i=Rh(A,r);i.styles.isVisible()&&(kh(r,i,n)?i.flags|=4:Mh(i.styles)&&(i.flags|=2),-1!==Lh.indexOf(r.tagName)&&(i.flags|=8),t.elements.push(i),r.slot,r.shadowRoot?_h(A,r.shadowRoot,i,n):tp(r)||Yh(r)||np(r)||_h(A,r,i,n))}},Rh=function(A,e){return qh(e)?new Qh(A,e):Zh(e)?new yh(A,e):Yh(e)?new Eh(A,e):Xh(e)?new vh(A,e):Jh(e)?new Uh(A,e):$h(e)?new xh(A,e):np(e)?new Dh(A,e):tp(e)?new Oh(A,e):Ap(e)?new Th(A,e):new Kg(A,e)},Kh=function(A,e){var t=Rh(A,e);return t.flags|=4,_h(A,e,t,t),t},kh=function(A,e,t){return e.styles.isPositionedWithZIndex()||e.styles.opacity<1||e.styles.isTransformed()||jh(A)&&t.styles.isTransparent()},Mh=function(A){return A.isPositioned()||A.isFloating()},Vh=function(A){return A.nodeType===Node.TEXT_NODE},Ph=function(A){return A.nodeType===Node.ELEMENT_NODE},Gh=function(A){return Ph(A)&&void 0!==A.style&&!Wh(A)},Wh=function(A){return"object"==typeof A.className},Xh=function(A){return"LI"===A.tagName},Jh=function(A){return"OL"===A.tagName},$h=function(A){return"INPUT"===A.tagName},Yh=function(A){return"svg"===A.tagName},jh=function(A){return"BODY"===A.tagName},Zh=function(A){return"CANVAS"===A.tagName},zh=function(A){return"VIDEO"===A.tagName},qh=function(A){return"IMG"===A.tagName},Ap=function(A){return"IFRAME"===A.tagName},ep=function(A){return"STYLE"===A.tagName},tp=function(A){return"TEXTAREA"===A.tagName},np=function(A){return"SELECT"===A.tagName},rp=function(A){return"SLOT"===A.tagName},op=function(A){return A.tagName.indexOf("-")>0},ip=function(){function A(){this.counters={}}return A.prototype.getCounterValue=function(A){var e=this.counters[A];return e&&e.length?e[e.length-1]:1},A.prototype.getCounterValues=function(A){var e=this.counters[A];return e||[]},A.prototype.pop=function(A){var e=this;A.forEach((function(A){return e.counters[A].pop()}))},A.prototype.parse=function(A){var e=this,t=A.counterIncrement,n=A.counterReset,r=!0;null!==t&&t.forEach((function(A){var t=e.counters[A.counter];t&&0!==A.increment&&(r=!1,t.length||t.push(1),t[Math.max(0,t.length-1)]+=A.increment)}));var o=[];return r&&n.forEach((function(A){var t=e.counters[A.counter];o.push(A.counter),t||(t=e.counters[A.counter]=[]),t.push(A.reset)})),o},A}(),sp={integers:[1e3,900,500,400,100,90,50,40,10,9,5,4,1],values:["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"]},ap={integers:[9e3,8e3,7e3,6e3,5e3,4e3,3e3,2e3,1e3,900,800,700,600,500,400,300,200,100,90,80,70,60,50,40,30,20,10,9,8,7,6,5,4,3,2,1],values:["Ք","Փ","Ւ","Ց","Ր","Տ","Վ","Ս","Ռ","Ջ","Պ","Չ","Ո","Շ","Ն","Յ","Մ","Ճ","Ղ","Ձ","Հ","Կ","Ծ","Խ","Լ","Ի","Ժ","Թ","Ը","Է","Զ","Ե","Դ","Գ","Բ","Ա"]},cp={integers:[1e4,9e3,8e3,7e3,6e3,5e3,4e3,3e3,2e3,1e3,400,300,200,100,90,80,70,60,50,40,30,20,19,18,17,16,15,10,9,8,7,6,5,4,3,2,1],values:["י׳","ט׳","ח׳","ז׳","ו׳","ה׳","ד׳","ג׳","ב׳","א׳","ת","ש","ר","ק","צ","פ","ע","ס","נ","מ","ל","כ","יט","יח","יז","טז","טו","י","ט","ח","ז","ו","ה","ד","ג","ב","א"]},lp={integers:[1e4,9e3,8e3,7e3,6e3,5e3,4e3,3e3,2e3,1e3,900,800,700,600,500,400,300,200,100,90,80,70,60,50,40,30,20,10,9,8,7,6,5,4,3,2,1],values:["ჵ","ჰ","ჯ","ჴ","ხ","ჭ","წ","ძ","ც","ჩ","შ","ყ","ღ","ქ","ფ","ჳ","ტ","ს","რ","ჟ","პ","ო","ჲ","ნ","მ","ლ","კ","ი","თ","ჱ","ზ","ვ","ე","დ","გ","ბ","ა"]},up=function(A,e,t,n,r,o){return At?Cp(A,r,o.length>0):n.integers.reduce((function(e,t,r){for(;A>=t;)A-=t,e+=n.values[r];return e}),"")+o},dp=function(A,e,t,n){var r="";do{t||A--,r=n(A)+r,A/=e}while(A*e>=e);return r},gp=function(A,e,t,n,r){var o=t-e+1;return(A<0?"-":"")+(dp(Math.abs(A),o,n,(function(A){return dc(Math.floor(A%o)+e)}))+r)},hp=function(A,e,t){void 0===t&&(t=". ");var n=e.length;return dp(Math.abs(A),n,!1,(function(A){return e[Math.floor(A%n)]}))+t},pp=function(A,e,t,n,r,o){if(A<-9999||A>9999)return Cp(A,4,r.length>0);var i=Math.abs(A),s=r;if(0===i)return e[0]+s;for(var a=0;i>0&&a<=4;a++){var c=i%10;0===c&&Eg(o,1)&&""!==s?s=e[c]+s:c>1||1===c&&0===a||1===c&&1===a&&Eg(o,2)||1===c&&1===a&&Eg(o,4)&&A>100||1===c&&a>1&&Eg(o,8)?s=e[c]+(a>0?t[a-1]:"")+s:1===c&&a>0&&(s=t[a-1]+s),i=Math.floor(i/10)}return(A<0?n:"")+s},Bp="十百千萬",fp="拾佰仟萬",mp="マイナス",wp="마이너스",Cp=function(A,e,t){var n=t?". ":"",r=t?"、":"",o=t?", ":"",i=t?" ":"";switch(e){case 0:return"•"+i;case 1:return"◦"+i;case 2:return"◾"+i;case 5:var s=gp(A,48,57,!0,n);return s.length<4?"0"+s:s;case 4:return hp(A,"〇一二三四五六七八九",r);case 6:return up(A,1,3999,sp,3,n).toLowerCase();case 7:return up(A,1,3999,sp,3,n);case 8:return gp(A,945,969,!1,n);case 9:return gp(A,97,122,!1,n);case 10:return gp(A,65,90,!1,n);case 11:return gp(A,1632,1641,!0,n);case 12:case 49:return up(A,1,9999,ap,3,n);case 35:return up(A,1,9999,ap,3,n).toLowerCase();case 13:return gp(A,2534,2543,!0,n);case 14:case 30:return gp(A,6112,6121,!0,n);case 15:return hp(A,"子丑寅卯辰巳午未申酉戌亥",r);case 16:return hp(A,"甲乙丙丁戊己庚辛壬癸",r);case 17:case 48:return pp(A,"零一二三四五六七八九",Bp,"負",r,14);case 47:return pp(A,"零壹貳參肆伍陸柒捌玖",fp,"負",r,15);case 42:return pp(A,"零一二三四五六七八九",Bp,"负",r,14);case 41:return pp(A,"零壹贰叁肆伍陆柒捌玖",fp,"负",r,15);case 26:return pp(A,"〇一二三四五六七八九","十百千万",mp,r,0);case 25:return pp(A,"零壱弐参四伍六七八九","拾百千万",mp,r,7);case 31:return pp(A,"영일이삼사오육칠팔구","십백천만",wp,o,7);case 33:return pp(A,"零一二三四五六七八九","十百千萬",wp,o,0);case 32:return pp(A,"零壹貳參四五六七八九","拾百千",wp,o,7);case 18:return gp(A,2406,2415,!0,n);case 20:return up(A,1,19999,lp,3,n);case 21:return gp(A,2790,2799,!0,n);case 22:return gp(A,2662,2671,!0,n);case 22:return up(A,1,10999,cp,3,n);case 23:return hp(A,"あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをん");case 24:return hp(A,"いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす");case 27:return gp(A,3302,3311,!0,n);case 28:return hp(A,"アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲン",r);case 29:return hp(A,"イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス",r);case 34:return gp(A,3792,3801,!0,n);case 37:return gp(A,6160,6169,!0,n);case 38:return gp(A,4160,4169,!0,n);case 39:return gp(A,2918,2927,!0,n);case 40:return gp(A,1776,1785,!0,n);case 43:return gp(A,3046,3055,!0,n);case 44:return gp(A,3174,3183,!0,n);case 45:return gp(A,3664,3673,!0,n);case 46:return gp(A,3872,3881,!0,n);default:return gp(A,48,57,!0,n)}},Qp="data-html2canvas-ignore",yp=function(){function A(A,e,t){if(this.context=A,this.options=t,this.scrolledElements=[],this.referenceElement=e,this.counters=new ip,this.quoteDepth=0,!e.ownerDocument)throw new Error("Cloned element does not have an owner document");this.documentElement=this.cloneNode(e.ownerDocument.documentElement,!1)}return A.prototype.toIFrame=function(A,e){var t=this,n=Up(A,e);if(!n.contentWindow)return Promise.reject("Unable to find iframe window");var r=A.defaultView.pageXOffset,o=A.defaultView.pageYOffset,i=n.contentWindow,s=i.document,a=Hp(n).then((function(){return ic(t,0,void 0,(function(){var A,t;return sc(this,(function(r){switch(r.label){case 0:return this.scrolledElements.forEach(Dp),i&&(i.scrollTo(e.left,e.top),!/(iPad|iPhone|iPod)/g.test(navigator.userAgent)||i.scrollY===e.top&&i.scrollX===e.left||(this.context.logger.warn("Unable to restore scroll position for cloned document"),this.context.windowBounds=this.context.windowBounds.add(i.scrollX-e.left,i.scrollY-e.top,0,0))),A=this.options.onclone,void 0===(t=this.clonedReferenceElement)?[2,Promise.reject("Error finding the "+this.referenceElement.nodeName+" in the cloned document")]:s.fonts&&s.fonts.ready?[4,s.fonts.ready]:[3,2];case 1:r.sent(),r.label=2;case 2:return/(AppleWebKit)/g.test(navigator.userAgent)?[4,bp(s)]:[3,4];case 3:r.sent(),r.label=4;case 4:return"function"==typeof A?[2,Promise.resolve().then((function(){return A(s,t)})).then((function(){return n}))]:[2,n]}}))}))}));return s.open(),s.write(Np(document.doctype)+""),xp(this.referenceElement.ownerDocument,r,o),s.replaceChild(s.adoptNode(this.documentElement),s.documentElement),s.close(),a},A.prototype.createElementClone=function(A){if(Rg(A,2),Zh(A))return this.createCanvasClone(A);if(zh(A))return this.createVideoClone(A);if(ep(A))return this.createStyleClone(A);var e=A.cloneNode(!1);return qh(e)&&(qh(A)&&A.currentSrc&&A.currentSrc!==A.src&&(e.src=A.currentSrc,e.srcset=""),"lazy"===e.loading&&(e.loading="eager")),op(e)?this.createCustomElementClone(e):e},A.prototype.createCustomElementClone=function(A){var e=document.createElement("html2canvascustomelement");return Sp(A.style,e),e},A.prototype.createStyleClone=function(A){try{var e=A.sheet;if(e&&e.cssRules){var t=[].slice.call(e.cssRules,0).reduce((function(A,e){return e&&"string"==typeof e.cssText?A+e.cssText:A}),""),n=A.cloneNode(!1);return n.textContent=t,n}}catch(Em){if(this.context.logger.error("Unable to access cssRules property",Em),"SecurityError"!==Em.name)throw Em}return A.cloneNode(!1)},A.prototype.createCanvasClone=function(A){var e;if(this.options.inlineImages&&A.ownerDocument){var t=A.ownerDocument.createElement("img");try{return t.src=A.toDataURL(),t}catch(Em){this.context.logger.info("Unable to inline canvas contents, canvas is tainted",A)}}var n=A.cloneNode(!1);try{n.width=A.width,n.height=A.height;var r=A.getContext("2d"),o=n.getContext("2d");if(o)if(!this.options.allowTaint&&r)o.putImageData(r.getImageData(0,0,A.width,A.height),0,0);else{var i=null!==(e=A.getContext("webgl2"))&&void 0!==e?e:A.getContext("webgl");if(i){var s=i.getContextAttributes();!1===(null==s?void 0:s.preserveDrawingBuffer)&&this.context.logger.warn("Unable to clone WebGL context as it has preserveDrawingBuffer=false",A)}o.drawImage(A,0,0)}return n}catch(Em){this.context.logger.info("Unable to clone canvas as it is tainted",A)}return n},A.prototype.createVideoClone=function(A){var e=A.ownerDocument.createElement("canvas");e.width=A.offsetWidth,e.height=A.offsetHeight;var t=e.getContext("2d");try{return t&&(t.drawImage(A,0,0,e.width,e.height),this.options.allowTaint||t.getImageData(0,0,e.width,e.height)),e}catch(Em){this.context.logger.info("Unable to clone video as it is tainted",A)}var n=A.ownerDocument.createElement("canvas");return n.width=A.offsetWidth,n.height=A.offsetHeight,n},A.prototype.appendChildNode=function(A,e,t){Ph(e)&&("SCRIPT"===e.tagName||e.hasAttribute(Qp)||"function"==typeof this.options.ignoreElements&&this.options.ignoreElements(e))||this.options.copyStyles&&Ph(e)&&ep(e)||A.appendChild(this.cloneNode(e,t))},A.prototype.cloneChildNodes=function(A,e,t){for(var n=this,r=A.shadowRoot?A.shadowRoot.firstChild:A.firstChild;r;r=r.nextSibling)if(Ph(r)&&rp(r)&&"function"==typeof r.assignedNodes){var o=r.assignedNodes();o.length&&o.forEach((function(A){return n.appendChildNode(e,A,t)}))}else this.appendChildNode(e,r,t)},A.prototype.cloneNode=function(A,e){if(Vh(A))return document.createTextNode(A.data);if(!A.ownerDocument)return A.cloneNode(!1);var t=A.ownerDocument.defaultView;if(t&&Ph(A)&&(Gh(A)||Wh(A))){var n=this.createElementClone(A);n.style.transitionProperty="none";var r=t.getComputedStyle(A),o=t.getComputedStyle(A,":before"),i=t.getComputedStyle(A,":after");this.referenceElement===A&&Gh(n)&&(this.clonedReferenceElement=n),jh(n)&&_p(n);var s=this.counters.parse(new Lg(this.context,r)),a=this.resolvePseudoContent(A,n,o,$g.BEFORE);op(A)&&(e=!0),zh(A)||this.cloneChildNodes(A,n,e),a&&n.insertBefore(a,n.firstChild);var c=this.resolvePseudoContent(A,n,i,$g.AFTER);return c&&n.appendChild(c),this.counters.pop(s),(r&&(this.options.copyStyles||Wh(A))&&!Ap(A)||e)&&Sp(r,n),0===A.scrollTop&&0===A.scrollLeft||this.scrolledElements.push([n,A.scrollLeft,A.scrollTop]),(tp(A)||np(A))&&(tp(n)||np(n))&&(n.value=A.value),n}return A.cloneNode(!1)},A.prototype.resolvePseudoContent=function(A,e,t,n){var r=this;if(t){var o=t.content,i=e.ownerDocument;if(i&&o&&"none"!==o&&"-moz-alt-content"!==o&&"none"!==t.display){this.counters.parse(new Lg(this.context,t));var s=new Tg(this.context,t),a=i.createElement("html2canvaspseudoelement");Sp(t,a),s.content.forEach((function(e){if(0===e.type)a.appendChild(i.createTextNode(e.value));else if(22===e.type){var t=i.createElement("img");t.src=e.value,t.style.opacity="1",a.appendChild(t)}else if(18===e.type){if("attr"===e.name){var n=e.values.filter(tu);n.length&&a.appendChild(i.createTextNode(A.getAttribute(n[0].value)||""))}else if("counter"===e.name){var o=e.values.filter(iu),c=o[0],l=o[1];if(c&&tu(c)){var u=r.counters.getCounterValue(c.value),d=l&&tu(l)?Pd.parse(r.context,l.value):3;a.appendChild(i.createTextNode(Cp(u,d,!1)))}}else if("counters"===e.name){var g=e.values.filter(iu),h=(c=g[0],g[1]);l=g[2];if(c&&tu(c)){var p=r.counters.getCounterValues(c.value),B=l&&tu(l)?Pd.parse(r.context,l.value):3,f=h&&0===h.type?h.value:"",m=p.map((function(A){return Cp(A,B,!1)})).join(f);a.appendChild(i.createTextNode(m))}}}else if(20===e.type)switch(e.value){case"open-quote":a.appendChild(i.createTextNode(Ig(s.quotes,r.quoteDepth++,!0)));break;case"close-quote":a.appendChild(i.createTextNode(Ig(s.quotes,--r.quoteDepth,!1)));break;default:a.appendChild(i.createTextNode(e.value))}})),a.className=Op+" "+Tp;var c=n===$g.BEFORE?" "+Op:" "+Tp;return Wh(e)?e.className.baseValue+=c:e.className+=c,a}}},A.destroy=function(A){return!!A.parentNode&&(A.parentNode.removeChild(A),!0)},A}();(Yg=$g||($g={}))[Yg.BEFORE=0]="BEFORE",Yg[Yg.AFTER=1]="AFTER";var Ep,vp,Up=function(A,e){var t=A.createElement("iframe");return t.className="html2canvas-container",t.style.visibility="hidden",t.style.position="fixed",t.style.left="-10000px",t.style.top="0px",t.style.border="0",t.width=e.width.toString(),t.height=e.height.toString(),t.scrolling="no",t.setAttribute(Qp,"true"),A.body.appendChild(t),t},Fp=function(A){return new Promise((function(e){A.complete?e():A.src?(A.onload=e,A.onerror=e):e()}))},bp=function(A){return Promise.all([].slice.call(A.images,0).map(Fp))},Hp=function(A){return new Promise((function(e,t){var n=A.contentWindow;if(!n)return t("No window assigned for iframe");var r=n.document;n.onload=A.onload=function(){n.onload=A.onload=null;var t=setInterval((function(){r.body.childNodes.length>0&&"complete"===r.readyState&&(clearInterval(t),e(A))}),50)}}))},Ip=["all","d","content"],Sp=function(A,e){for(var t=A.length-1;t>=0;t--){var n=A.item(t);-1===Ip.indexOf(n)&&e.style.setProperty(n,A.getPropertyValue(n))}return e},Np=function(A){var e="";return A&&(e+=""),e},xp=function(A,e,t){A&&A.defaultView&&(e!==A.defaultView.pageXOffset||t!==A.defaultView.pageYOffset)&&A.defaultView.scrollTo(e,t)},Dp=function(A){var e=A[0],t=A[1],n=A[2];e.scrollLeft=t,e.scrollTop=n},Op="___html2canvas___pseudoelement_before",Tp="___html2canvas___pseudoelement_after",Lp='{\n content: "" !important;\n display: none !important;\n}',_p=function(A){Rp(A,"."+Op+":before"+Lp+"\n ."+Tp+":after"+Lp)},Rp=function(A,e){var t=A.ownerDocument;if(t){var n=t.createElement("style");n.textContent=e,A.appendChild(n)}},Kp=function(){function A(){}return A.getOrigin=function(e){var t=A._link;return t?(t.href=e,t.href=t.href,t.protocol+t.hostname+t.port):"about:blank"},A.isSameOrigin=function(e){return A.getOrigin(e)===A._origin},A.setContext=function(e){A._link=e.document.createElement("a"),A._origin=A.getOrigin(e.location.href)},A._origin="about:blank",A}(),kp=function(){function A(A,e){this.context=A,this._options=e,this._cache={}}return A.prototype.addImage=function(A){var e=Promise.resolve();return this.has(A)?e:Jp(A)||Gp(A)?((this._cache[A]=this.loadImage(A)).catch((function(){})),e):e},A.prototype.match=function(A){return this._cache[A]},A.prototype.loadImage=function(A){return ic(this,0,void 0,(function(){var e,t,n,r,o=this;return sc(this,(function(i){switch(i.label){case 0:return e=Kp.isSameOrigin(A),t=!Wp(A)&&!0===this._options.useCORS&&ch.SUPPORT_CORS_IMAGES&&!e,n=!Wp(A)&&!e&&!Jp(A)&&"string"==typeof this._options.proxy&&ch.SUPPORT_CORS_XHR&&!t,e||!1!==this._options.allowTaint||Wp(A)||Jp(A)||n||t?(r=A,n?[4,this.proxy(r)]:[3,2]):[2];case 1:r=i.sent(),i.label=2;case 2:return this.context.logger.debug("Added image "+A.substring(0,256)),[4,new Promise((function(A,e){var n=new Image;n.onload=function(){return A(n)},n.onerror=e,(Xp(r)||t)&&(n.crossOrigin="anonymous"),n.src=r,!0===n.complete&&setTimeout((function(){return A(n)}),500),o._options.imageTimeout>0&&setTimeout((function(){return e("Timed out ("+o._options.imageTimeout+"ms) loading image")}),o._options.imageTimeout)}))];case 3:return[2,i.sent()]}}))}))},A.prototype.has=function(A){return void 0!==this._cache[A]},A.prototype.keys=function(){return Promise.resolve(Object.keys(this._cache))},A.prototype.proxy=function(A){var e=this,t=this._options.proxy;if(!t)throw new Error("No proxy defined");var n=A.substring(0,256);return new Promise((function(r,o){var i=ch.SUPPORT_RESPONSE_TYPE?"blob":"text",s=new XMLHttpRequest;s.onload=function(){if(200===s.status)if("text"===i)r(s.response);else{var A=new FileReader;A.addEventListener("load",(function(){return r(A.result)}),!1),A.addEventListener("error",(function(A){return o(A)}),!1),A.readAsDataURL(s.response)}else o("Failed to proxy resource "+n+" with status code "+s.status)},s.onerror=o;var a=t.indexOf("?")>-1?"&":"?";if(s.open("GET",""+t+a+"url="+encodeURIComponent(A)+"&responseType="+i),"text"!==i&&s instanceof XMLHttpRequest&&(s.responseType=i),e._options.imageTimeout){var c=e._options.imageTimeout;s.timeout=c,s.ontimeout=function(){return o("Timed out ("+c+"ms) proxying "+n)}}s.send()}))},A}(),Mp=/^data:image\/svg\+xml/i,Vp=/^data:image\/.*;base64,/i,Pp=/^data:image\/.*/i,Gp=function(A){return ch.SUPPORT_SVG_DRAWING||!$p(A)},Wp=function(A){return Pp.test(A)},Xp=function(A){return Vp.test(A)},Jp=function(A){return"blob"===A.substr(0,4)},$p=function(A){return"svg"===A.substr(-3).toLowerCase()||Mp.test(A)},Yp=function(){function A(A,e){this.type=0,this.x=A,this.y=e}return A.prototype.add=function(e,t){return new A(this.x+e,this.y+t)},A}(),jp=function(A,e,t){return new Yp(A.x+(e.x-A.x)*t,A.y+(e.y-A.y)*t)},Zp=function(){function A(A,e,t,n){this.type=1,this.start=A,this.startControl=e,this.endControl=t,this.end=n}return A.prototype.subdivide=function(e,t){var n=jp(this.start,this.startControl,e),r=jp(this.startControl,this.endControl,e),o=jp(this.endControl,this.end,e),i=jp(n,r,e),s=jp(r,o,e),a=jp(i,s,e);return t?new A(this.start,n,i,a):new A(a,s,o,this.end)},A.prototype.add=function(e,t){return new A(this.start.add(e,t),this.startControl.add(e,t),this.endControl.add(e,t),this.end.add(e,t))},A.prototype.reverse=function(){return new A(this.end,this.endControl,this.startControl,this.start)},A}(),zp=function(A){return 1===A.type},qp=function(){return function(A){var e=A.styles,t=A.bounds,n=pu(e.borderTopLeftRadius,t.width,t.height),r=n[0],o=n[1],i=pu(e.borderTopRightRadius,t.width,t.height),s=i[0],a=i[1],c=pu(e.borderBottomRightRadius,t.width,t.height),l=c[0],u=c[1],d=pu(e.borderBottomLeftRadius,t.width,t.height),g=d[0],h=d[1],p=[];p.push((r+s)/t.width),p.push((g+l)/t.width),p.push((o+h)/t.height),p.push((a+u)/t.height);var B=Math.max.apply(Math,p);B>1&&(r/=B,o/=B,s/=B,a/=B,l/=B,u/=B,g/=B,h/=B);var f=t.width-s,m=t.height-u,w=t.width-l,C=t.height-h,Q=e.borderTopWidth,y=e.borderRightWidth,E=e.borderBottomWidth,v=e.borderLeftWidth,U=Bu(e.paddingTop,A.bounds.width),F=Bu(e.paddingRight,A.bounds.width),b=Bu(e.paddingBottom,A.bounds.width),H=Bu(e.paddingLeft,A.bounds.width);this.topLeftBorderDoubleOuterBox=r>0||o>0?AB(t.left+v/3,t.top+Q/3,r-v/3,o-Q/3,Ep.TOP_LEFT):new Yp(t.left+v/3,t.top+Q/3),this.topRightBorderDoubleOuterBox=r>0||o>0?AB(t.left+f,t.top+Q/3,s-y/3,a-Q/3,Ep.TOP_RIGHT):new Yp(t.left+t.width-y/3,t.top+Q/3),this.bottomRightBorderDoubleOuterBox=l>0||u>0?AB(t.left+w,t.top+m,l-y/3,u-E/3,Ep.BOTTOM_RIGHT):new Yp(t.left+t.width-y/3,t.top+t.height-E/3),this.bottomLeftBorderDoubleOuterBox=g>0||h>0?AB(t.left+v/3,t.top+C,g-v/3,h-E/3,Ep.BOTTOM_LEFT):new Yp(t.left+v/3,t.top+t.height-E/3),this.topLeftBorderDoubleInnerBox=r>0||o>0?AB(t.left+2*v/3,t.top+2*Q/3,r-2*v/3,o-2*Q/3,Ep.TOP_LEFT):new Yp(t.left+2*v/3,t.top+2*Q/3),this.topRightBorderDoubleInnerBox=r>0||o>0?AB(t.left+f,t.top+2*Q/3,s-2*y/3,a-2*Q/3,Ep.TOP_RIGHT):new Yp(t.left+t.width-2*y/3,t.top+2*Q/3),this.bottomRightBorderDoubleInnerBox=l>0||u>0?AB(t.left+w,t.top+m,l-2*y/3,u-2*E/3,Ep.BOTTOM_RIGHT):new Yp(t.left+t.width-2*y/3,t.top+t.height-2*E/3),this.bottomLeftBorderDoubleInnerBox=g>0||h>0?AB(t.left+2*v/3,t.top+C,g-2*v/3,h-2*E/3,Ep.BOTTOM_LEFT):new Yp(t.left+2*v/3,t.top+t.height-2*E/3),this.topLeftBorderStroke=r>0||o>0?AB(t.left+v/2,t.top+Q/2,r-v/2,o-Q/2,Ep.TOP_LEFT):new Yp(t.left+v/2,t.top+Q/2),this.topRightBorderStroke=r>0||o>0?AB(t.left+f,t.top+Q/2,s-y/2,a-Q/2,Ep.TOP_RIGHT):new Yp(t.left+t.width-y/2,t.top+Q/2),this.bottomRightBorderStroke=l>0||u>0?AB(t.left+w,t.top+m,l-y/2,u-E/2,Ep.BOTTOM_RIGHT):new Yp(t.left+t.width-y/2,t.top+t.height-E/2),this.bottomLeftBorderStroke=g>0||h>0?AB(t.left+v/2,t.top+C,g-v/2,h-E/2,Ep.BOTTOM_LEFT):new Yp(t.left+v/2,t.top+t.height-E/2),this.topLeftBorderBox=r>0||o>0?AB(t.left,t.top,r,o,Ep.TOP_LEFT):new Yp(t.left,t.top),this.topRightBorderBox=s>0||a>0?AB(t.left+f,t.top,s,a,Ep.TOP_RIGHT):new Yp(t.left+t.width,t.top),this.bottomRightBorderBox=l>0||u>0?AB(t.left+w,t.top+m,l,u,Ep.BOTTOM_RIGHT):new Yp(t.left+t.width,t.top+t.height),this.bottomLeftBorderBox=g>0||h>0?AB(t.left,t.top+C,g,h,Ep.BOTTOM_LEFT):new Yp(t.left,t.top+t.height),this.topLeftPaddingBox=r>0||o>0?AB(t.left+v,t.top+Q,Math.max(0,r-v),Math.max(0,o-Q),Ep.TOP_LEFT):new Yp(t.left+v,t.top+Q),this.topRightPaddingBox=s>0||a>0?AB(t.left+Math.min(f,t.width-y),t.top+Q,f>t.width+y?0:Math.max(0,s-y),Math.max(0,a-Q),Ep.TOP_RIGHT):new Yp(t.left+t.width-y,t.top+Q),this.bottomRightPaddingBox=l>0||u>0?AB(t.left+Math.min(w,t.width-v),t.top+Math.min(m,t.height-E),Math.max(0,l-y),Math.max(0,u-E),Ep.BOTTOM_RIGHT):new Yp(t.left+t.width-y,t.top+t.height-E),this.bottomLeftPaddingBox=g>0||h>0?AB(t.left+v,t.top+Math.min(C,t.height-E),Math.max(0,g-v),Math.max(0,h-E),Ep.BOTTOM_LEFT):new Yp(t.left+v,t.top+t.height-E),this.topLeftContentBox=r>0||o>0?AB(t.left+v+H,t.top+Q+U,Math.max(0,r-(v+H)),Math.max(0,o-(Q+U)),Ep.TOP_LEFT):new Yp(t.left+v+H,t.top+Q+U),this.topRightContentBox=s>0||a>0?AB(t.left+Math.min(f,t.width+v+H),t.top+Q+U,f>t.width+v+H?0:s-v+H,a-(Q+U),Ep.TOP_RIGHT):new Yp(t.left+t.width-(y+F),t.top+Q+U),this.bottomRightContentBox=l>0||u>0?AB(t.left+Math.min(w,t.width-(v+H)),t.top+Math.min(m,t.height+Q+U),Math.max(0,l-(y+F)),u-(E+b),Ep.BOTTOM_RIGHT):new Yp(t.left+t.width-(y+F),t.top+t.height-(E+b)),this.bottomLeftContentBox=g>0||h>0?AB(t.left+v+H,t.top+C,Math.max(0,g-(v+H)),h-(E+b),Ep.BOTTOM_LEFT):new Yp(t.left+v+H,t.top+t.height-(E+b))}}();(vp=Ep||(Ep={}))[vp.TOP_LEFT=0]="TOP_LEFT",vp[vp.TOP_RIGHT=1]="TOP_RIGHT",vp[vp.BOTTOM_RIGHT=2]="BOTTOM_RIGHT",vp[vp.BOTTOM_LEFT=3]="BOTTOM_LEFT";var AB=function(A,e,t,n,r){var o=(Math.sqrt(2)-1)/3*4,i=t*o,s=n*o,a=A+t,c=e+n;switch(r){case Ep.TOP_LEFT:return new Zp(new Yp(A,c),new Yp(A,c-s),new Yp(a-i,e),new Yp(a,e));case Ep.TOP_RIGHT:return new Zp(new Yp(A,e),new Yp(A+i,e),new Yp(a,c-s),new Yp(a,c));case Ep.BOTTOM_RIGHT:return new Zp(new Yp(a,e),new Yp(a,e+s),new Yp(A+i,c),new Yp(A,c));case Ep.BOTTOM_LEFT:default:return new Zp(new Yp(a,c),new Yp(a-i,c),new Yp(A,e+s),new Yp(A,e))}},eB=function(A){return[A.topLeftBorderBox,A.topRightBorderBox,A.bottomRightBorderBox,A.bottomLeftBorderBox]},tB=function(A){return[A.topLeftPaddingBox,A.topRightPaddingBox,A.bottomRightPaddingBox,A.bottomLeftPaddingBox]},nB=function(){return function(A,e,t){this.offsetX=A,this.offsetY=e,this.matrix=t,this.type=0,this.target=6}}(),rB=function(){return function(A,e){this.path=A,this.target=e,this.type=1}}(),oB=function(){return function(A){this.opacity=A,this.type=2,this.target=6}}(),iB=function(A){return 1===A.type},sB=function(A,e){return A.length===e.length&&A.some((function(A,t){return A===e[t]}))},aB=function(){return function(A){this.element=A,this.inlineLevel=[],this.nonInlineLevel=[],this.negativeZIndex=[],this.zeroOrAutoZIndexOrTransformedOrOpacity=[],this.positiveZIndex=[],this.nonPositionedFloats=[],this.nonPositionedInlineLevel=[]}}(),cB=function(){function A(A,e){if(this.container=A,this.parent=e,this.effects=[],this.curves=new qp(this.container),this.container.styles.opacity<1&&this.effects.push(new oB(this.container.styles.opacity)),null!==this.container.styles.transform){var t=this.container.bounds.left+this.container.styles.transformOrigin[0].number,n=this.container.bounds.top+this.container.styles.transformOrigin[1].number,r=this.container.styles.transform;this.effects.push(new nB(t,n,r))}if(0!==this.container.styles.overflowX){var o=eB(this.curves),i=tB(this.curves);sB(o,i)?this.effects.push(new rB(o,6)):(this.effects.push(new rB(o,2)),this.effects.push(new rB(i,4)))}}return A.prototype.getEffects=function(A){for(var e=-1===[2,3].indexOf(this.container.styles.position),t=this.parent,n=this.effects.slice(0);t;){var r=t.effects.filter((function(A){return!iB(A)}));if(e||0!==t.container.styles.position||!t.parent){if(n.unshift.apply(n,r),e=-1===[2,3].indexOf(t.container.styles.position),0!==t.container.styles.overflowX){var o=eB(t.curves),i=tB(t.curves);sB(o,i)||n.unshift(new rB(i,6))}}else n.unshift.apply(n,r);t=t.parent}return n.filter((function(e){return Eg(e.target,A)}))},A}(),lB=function(A,e,t,n){A.container.elements.forEach((function(r){var o=Eg(r.flags,4),i=Eg(r.flags,2),s=new cB(r,A);Eg(r.styles.display,2048)&&n.push(s);var a=Eg(r.flags,8)?[]:n;if(o||i){var c=o||r.styles.isPositioned()?t:e,l=new aB(s);if(r.styles.isPositioned()||r.styles.opacity<1||r.styles.isTransformed()){var u=r.styles.zIndex.order;if(u<0){var d=0;c.negativeZIndex.some((function(A,e){return u>A.element.container.styles.zIndex.order?(d=e,!1):d>0})),c.negativeZIndex.splice(d,0,l)}else if(u>0){var g=0;c.positiveZIndex.some((function(A,e){return u>=A.element.container.styles.zIndex.order?(g=e+1,!1):g>0})),c.positiveZIndex.splice(g,0,l)}else c.zeroOrAutoZIndexOrTransformedOrOpacity.push(l)}else r.styles.isFloating()?c.nonPositionedFloats.push(l):c.nonPositionedInlineLevel.push(l);lB(s,l,o?l:t,a)}else r.styles.isInlineLevel()?e.inlineLevel.push(s):e.nonInlineLevel.push(s),lB(s,e,t,a);Eg(r.flags,8)&&uB(r,a)}))},uB=function(A,e){for(var t=A instanceof Uh?A.start:1,n=A instanceof Uh&&A.reversed,r=0;r0&&A.intrinsicHeight>0){var n=BB(A),r=tB(e);this.path(r),this.ctx.save(),this.ctx.clip(),this.ctx.drawImage(t,0,0,A.intrinsicWidth,A.intrinsicHeight,n.left,n.top,n.width,n.height),this.ctx.restore()}},e.prototype.renderNodeContent=function(A){return ic(this,0,void 0,(function(){var t,n,r,o,i,s,a,c,l,u,d,g,h,p,B,f,m,w;return sc(this,(function(C){switch(C.label){case 0:this.applyEffects(A.getEffects(4)),t=A.container,n=A.curves,r=t.styles,o=0,i=t.textNodes,C.label=1;case 1:return o0&&E>0&&(f=n.ctx.createPattern(h,"repeat"),n.renderRepeat(w,f,U,F))):function(A){return 2===A.type}(t)&&(m=fB(A,e,[null,null,null]),w=m[0],C=m[1],Q=m[2],y=m[3],E=m[4],v=0===t.position.length?[gu]:t.position,U=Bu(v[0],y),F=Bu(v[v.length-1],E),b=function(A,e,t,n,r){var o=0,i=0;switch(A.size){case 0:0===A.shape?o=i=Math.min(Math.abs(e),Math.abs(e-n),Math.abs(t),Math.abs(t-r)):1===A.shape&&(o=Math.min(Math.abs(e),Math.abs(e-n)),i=Math.min(Math.abs(t),Math.abs(t-r)));break;case 2:if(0===A.shape)o=i=Math.min(Ku(e,t),Ku(e,t-r),Ku(e-n,t),Ku(e-n,t-r));else if(1===A.shape){var s=Math.min(Math.abs(t),Math.abs(t-r))/Math.min(Math.abs(e),Math.abs(e-n)),a=ku(n,r,e,t,!0),c=a[0],l=a[1];i=s*(o=Ku(c-e,(l-t)/s))}break;case 1:0===A.shape?o=i=Math.max(Math.abs(e),Math.abs(e-n),Math.abs(t),Math.abs(t-r)):1===A.shape&&(o=Math.max(Math.abs(e),Math.abs(e-n)),i=Math.max(Math.abs(t),Math.abs(t-r)));break;case 3:if(0===A.shape)o=i=Math.max(Ku(e,t),Ku(e,t-r),Ku(e-n,t),Ku(e-n,t-r));else if(1===A.shape){s=Math.max(Math.abs(t),Math.abs(t-r))/Math.max(Math.abs(e),Math.abs(e-n));var u=ku(n,r,e,t,!1);c=u[0],l=u[1],i=s*(o=Ku(c-e,(l-t)/s))}}return Array.isArray(A.size)&&(o=Bu(A.size[0],n),i=2===A.size.length?Bu(A.size[1],r):o),[o,i]}(t,U,F,y,E),H=b[0],I=b[1],H>0&&I>0&&(S=n.ctx.createRadialGradient(C+U,Q+F,0,C+U,Q+F,H),_u(t.stops,2*H).forEach((function(A){return S.addColorStop(A.stop,Uu(A.color))})),n.path(w),n.ctx.fillStyle=S,H!==I?(N=A.bounds.left+.5*A.bounds.width,x=A.bounds.top+.5*A.bounds.height,O=1/(D=I/H),n.ctx.save(),n.ctx.translate(N,x),n.ctx.transform(1,0,0,D,0,0),n.ctx.translate(-N,-x),n.ctx.fillRect(C,O*(Q-x)+x,y,E*O),n.ctx.restore()):n.ctx.fill())),T.label=6;case 6:return e--,[2]}}))},n=this,r=0,o=A.styles.backgroundImage.slice(0).reverse(),s.label=1;case 1:return r0?2!==a.style?[3,5]:[4,this.renderDashedDottedBorder(a.color,a.width,o,A.curves,2)]:[3,11]:[3,13];case 4:return l.sent(),[3,11];case 5:return 3!==a.style?[3,7]:[4,this.renderDashedDottedBorder(a.color,a.width,o,A.curves,3)];case 6:return l.sent(),[3,11];case 7:return 4!==a.style?[3,9]:[4,this.renderDoubleBorder(a.color,a.width,o,A.curves)];case 8:return l.sent(),[3,11];case 9:return[4,this.renderSolidBorder(a.color,o,A.curves)];case 10:l.sent(),l.label=11;case 11:o++,l.label=12;case 12:return i++,[3,3];case 13:return[2]}}))}))},e.prototype.renderDashedDottedBorder=function(A,e,t,n,r){return ic(this,0,void 0,(function(){var o,i,s,a,c,l,u,d,g,h,p,B,f,m,w,C;return sc(this,(function(Q){return this.ctx.save(),o=function(A,e){switch(e){case 0:return gB(A.topLeftBorderStroke,A.topRightBorderStroke);case 1:return gB(A.topRightBorderStroke,A.bottomRightBorderStroke);case 2:return gB(A.bottomRightBorderStroke,A.bottomLeftBorderStroke);default:return gB(A.bottomLeftBorderStroke,A.topLeftBorderStroke)}}(n,t),i=dB(n,t),2===r&&(this.path(i),this.ctx.clip()),zp(i[0])?(s=i[0].start.x,a=i[0].start.y):(s=i[0].x,a=i[0].y),zp(i[1])?(c=i[1].end.x,l=i[1].end.y):(c=i[1].x,l=i[1].y),u=0===t||2===t?Math.abs(s-c):Math.abs(a-l),this.ctx.beginPath(),3===r?this.formatPath(o):this.formatPath(i.slice(0,2)),d=e<3?3*e:2*e,g=e<3?2*e:e,3===r&&(d=e,g=e),h=!0,u<=2*d?h=!1:u<=2*d+g?(d*=p=u/(2*d+g),g*=p):(B=Math.floor((u+g)/(d+g)),f=(u-B*d)/(B-1),g=(m=(u-(B+1)*d)/B)<=0||Math.abs(g-f)"image"===A.tagName,...e},i=await LB(t,o);i.classList.add(pa);const s=i.toDataURL(zs,Zs);return i.remove(),s}catch(n){return console.error("Screenshot failed:",n),null}}async function e(){const e=document.querySelector(`.${Ba}`);return e?A(e):null}return{screenshotSelectionArea:async function(t,n){const r=await e();if(r)return r;const o={x:n.x-250+window.scrollX,y:n.y-75+window.scrollY,width:500,height:150};return A(document.body,o)},screenshotTargetElement:e}}class kB{constructor(A){this.selectionType=A,this.screenshot=function(){const{screenshotSelectionArea:A,screenshotTargetElement:e}=KB();return{captureSelectionScreenshot:async(t,n={},r)=>{try{const t=await e();if(t)return t;const n={x:(null==r?void 0:r.clientX)||0,y:(null==r?void 0:r.clientY)||0};return await A(n,n)}catch(o){return console.error("Failed to capture selection screenshot:",o),null}}}}(),this.errorHandler=Ya}async processSelection(A,e,t={}){throw new Error(`processSelection must be implemented by ${this.constructor.name}`)}validateTarget(A){return null!=A}async preProcess(A,e,t){return!!va()&&(!!this.validateTarget(A)||(this.errorHandler.handleSelectionError(this.selectionType,new Error("Invalid selection target"),{target:A,event:e}),!1))}async postProcess(A,e,t,n){if(!A)return null;if(A.type=this.selectionType,A.timestamp=Date.now(),A.index=A.index??-1,n.captureScreenshot&&!A.image){document.body.classList.add("smartcomments-creating-screenshot");try{const n=(null==e?void 0:e.getBoundingClientRect)?e:null;A.image=await this.screenshot.captureSelectionScreenshot(n,null,t)}catch(r){this.errorHandler.handleScreenshotError(this.selectionType,r,A)}document.body.classList.remove("smartcomments-creating-screenshot")}if(!this.validateSelectionData(A))throw this.errorHandler.createContextualError("Selection data validation failed",this.selectionType,{selectionData:A,target:e});return A}validateSelectionData(A){return!(!A||"object"!=typeof A)&&(!(!A.text||0===A.text.length)&&(!(A.text.length>Ms)&&A.type===this.selectionType))}createBaseSelectionData(A,e=null,t=-1){return{text:this.sanitizeText(A),index:t,type:this.selectionType,element:e,timestamp:Date.now(),image:null}}sanitizeText(A){return Ca(A)}sanitizeHTML(A){return Ca(A)}getType(){return this.selectionType}getName(){return this.constructor.name}}class MB extends kB{constructor(){super("text"),this.rangyInitialized=!1,this.highlighter=null}validateTarget(A){return!!A&&(void 0!==A.rangeCount?A.rangeCount>0&&!A.isCollapsed:!(!A.toString||!A.toHtml))}async processSelection(A,e,t={}){if(!(await this.preProcess(A,e,t)))return null;try{if(!this.ensureRangyInitialized())throw new Error("Rangy library not available");const n=void 0!==A.rangeCount?A.getRangeAt(0):A,r=ya(n);if(!this.errorHandler.handleValidationError(r,this.selectionType))return null;const o=await this.extractTextAndIndex(n);return o.element=this.getSelectionElement(n),await this.postProcess(o,n,e,t)}catch(n){return this.errorHandler.handleSelectionError(this.selectionType,n,{target:A,event:e,options:t}),null}}prepareScreenshotParams(A,e,t){this.applyTemporaryHighlight(A);const n=A.getBoundingClientRect?A.getBoundingClientRect():this.getRangeRect(A);return{selectionPosition:{x:(null==e?void 0:e.clientX)||n.right,y:(null==e?void 0:e.clientY)||n.bottom},startPosition:{x:n.left,y:n.top},text:t.text,cleanupCallback:()=>this.clearTemporaryHighlight()}}async postProcess(A,e,t,n){let r=!1,o=null;try{n.captureScreenshot&&(o=this.applyTemporaryHighlight(e),r=!0,await new Promise((A=>setTimeout(A,50))),o&&(A.element=o));return await super.postProcess(A,e,t,n)}finally{r&&setTimeout((()=>{this.clearTemporaryHighlight()}),100)}}async extractTextAndIndex(A){return new Promise(((e,t)=>{try{const n=wa();if(!n)return void t(new Error("MediaWiki content root not found"));const r=rangy.serializeRange(A),o=A.toString(),i=this.sanitizeText(o),s=A.toHtml();if(i.length>Ms)return void t(new Error(`Selection too long: ${i.length} characters`));if(!o&&!s)return void t(new Error("Selection is empty"));Gs.HTML_TAG_REGEX.test(s)?this.searchHTMLContent(n,A,o,s,e,t,i):this.searchPlainText(n,A,o,r,e,t,i)}catch(n){t(n)}}))}searchPlainText(A,e,t,n,r,o,i){const s=rangy.createRange();s.selectNodeContents(A);const a={caseSensitive:!0,withinRange:s},c=rangy.createRange();c.selectNodeContents(A),c.findText(t,a)?this.findTextOccurrence(A,t,n,0,r,o,i||t):o(new Error(`Text "${t}" not found in content`))}searchHTMLContent(A,e,t,n,r,o,i){const s=document.createTreeWalker(A,NodeFilter.SHOW_TEXT,null,!1);let a,c=0,l=0;const u=t;for(;a=s.nextNode();){const A=a.textContent;for(let t=0;t{if(n>Ps)o(new Error("Search iteration limit exceeded"));else try{if(s.findText(e,c)){if(rangy.serializeRange(s)===t)return void r({text:i||e,index:n,type:"text"});s.collapse(!1),n++,requestAnimationFrame(l)}else o(new Error(`Text not found at position after ${n} occurrences`))}catch(A){o(A)}};l()}isTargetMatch(A,e){return A.parentNode.contains(e.endContainer)&&A.parentNode.contains(e.startContainer)}getSelectionElement(A){return A.startContainer.nodeType===Node.ELEMENT_NODE?A.startContainer:A.startContainer.parentElement||A.startContainer.parentNode}getRangeRect(A){try{return A.getBoundingClientRect()}catch(e){const t=this.getSelectionElement(A);return t?t.getBoundingClientRect():{left:0,top:0,right:0,bottom:0}}}applyTemporaryHighlight(A){try{const e=document.createElement("span");if(e.className=Ws,e.style.backgroundColor="#ffffe0",e.style.borderTop="1px solid rgba(0,0,0,0.2)",e.style.borderBottom="1px solid rgba(0,0,0,0.2)",A.canSurroundContents())return A.surroundContents(e),tc(e),e;{const t=A.extractContents();return e.appendChild(t),A.insertNode(e),tc(e),e}}catch(e){return console.warn("Failed to apply temporary highlight:",e),null}}clearTemporaryHighlight(){try{document.querySelectorAll(`.${Ws}`).forEach((A=>{!function(A){Ac(A,ma.TEMP_HIGHLIGHT_CLASSES[1],!1)}(A);const e=A.parentNode;e&&(e.replaceChild(document.createTextNode(A.textContent),A),e.normalize())}))}catch(A){console.warn("Failed to clear temporary highlight:",A)}}ensureRangyInitialized(){return this.rangyInitialized||(this.rangyInitialized=function(){if(window.rangy&&window.rangy.initialized)return!0;if(void 0===window.rangy)return console.error("Rangy library not found. Text selection may not work properly."),!1;try{return!window.rangy.initialized&&window.rangy.init&&window.rangy.init(),!0}catch(A){return console.error("Failed to initialize Rangy:",A),!1}}()),this.rangyInitialized}}class VB extends kB{constructor(){super("image"),this.setupCompleted=!1}validateTarget(A){if(!A||A.nodeType!==Node.ELEMENT_NODE)return!1;if("IMG"===A.tagName)return this.isValidImageElement(A);const e=A.querySelector("img");return e&&this.isValidImageElement(e)}isValidImageElement(A){if(!A.src)return!1;if(A.closest(`.${Ys}`)||A.closest(`.${js}`))return!1;const e=A.closest(`.${Js}`);return!e||e===A.parentElement}async processSelection(A,e,t={}){if(!(await this.preProcess(A,e,t)))return null;try{const n="IMG"===A.tagName?A:A.querySelector("img");if(!n)throw new Error("No image element found in target");if(!this.isValidImageElement(n))throw new Error("Invalid image element for selection");const r=ya(n.outerHTML);if(r!==sa&&r!==la&&!this.errorHandler.handleValidationError(r,this.selectionType))return null;const o=this.createImageSelectionData(n);return await this.postProcess(o,n,e,t)}catch(n){return this.errorHandler.handleSelectionError(this.selectionType,n,{target:A,event:e,options:t}),null}}createImageSelectionData(A){const e=Fa(A.src,A.width,A.height),t=A.alt||"",n=A.title||"",r=this.extractFilename(A.src);let o=t||n||`Image: ${r}`;return e&&(o=t||`Image: ${e}`),this.createBaseSelectionData(o,A,-1,{imageHash:e,src:A.src,width:A.width,height:A.height,alt:t,title:n,filename:r})}createBaseSelectionData(A,e,t,n={}){return{...super.createBaseSelectionData(A,e,t),imageHash:n.imageHash,src:n.src,metadata:{width:n.width,height:n.height,alt:n.alt,title:n.title,filename:n.filename,aspectRatio:n.width&&n.height?(n.width/n.height).toFixed(2):null}}}extractFilename(A){try{const e=new URL(A).pathname;return e.split("/").pop()||"unknown"}catch(e){return"unknown"}}setupImageSelection(){if(!this.setupCompleted)try{const A=wa();if(!A)return void console.error("Cannot setup image selection: content root not found.");const e=A.querySelectorAll("img");let t=0;e.forEach((A=>{this.shouldWrapImage(A)&&(this.wrapImageInDynamicBlock(A),t++)})),this.setupCompleted=!0}catch(A){console.error("Error during image selection setup:",A)}}shouldWrapImage(A){return(!A.parentElement||!A.parentElement.classList.contains(Js))&&(!A.closest(`.${Ys}`)&&!A.closest(`.${js}`)&&!!A.src)}wrapImageInDynamicBlock(A){try{const e=Fa(A.src,A.width,A.height),t=document.createElement("div");t.className=Js+" "+$s,t.dataset.hash=`${Gs.IMAGE_POSITION_PREFIX}${e}]`,t.dataset.type="image",A.alt&&t.setAttribute("aria-label",`Image: ${A.alt}`),A.parentNode?(A.parentNode.insertBefore(t,A),t.appendChild(A)):console.warn("Image has no parentNode, cannot wrap:",A)}catch(e){console.error("Error wrapping image:",e,A)}}prepareScreenshotParams(A,e,t){return{element:A,selectionPosition:this.screenshot.calculatePositionData(A,e).selectionPosition,startPosition:this.screenshot.calculatePositionData(A,e).startPosition}}resetSetup(){this.setupCompleted=!1}isSetupCompleted(){return this.setupCompleted}}class PB extends kB{constructor(){super("svg")}validateTarget(A){if(!A||A.nodeType!==Node.ELEMENT_NODE)return!1;return null!==this.findSVGLink(A)}async processSelection(A,e,t={}){if(!(await this.preProcess(A,e,t)))return null;try{const n=this.findSVGLink(A);if(!n)throw new Error("SVG element is not within a clickable link");const r=this.generateSVGUniqueId(n);r||(console.warn("SVGSelectionStrategy: uniqueId is undefined/null for svgLink:",n),console.warn("SVGSelectionStrategy: svgLink attributes:",{href:n.getAttribute("href"),xlinkHref:n.getAttribute("xlink:href"),innerHTML:n.innerHTML,outerHTML:n.outerHTML}));const o=this.extractSVGTextContent(n),i=n.getAttribute("xlink:href")||n.getAttribute("href"),s=this.extractSVGMetadata(n),a=ya(o||i||r);if(a!==sa&&a!==la&&!this.errorHandler.handleValidationError(a,this.selectionType))return null;const c=this.createSVGSelectionData(r,o,i,s,n);return await this.postProcess(c,n,e,t)}catch(n){return this.errorHandler.handleSelectionError(this.selectionType,n,{target:A,event:e,options:t}),null}}createSVGSelectionData(A,e,t,n,r){const o=function(A,e,t){return Ua([A||"",e||"",(t||"").trim()].filter(Boolean).join("|"))}(A,t,e),i=`${Gs.SVG_POSITION_PREFIX}${A}]`.trim(),s=e||(t?`SVG Link: ${this.extractPathFromHref(t)}`:A);return{...this.createBaseSelectionData(i,r,-1),svgId:A,svgHash:o,href:t,position:i,textContent:s,metadata:this.enhanceMetadata(n,r)}}generateSVGUniqueId(A){const e=A.getAttribute("xlink:href")||A.getAttribute("href");if(e){return this.generateIdFromHref(e)}const t=this.extractSVGTextContent(A);if(t){return this.generateIdFromTextAndPosition(A,t)}return this.generateFallbackId(A)}generateIdFromHref(A){try{const e=new URL(A).pathname.split("/").filter(Boolean),t=e[e.length-1];if(t&&"index.php"!==t){return`svg-href-${Qa(t)}`}}catch(Em){return`svg-href-${Qa(A)}`}return`svg-href-${Qa(A)}`}generateIdFromTextAndPosition(A,e){const t=A.getBoundingClientRect(),n=`${Math.round(t.left)}-${Math.round(t.top)}`;return`svg-text-${Qa(e.toLowerCase())}-${n}`}generateFallbackId(A){const e={tagName:A.tagName,position:A.getBoundingClientRect(),childCount:A.children.length,timestamp:Date.now()};return`svg-fallback-${btoa(JSON.stringify(e)).replace(/[^a-zA-Z0-9]/g,"").substring(0,16)}`}extractPathFromHref(A){try{return new URL(A).pathname.split("/").pop()||A}catch(Em){return A}}extractSVGTextContent(A){const e=[],t=A.querySelector("title");t&&t.textContent.trim()&&e.push(t.textContent.trim());A.querySelectorAll("text, tspan").forEach((A=>{const t=A.textContent.trim();t&&!e.includes(t)&&e.push(t)}));const n=A.querySelector("desc");if(n&&n.textContent.trim()){const A=n.textContent.trim();e.includes(A)||e.push(A)}return e.join(" ")}extractSVGMetadata(A){const e={},t=A.getAttribute("xlink:href")||A.getAttribute("href");t&&(e.href=t);const n=A.querySelector("metadata rdf\\:description, metadata description");if(n){const A=n.getAttribute("rdf:about")||n.getAttribute("about");A&&(e.rdfAbout=A)}const r=A.querySelector("rect, circle, ellipse, polygon, path");r&&(e.visual=this.extractVisualProperties(r));const o=A.getAttribute("class");o&&(e.classes=o.split(" ").filter(Boolean));const i=A.closest("svg");return i&&(e.svg={viewBox:i.getAttribute("viewBox"),width:i.getAttribute("width"),height:i.getAttribute("height")}),e}extractVisualProperties(A){const e={};return["x","y","width","height","r","cx","cy","fill","stroke","stroke-width"].forEach((t=>{const n=A.getAttribute(t)||A.style[t];n&&(e[t]=n)})),e}enhanceMetadata(A,e){const t={...A};return t.computed={boundingBox:e.getBoundingClientRect(),childElementCount:e.children.length,hasText:this.extractSVGTextContent(e).length>0,hasVisualElements:null!==e.querySelector("rect, circle, ellipse, polygon, path")},t.accessibility={hasTitle:null!==e.querySelector("title"),hasDesc:null!==e.querySelector("desc"),ariaLabel:e.getAttribute("aria-label"),role:e.getAttribute("role")},t}findSVGLink(A){if("a"===A.tagName&&A.closest("svg"))return A;return A.closest("svg a")}}class GB extends kB{constructor(){super("dynamic-block")}validateTarget(A){return!(!A||A.nodeType!==Node.ELEMENT_NODE)&&(A.classList.contains(Js)||null!==A.closest(`.${Js}`))}async processSelection(A,e,t={}){if(!(await this.preProcess(A,e,t)))return null;try{const n=this.getDynamicBlockElement(A);if(!n)throw new Error("No dynamic block element found");if(this.isAlreadyCommented(n))throw new Error("Dynamic block already has comments");const r=this.createDynamicBlockSelectionData(n);return await this.postProcess(r,n,e,t)}catch(n){return this.errorHandler.handleSelectionError(this.selectionType,n,{target:A,event:e,options:t}),null}}getDynamicBlockElement(A){return A.classList.contains(Js)?A:A.closest(`.${Js}`)}isAlreadyCommented(A){return A.outerHTML.includes(Xs)}createDynamicBlockSelectionData(A){let e=this.determineSelectionText(A);const t=this.extractBlockMetadata(A);return{...this.createBaseSelectionData(e,A,-1),blockType:this.getBlockType(A),blockHash:A.dataset.hash||null,metadata:t}}determineSelectionText(A){if(A.classList.contains($s)&&A.dataset.hash)return A.dataset.hash;const e=A.outerHTML;if(e.length>500){const A=e.substring(0,500)+"...";return this.sanitizeHTML(A)}return this.sanitizeHTML(e)}sanitizeHTML(A){return A.replace(/)<[^<]*)*<\/script>/gi,"").replace(/javascript:/gi,"").replace(/on\w+\s*=/gi,"").trim()}getBlockType(A){return A.classList.contains($s)?"image":A.dataset.type?A.dataset.type:A.querySelector("img")?"image":A.querySelector("table")?"table":A.querySelector("video")?"video":A.querySelector("iframe")?"iframe":"generic"}extractBlockMetadata(A){const e={classes:Array.from(A.classList),datasets:{...A.dataset},dimensions:{width:A.offsetWidth,height:A.offsetHeight},position:A.getBoundingClientRect(),childCount:A.children.length};switch(this.getBlockType(A)){case"image":e.image=this.extractImageMetadata(A);break;case"table":e.table=this.extractTableMetadata(A);break;case"video":e.video=this.extractVideoMetadata(A);break;case"iframe":e.iframe=this.extractIframeMetadata(A)}return e}extractImageMetadata(A){const e=A.querySelector("img");return e?{src:e.src,alt:e.alt,title:e.title,width:e.width||e.naturalWidth,height:e.height||e.naturalHeight,aspectRatio:e.naturalWidth&&e.naturalHeight?(e.naturalWidth/e.naturalHeight).toFixed(2):null}:{}}extractTableMetadata(A){const e=A.querySelector("table");return e?{rows:e.rows.length,columns:e.rows[0]?e.rows[0].cells.length:0,hasHeader:null!==e.querySelector("thead, th"),hasCaption:null!==e.querySelector("caption")}:{}}extractVideoMetadata(A){const e=A.querySelector("video");return e?{src:e.src||(e.querySelector("source")?e.querySelector("source").src:""),duration:e.duration,width:e.videoWidth||e.width,height:e.videoHeight||e.height,controls:e.controls,autoplay:e.autoplay,loop:e.loop,muted:e.muted}:{}}extractIframeMetadata(A){const e=A.querySelector("iframe");return e?{src:e.src,width:e.width||e.offsetWidth,height:e.height||e.offsetHeight,title:e.title,sandbox:e.sandbox.toString(),loading:e.loading}:{}}prepareScreenshotParams(A,e,t){return{...this.screenshot.calculatePositionData(A,e),text:t.text,element:A}}getAllDynamicBlocks(){return document.querySelectorAll(`.${Js}`)}getBlockStatistics(){const A=this.getAllDynamicBlocks(),e={total:A.length,byType:{},commented:0,uncommented:0};return A.forEach((A=>{const t=this.getBlockType(A);e.byType[t]=(e.byType[t]||0)+1,this.isAlreadyCommented(A)?e.commented++:e.uncommented++})),e}}const WB=new class{constructor(){this.strategies=new Map,this.defaultStrategy=null,this.initialized=!1}initialize(){if(!this.initialized)try{this.registerStrategy("text",new MB),this.registerStrategy("image",new VB),this.registerStrategy("svg",new PB),this.registerStrategy("dynamic-block",new GB),this.defaultStrategy=this.strategies.get("text"),this.initialized=!0}catch(A){console.error("Failed to initialize Selection Strategy Factory:",A),this.initialized=!1}}registerStrategy(A,e){if(!A||!e)throw new Error("Both type and strategy are required for registration");this.strategies.has(A)&&console.warn(`Strategy type '${A}' already registered, overwriting`),this.strategies.set(A,e)}getStrategy(A){return this.ensureInitialized(),this.strategies.get(A)||null}determineStrategy(A,e){return this.ensureInitialized(),this.isTextSelection(A)?this.getStrategy("text"):A&&A.nodeType===Node.ELEMENT_NODE?this.determineElementStrategy(A):(console.warn("Could not determine appropriate strategy for target:",A),this.defaultStrategy)}determineElementStrategy(A){const e=this.getStrategy("svg");if(e&&e.validateTarget(A))return e;const t=this.getStrategy("dynamic-block");if(t&&t.validateTarget(A))return t;const n=this.getStrategy("image");return n&&n.validateTarget(A)?n:this.getStrategy("text")}isTextSelection(A){return A&&"object"==typeof A&&void 0!==A.rangeCount?A.rangeCount>0&&!A.isCollapsed:!(!A||"object"!=typeof A||"function"!=typeof A.toString||"function"!=typeof A.toHtml)}async processSelection(A,e,t={}){var n;if(this.ensureInitialized(),null==(n=null==e?void 0:e.target)?void 0:n.closest(`[class*="${ga}"]`))return null;const r=this.determineStrategy(A,e);if(!r)return console.error("No strategy available for target:",A),null;try{const n=await r.processSelection(A,e,t);return n&&(n._strategy={type:r.getType(),name:r.getName()}),n}catch(o){return console.error(`Strategy ${r.getName()} failed:`,o),null}}getRegisteredTypes(){return this.ensureInitialized(),Array.from(this.strategies.keys())}getStatistics(){return{initialized:this.initialized,strategyCount:this.strategies.size,registeredTypes:this.getRegisteredTypes(),defaultStrategy:this.defaultStrategy?this.defaultStrategy.getName():null}}reset(){this.strategies.clear(),this.defaultStrategy=null,this.initialized=!1}ensureInitialized(){this.initialized||this.initialize()}setupStrategies(){this.ensureInitialized();const A=this.getStrategy("image");A&&"function"==typeof A.setupImageSelection&&A.setupImageSelection()}validateStrategy(A){if(!A||"object"!=typeof A)return!1;return["processSelection","validateTarget","getType","getName"].every((e=>"function"==typeof A[e]))}getStrategyByElement(A){this.ensureInitialized();for(const[e,t]of this.strategies)if(t.validateTarget(A))return t;return this.defaultStrategy}};function XB(){const A=Se(!1),e=Se(null),t=Se(null),n=fe({x:0,y:0}),r=fe({x:0,y:0}),o=Se(!1);async function i(r,i,a={}){if(o.value)return console.warn("Selection processing already in progress"),null;o.value=!0;try{const o=await WB.processSelection(r,i,a);return o?(e.value=o,function(A,e){if("text"===A.type&&window.rangy&&rangy.getSelection){const A=rangy.getSelection();A.rangeCount&&(t.value=A.getRangeAt(0).cloneRange())}else t.value=null;if(e)n.x=e.clientX||e.pageX||0,n.y=e.clientY||e.pageY||0;else if(A.element){const e=A.element.getBoundingClientRect();n.x=e.left+e.width/2,n.y=e.top+e.height/2}}(o,i),A.value=!0,o):(s(),null)}finally{o.value=!1}}function s(){if(e.value=null,t.value=null,A.value=!1,o.value=!1,window.getSelection)try{window.getSelection().removeAllRanges()}catch(n){console.warn("Failed to clear browser selection:",n)}if(window.rangy&&rangy.getSelection)try{rangy.getSelection().removeAllRanges()}catch(n){console.warn("Failed to clear rangy selection:",n)}}return WB.initialize(),{isSelectionActive:A,currentSelection:e,lastRange:t,selectionPosition:n,startPosition:r,isCapturing:o,processSelection:i,processTextSelection:async function(A,e={}){if(await new Promise((A=>setTimeout(A,ks))),!window.rangy||!rangy.getSelection)return console.error("Rangy library not available for text selection"),null;const t=rangy.getSelection();if(!t.rangeCount||t.isCollapsed)return null;const n=t.getRangeAt(0);return await i(n,A,e)},processDynamicBlockSelection:async function(A,e,t={}){return await i(A,e,t)},processImageSelection:async function(A,e,t={}){return await i(A,e,t)},processSVGSelection:async function(A,e,t={}){return await i(A,e,t)},clearSelection:s,formatSelectionForAPI:function(A){if(!A)return null;wa();let e=null;if(A.element){const t=A.element.closest("[data-comment-id]");t&&(e=t.dataset.commentId)}const n={text:A.text||"",index:A.index??-1,type:A.type||"text",image:A.image||null,parentId:e,src:A.src||null,imageHash:A.imageHash||null,svgId:A.svgId||null,svgHash:A.svgHash||null,href:A.href||null};switch(A.type){case"dynamic-block":A.element&&(n.elementData={hash:A.element.dataset.hash,type:A.element.dataset.type,blockType:A.blockType});break;case"image":A.metadata&&(n.elementData={src:A.src,width:A.metadata.width,height:A.metadata.height,alt:A.metadata.alt,aspectRatio:A.metadata.aspectRatio});break;case"svg":n.elementData={svgId:A.svgId,href:A.href,textContent:A.textContent,metadata:A.metadata};break;case"text":t.value&&(n.elementData={hasRange:!0,rangeInfo:"Available"})}return n},setupSelection:function(){try{WB.setupStrategies()}catch(A){console.error("Failed to setup selection system:",A)}},setupImageSelection:function(){const A=WB.getStrategy("image");if(A&&"function"==typeof A.setupImageSelection)return A.setupImageSelection();console.warn("Image strategy not available for setup")},findSVGLink:function(A){const e=WB.getStrategy("svg");return e&&"function"==typeof e.findSVGLink?e.findSVGLink(A):null},getSelectionStats:function(){var t;return{factory:WB.getStatistics(),currentState:{isActive:A.value,isCapturing:o.value,hasSelection:null!==e.value,selectionType:(null==(t=e.value)?void 0:t.type)||null},position:{selection:{...n},start:{...r}}}},canSelectElement:function(A){const e=WB.getStrategyByElement(A);return!!e&&e.validateTarget(A)},getElementSelectionType:function(A){const e=WB.getStrategyByElement(A);return e?e.getType():null},getMediaWikiContentRoot:wa}}const JB=Object.freeze(Object.defineProperty({__proto__:null,useSelection:XB},Symbol.toStringTag,{value:"Module"}));function $B(){let A=!1;const e=new Set;function t(A){if(!va())return;const t=A.target.closest(`.${Js}`);t&&(t.parentElement&&Array.from(t.parentElement.classList).some((A=>A.startsWith("smartcomment-hl-")))||(t.classList.add("hover"),e.add(t)))}function n(A){if(!va())return;const t=A.target.closest(`.${Js}`);t&&(t.classList.remove("hover"),e.delete(t))}function r(A){if(!va())return;const t=A.target;let n=null;n="a"===t.tagName&&t.closest("svg")?t:t.closest("svg a"),n&&(n.classList.contains("smartcomment-hl-")||Array.from(n.classList).some((A=>A.startsWith("smartcomment-hl-")))||(n.classList.add("sc-svg-hover"),e.add(n),function(A){try{if(!A.dataset.originalStyles){const e={};A.querySelectorAll("rect, path, circle, polygon, ellipse").forEach(((A,t)=>{e[`shape_${t}`]={fill:A.style.fill||A.getAttribute("fill"),stroke:A.style.stroke||A.getAttribute("stroke"),strokeWidth:A.style.strokeWidth||A.getAttribute("stroke-width")}})),A.dataset.originalStyles=JSON.stringify(e)}}catch(e){console.warn("Failed to apply SVG hover effects:",e)}}(n)))}function o(A){if(!va())return;const t=A.target;let n=null;n="a"===t.tagName&&t.closest("svg")?t:t.closest("svg a"),n&&(n.classList.remove("sc-svg-hover"),e.delete(n),i(n))}function i(A){try{A.dataset.originalStyles&&delete A.dataset.originalStyles}catch(e){console.warn("Failed to remove SVG hover effects:",e)}}function s(){e.forEach((A=>{A.classList.contains(Js)?A.classList.remove("hover"):A.closest("svg")&&(A.classList.remove("sc-svg-hover"),i(A))})),e.clear()}return{initializeHoverEffects:function(){if(!A)try{document.addEventListener("mouseover",t,!0),document.addEventListener("mouseout",n,!0),document.addEventListener("mouseover",r,!0),document.addEventListener("mouseout",o,!0),A=!0}catch(e){console.error("Failed to initialize hover effects:",e)}},destroyHoverEffects:function(){if(A)try{document.removeEventListener("mouseover",t,!0),document.removeEventListener("mouseout",n,!0),document.removeEventListener("mouseover",r,!0),document.removeEventListener("mouseout",o,!0),s(),A=!1}catch(e){console.error("Failed to destroy hover effects:",e)}},clearAllHoverEffects:s,getHoverStats:function(){return{isInitialized:A,activeHovers:e.size,hoveredElements:Array.from(e).map((A=>({tagName:A.tagName,classes:Array.from(A.classList),type:A.closest("svg")?"svg":"dynamic-block"})))}},get isInitialized(){return A},get hoveredElementsCount(){return e.size}}}const YB={SELECTION_ACTIVE:"sc-selection-active",COMMENT_GROUP_OPEN:"sc-comment-group-open",COMMENT_GROUP_CLOSE:"sc-comment-group-close",DEBUG_MODE:"sc-debug-mode",OPEN_COMMENT_ID:"sc-open-comment",OPEN_COMMENT_WITH_POSITION:"sc-open-comment-with-position",COMMENT_CREATED:"sc-comment-created",COMMENT_UPDATED:"sc-comment-updated",COMMENT_DELETED:"sc-comment-deleted",COMMENT_COMPLETED:"sc-comment-completed",HIGHLIGHT_CLICKED:"sc-highlight-clicked",SELECTION_CHANGED:"sc-selection-changed",COMMENTS_ENABLED:"sc-comments-enabled",COMMENTS_DISABLED:"sc-comments-disabled",REFRESH_HIGHLIGHTS:"smartcomments:refresh-highlights",REFRESH_TIMELINE:"smartcomments:refresh-timeline"};const jB=new class{constructor(){this.listeners=new Map,this.debugMode=!1,this.checkDebugMode(),this.setupLegacyCompatibility()}checkDebugMode(){"1"!==new URLSearchParams(window.location.search).get("scenabled")&&-1===window.location.href.indexOf("scenabled=1")||this.enableDebugMode()}enableDebugMode(){this.debugMode=!0,this.trigger(YB.DEBUG_MODE,{enabled:!0})}disableDebugMode(){this.debugMode=!1,this.trigger(YB.DEBUG_MODE,{enabled:!1})}trigger(A,e={},t=window){const n=new CustomEvent(A,{detail:e,bubbles:!0,cancelable:!0});return t.dispatchEvent(n),t!==window&&window.dispatchEvent(n),n}on(A,e,t=window){const n=A=>{e(A)};t.addEventListener(A,n);const r=`${A}_${Date.now()}_${Math.random()}`;return this.listeners.set(r,{target:t,eventName:A,callback:n}),()=>{t.removeEventListener(A,n),this.listeners.delete(r)}}once(A,e,t=window){const n=this.on(A,(A=>{n(),e(A)}),t);return n}removeAllListeners(){for(const[A,e]of this.listeners)e.target.removeEventListener(e.eventName,e.callback);this.listeners.clear()}setupLegacyCompatibility(){"undefined"!=typeof $&&$.fn&&Object.values(YB).forEach((A=>{this.on(A,(e=>{$(window).trigger(A,e.detail)}))}))}triggerCommentGroupOpen(A,e={}){return this.trigger(YB.COMMENT_GROUP_OPEN,{comment:A,position:e,timestamp:Date.now()})}triggerCommentGroupClose(){return this.trigger(YB.COMMENT_GROUP_CLOSE,{timestamp:Date.now()})}triggerSelectionActive(A){return this.trigger(YB.SELECTION_ACTIVE,{selection:A,timestamp:Date.now()})}triggerOpenComment(A){return this.trigger(YB.OPEN_COMMENT_ID,{commentId:A,timestamp:Date.now()})}triggerOpenCommentWithPosition(A,e){return this.trigger(YB.OPEN_COMMENT_WITH_POSITION,{commentId:A,position:e,timestamp:Date.now()})}triggerHighlightClicked(A,e){return this.trigger(YB.HIGHLIGHT_CLICKED,{comment:A,position:e,timestamp:Date.now()})}triggerCommentCreated(A){return this.trigger(YB.COMMENT_CREATED,{comment:A,timestamp:Date.now()})}triggerCommentUpdated(A){return this.trigger(YB.COMMENT_UPDATED,{comment:A,timestamp:Date.now()})}triggerCommentDeleted(A){return this.trigger(YB.COMMENT_DELETED,{comment:A,timestamp:Date.now()})}triggerCommentCompleted(A){return this.trigger(YB.COMMENT_COMPLETED,{comment:A,timestamp:Date.now()})}triggerCommentsEnabled(){return this.trigger(YB.COMMENTS_ENABLED,{timestamp:Date.now()})}triggerCommentsDisabled(){return this.trigger(YB.COMMENTS_DISABLED,{timestamp:Date.now()})}triggerRefreshHighlights(){return this.trigger(YB.REFRESH_HIGHLIGHTS,{timestamp:Date.now()})}triggerRefreshTimeline(){return this.trigger(YB.REFRESH_TIMELINE,{timestamp:Date.now()})}};function ZB(){const A=XB(),e=Ja(),t=$B();let n,r,o,i,s=!1;function a(){try{return Rs().isEnabled}catch(A){return console.warn("Could not check selection enabled state:",A),!1}}async function c(t,n,r={}){if(!a())return null;const o={captureScreenshot:!0,...r};try{const r=await A.processSelection(t,n,o);return r?(await async function(t,n){try{const r=function(A){return{data_id:p(),text:A.text,index:A.index,type:A.type,element:A.element||null,screenshot:A.image||null,timestamp:Date.now(),metadata:A.metadata||null,pos:A.pos||A.selector||null}}(t);e.addHighlight(t.type,r);const o=A.formatSelectionForAPI(t),i={selection:t,screenshot:t.image||null,apiData:o,position:{x:(null==n?void 0:n.pageX)||0,y:(null==n?void 0:n.pageY)||0},highlight:r,timestamp:Date.now()};jB.triggerSelectionActive(i);const s=new CustomEvent("smartcomments:selection",{detail:i});document.dispatchEvent(s)}catch(r){console.error("Failed to handle successful selection:",r),Ya.handleSelectionError("event-handling",r,{selectionResult:t,event:n})}}(r,n),r):null}catch(i){return Ya.handleSelectionError("universal",i,{target:t,event:n,options:o}),null}}async function l(A,e){if(a())try{await c(A,e)}catch(t){console.error("SVG selection failed:",t),Ya.handleSelectionError("svg",t,{svgLink:A,event:e})}}function u(e){a()&&(A.startPosition.x=e.pageX,A.startPosition.y=e.pageY)}function d(e){a()&&(A.isCapturing.value||(A.selectionPosition.x=e.pageX,A.selectionPosition.y=e.pageY))}function g(A){a()&&setTimeout((async()=>{if(!window.rangy||!rangy.getSelection)return;const e=rangy.getSelection();if(!e.isCollapsed&&e.rangeCount>0)try{const t=e.getRangeAt(0);await c(t,A)}catch(t){console.error("Text selection processing failed:",t),Ya.handleSelectionError("text",t,{event:A})}}),ks)}async function h(e){if(!a())return;const t=e.target;try{A.canSelectElement(t)&&(e.preventDefault(),await c(t,e))}catch(n){console.error("Click selection processing failed:",n),Ya.handleSelectionError("click",n,{target:t,event:e})}}function p(){return`temp_${Date.now()}_${Math.random().toString(36).substr(2,9)}`}function B(){if(s)try{n&&document.removeEventListener("mousedown",n),r&&document.removeEventListener("mouseup",r),o&&document.removeEventListener("mousemove",o),i&&document.removeEventListener("click",i),n=null,r=null,o=null,i=null,t.destroyHoverEffects(),s=!1}catch(A){console.error("Failed to unbind selection events:",A)}}return{bindEvents:function(){if(s)console.warn("Selection events already bound");else try{n=u.bind(this),r=g.bind(this),o=d.bind(this),i=h.bind(this),document.addEventListener("mousedown",n),document.addEventListener("mouseup",r),document.addEventListener("mousemove",o),document.addEventListener("click",i),t.initializeHoverEffects(),s=!0}catch(A){console.error("Failed to bind selection events:",A),s=!1}},unbindEvents:B,onSelectionCreate:function(A){if("function"!=typeof A)throw new Error("Selection create callback must be a function");const e=e=>{A(e.detail)};return document.addEventListener("smartcomments:selection",e),()=>{document.removeEventListener("smartcomments:selection",e)}},processUniversalSelection:c,createSelectionFromElement:function(e){const t=e.target,n=A.findSVGLink(t);if(n)return e.preventDefault(),void l(n,e);if(!window.rangy||!rangy.getSelection)return void console.warn("Rangy not available for text selection creation");const r=rangy.getSelection(),o=t.textContent||t.innerText||"";if(o.trim())try{const A=rangy.createRange();A.selectNodeContents(t),A.findText&&A.findText(o.trim())||A.selectNodeContents(t),r.setSingleRange(A)}catch(i){console.warn("Failed to create selection from element:",i);const A=rangy.createRange();A.selectNodeContents(t),r.setSingleRange(A)}},handleSVGSelection:l,handleMouseDown:u,handleMouseMove:d,handleMouseUp:g,handleClick:h,isSelectionEnabled:a,showSelectionError:function(A,e="unknown"){Ya.handleSelectionError(e,A)},getEventStats:function(){return{isEventsBound:s,selectionStats:A.getSelectionStats(),errorStats:Ya.getErrorStats(),timestamp:Date.now()}},resetEventSystem:function(){B(),A.clearSelection(),Ya.clearErrorStats()},get isEventsBound(){return s}}}function zB(){let A=null,e=!1;const{messages:t}=Ha();function n(A){var e;const n=Rs(),r=null==(e=mw.config.get("wgSmartComments"))?void 0:e.selectLinksOnClick;if(!n.isEnabled)return;const o=A.target;const i=function(A){let e=A;for(;e&&e!==document;){if("A"===e.tagName&&e.href||"a"===e.tagName&&e.getAttributeNS("http://www.w3.org/1999/xlink","href"))return e;e=e.parentElement}return null}(o);if(i){let e=i.href||i.getAttributeNS("http://www.w3.org/1999/xlink","href");if(void 0!==(null==e?void 0:e.baseVal)&&(e=e.baseVal),!e||"string"!=typeof e)return;const n=document.getElementById(qs);if(!n||!n.contains(i))return;if(o.closest(".smartcomments")||o.closest(".sic-timeline-container"))return;if(o.closest(".mw-editsection"))return;if(o.closest(`[class*="${ga}"]`)||i.classList.toString().includes(ga))return;if(o.closest(`.${ha}`))return;if(e.includes("#")&&e.split("#")[0]===window.location.href.split("#")[0])return;if(i.querySelector(`[class*="${ga}"]`))return A.preventDefault(),A.stopPropagation(),void mw.notify(t.linkCommentHighlightWarn(),{type:"warn",autoHide:!0,autoHideSeconds:4});if(A.preventDefault(),A.stopPropagation(),r){const{createSelectionFromElement:e}=ZB();return void e(A)}mw.notify(t.linkDisabledWarn(),{type:"warn",autoHide:!0,autoHideSeconds:3})}}return{bindEvents:function(){e||(A=n.bind(null),document.addEventListener("click",A,!0),e=!0)},unbindEvents:function(){e&&A&&(document.removeEventListener("click",A,!0),A=null,e=!1)},isLinkPreventionActive:function(){return Rs().isEnabled},isEventsBound:()=>e}}function qB(A,e=[]){if(A.nodeType===Node.TEXT_NODE)""!==A.nodeValue.trim()&&e.push(A);else for(let t=0,n=A.childNodes.length;t")}function ef(){return{applyTextHighlight:function(A,e,t,n){if(!window.rangy)return void console.error("Rangy not initialized. Cannot apply text highlights.");const r=String(e.comment.data_id);let o=window.rangy.createClassApplier(t,{ignoreWhiteSpace:!0,elementTagName:"span",normalize:!0,onElementCreate:(A,t)=>{A.setAttribute("data-comment-id",r),n(A,e.comment)}});!function(A,e,t){const{comment:n}=e;if(!n||!n.pos)return void console.warn("applyTextIndexHighlight: Missing comment or comment.pos",e);const r=String(n.pos),o=r.lastIndexOf("|");if(-1===o)return void console.warn("applyTextIndexHighlight: Invalid pos string format (missing |)",r);let i=r.substring(0,o);i=Af(i);const s=parseInt(r.substring(o+1),10);if(isNaN(s)||s<0)return void console.warn("applyTextIndexHighlight: Invalid index (NaN or negative)",s,"for pos:",r);window.rangy.createRange().selectNodeContents(A);let a=0,c=!1;const l=qB(A);for(const u of l){let A=u.data.indexOf(i);for(;-1!==A;){if(a===s){const n=window.rangy.createRange();n.setStart(u,A),n.setEnd(u,A+i.length);try{t.applyToRange(n)}catch(Em){console.error("Error applying classApplier to range:",Em,{textNode:u,localIndex:A,textToFind:i,highlightData:e})}c=!0;break}a++,A=u.data.indexOf(i,A+i.length)}if(c)break}c||console.warn("applyTextIndexHighlight: Text index highlight not found or applied for:",{textToFind:i,index:s,posString:r})}(A,e,o);const i=A.querySelectorAll(`.${t}`);i.length>0&&i.forEach((A=>{A.getAttribute("data-comment-id")||A.setAttribute("data-comment-id",r),n(A,e.comment)}))},removeTextHighlight:function(A,e,t){if(!window.rangy)return void console.warn("removeTextHighlight: Rangy not available");const n=window.rangy.createClassApplier(A,{ignoreWhiteSpace:!0,elementTagName:"span",normalize:!0});t.forEach((e=>{const t=Array.from(e.classList).some((e=>e.startsWith("smartcomment-hl-")&&e!==A));if("SPAN"===e.tagName&&e.hasAttribute("data-comment-id"))try{const A=window.rangy.createRange();A.selectNodeContents(e),n.undoToRange(A),t||e.removeAttribute("data-comment-id")}catch(Em){console.warn("removeTextHighlight: Error using Rangy undoToRange, falling back to manual removal:",Em),function(A,e,t){A.classList.remove(e),t||A.removeAttribute("data-comment-id");if("SPAN"===A.tagName){if(!t&&(0===A.classList.length||!Array.from(A.classList).some((A=>A.startsWith("smartcomment-"))))&&(!A.hasAttributes()||1===A.attributes.length&&A.hasAttribute("class")&&0===A.classList.length)){const e=A.parentNode;if(e){for(;A.firstChild;)e.insertBefore(A.firstChild,A);e.removeChild(A);try{e.normalize()}catch(n){console.warn("manuallyRemoveTextHighlight: Error normalizing parent node:",n)}}}}}(e,A,t)}}))},getTextNodesIn:qB,decodeHtmlEntities:Af}}function tf(){return{applySelectorHighlight:function(A,e,t,n){const{comment:r}=e;if(!r||!r.pos)return void console.warn("applySelectorHighlight: Missing comment or comment.pos",e);let o=r.pos;const i=t.split(" "),s=String(r.data_id);o.startsWith("img[")?function(A,e,t,n,r,o){const i=e.replace("img[","").replace("]",""),s=A.querySelectorAll(`[data-hash="${e}"]`);if(s.length>0)return void s.forEach((A=>{A.classList.add(...n),A.setAttribute("data-comment-id",r),o(A,t)}));const a=A.querySelectorAll("img");a.forEach((e=>{if(e.getAttribute("data-original-hash")===i||e.src.includes(i)||t.image_hash&&e.src.includes(t.image_hash)){const i=e.closest("figure")||e.parentElement;i&&i!==A?(i.classList.add(...n),i.setAttribute("data-comment-id",r),o(i,t)):(e.classList.add(...n),e.setAttribute("data-comment-id",r),o(e,t))}}))}(A,o,r,i,s,n):function(A,e,t,n,r,o){try{A.querySelectorAll(e).forEach((A=>{A.classList.add(...n),A.setAttribute("data-comment-id",r),o(A,t)}))}catch(Em){console.error("Error applying selector highlight with selector:",e,Em)}}(A,o,r,i,s,n)},removeSelectorHighlight:function(A,e,t){t.forEach((e=>{const t=Array.from(e.classList).some((e=>e.startsWith("smartcomment-hl-")&&e!==A));e.classList.remove(A),t||e.removeAttribute("data-comment-id")}))}}}const nf=new Map;class rf{static initialize(){if(this.strategies)return this.strategies;const{applyTextHighlight:A,removeTextHighlight:e}=ef(),{applySelectorHighlight:t,removeSelectorHighlight:n}=tf(),{applySVGHighlight:r,removeSVGHighlight:o}=function(){function A(A,t,n,r,o,i){let s=!1;const a=A.querySelectorAll(`[data-svg-id="${t}"]`);return a.length>0&&a.forEach((A=>{A.classList.add(...r),A.setAttribute("data-comment-id",o),i(A,n),s=!0})),s||A.querySelectorAll("svg a").forEach(((A,a)=>{e(A,t)&&(A.setAttribute("data-svg-id",t),A.classList.add(...r),A.setAttribute("data-comment-id",o),i(A,n),s=!0)})),s||A.querySelectorAll("svg *[href], svg *[xlink\\:href]").forEach(((A,a)=>{if(e(A,t)){const e=A.closest("a")||A;e.setAttribute("data-svg-id",t),e.classList.add(...r),e.setAttribute("data-comment-id",o),i(e,n),s=!0}})),s||console.warn("applySVGHighlight: SVG element not found for ID:",t),s}function e(A,e){if(A.getAttribute("data-svg-id")===e)return!0;const t=A.getAttribute("xlink:href")||A.getAttribute("href");if(e.startsWith("svg-href-")&&t)try{const A=new URL(t).pathname.split("/").filter(Boolean),n=A[A.length-1];if(n&&"index.php"!==n){const A=`svg-href-${Qa(n)}`.trim();if(e.trim()===A)return!0}}catch(Em){const n=`svg-href-${Qa(t)}`.trim();if(e.trim()===n)return!0}if(e.startsWith("svg-text-")){const t=function(A){const e=A.querySelectorAll("text, tspan"),t=[];e.forEach((A=>{const e=A.textContent.trim();e&&!t.includes(e)&&t.push(e)}));const n=A.querySelector("title");if(n&&n.textContent.trim()){const A=n.textContent.trim();t.includes(A)||t.unshift(A)}return t.join(" ")}(A);if(t){const n=A.getBoundingClientRect(),r=`${Math.round(n.left)}-${Math.round(n.top)}`;if(e===`svg-text-${Qa(t.toLowerCase())}-${r}`)return!0}}if(e.startsWith("svg-fallback-"))try{const t={tagName:A.tagName,position:A.getBoundingClientRect(),childCount:A.children.length};if(e===`svg-fallback-${btoa(JSON.stringify(t)).replace(/[^a-zA-Z0-9]/g,"").substring(0,16)}`)return!0}catch(Em){}return!1}return{applySVGHighlight:function(e,t,n,r){const{comment:o}=t;if(!o||!o.pos)return void console.warn("applySVGHighlight: Missing comment or comment.pos",t);const i=o.pos,s=n.split(" "),a=String(o.data_id);if(!i.startsWith("svg[")||!i.endsWith("]"))return void console.warn("applySVGHighlight: Invalid SVG selector format:",i);const c=i.slice(4,-1);A(e,c,o,s,a,r)||setTimeout((()=>{A(e,c,o,s,a,r)}),100)},removeSVGHighlight:function(A,e,t){t.forEach((e=>{const t=Array.from(e.classList).some((e=>e.startsWith("smartcomment-hl-")&&e!==A));e.classList.remove(A),t||e.removeAttribute("data-comment-id")}))}}}();return this.strategies={wordIndex:{apply:A,remove:e},selector:{apply:t,remove:n},svg:{apply:r,remove:o}},this.strategies}static getStrategy(A){const e=this.initialize()[A];return e||ka.handleValidationError(`Unknown highlight type: ${A}`,{type:A}),e}}function of(){const{ensureClickListenerIsAttached:A,clearListenersForCommentId:e,clearAllListeners:t}={ensureClickListenerIsAttached:function(A,e,t){const n=String(e.data_id);let r=nf.get(n);if((!r||!r.some((e=>e.element===A&&"click"===e.type)))&&t&&"function"==typeof t){const r=n=>{n.stopPropagation();const r=A.getBoundingClientRect(),o={top:r.top+window.scrollY,left:r.left+window.scrollX,bottom:r.bottom+window.scrollY,right:r.right+window.scrollX,width:r.width,height:r.height};t(n,e,o)};A.addEventListener("click",r),A.style.cursor="pointer",nf.has(n)||nf.set(n,[]),nf.get(n).push({element:A,handler:r,type:"click"})}},clearListenersForCommentId:function(A){nf.has(A)&&(nf.get(A).forEach((({element:A,handler:e,type:t})=>{A.removeEventListener(t,e),A.style.cursor=""})),nf.delete(A))},clearAllListeners:function(){nf.forEach(((A,e)=>{A.forEach((({element:A,handler:e,type:t})=>{A.removeEventListener(t,e),A&&(A.style.cursor="")}))})),nf.clear()},getAttachedListeners:function(){return nf},hasListenerAttached:function(A,e,t="click"){const n=String(e),r=nf.get(n);return r&&r.some((e=>e.element===A&&e.type===t))}};return{applyHighlights:function(e,t,n){t&&Array.isArray(t)?window.rangy?t.forEach((t=>{var r;ka.safeExecute((()=>{ka.validateHighlightData(t);const r=Ga(t.comment.data_id);rf.getStrategy(t.type).apply(e,t,r,((e,t)=>{A(e,t,n)}))}),`apply ${(null==t?void 0:t.type)||"unknown"} highlight`,{commentId:null==(r=null==t?void 0:t.comment)?void 0:r.data_id,type:null==t?void 0:t.type})})):ka.handleRangyError("Rangy not initialized. Cannot apply highlights"):ka.handleValidationError("Highlights must be an array of highlight objects",{highlights:t})},clearHighlights:function(A,t){t&&Array.isArray(t)?window.rangy?t.forEach((t=>{var n;ka.safeExecute((()=>{var n;if(!(null==(n=null==t?void 0:t.comment)?void 0:n.data_id))return;const r=String(t.comment.data_id),o=Ga(r);e(r);const i=Xa(A,r);if(0===i.length)return;rf.getStrategy(t.type).remove(o,A,Array.from(i))}),`clear ${(null==t?void 0:t.type)||"unknown"} highlight`,{commentId:null==(n=null==t?void 0:t.comment)?void 0:n.data_id,type:null==t?void 0:t.type})})):ka.handleRangyError("Rangy not available for clearing highlights"):ka.handleValidationError("highlightsToClear must be an array",{highlightsToClear:t})},clearAllHighlights:function(A){ka.safeExecute((()=>{t();A.querySelectorAll(`[data-comment-id], [class*="${Ma}"]`).forEach((A=>{Array.from(A.classList).filter((A=>A.startsWith(Ma))).forEach((e=>{Wa(A,e)})),"SPAN"===A.tagName&&function(A){if("SPAN"!==A.tagName)return;if(0===A.classList.length&&!A.hasAttributes()&&A.innerHTML===A.textContent){const e=A.parentNode;if(e){for(;A.firstChild;)e.insertBefore(A.firstChild,A);e.removeChild(A);try{e.normalize()}catch(Em){console.warn("Error normalizing parent after span unwrap:",Em)}}}}(A)}))}),"clear all highlights",{scopeElement:null==A?void 0:A.tagName})},removeCommentHighlight:function(A,t=null){const n=t||document.getElementById("mw-content-text")||document.body;ka.safeExecute((()=>{if(!window.rangy)return void ka.handleRangyError("Rangy not available for comment highlight removal",{commentId:A});const t=String(A);e(t);const r=Xa(n,t);if(0===r.length)return;const o=function(A){const e=A.some((A=>"SPAN"===A.tagName&&A.hasAttribute("data-comment-id"))),t=A.some((A=>A.hasAttribute("data-svg-id")||A.closest("svg")||"a"===A.tagName&&A.closest("svg")));return e?"wordIndex":t?"svg":"selector"}(Array.from(r));if(o){const A=rf.getStrategy(o),e=Ga(t);A.remove(e,n,Array.from(r))}else{const A=Ga(t);!function(A,e,t=null){A.querySelectorAll(`.${e}`).forEach((A=>{t&&"function"==typeof t?t(A,e):Wa(A,e)}))}(n,A)}}),"remove comment highlight",{commentId:A,scopeElement:null==n?void 0:n.tagName})}}}__publicField(rf,"strategies",null);const sf=Ls("commentsStore",{state:()=>({comments:[],currentCommentId:null,isLoading:!1,error:null,activeComment:null,commentPosition:null,isCommentDialogVisible:!1,isNewCommentDialogVisible:!1,newCommentSelection:null,isImageModalVisible:!1}),getters:{getCurrentComment:A=>A.comments.find((e=>e.id&&e.id===A.currentCommentId||e.data_id&&e.data_id===A.currentCommentId))||null,getCommentsSortedByPosition:A=>A.comments.filter((A=>"completed"!==A.status)).slice().sort(((e,t)=>A.getCommentDocumentPosition(e)-A.getCommentDocumentPosition(t))),getCurrentCommentIndex:A=>A.getCommentsSortedByPosition.findIndex((e=>e.id&&e.id===A.currentCommentId||e.data_id&&e.data_id===A.currentCommentId)),hasNextComment:A=>{const e=A.getCommentsSortedByPosition,t=e.findIndex((e=>e.id&&e.id===A.currentCommentId||e.data_id&&e.data_id===A.currentCommentId));return-1!==t&&tA.getCommentsSortedByPosition.findIndex((e=>e.id&&e.id===A.currentCommentId||e.data_id&&e.data_id===A.currentCommentId))>0,getNextComment:A=>{const e=A.getCommentsSortedByPosition,t=e.findIndex((e=>e.id&&e.id===A.currentCommentId||e.data_id&&e.data_id===A.currentCommentId));return-1!==t&&t{const e=A.getCommentsSortedByPosition,t=e.findIndex((e=>e.id&&e.id===A.currentCommentId||e.data_id&&e.data_id===A.currentCommentId));return t>0?e[t-1]:null},getCommentDocumentPosition:()=>A=>{try{const e=A.id||A.data_id,t=document.querySelector(`.smartcomment-hl-${e}, [data-comment-id="${e}"]`);if(t)return af(t);if(A.parsedSelection){const e=A.parsedSelection;if("text"===e.type&&e.text&&"number"==typeof e.index)return function(A,e=0){if(!A)return Number.MAX_SAFE_INTEGER;try{const t=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT,null,!1);let n,r=0;for(;n=t.nextNode();){const t=(n.textContent||"").indexOf(A);if(-1!==t){if(r===e){const e=document.createRange();e.setStart(n,t),e.setEnd(n,t+A.length);const r=e.getBoundingClientRect(),o=window.scrollY||window.pageYOffset;return r.top+o}r++}}return Number.MAX_SAFE_INTEGER}catch(t){return console.warn("Error finding text position:",t),Number.MAX_SAFE_INTEGER}}(e.text,e.index);if("image"===e.type||"dynamic-block"===e.type||"svg"===e.type){const A=function(A){if(!A)return null;try{let e=A;return A.startsWith("img:")&&(e=A.substring(4)),A.startsWith("svg:")&&(e=A.substring(4)),document.querySelector(e)}catch(e){return console.warn("Invalid selector:",A,e),null}}(e.text);if(A)return af(A)}}return console.warn("Could not determine position for comment:",e),Number.MAX_SAFE_INTEGER}catch(e){return console.warn("Error calculating comment position:",e),Number.MAX_SAFE_INTEGER}}},actions:{setComments(A){this.comments=A},setCurrentComment(A){this.currentCommentId=A},addComment(A){this.comments.push(A)},updateComment(A,e){const t=this.comments.findIndex((e=>e.id&&e.id===A||e.data_id&&e.data_id===A));-1!==t&&(this.comments[t]={...this.comments[t],...e})},removeComment(A){const e=this.comments.length;this.comments=this.comments.filter((e=>{const t=e.id&&e.id==A,n=e.data_id&&e.data_id==A;return!t&&!n})),this.comments.length===e&&console.warn("CommentsStore: removeComment called but no comment was removed",{commentId:A,totalComments:e}),this.currentCommentId==A&&(this.currentCommentId=null)},goToNextComment(){const A=this.getNextComment;return A?(this.currentCommentId=A.id||A.data_id,A):null},goToPreviousComment(){const A=this.getPreviousComment;return A?(this.currentCommentId=A.id||A.data_id,A):null},setLoading(A){this.isLoading=A},setError(A){this.error=A},clearError(){this.error=null},async openCommentDialog(A,e){this.setLoading(!0),this.clearError();try{const{getComment:t}=Ia(),n=await t(A.data_id);n?(this.activeComment=n,this.commentPosition=e,this.isCommentDialogVisible=!0,this.setCurrentComment(n.id||n.data_id),this.setActiveHighlight(n.data_id||n.id)):(this.setError("Comment not found"),console.error("CommentsStore: Comment not found:",A.data_id))}catch(t){this.setError("Error fetching comment"),console.error("CommentsStore: Error fetching comment:",t)}finally{this.setLoading(!1)}},closeCommentDialog(){jB.triggerCommentGroupClose(),this.clearActiveHighlight(),this.activeComment=null,this.commentPosition=null,this.isCommentDialogVisible=!1,this.setCurrentComment(null)},async navigateComment(A){const e="next"===A?this.goToNextComment():this.goToPreviousComment();if(e)try{const{getComment:t}=Ia(),n=await t(e.data_id||e.id);n?(this.activeComment=n,this.setCurrentComment(n.id||n.data_id),this.setActiveHighlight(n.data_id||n.id,!0)):(this.setError(`Could not fetch ${A} comment`),console.error("CommentsStore: Could not fetch",A,"comment:",e))}catch(t){this.setError(`Error navigating to ${A} comment`),console.error("CommentsStore: Error navigating to",A,"comment:",t)}},openNewCommentDialog(A){this.newCommentSelection={text:A.selection.text,index:A.selection.index,type:A.selection.type,image:A.selection.image||null},this.isNewCommentDialogVisible=!0},closeNewCommentDialog(){this.newCommentSelection=null,this.isNewCommentDialogVisible=!1},openImageModal(){this.isImageModalVisible=!0},closeImageModal(){this.isImageModalVisible=!1},async handleCommentSaved(A){this.closeNewCommentDialog(),jB.triggerCommentCreated(A),"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("smartcomments:refresh-highlights",{detail:{savedComment:A}}))},async deleteComment(A){this.setLoading(!0);try{const{deleteComment:e}=Ia(),t=await e(A.id||A.data_id);if("1"===t.success||!0===t.success){this.removeComment(A.id||A.data_id),jB.triggerCommentDeleted(A);const{removeCommentHighlight:e}=of();e(A.id||A.data_id),this.closeCommentDialog(),"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("smartcomments:refresh-highlights",{detail:{deletedComment:A}}))}else this.setError(t.message||"Failed to delete comment")}catch(e){this.setError("Error deleting comment"),console.error("CommentsStore: Error deleting comment:",e)}finally{this.setLoading(!1)}},async completeComment(A){this.setLoading(!0);try{const{updateComment:e}=Ia(),t=await e(A.id||A.data_id,"completed","");if("1"===t.success||!0===t.success){this.updateComment(A.id||A.data_id,{status:"completed"}),jB.triggerCommentCompleted(A);const{removeCommentHighlight:e}=of();e(A.id||A.data_id),"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("smartcomments:refresh-highlights",{detail:{completedComment:A}})),this.closeCommentDialog()}else this.setError(t.message||"Failed to complete comment")}catch(e){this.setError("Error completing comment"),console.error("CommentsStore: Error completing comment:",e)}finally{this.setLoading(!1)}},viewPage(A){const e=mw.util.getUrl("Special:SmartComments",{page:mw.config.get("wgPageName")});window.open(e,"_blank")},closeAllDialogs(){this.closeCommentDialog(),this.closeNewCommentDialog()},setActiveHighlight(A,e=!1){this.clearActiveHighlight();const t=`smartcomment-hl-${A}`,n=document.querySelectorAll(`.${t}`);n.forEach((A=>{A.classList.add("active")}));const r=document.querySelectorAll(`[data-comment-id="${A}"]`);if(r.forEach((A=>{A.classList.add("active")})),e){const A=n[0]||r[0];A&&A.scrollIntoView({behavior:"smooth",block:"center"})}},clearActiveHighlight(){document.querySelectorAll('[class*="smartcomment-hl-"].active, [data-comment-id].active').forEach((A=>{A.classList.remove("active")}))},handleReplyAdded(A){if(this.activeComment&&A.comment){const e=A.comment.id||A.comment.data_id;this.updateComment(e,{replies:A.comment.replies})}"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("smartcomments:refresh-highlights",{detail:{replyAdded:!0,replyData:A}}))},async openCommentDialogById(A){if(A){this.setLoading(!0),this.clearError();try{const{getComment:e}=Ia(),t=await e(A);if(t){const e=document.querySelector(`.smartcomment-hl-${A}`);let n;if(e){const A=e.getBoundingClientRect();n={top:A.top+window.scrollY,left:A.left+window.scrollX,bottom:A.bottom+window.scrollY,right:A.right+window.scrollX,width:A.width,height:A.height}}else n={top:100,left:100,bottom:150,right:400,width:300,height:50};this.activeComment=t,this.commentPosition=n,this.isCommentDialogVisible=!0,this.setCurrentComment(t.id||t.data_id),this.setActiveHighlight(t.data_id||t.id,!0);-1===this.comments.findIndex((e=>e.id&&e.id===A||e.data_id&&e.data_id===A))&&this.comments.push(t)}else this.setError("Comment not found"),console.error("CommentsStore: Comment not found for ID:",A)}catch(e){this.setError("Error fetching comment"),console.error("CommentsStore: Error fetching comment by ID:",e)}finally{this.setLoading(!1)}}},async checkAndOpenCommentFromUrl(){const A=new URLSearchParams(window.location.search),e=A.get("commentId")||A.get("focusId");e&&await this.openCommentDialogById(e)},async openCommentDialogByIdWithPosition(A,e){if(A&&e){this.setLoading(!0),this.clearError();try{const{getComment:t}=Ia(),n=await t(A);if(n){this.activeComment=n,this.commentPosition=e,this.isCommentDialogVisible=!0,this.setCurrentComment(n.id||n.data_id),this.setActiveHighlight(n.data_id||n.id,!1);-1===this.comments.findIndex((e=>e.id&&e.id===A||e.data_id&&e.data_id===A))&&this.comments.push(n)}else this.setError("Comment not found"),console.error("CommentsStore: Comment not found for ID:",A)}catch(t){this.setError("Error fetching comment"),console.error("CommentsStore: Error fetching comment by ID:",t)}finally{this.setLoading(!1)}}},async openCommentById(A){return await this.openCommentDialogById(A)}}});function af(A){if(!A)return Number.MAX_SAFE_INTEGER;const e=A.getBoundingClientRect(),t=window.scrollY||window.pageYOffset;return e.top+t}const{applyHighlights:cf,clearAllHighlights:lf}=of();const uf=(A,e)=>{const t=A.__vccOpts||A;for(const[n,r]of e)t[n]=r;return t},df={class:"smartcomments-reply-form"},gf={class:"smartcomments-reply-form-header"},hf={class:"smartcomments-reply-form-body"},pf=["placeholder","aria-label"],Bf={class:"smartcomments-reply-form-footer"},ff={class:"smartcomments-reply-form-actions"},mf=["disabled"];const wf=uf(Jt({name:"ReplyForm",data:()=>({reply:"",isFocused:!1,hasContent:!1,isSubmitting:!1}),props:{comment:{type:Object,required:!0}},emits:["reply-submitted"],setup(A){const{messages:e,msg:t}=Ha();return{messages:e,replyAriaLabel:Ro((()=>{const e=A.comment.author?A.comment.author.replace(/<[^>]*>/g,""):"comment";return t("sic-reply-aria-label",`Reply to ${e}`,e)}))}},computed:{showActions(){return this.isFocused||this.hasContent||this.isSubmitting},canSubmit(){return this.reply.trim().length>0&&!this.isSubmitting}},methods:{onFocus(){this.isFocused=!0},onBlur(){this.isFocused=!1},onInput(){this.hasContent=this.reply.trim().length>0},async submitReply(){if(this.canSubmit){this.isSubmitting=!0;try{if(this.comment.reply&&"function"==typeof this.comment.reply){if(await this.comment.reply(this.reply)){const A={text:this.reply,author:mw.config.get("wgUserName"),datetime:(new Date).toISOString()};this.$emit("reply-submitted",A),this.reply="",this.hasContent=!1,this.isFocused=!1}else console.error("Failed to submit reply")}else console.error("Comment object does not have a reply method")}catch(A){console.error("Error submitting reply:",A)}finally{this.isSubmitting=!1}}},cancelReply(){this.reply="",this.hasContent=!1,this.isFocused=!1,this.$refs.textarea.blur()}}}),[["render",function(A,e,t,n,r,o){return $r(),zr("div",df,[ro("div",gf,[ro("p",null,q(A.messages.replyHeader()),1)]),ro("div",hf,[Pt(ro("textarea",{class:W(["smartcomments-reply-form-body-textarea",{"has-content":A.hasContent}]),"onUpdate:modelValue":e[0]||(e[0]=e=>A.reply=e),placeholder:A.messages.replyPlaceholder(),onFocus:e[1]||(e[1]=(...e)=>A.onFocus&&A.onFocus(...e)),onBlur:e[2]||(e[2]=(...e)=>A.onBlur&&A.onBlur(...e)),onInput:e[3]||(e[3]=(...e)=>A.onInput&&A.onInput(...e)),"aria-label":A.replyAriaLabel,ref:"textarea"},null,42,pf),[[yi,A.reply]])]),Pt(ro("div",Bf,[ro("div",ff,[ro("button",{class:"smartcomments-reply-form-cancel",onClick:e[4]||(e[4]=(...e)=>A.cancelReply&&A.cancelReply(...e)),type:"button"},q(A.messages.cancel()),1),ro("button",{class:"smartcomments-reply-form-submit",onClick:e[5]||(e[5]=(...e)=>A.submitReply&&A.submitReply(...e)),disabled:!A.canSubmit,type:"submit"},q(A.messages.replySubmit()),9,mf)])],512),[[Zo,A.showActions]])])}]]);const Cf={class:"smartcomments-message"},Qf={class:"smartcomments-message-header"},yf=["innerHTML"],Ef=["innerHTML"],vf=["innerHTML"];const Uf=uf(Jt({name:"CommentMessage",props:{comment:{type:Object,required:!0}},computed:{commentText(){return this.comment&&"string"==typeof this.comment.text?function(A){if("string"!=typeof A)return A;const e=document.createElement("textarea");return e.innerHTML=A,e.value}(this.comment.text):""}}}),[["render",function(A,e,t,n,r,o){return $r(),zr("div",Cf,[ro("div",Qf,[ro("div",{class:"smartcomments-message-header-author",innerHTML:A.comment.author},null,8,yf),ro("div",{class:"smartcomments-message-header-date",innerHTML:A.comment.datetime},null,8,Ef)]),ro("div",{class:"smartcomments-message-body",innerHTML:A.commentText},null,8,vf)])}]]),Ff={class:"smartcomments-reply-list"};const bf=uf(Jt({name:"ReplyList",components:{CommentMessage:Uf},props:{replies:{type:Array,required:!0}}}),[["render",function(A,e,t,n,r,o){const i=Bn("comment-message");return $r(),zr("div",Ff,[($r(!0),zr(Vr,null,wn(A.replies,(A=>($r(),zr("div",{class:"smartcomments-reply-list-item",key:A.id},[oo(i,{comment:A},null,8,["comment"])])))),128))])}]]),Hf={class:"smartcomments-comment-actions"},If=["onClick","data-tooltip"],Sf=["innerHTML"],Nf=["onClick","data-tooltip"],xf=["innerHTML"],Df={key:0,class:"smartcomments-dropdown-menu"},Of=["onClick"],Tf=["innerHTML"];const Lf=uf(Jt({name:"CommentActions",props:{comment:{type:Object,required:!0}},setup(A,{emit:e}){const t=_s(),n=sf(),{messages:r}=Ha(),o=Ro((()=>[{icon:"oo-ui-icon-arrowPrevious",label:r.previousComment(),align:"left",action:()=>{e("previous")},when:()=>n.hasPreviousComment},{icon:"oo-ui-icon-arrowNext",label:r.nextComment(),align:"left",action:()=>{e("next")},when:()=>n.hasNextComment},{icon:"oo-ui-icon-ellipsis",label:r.actions(),align:"right",items:[{icon:"oo-ui-icon-check",label:r.markComplete(),style:"",action:()=>{e("complete",A.comment)}},{icon:"oo-ui-icon-trash",label:r.markDelete(),style:"",action:()=>{e("delete",A.comment)}},{icon:"oo-ui-icon-articles",label:r.viewOverview(),style:"",action:()=>{e("view",A.comment)}}],when:()=>t.canManageComments},{icon:"oo-ui-icon-close",label:r.close(),align:"right",action:()=>{e("close")},when:()=>!0}])),i=Ro((()=>o.value.filter((A=>A.when())))),s=Se({});return{filteredActions:i,dropdownStates:s,toggleDropdown:A=>{s.value[A]=!s.value[A]},handleSubItemClick:(A,e)=>{A.action(),s.value[e]=!1}}}}),[["render",function(A,e,t,n,r,o){return $r(),zr("div",Hf,[($r(!0),zr(Vr,null,wn(A.filteredActions,(e=>($r(),zr("div",{class:W(["smartcomments-comment-actions-item",`align-${e.align}`]),key:e.icon,style:k(e.style)},[e.items?($r(),zr("div",{key:1,class:W(["smartcomments-dropdown",{"is-open":A.dropdownStates[e.icon]}])},[ro("button",{class:"smartcomments-comment-actions-item-button smartcomments-dropdown-toggle",onClick:t=>A.toggleDropdown(e.icon),"data-tooltip":e.label},[ro("span",{class:W(["oo-ui-iconElement-icon",e.icon])},null,2),ro("span",{class:"smartcomments-visually-hidden",innerHTML:e.label},null,8,xf)],8,Nf),A.dropdownStates[e.icon]?($r(),zr("div",Df,[($r(!0),zr(Vr,null,wn(e.items,(t=>($r(),zr("button",{key:t.icon,class:"smartcomments-dropdown-item",onClick:n=>A.handleSubItemClick(t,e.icon),style:k(t.style)},[ro("span",{class:W(["oo-ui-iconElement-icon",t.icon])},null,2),ro("span",{innerHTML:t.label},null,8,Tf)],12,Of)))),128))])):lo("",!0)],2)):($r(),zr("button",{key:0,class:"smartcomments-comment-actions-item-button",onClick:e.action,"data-tooltip":e.label},[ro("span",{class:W(["oo-ui-iconElement-icon",e.icon])},null,2),ro("span",{class:"smartcomments-visually-hidden",innerHTML:e.label},null,8,Sf)],8,If))],6)))),128))])}]]),_f={class:"smartcomments-comment-body"};const Rf=uf(Jt({name:"CommentBody",components:{CommentMessage:Uf},props:{comment:{type:Object,required:!0}}}),[["render",function(A,e,t,n,r,o){const i=Bn("comment-message");return $r(),zr("div",_f,[oo(i,{comment:A.comment},null,8,["comment"])])}]]),Kf=Jt({name:"ImageModal",props:{show:{type:Boolean,default:!1},imageSrc:{type:String,required:!0},imageAlt:{type:String,default:"Image"}},emits:["close"],setup:(A,{emit:e})=>({handleImageError:A=>{console.warn("Failed to load modal image:",A.target.src),e("close")}})}),kf=["src","alt"];const Mf=Jt({name:"Comment",components:{ReplyForm:wf,ReplyList:bf,CommentActions:Lf,CommentBody:Rf,ImageModal:uf(Kf,[["render",function(A,e,t,n,r,o){return A.show?($r(),zr("div",{key:0,class:"smartcomments-image-modal",onClick:e[3]||(e[3]=e=>A.$emit("close"))},[ro("div",{class:"smartcomments-image-modal-content",onClick:e[2]||(e[2]=Ui((()=>{}),["stop"]))},[ro("button",{class:"smartcomments-image-modal-close",onClick:e[0]||(e[0]=e=>A.$emit("close"))},"×"),ro("img",{src:A.imageSrc,alt:A.imageAlt,class:"smartcomments-image-modal-image",onError:e[1]||(e[1]=(...e)=>A.handleImageError&&A.handleImageError(...e))},null,40,kf)])])):lo("",!0)}],["__scopeId","data-v-606b1f51"]])},props:{comment:{type:Object,required:!0},position:{type:Object,default:null},allowReplies:{type:Boolean,default:!0}},emits:["close","delete","complete","view","navigate","reply-added"],setup(A,{emit:e}){const{messages:t}=Ha(),n=sf(),r=Rs(),o=Ro((()=>{const e=null!==document.querySelector('div.sic-timeline-item.broken[data-comment-id="'+A.comment.id+'"]');return r.isSpecialPageMode||e})),i=Ro((()=>{if(!A.position)return console.warn("Comment panel: No position data, using default positioning"),{top:"0"};const e=window.innerHeight;let t;t=A.position.top;const n=window.scrollY+e-200-20;return t>n&&(t=Math.max(window.scrollY+10,n)),{top:`${t}px`}})),s=Ro((()=>({...A.comment,reply:a}))),a=async n=>{if(!n||""===n.trim())return console.warn("Cannot submit empty reply"),!1;try{const{saveComment:r}=Ia(),o={text:n,parentId:A.comment.id||A.comment.data_id,type:"reply"},i=await r(n,o);if("1"===i.success||!0===i.success){const r={id:i.comment||Date.now(),text:`

${n}

`,author:`${mw.config.get("wgUserName")}`,datetime:t.justNow(),modifiedBy:mw.config.get("wgUserName"),modifiedDateTime:t.justNow()};return A.comment.replies||(A.comment.replies=[]),A.comment.replies.push(r),e("reply-added",{comment:A.comment,reply:r}),!0}return console.error("Failed to submit reply:",i.message),!1}catch(r){return console.error("Error submitting reply:",r),!1}};return{panelStyle:i,enhancedComment:s,handleNext:()=>{e("navigate",{direction:"next"})},handlePrevious:()=>{e("navigate",{direction:"previous"})},handleReplySubmitted:e=>{"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("smartcomments:refresh-highlights",{detail:{replyAdded:!0,comment:A.comment,reply:e}}))},handleImageError:A=>{console.warn("Failed to load comment screenshot:",A.target.src),A.target.style.display="none"},openImageModal:()=>{n.openImageModal()},shouldShowScreenshot:o,commentsStore:n,messages:t}}}),Vf={class:"smartcomments-commentgroup"},Pf=["data-tooltip"],Gf=["src"];const Wf=uf(Mf,[["render",function(A,e,t,n,r,o){const i=Bn("comment-actions"),s=Bn("image-modal"),a=Bn("comment-body"),c=Bn("reply-list"),l=Bn("reply-form");return $r(),zr("div",{class:"smartcomments-side-panel",style:k(A.panelStyle)},[ro("div",Vf,[oo(i,{onClose:e[0]||(e[0]=e=>A.$emit("close")),onDelete:e[1]||(e[1]=e=>A.$emit("delete",e)),onComplete:e[2]||(e[2]=e=>A.$emit("complete",e)),onView:e[3]||(e[3]=e=>A.$emit("view",e)),onNext:A.handleNext,onPrevious:A.handlePrevious,comment:A.comment},null,8,["onNext","onPrevious","comment"]),A.shouldShowScreenshot?($r(),zr("div",{key:0,class:"smartcomments-screenshot tt-center","data-tooltip":A.messages.sicShowScreenshotFullSize()},[ro("img",{src:A.comment.positionImage,alt:"Comment screenshot",class:"smartcomments-screenshot-image",onError:e[4]||(e[4]=(...e)=>A.handleImageError&&A.handleImageError(...e)),onClick:e[5]||(e[5]=(...e)=>A.openImageModal&&A.openImageModal(...e))},null,40,Gf)],8,Pf)):lo("",!0),oo(s,{show:A.commentsStore.isImageModalVisible,"image-src":A.comment.positionImage,"image-alt":"Comment screenshot - full size",onClose:A.commentsStore.closeImageModal},null,8,["show","image-src","onClose"]),oo(a,{comment:A.comment},null,8,["comment"]),oo(c,{replies:A.comment.replies||[]},null,8,["replies"]),A.allowReplies?($r(),qr(l,{key:1,comment:A.enhancedComment,onReplySubmitted:A.handleReplySubmitted},null,8,["comment","onReplySubmitted"])):lo("",!0)])],4)}]]),Xf=Jt({name:"NewCommentDialog",props:{isVisible:{type:Boolean,default:!1},selectionData:{type:Object,default:null},title:{type:String,default:""}},emits:["close","save","cancel"],setup(A,{emit:e}){const t=Se(""),n=Se(""),r=Se(!1),o=Se(null),{saveComment:i}=Ia(),{messages:s,msg:a}=Ha(),c=Ro((()=>A.title||s.newCommentTitle())),l=Ro((()=>t.value.trim().length>0)),u=Ro((()=>({position:"fixed",top:"50%",left:"50%",transform:"translate(-50%, -50%)"}))),d=()=>{t.value="",n.value="",e("cancel"),e("close")},g=async()=>{if(l.value){r.value=!0,n.value="";try{const r=await i(t.value,A.selectionData);"1"===r.success||!0===r.success?(e("save",{text:t.value,result:r}),t.value="",window.mw&&window.mw.notify&&window.mw.notify(s.commentAdded(),{type:"success"}),e("close")):n.value=r.message||s.apiError()}catch(o){n.value=s.apiError(),console.error("Error saving comment:",o)}finally{r.value=!1}}else n.value=s.errorEmpty()},h=e=>{"Escape"===e.key&&A.isVisible&&d()};sn((()=>{document.addEventListener("keydown",h)})),un((()=>{document.removeEventListener("keydown",h),document.body.classList.remove("smartcomments-dialog-open")}));return{commentText:t,error:n,isSaving:r,commentInput:o,canSave:l,dialogStyle:u,handleCancel:d,handleSave:g,handleKeydown:A=>{"Escape"===A.key?d():"Enter"===A.key&&(A.ctrlKey||A.metaKey)&&(A.preventDefault(),g())},focusInput:async()=>{A.isVisible&&o.value&&(await ut(),o.value.focus())},handleBackdropClick:()=>{d()},manageBodyClass:()=>{A.isVisible?document.body.classList.add("smartcomments-dialog-open"):document.body.classList.remove("smartcomments-dialog-open")},messages:s,t:A=>({selectedText:a("sic-selected-text","Selected text"),selectedImage:a("sic-selected-image","Selected image"),commentPlaceholder:a("sic-comment-placeholder","Enter your comment..."),saving:a("sic-saving","Saving...")}[A]||A),title:c}},watch:{isVisible:{handler(A){this.manageBodyClass(),A&&this.focusInput()},immediate:!0}}}),Jf={class:"smartcomments-new-comment-content"},$f={class:"smartcomments-dialog-header"},Yf={class:"smartcomments-dialog-title"},jf=["data-tooltip"],Zf={key:0,class:"smartcomments-selected-content"},zf={class:"smartcomments-selected-text"},qf={class:"smartcomments-selection-preview"},Am=["src","alt"],em={class:"smartcomments-comment-input-wrapper"},tm={for:"smartcomments-comment-input",class:"smartcomments-input-label"},nm=["placeholder"],rm={key:0,class:"smartcomments-error-message"},om={class:"smartcomments-dialog-actions"},im=["disabled"],sm=["disabled"],am={key:0},cm={key:1};const lm=uf(Xf,[["render",function(A,e,t,n,r,o){return A.isVisible?($r(),zr("div",{key:0,class:"smartcomments-dialog-overlay",onClick:e[6]||(e[6]=(...e)=>A.handleBackdropClick&&A.handleBackdropClick(...e))},[ro("div",{class:"smartcomments-new-comment-dialog",style:k(A.dialogStyle),onClick:e[5]||(e[5]=Ui((()=>{}),["stop"]))},[ro("div",Jf,[ro("div",$f,[ro("span",Yf,q(A.title),1),ro("button",{class:"smartcomments-dialog-close",onClick:e[0]||(e[0]=(...e)=>A.handleCancel&&A.handleCancel(...e)),"data-tooltip":A.messages.close()},e[7]||(e[7]=[ro("span",{class:"oo-ui-iconElement-icon oo-ui-icon-close"},null,-1)]),8,jf)]),A.selectionData?($r(),zr("div",Zf,[ro("div",zf,[ro("strong",null,q(A.t("selectedText"))+":",1),ro("div",qf,q(A.selectionData.text),1)]),A.selectionData.image?($r(),zr("img",{key:0,class:"smartcomments-selected-image",src:A.selectionData.image,alt:A.t("selectedImage")},null,8,Am)):lo("",!0)])):lo("",!0),ro("div",em,[ro("label",tm,q(A.messages.commentInput()),1),Pt(ro("textarea",{id:"smartcomments-comment-input","onUpdate:modelValue":e[1]||(e[1]=e=>A.commentText=e),class:"smartcomments-comment-input",placeholder:A.t("commentPlaceholder"),rows:"4",ref:"commentInput",onKeydown:e[2]||(e[2]=(...e)=>A.handleKeydown&&A.handleKeydown(...e))},null,40,nm),[[yi,A.commentText]]),A.error?($r(),zr("div",rm,q(A.error),1)):lo("",!0)]),ro("div",om,[ro("button",{class:"smartcomments-button smartcomments-button-cancel",onClick:e[3]||(e[3]=(...e)=>A.handleCancel&&A.handleCancel(...e)),disabled:A.isSaving},q(A.messages.cancel()),9,im),ro("button",{class:"smartcomments-button smartcomments-button-save",onClick:e[4]||(e[4]=(...e)=>A.handleSave&&A.handleSave(...e)),disabled:!A.canSave||A.isSaving},[A.isSaving?($r(),zr("span",am,q(A.t("saving")),1)):($r(),zr("span",cm,q(A.messages.save()),1))],8,sm)])])],4)])):lo("",!0)}]]),um=Jt({name:"CommentTimeline",setup(){const A=sf(),e=Rs(),{messages:t,msgWithFallback:n}=Ha(),r=Se([]),o=Se(0),i=Se({visible:!1,style:{},selection:null});sn((()=>{window.addEventListener("resize",s),window.addEventListener("scroll",a)})),ln((()=>{window.removeEventListener("resize",s),window.removeEventListener("scroll",a)}));const s=()=>{r.value=[]},a=()=>{i.value.visible&&(i.value.visible=!1),o.value=window.scrollY,r.value=[]},c=A=>A.data_id||A.id,l=A=>document.querySelector(`.smartcomment-hl-${A}`),u=()=>(()=>{const A=document.getElementById("content");return(null==A?void 0:A.scrollHeight)||document.body.scrollHeight})()-150,d=A=>{const e=c(A);return!l(e)},g=Ro((()=>e.isEnabled)),h=Ro((()=>Array.isArray(A.comments)?A.comments.filter((A=>A&&"completed"!==A.status)):(console.warn("CommentTimeline: commentsStore.comments is not an array:",A.comments),[]))),p=Ro((()=>t.unlocalizedComment())),B=Ro((()=>{var A;return(null==(A=h.value)?void 0:A.length)?h.value.filter(d):[]})),f=Ro((()=>B.value.length)),m=Ro((()=>{const A=f.value;if(0===A)return"";return n("sic-broken-comments-below",`${A} broken comment${A>1?"s":""} below`).replace("$1",A.toString())})),w=Ro((()=>{const A=document.querySelector(".mw-body")||document.querySelector("body");if(!A)return console.warn("CommentTimeline: Could not find body element"),{top:"0px"};return{top:`${-A.getBoundingClientRect().top-80}px`}})),C=Ro((()=>{if(0===f.value)return!1;o.value;const A=window.innerHeight,e=window.scrollY+A;if(!document.getElementById("content"))return!1;return u()>e-100})),Q=Ro((()=>{var A;if(!(null==(A=h.value)?void 0:A.length))return[];const{normalComments:e,brokenCommentsArray:t}=(A=>{const e=[],t=[];return A.forEach((A=>{const n=c(A),r=l(n);if(r){const t=r.getBoundingClientRect().top+window.scrollY;e.push({...A,isBroken:!1,positionTop:t})}else t.push({...A,isBroken:!0})})),{normalComments:e,brokenCommentsArray:t}})(h.value),n=(A=>{const e=[],t=[];return A.forEach((A=>{let n=A.positionTop;for(;t.includes(n);)n+=10;t.push(n),e.push({...A,itemStyle:{top:`${n}px`,right:"0px",position:"absolute"}})})),e})(e),r=(A=>{const e=[],t=u();return A.forEach(((A,n)=>{const r=t-10*n;e.push({...A,itemStyle:{top:`${r}px`,right:"0px",position:"absolute"}})})),e})(t);return[...n,...r]}));return{isEnabled:g,comments:h,positionedComments:Q,containerStyle:w,brokenCommentHover:i,brokenCommentMessage:p,brokenCommentCount:f,brokenIndicatorText:m,showBrokenIndicator:C,handleCommentClick:e=>{const t=c(e),n=l(t);e.isBroken?(e=>{const t=document.querySelector(`.sic-timeline-item[data-selection="${e.posimg}"]`);if(t){const n=t.getBoundingClientRect(),r={top:n.top+window.scrollY,left:n.left+window.scrollX,bottom:n.bottom+window.scrollY,right:n.right+window.scrollX,width:n.width,height:n.height};A.openCommentDialog(e,r)}})(e):n&&(A=>{A.dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0,view:window}))})(n)},handleMouseOver:(A,e)=>{const t=c(A),n=l(t);n&&n.classList.add("active"),A.isBroken&&A.posimg&&((A,e)=>{i.value={visible:!0,selection:A.posimg,style:{position:"absolute",right:"30px",top:e.pageY-50+"px",border:"2px solid #ff000050",background:"white",padding:"10px",borderRadius:"5px",boxShadow:"0 2px 10px rgba(0,0,0,0.1)",zIndex:1e3}}})(A,e)},handleMouseOut:A=>{const e=c(A),t=l(e);t&&t.classList.remove("active"),A.isBroken&&(i.value.visible=!1)},scrollToBrokenComments:()=>{const A=u();window.scrollTo({top:A-window.innerHeight+100,behavior:"smooth"})}}}}),dm=["data-selection","data-comment-id","onClick","onMouseover","onMouseout"],gm=["src"],hm={class:"sic-broken-text"};const pm={key:0,class:"smartcomments"};const Bm=uf(Jt({name:"SmartComments",components:{Comment:Wf,NewCommentDialog:lm,CommentTimeline:uf(um,[["render",function(A,e,t,n,r,o){return A.isEnabled&&A.positionedComments.length>0?($r(),zr("div",{key:0,class:"sic-timeline-container",style:k(A.containerStyle)},[($r(!0),zr(Vr,null,wn(A.positionedComments,(t=>($r(),zr("div",{key:t.id||t.data_id,class:W(["sic-timeline-item",{broken:t.isBroken,"sic-timeline-item-hasreplies":"true"===t.hasReplies||!0===t.hasReplies||t.replies&&t.replies.length>0}]),style:k(t.itemStyle),"data-selection":t.posimg,"data-comment-id":t.data_id,onClick:e=>A.handleCommentClick(t),onMouseover:e=>A.handleMouseOver(t,e),onMouseout:e=>A.handleMouseOut(t)},e[1]||(e[1]=[ro("span",{class:"oo-ui-iconElement-icon oo-ui-icon-speechBubbles"},null,-1)]),46,dm)))),128)),A.brokenCommentHover.visible?($r(),zr("div",{key:0,class:"sic-timeline-item-hover",style:k(A.brokenCommentHover.style)},[ro("h2",null,q(A.brokenCommentMessage),1),A.brokenCommentHover.selection?($r(),zr("img",{key:0,src:A.brokenCommentHover.selection,width:"500",alt:"Comment selection preview"},null,8,gm)):lo("",!0)],4)):lo("",!0),ro("div",{class:W(["sic-broken-indicator",{visible:A.showBrokenIndicator}]),onClick:e[0]||(e[0]=(...e)=>A.scrollToBrokenComments&&A.scrollToBrokenComments(...e))},[e[2]||(e[2]=ro("span",{class:"sic-broken-icon"},"⚠️",-1)),ro("span",hm,q(A.brokenIndicatorText),1),e[3]||(e[3]=ro("span",{class:"sic-broken-arrow"},"↓",-1))],2)],4)):lo("",!0)}]])},setup(){const A=$a(),e=Rs(),t=sf(),n=Ha(),r=e.isSpecialPageMode?null:zB(),o=function(A,e,t){const n=Se(!1),r=()=>document.getElementById("mw-content-text")||document.body,o=(A,n,r)=>{A&&A.preventDefault&&A.preventDefault(),t.triggerHighlightClicked(n,r),t.triggerCommentGroupOpen(n,r),e.openCommentDialog(n,r)},i=async()=>{var t,i,s;if(!n.value)try{n.value=!0;const a=r();if((null==(t=A.highlightedAnchors)?void 0:t.value)&&lf(a,A.highlightedAnchors.value),await A.loadAndSetHighlights(),void 0!==(null==(i=A.comments)?void 0:i.value)?e.setComments(A.comments.value):(console.warn("useHighlightOrchestrator: comments.value is undefined after loadAndSetHighlights, setting empty array"),e.setComments([])),(null==(s=A.highlightedAnchors)?void 0:s.value)&&cf(a,A.highlightedAnchors.value,o),e.isCommentDialogVisible&&e.activeComment){const A=e.activeComment.data_id||e.activeComment.id;e.setActiveHighlight(A)}}catch(a){console.error("useHighlightOrchestrator: Error reloading highlights:",a)}finally{n.value=!1}},s=()=>{var e;const t=r();(null==(e=A.highlightedAnchors)?void 0:e.value)&&lf(t,A.highlightedAnchors.value)};return{isRefreshing:n,reloadHighlightsAndComments:i,clearHighlights:s,setupHighlightRefreshListener:()=>{const A=async()=>{await i()};return document.addEventListener("smartcomments:refresh-highlights",A),()=>{document.removeEventListener("smartcomments:refresh-highlights",A)}},reloadHighlights:async e=>{if(e)if(null==A?void 0:A.loadAndSetHighlights)try{s(),await i()}catch(t){console.error("useHighlightOrchestrator reloadHighlights: Error:",t)}else console.error("useHighlightOrchestrator: smartCommentsSetup.loadAndSetHighlights not available.");else console.warn("useHighlightOrchestrator: Cannot reload highlights, system is disabled.")},handleHighlightClick:o}}(A,t,jB),i=function(A){const e=e=>{"Escape"===e.key&&A.isCommentDialogVisible?A.isImageModalVisible?A.closeImageModal():A.closeCommentDialog():"ArrowDown"===e.key&&A.hasNextComment?A.navigateComment("next"):"ArrowUp"===e.key&&A.hasPreviousComment&&A.navigateComment("previous")};return{setupKeyboardShortcuts:()=>(document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)})}}(t),s=function(A){const e=A=>{document.documentElement.style.setProperty("--smartcomments-annotate-text",`"${A}"`)},t=A=>{document.documentElement.style.setProperty("--smartcomments-button-open-text",`"${A}"`)};return{setupCustomPropertiesWatchers:()=>{const n=()=>A.msg("sic-annotate-tooltip"),r=()=>A.msg("sic-button-open");e(n()),t(r());const o=vr(n,(A=>{e(A)})),i=vr(r,(A=>{t(A)}));return()=>{o(),i()}},updateAnnotateTooltipText:e,updateButtonOpenText:t}}(n),a=function(A,e,t,n,r){return{setupSmartCommentsEvents:()=>{const o=[];return o.push(A.on(e.DEBUG_MODE,(A=>{A.detail.enabled&&!t.isEnabled&&t.setEnabled(!0)}))),o.push(A.on(e.SELECTION_ACTIVE,(A=>{n.isCommentDialogVisible&&n.closeCommentDialog()}))),o.push(A.on(e.OPEN_COMMENT_ID,(A=>{A.detail.commentId&&n.openCommentDialogById(A.detail.commentId)}))),o.push(A.on(e.OPEN_COMMENT_WITH_POSITION,(A=>{A.detail.commentId&&A.detail.position&&n.openCommentDialogByIdWithPosition(A.detail.commentId,A.detail.position)}))),o.push(A.on(e.COMMENT_CREATED,(A=>{r&&r.reloadHighlightsAndComments()}))),()=>{o.forEach((A=>A()))}}}}(jB,YB,e,t,o),c=function(A){return{setupUrlNavigation:e=>{const t=async()=>{e()&&await A.checkAndOpenCommentFromUrl()};return window.addEventListener("popstate",t),()=>{window.removeEventListener("popstate",t)}},checkUrlParameters:async e=>{e()?await A.checkAndOpenCommentFromUrl():console.warn("useUrlNavigation: Cannot check URL parameters, system is disabled.")}}}(t);return{smartCommentsSetup:A,store:e,commentsStore:t,smartCommentsEvents:jB,EVENTS:YB,messages:n,linkPrevention:r,highlightsManager:o,keyboardShortcuts:i,customProperties:s,eventHandlers:a,urlNavigation:c}},data:()=>({selectionEvents:null,cleanupFunctions:[]}),computed:{isEnabled(){return this.store.isEnabled}},mounted(){this.store.isSpecialPageMode||(this.selectionEvents=ZB(),this.cleanupFunctions.push(this.selectionEvents.onSelectionCreate(this.handleNewSelection))),this.setupSystems(),this.$watch((()=>this.isEnabled),(async A=>{A?await this.enableSmartComments():await this.disableSmartComments()}),{immediate:!0})},beforeUnmount(){this.highlightsManager.clearHighlights(),this.selectionEvents&&this.selectionEvents.unbindEvents(),this.linkPrevention&&this.linkPrevention.unbindEvents(),this.cleanupFunctions.forEach((A=>A()))},methods:{setupSystems(){this.cleanupFunctions.push(this.highlightsManager.setupHighlightRefreshListener()),this.cleanupFunctions.push(this.eventHandlers.setupSmartCommentsEvents()),this.cleanupFunctions.push(this.keyboardShortcuts.setupKeyboardShortcuts()),this.cleanupFunctions.push(this.customProperties.setupCustomPropertiesWatchers()),this.cleanupFunctions.push(this.urlNavigation.setupUrlNavigation((()=>this.isEnabled)))},async enableSmartComments(){try{if(this.smartCommentsEvents.triggerCommentsEnabled(),!this.store.isSpecialPageMode){this.selectionEvents&&this.selectionEvents.bindEvents();try{const{useSelection:A}=await Promise.resolve().then((()=>JB));A().setupSelection()}catch(A){console.error("Failed to setup selection strategies:",A)}this.linkPrevention&&this.linkPrevention.bindEvents(),this.highlightsManager.clearHighlights(),await this.highlightsManager.reloadHighlightsAndComments()}await this.commentsStore.checkAndOpenCommentFromUrl()}catch(Em){console.error("SmartComments.vue enableSmartComments: Error:",Em)}},async disableSmartComments(){this.smartCommentsEvents.triggerCommentsDisabled(),this.store.isSpecialPageMode||(this.selectionEvents&&this.selectionEvents.unbindEvents(),this.linkPrevention&&this.linkPrevention.unbindEvents(),this.highlightsManager.clearHighlights()),this.commentsStore.closeAllDialogs()},handleNewSelection(A){this.smartCommentsEvents.triggerSelectionActive(A),this.commentsStore.openNewCommentDialog(A)},handleCommentNavigation(A){const{direction:e}=A;this.commentsStore.navigateComment(e)},async reloadHighlights(){await this.highlightsManager.reloadHighlights(this.isEnabled)},async checkUrlParameters(){await this.urlNavigation.checkUrlParameters((()=>this.isEnabled))}}}),[["render",function(A,e,t,n,r,o){const i=Bn("comment"),s=Bn("new-comment-dialog"),a=Bn("comment-timeline");return A.isEnabled?($r(),zr("div",pm,[A.commentsStore.isCommentDialogVisible?($r(),qr(i,{key:0,comment:A.commentsStore.activeComment,position:A.commentsStore.commentPosition,"allow-replies":!0,onClose:A.commentsStore.closeCommentDialog,onDelete:A.commentsStore.deleteComment,onComplete:A.commentsStore.completeComment,onView:A.commentsStore.viewPage,onNavigate:A.handleCommentNavigation,onReplyAdded:A.commentsStore.handleReplyAdded},null,8,["comment","position","onClose","onDelete","onComplete","onView","onNavigate","onReplyAdded"])):lo("",!0),A.store.isSpecialPageMode?lo("",!0):($r(),qr(s,{key:1,"is-visible":A.commentsStore.isNewCommentDialogVisible,"selection-data":A.commentsStore.newCommentSelection,onClose:A.commentsStore.closeNewCommentDialog,onSave:A.commentsStore.handleCommentSaved,onCancel:A.commentsStore.closeNewCommentDialog},null,8,["is-visible","selection-data","onClose","onSave","onCancel"])),A.store.isSpecialPageMode?lo("",!0):($r(),qr(a,{key:2}))])):lo("",!0)}]]);function fm(A){return A&&A.__esModule&&Object.prototype.hasOwnProperty.call(A,"default")?A.default:A}var mm,wm={exports:{}};function Cm(){return mm||(mm=1,wm.exports=function(){var A="object",e="function",t="undefined",n=["startContainer","startOffset","endContainer","endOffset","collapsed","commonAncestorContainer"],r=["setStart","setStartBefore","setStartAfter","setEnd","setEndBefore","setEndAfter","collapse","selectNode","selectNodeContents","compareBoundaryPoints","deleteContents","extractContents","cloneContents","insertNode","surroundContents","cloneRange","toString","detach"],o=["boundingHeight","boundingLeft","boundingTop","boundingWidth","htmlText","text"],i=["collapse","compareEndPoints","duplicate","moveToElementText","parentElement","select","setEndPoint","getBoundingClientRect"];function s(t,n){var r=typeof t[n];return r==e||!(r!=A||!t[n])||"unknown"==r}function a(e,t){return!(typeof e[t]!=A||!e[t])}function c(A,e){return typeof A[e]!=t}function l(A){return function(e,t){for(var n=t.length;n--;)if(!A(e,t[n]))return!1;return!0}}var u=l(s),d=l(a),g=l(c);function h(A){return A&&u(A,i)&&g(A,o)}function p(A){return a(A,"body")?A.body:A.getElementsByTagName("body")[0]}var B,f,m={},w=typeof window!=t&&typeof document!=t,C={isHostMethod:s,isHostObject:a,isHostProperty:c,areHostMethods:u,areHostObjects:d,areHostProperties:g,isTextRange:h,getBody:p,forEach:[].forEach?function(A,e){A.forEach(e)}:function(A,e){for(var t=0,n=A.length;te?(r.node=n,r.offset-=e):r.node==A.parentNode&&r.offset>l(A)&&++r.offset;return n}function C(A){if(9==A.nodeType)return A;if(typeof A.ownerDocument!=t)return A.ownerDocument;if(typeof A.document!=t)return A.document;if(A.parentNode)return C(A.parentNode);throw e.createError("getDocument: no document found for node")}function Q(A){var n=C(A);if(typeof n.defaultView!=t)return n.defaultView;if(typeof n.parentWindow!=t)return n.parentWindow;throw e.createError("Cannot get a window object for node")}function y(A){if(typeof A.contentDocument!=t)return A.contentDocument;if(typeof A.contentWindow!=t)return A.contentWindow.document;throw e.createError("getIframeDocument: No Document object found for iframe element")}function E(A){if(typeof A.contentWindow!=t)return A.contentWindow;if(typeof A.contentDocument!=t)return A.contentDocument.defaultView;throw e.createError("getIframeWindow: No Window object found for iframe element")}function v(A){return A&&n.isHostMethod(A,"setTimeout")&&n.isHostObject(A,"document")}function U(A,e,t){var r;if(A?n.isHostProperty(A,"nodeType")?r=1==A.nodeType&&"iframe"==A.tagName.toLowerCase()?y(A):C(A):v(A)&&(r=A.document):r=document,!r)throw e.createError(t+"(): Parameter must be a Window object or DOM node");return r}function F(A){for(var e;e=A.parentNode;)A=e;return A}function b(A,t,n,r){var o,i,s,a,c;if(A==n)return t===r?0:t[index:"+l(A)+",length:"+A.childNodes.length+"]["+(A.innerHTML||"[innerHTML not supported]").slice(0,25)+"]"}return A.nodeName}function x(A){for(var e,t=C(A).createDocumentFragment();e=A.firstChild;)t.appendChild(e);return t}function D(A,e,t){var n=r(A),o=A.createElement("div");o.contentEditable=""+!!t,e&&(o.innerHTML=e);var i=n.firstChild;return i?n.insertBefore(o,i):n.appendChild(o),o}function O(A){return A.parentNode.removeChild(A)}function T(A){this.root=A,this._next=A}function L(A){return new T(A)}function _(A,e){this.node=A,this.offset=e}function R(A){this.code=this[A],this.codeName=A,this.message="DOMException: "+this.codeName}!function(){var e=document.createElement("b");e.innerHTML="1";var t=e.firstChild;e.innerHTML="
",I=S(t),A.features.crashyTextNodes=I}(),typeof window.getComputedStyle!=t?H=function(A,e){return Q(A).getComputedStyle(A,null)[e]}:typeof document.documentElement.currentStyle!=t?H=function(A,e){return A.currentStyle?A.currentStyle[e]:""}:e.fail("No means of obtaining computed style properties found"),T.prototype={_current:null,hasNext:function(){return!!this._next},next:function(){var A,e,t=this._current=this._next;if(this._current)if(A=t.firstChild)this._next=A;else{for(e=null;t!==this.root&&!(e=t.nextSibling);)t=t.parentNode;this._next=e}return this._current},detach:function(){this._current=this._next=this.root=null}},_.prototype={equals:function(A){return!!A&&this.node===A.node&&this.offset==A.offset},inspect:function(){return"[DomPosition("+N(this.node)+":"+this.offset+")]"},toString:function(){return this.inspect()}},R.prototype={INDEX_SIZE_ERR:1,HIERARCHY_REQUEST_ERR:3,WRONG_DOCUMENT_ERR:4,NO_MODIFICATION_ALLOWED_ERR:7,NOT_FOUND_ERR:8,NOT_SUPPORTED_ERR:9,INVALID_STATE_ERR:11,INVALID_NODE_TYPE_ERR:24},R.prototype.toString=function(){return this.message},A.dom={arrayContains:s,isHtmlNamespace:a,parentElement:c,getNodeIndex:l,getNodeLength:u,getCommonAncestor:d,isAncestorOf:g,isOrIsAncestorOf:h,getClosestAncestorIn:p,isCharacterDataNode:B,isTextOrCommentNode:f,insertAfter:m,splitDataNode:w,getDocument:C,getWindow:Q,getIframeWindow:E,getIframeDocument:y,getBody:r,isWindow:v,getContentDocument:U,getRootContainer:F,comparePoints:b,isBrokenNode:S,inspectNode:N,getComputedStyleProperty:H,createTestElement:D,removeNode:O,fragmentFromNodeChildren:x,createIterator:L,DomPosition:_},A.DOMException=R})),Q.createCoreModule("DomRange",["DomUtil"],(function(A,e){var t=A.dom,n=A.util,r=t.DomPosition,o=A.DOMException,i=t.isCharacterDataNode,s=t.getNodeIndex,a=t.isOrIsAncestorOf,c=t.getDocument,l=t.comparePoints,u=t.splitDataNode,d=t.getClosestAncestorIn,g=t.getNodeLength,h=t.arrayContains,p=t.getRootContainer,B=A.features.crashyTextNodes,f=t.removeNode;function m(A,e){return 3!=A.nodeType&&(a(A,e.startContainer)||a(A,e.endContainer))}function w(A){return A.document||c(A.startContainer)}function C(A){return p(A.startContainer)}function Q(A){return new r(A.parentNode,s(A))}function y(A){return new r(A.parentNode,s(A)+1)}function E(A,e,n){var r=11==A.nodeType?A.firstChild:A;return i(e)?n==e.length?t.insertAfter(A,e):e.parentNode.insertBefore(A,0==n?e:u(e,n)):n>=e.childNodes.length?e.appendChild(A):e.insertBefore(A,e.childNodes[n]),r}function v(A,e,t){if(j(A),j(e),w(e)!=w(A))throw new o("WRONG_DOCUMENT_ERR");var n=l(A.startContainer,A.startOffset,e.endContainer,e.endOffset),r=l(A.endContainer,A.endOffset,e.startContainer,e.startOffset);return t?n<=0&&r>=0:n<0&&r>0}function U(A){for(var e,t,n,r=w(A.range).createDocumentFragment();t=A.next();){if(e=A.isPartiallySelectedSubtree(),t=t.cloneNode(!e),e&&(n=A.getSubtreeIterator(),t.appendChild(U(n)),n.detach()),10==t.nodeType)throw new o("HIERARCHY_REQUEST_ERR");r.appendChild(t)}return r}function F(A,e,n){var r,o,i,s;for(n=n||{stop:!1};i=A.next();)if(A.isPartiallySelectedSubtree()){if(!1===e(i))return void(n.stop=!0);if(F(s=A.getSubtreeIterator(),e,n),s.detach(),n.stop)return}else for(r=t.createIterator(i);o=r.next();)if(!1===e(o))return void(n.stop=!0)}function b(A){for(var e;A.next();)A.isPartiallySelectedSubtree()?(b(e=A.getSubtreeIterator()),e.detach()):A.remove()}function H(A){for(var e,t,n=w(A.range).createDocumentFragment();e=A.next();){if(A.isPartiallySelectedSubtree()?(e=e.cloneNode(!1),t=A.getSubtreeIterator(),e.appendChild(H(t)),t.detach()):A.remove(),10==e.nodeType)throw new o("HIERARCHY_REQUEST_ERR");n.appendChild(e)}return n}function I(A,e,t){var n,r=!(!e||!e.length),o=!!t;r&&(n=new RegExp("^("+e.join("|")+")$"));var s=[];return F(new N(A,!1),(function(e){if((!r||n.test(e.nodeType))&&(!o||t(e))){var a=A.startContainer;if(e!=a||!i(a)||A.startOffset!=a.length){var c=A.endContainer;e==c&&i(c)&&0==A.endOffset||s.push(e)}}})),s}function S(A){return"["+(void 0===A.getName?"Range":A.getName())+"("+t.inspectNode(A.startContainer)+":"+A.startOffset+", "+t.inspectNode(A.endContainer)+":"+A.endOffset+")]"}function N(A,e){if(this.range=A,this.clonePartiallySelectedTextNodes=e,!A.collapsed){this.sc=A.startContainer,this.so=A.startOffset,this.ec=A.endContainer,this.eo=A.endOffset;var t=A.commonAncestorContainer;this.sc===this.ec&&i(this.sc)?(this.isSingleCharacterDataNode=!0,this._first=this._last=this._next=this.sc):(this._first=this._next=this.sc!==t||i(this.sc)?d(this.sc,t,!0):this.sc.childNodes[this.so],this._last=this.ec!==t||i(this.ec)?d(this.ec,t,!0):this.ec.childNodes[this.eo-1])}}N.prototype={_current:null,_next:null,_first:null,_last:null,isSingleCharacterDataNode:!1,reset:function(){this._current=null,this._next=this._first},hasNext:function(){return!!this._next},next:function(){var A=this._current=this._next;return A&&(this._next=A!==this._last?A.nextSibling:null,i(A)&&this.clonePartiallySelectedTextNodes&&(A===this.ec&&(A=A.cloneNode(!0)).deleteData(this.eo,A.length-this.eo),this._current===this.sc&&(A=A.cloneNode(!0)).deleteData(0,this.so))),A},remove:function(){var A,e,t=this._current;!i(t)||t!==this.sc&&t!==this.ec?t.parentNode&&f(t):(A=t===this.sc?this.so:0)!=(e=t===this.ec?this.eo:t.length)&&t.deleteData(A,e-A)},isPartiallySelectedSubtree:function(){return m(this._current,this.range)},getSubtreeIterator:function(){var A;if(this.isSingleCharacterDataNode)(A=this.range.cloneRange()).collapse(!1);else{A=new fA(w(this.range));var e=this._current,t=e,n=0,r=e,o=g(e);a(e,this.sc)&&(t=this.sc,n=this.so),a(e,this.ec)&&(r=this.ec,o=this.eo),BA(A,t,n,r,o)}return new N(A,this.clonePartiallySelectedTextNodes)},detach:function(){this.range=this._current=this._next=this._first=this._last=this.sc=this.so=this.ec=this.eo=null}};var x=[1,3,4,5,7,8,10],D=[2,9,11],O=[5,6,10,12],T=[1,3,4,5,7,8,10,11],L=[1,3,4,5,7,8];function _(A){return function(e,t){for(var n,r=t?e:e.parentNode;r;){if(n=r.nodeType,h(A,n))return r;r=r.parentNode}return null}}var R=_([9,11]),K=_(O),k=_([6,10,12]),M=_([1]);function V(A,e){if(k(A,e))throw new o("INVALID_NODE_TYPE_ERR")}function P(A,e){if(!h(e,A.nodeType))throw new o("INVALID_NODE_TYPE_ERR")}function G(A,e){if(e<0||e>(i(A)?A.length:A.childNodes.length))throw new o("INDEX_SIZE_ERR")}function W(A,e){if(R(A,!0)!==R(e,!0))throw new o("WRONG_DOCUMENT_ERR")}function X(A){if(K(A,!0))throw new o("NO_MODIFICATION_ALLOWED_ERR")}function J(A,e){if(!A)throw new o(e)}function $(A,e){return e<=(i(A)?A.length:A.childNodes.length)}function Y(A){return!!A.startContainer&&!!A.endContainer&&!(B&&(t.isBrokenNode(A.startContainer)||t.isBrokenNode(A.endContainer)))&&p(A.startContainer)==p(A.endContainer)&&$(A.startContainer,A.startOffset)&&$(A.endContainer,A.endOffset)}function j(A){if(!Y(A))throw new Error("Range error: Range is not valid. This usually happens after DOM mutation. Range: ("+A.inspect()+")")}var Z=document.createElement("style"),z=!1;try{Z.innerHTML="x",z=3==Z.firstChild.nodeType}catch(Em){}A.features.htmlParsingConforms=z;var q=z?function(A){var e=this.startContainer,n=c(e);if(!e)throw new o("INVALID_STATE_ERR");var r=null;return 1==e.nodeType?r=e:i(e)&&(r=t.parentElement(e)),(r=null===r||"HTML"==r.nodeName&&t.isHtmlNamespace(c(r).documentElement)&&t.isHtmlNamespace(r)?n.createElement("body"):r.cloneNode(!1)).innerHTML=A,t.fragmentFromNodeChildren(r)}:function(A){var e=w(this).createElement("body");return e.innerHTML=A,t.fragmentFromNodeChildren(e)};function AA(A,e){j(A);var t=A.startContainer,n=A.startOffset,r=A.endContainer,o=A.endOffset,a=t===r;i(r)&&o>0&&o0&&n=s(t)&&o++,n=0),A.setStartAndEnd(t,n,r,o)}function eA(A){j(A);var e=A.commonAncestorContainer.parentNode.cloneNode(!1);return e.appendChild(A.cloneContents()),e.innerHTML}var tA=["startContainer","startOffset","endContainer","endOffset","collapsed","commonAncestorContainer"],nA=0,rA=1,oA=2,iA=3,sA=0,aA=1,cA=2,lA=3;function uA(A){A.START_TO_START=nA,A.START_TO_END=rA,A.END_TO_END=oA,A.END_TO_START=iA,A.NODE_BEFORE=sA,A.NODE_AFTER=aA,A.NODE_BEFORE_AND_AFTER=cA,A.NODE_INSIDE=lA}function dA(A){uA(A),uA(A.prototype)}function gA(A,e){return function(){j(this);var t,n=this.startContainer,r=this.startOffset,o=this.commonAncestorContainer,i=new N(this,!0);n!==o&&(n=(t=y(d(n,o,!0))).node,r=t.offset),F(i,X),i.reset();var s=A(i);return i.detach(),e(this,n,r,n,r),s}}function hA(e,t){function r(A,e){return function(t){P(t,x),P(p(t),D);var n=(A?Q:y)(t);(e?o:a)(this,n.node,n.offset)}}function o(A,e,n){var r=A.endContainer,o=A.endOffset;e===A.startContainer&&n===A.startOffset||(p(e)==p(r)&&1!=l(e,n,r,o)||(r=e,o=n),t(A,e,n,r,o))}function a(A,e,n){var r=A.startContainer,o=A.startOffset;e===A.endContainer&&n===A.endOffset||(p(e)==p(r)&&-1!=l(e,n,r,o)||(r=e,o=n),t(A,r,o,e,n))}var c=function(){};c.prototype=A.rangePrototype,e.prototype=new c,n.extend(e.prototype,{setStart:function(A,e){V(A,!0),G(A,e),o(this,A,e)},setEnd:function(A,e){V(A,!0),G(A,e),a(this,A,e)},setStartAndEnd:function(){var A=arguments,e=A[0],n=A[1],r=e,o=n;switch(A.length){case 3:o=A[2];break;case 4:r=A[2],o=A[3]}V(e,!0),G(e,n),V(r,!0),G(r,o),t(this,e,n,r,o)},setBoundary:function(A,e,t){this["set"+(t?"Start":"End")](A,e)},setStartBefore:r(!0,!0),setStartAfter:r(!1,!0),setEndBefore:r(!0,!1),setEndAfter:r(!1,!1),collapse:function(A){j(this),A?t(this,this.startContainer,this.startOffset,this.startContainer,this.startOffset):t(this,this.endContainer,this.endOffset,this.endContainer,this.endOffset)},selectNodeContents:function(A){V(A,!0),t(this,A,0,A,g(A))},selectNode:function(A){V(A,!1),P(A,x);var e=Q(A),n=y(A);t(this,e.node,e.offset,n.node,n.offset)},extractContents:gA(H,t),deleteContents:gA(b,t),canSurroundContents:function(){j(this),X(this.startContainer),X(this.endContainer);var A=new N(this,!0),e=A._first&&m(A._first,this)||A._last&&m(A._last,this);return A.detach(),!e},splitBoundaries:function(){AA(this)},splitBoundariesPreservingPositions:function(A){AA(this,A)},normalizeBoundaries:function(){j(this);var A,e=this.startContainer,n=this.startOffset,r=this.endContainer,o=this.endOffset,a=function(A){var e=A.nextSibling;e&&e.nodeType==A.nodeType&&(r=A,o=A.length,A.appendData(e.data),f(e))},c=function(A){var t=A.previousSibling;if(t&&t.nodeType==A.nodeType){e=A;var i=A.length;if(n=t.length,A.insertData(0,t.data),f(t),e==r)o+=n,r=e;else if(r==A.parentNode){var a=s(A);o==a?(r=A,o=i):o>a&&o--}}},l=!0;if(i(r))o==r.length?a(r):0==o&&(A=r.previousSibling)&&A.nodeType==r.nodeType&&(o=A.length,e==r&&(l=!1),A.appendData(r.data),f(r),r=A);else{if(o>0){var u=r.childNodes[o-1];u&&i(u)&&a(u)}l=!this.collapsed}if(l){if(i(e))0==n?c(e):n==e.length&&(A=e.nextSibling)&&A.nodeType==e.nodeType&&(r==A&&(r=e,o+=e.length),e.appendData(A.data),f(A));else if(n0?cA:sA:r>0?aA:lA},comparePoint:function(A,e){return j(this),J(A,"HIERARCHY_REQUEST_ERR"),W(A,this.startContainer),l(A,e,this.startContainer,this.startOffset)<0?-1:l(A,e,this.endContainer,this.endOffset)>0?1:0},createContextualFragment:q,toHtml:function(){return eA(this)},intersectsNode:function(A,e){if(j(this),p(A)!=C(this))return!1;var t=A.parentNode,n=s(A);if(!t)return!0;var r=l(t,n,this.endContainer,this.endOffset),o=l(t,n+1,this.startContainer,this.startOffset);return e?r<=0&&o>=0:r<0&&o>0},isPointInRange:function(A,e){return j(this),J(A,"HIERARCHY_REQUEST_ERR"),W(A,this.startContainer),l(A,e,this.startContainer,this.startOffset)>=0&&l(A,e,this.endContainer,this.endOffset)<=0},intersectsRange:function(A){return v(this,A,!1)},intersectsOrTouchesRange:function(A){return v(this,A,!0)},intersection:function(A){if(this.intersectsRange(A)){var e=l(this.startContainer,this.startOffset,A.startContainer,A.startOffset),t=l(this.endContainer,this.endOffset,A.endContainer,A.endOffset),n=this.cloneRange();return-1==e&&n.setStart(A.startContainer,A.startOffset),1==t&&n.setEnd(A.endContainer,A.endOffset),n}return null},union:function(A){if(this.intersectsOrTouchesRange(A)){var e=this.cloneRange();return-1==l(A.startContainer,A.startOffset,this.startContainer,this.startOffset)&&e.setStart(A.startContainer,A.startOffset),1==l(A.endContainer,A.endOffset,this.endContainer,this.endOffset)&&e.setEnd(A.endContainer,A.endOffset),e}throw new o("Ranges do not intersect")},containsNode:function(A,e){return e?this.intersectsNode(A,!1):this.compareNode(A)==lA},containsNodeContents:function(A){return this.comparePoint(A,0)>=0&&this.comparePoint(A,g(A))<=0},containsRange:function(A){var e=this.intersection(A);return null!==e&&A.equals(e)},containsNodeText:function(A){var e=this.cloneRange();e.selectNode(A);var t=e.getNodes([3]);if(t.length>0){e.setStart(t[0],0);var n=t.pop();return e.setEnd(n,n.length),this.containsRange(e)}return this.containsNodeContents(A)},getNodes:function(A,e){return j(this),I(this,A,e)},getDocument:function(){return w(this)},collapseBefore:function(A){this.setEndBefore(A),this.collapse(!1)},collapseAfter:function(A){this.setStartAfter(A),this.collapse(!0)},getBookmark:function(e){var n=w(this),r=A.createRange(n);e=e||t.getBody(n),r.selectNodeContents(e);var o=this.intersection(r),i=0,s=0;return o&&(r.setEnd(o.startContainer,o.startOffset),s=(i=r.toString().length)+o.toString().length),{start:i,end:s,containerNode:e}},moveToBookmark:function(A){var e=A.containerNode,t=0;this.setStart(e,0),this.collapse(!0);for(var n,r,o,i,s=[e],a=!1,c=!1;!c&&(n=s.pop());)if(3==n.nodeType)r=t+n.length,!a&&A.start>=t&&A.start<=r&&(this.setStart(n,A.start-t),a=!0),a&&A.end>=t&&A.end<=r&&(this.setEnd(n,A.end-t),c=!0),t=r;else for(o=(i=n.childNodes).length;o--;)s.push(i[o])},getName:function(){return"DomRange"},equals:function(A){return fA.rangesEqual(this,A)},isValid:function(){return Y(this)},inspect:function(){return S(this)},detach:function(){}}),hA(fA,BA),n.extend(fA,{rangeProperties:tA,RangeIterator:N,copyComparisonConstants:dA,createPrototypeRange:hA,inspect:S,toHtml:eA,getRangeDocument:w,rangesEqual:function(A,e){return A.startContainer===e.startContainer&&A.startOffset===e.startOffset&&A.endContainer===e.endContainer&&A.endOffset===e.endOffset}}),A.DomRange=fA})),Q.createCoreModule("WrappedRange",["DomRange"],(function(A,e){var t,n,r=A.dom,o=A.util,i=r.DomPosition,s=A.DomRange,a=r.getBody,c=r.getContentDocument,l=r.isCharacterDataNode;if(A.features.implementsDomRange&&function(){var n,i,l=s.rangeProperties;function u(A){for(var e,t=l.length;t--;)A[e=l[t]]=A.nativeRange[e];A.collapsed=A.startContainer===A.endContainer&&A.startOffset===A.endOffset}function d(A,e,t,n,r){var o=A.startContainer!==e||A.startOffset!=t,i=A.endContainer!==n||A.endOffset!=r,s=!A.equals(A.nativeRange);(o||i||s)&&(A.setEnd(n,r),A.setStart(e,t))}t=function(A){if(!A)throw e.createError("WrappedRange: Range must be specified");this.nativeRange=A,u(this)},s.createPrototypeRange(t,d),(n=t.prototype).selectNode=function(A){this.nativeRange.selectNode(A),u(this)},n.cloneContents=function(){return this.nativeRange.cloneContents()},n.surroundContents=function(A){this.nativeRange.surroundContents(A),u(this)},n.collapse=function(A){this.nativeRange.collapse(A),u(this)},n.cloneRange=function(){return new t(this.nativeRange.cloneRange())},n.refresh=function(){u(this)},n.toString=function(){return this.nativeRange.toString()};var g=document.createTextNode("test");a(document).appendChild(g);var h=document.createRange();h.setStart(g,0),h.setEnd(g,0);try{h.setStart(g,1),n.setStart=function(A,e){this.nativeRange.setStart(A,e),u(this)},n.setEnd=function(A,e){this.nativeRange.setEnd(A,e),u(this)},i=function(A){return function(e){this.nativeRange[A](e),u(this)}}}catch(w){n.setStart=function(A,e){try{this.nativeRange.setStart(A,e)}catch(t){this.nativeRange.setEnd(A,e),this.nativeRange.setStart(A,e)}u(this)},n.setEnd=function(A,e){try{this.nativeRange.setEnd(A,e)}catch(t){this.nativeRange.setStart(A,e),this.nativeRange.setEnd(A,e)}u(this)},i=function(A,e){return function(t){try{this.nativeRange[A](t)}catch(n){this.nativeRange[e](t),this.nativeRange[A](t)}u(this)}}}n.setStartBefore=i("setStartBefore","setEndBefore"),n.setStartAfter=i("setStartAfter","setEndAfter"),n.setEndBefore=i("setEndBefore","setStartBefore"),n.setEndAfter=i("setEndAfter","setStartAfter"),n.selectNodeContents=function(A){this.setStartAndEnd(A,0,r.getNodeLength(A))},h.selectNodeContents(g),h.setEnd(g,3);var p=document.createRange();p.selectNodeContents(g),p.setEnd(g,4),p.setStart(g,2),-1==h.compareBoundaryPoints(h.START_TO_END,p)&&1==h.compareBoundaryPoints(h.END_TO_START,p)?n.compareBoundaryPoints=function(A,e){return A==(e=e.nativeRange||e).START_TO_END?A=e.END_TO_START:A==e.END_TO_START&&(A=e.START_TO_END),this.nativeRange.compareBoundaryPoints(A,e)}:n.compareBoundaryPoints=function(A,e){return this.nativeRange.compareBoundaryPoints(A,e.nativeRange||e)};var B=document.createElement("div");B.innerHTML="123";var f=B.firstChild,m=a(document);m.appendChild(B),h.setStart(f,1),h.setEnd(f,2),h.deleteContents(),"13"==f.data&&(n.deleteContents=function(){this.nativeRange.deleteContents(),u(this)},n.extractContents=function(){var A=this.nativeRange.extractContents();return u(this),A}),m.removeChild(B),m=null,o.isHostMethod(h,"createContextualFragment")&&(n.createContextualFragment=function(A){return this.nativeRange.createContextualFragment(A)}),a(document).removeChild(g),n.getName=function(){return"WrappedRange"},A.WrappedRange=t,A.createNativeRange=function(A){return(A=c(A,e,"createNativeRange")).createRange()}}(),A.features.implementsTextRange){var u=function(A){var e=A.parentElement(),t=A.duplicate();t.collapse(!0);var n=t.parentElement();(t=A.duplicate()).collapse(!1);var o=t.parentElement(),i=n==o?n:r.getCommonAncestor(n,o);return i==e?i:r.getCommonAncestor(e,i)},d=function(A){return 0==A.compareEndPoints("StartToEnd",A)},g=function(A,e,t,n,o){var s=A.duplicate();s.collapse(t);var a=s.parentElement();if(r.isOrIsAncestorOf(e,a)||(a=e),!a.canHaveHTML){var c=new i(a.parentNode,r.getNodeIndex(a));return{boundaryPosition:c,nodeInfo:{nodeIndex:c.offset,containerElement:c.node}}}var u=r.getDocument(a).createElement("span");u.parentNode&&r.removeNode(u);for(var d,g,h,p,B,f=t?"StartToStart":"StartToEnd",m=o&&o.containerElement==a?o.nodeIndex:0,w=a.childNodes.length,C=w,Q=C;Q==w?a.appendChild(u):a.insertBefore(u,a.childNodes[Q]),s.moveToElementText(u),0!=(d=s.compareEndPoints(f,A))&&m!=C;){if(-1==d){if(C==m+1)break;m=Q}else C=C==m+1?m:Q;Q=Math.floor((m+C)/2),a.removeChild(u)}if(B=u.nextSibling,-1==d&&B&&l(B)){var y;if(s.setEndPoint(t?"EndToStart":"EndToEnd",A),/[\r\n]/.test(B.data)){var E=s.duplicate(),v=E.text.replace(/\r\n/g,"\r").length;for(y=E.moveStart("character",v);-1==(d=E.compareEndPoints("StartToEnd",E));)y++,E.moveStart("character",1)}else y=s.text.length;p=new i(B,y)}else g=(n||!t)&&u.previousSibling,p=(h=(n||t)&&u.nextSibling)&&l(h)?new i(h,0):g&&l(g)?new i(g,g.data.length):new i(a,r.getNodeIndex(u));return r.removeNode(u),{boundaryPosition:p,nodeInfo:{nodeIndex:Q,containerElement:a}}},h=function(A,e){var t,n,o,i,s=A.offset,c=r.getDocument(A.node),u=a(c).createTextRange(),d=l(A.node);return d?n=(t=A.node).parentNode:(t=s<(i=A.node.childNodes).length?i[s]:null,n=A.node),(o=c.createElement("span")).innerHTML="&#feff;",t?n.insertBefore(o,t):n.appendChild(o),u.moveToElementText(o),u.collapse(!e),n.removeChild(o),d&&u[e?"moveStart":"moveEnd"]("character",s),u};(n=function(A){this.textRange=A,this.refresh()}).prototype=new s(document),n.prototype.refresh=function(){var A,e,t,n=u(this.textRange);d(this.textRange)?e=A=g(this.textRange,n,!0,!0).boundaryPosition:(A=(t=g(this.textRange,n,!0,!1)).boundaryPosition,e=g(this.textRange,n,!1,!1,t.nodeInfo).boundaryPosition),this.setStart(A.node,A.offset),this.setEnd(e.node,e.offset)},n.prototype.getName=function(){return"WrappedTextRange"},s.copyComparisonConstants(n);var p=function(A){if(A.collapsed)return h(new i(A.startContainer,A.startOffset),!0);var e=h(new i(A.startContainer,A.startOffset),!0),t=h(new i(A.endContainer,A.endOffset),!1),n=a(s.getRangeDocument(A)).createTextRange();return n.setEndPoint("StartToStart",e),n.setEndPoint("EndToEnd",t),n};if(n.rangeToTextRange=p,n.prototype.toTextRange=function(){return p(this)},A.WrappedTextRange=n,!A.features.implementsDomRange||A.config.preferTextRange){var B=Function("return this;")();void 0===B.Range&&(B.Range=n),A.createNativeRange=function(A){return A=c(A,e,"createNativeRange"),a(A).createTextRange()},A.WrappedRange=n}}A.createRange=function(t){return t=c(t,e,"createRange"),new A.WrappedRange(A.createNativeRange(t))},A.createRangyRange=function(A){return A=c(A,e,"createRangyRange"),new s(A)},o.createAliasForDeprecatedMethod(A,"createIframeRange","createRange"),o.createAliasForDeprecatedMethod(A,"createIframeRangyRange","createRangyRange"),A.addShimListener((function(e){var t=e.document;void 0===t.createRange&&(t.createRange=function(){return A.createRange(t)}),t=e=null}))})),Q.createCoreModule("WrappedSelection",["DomRange","WrappedRange"],(function(A,e){A.config.checkSelectionRanges=!0;var t,n,r="boolean",o="number",i=A.dom,s=A.util,a=s.isHostMethod,c=A.DomRange,l=A.WrappedRange,u=A.DOMException,d=i.DomPosition,g=A.features,h="Control",p=i.getDocument,B=i.getBody,f=c.rangesEqual;function m(A){return"string"==typeof A?/^backward(s)?$/i.test(A):!!A}function w(A,t){if(A){if(i.isWindow(A))return A;if(A instanceof j)return A.win;var n=i.getContentDocument(A,e,t);return i.getWindow(n)}return window}function C(A){return w(A,"getWinSelection").getSelection()}function Q(A){return w(A,"getDocSelection").document.selection}function y(A){var e=!1;return A.anchorNode&&(e=1==i.comparePoints(A.anchorNode,A.anchorOffset,A.focusNode,A.focusOffset)),e}var E=a(window,"getSelection"),v=s.isHostObject(document,"selection");g.implementsWinGetSelection=E,g.implementsDocSelection=v;var U=v&&(!E||A.config.preferTextRange);if(U)t=Q,A.isSelectionValid=function(A){var e=w(A,"isSelectionValid").document,t=e.selection;return"None"!=t.type||p(t.createRange().parentElement())==e};else{if(!E)return e.fail("Neither document.selection or window.getSelection() detected."),!1;t=C,A.isSelectionValid=function(){return!0}}A.getNativeSelection=t;var F=t();if(!F)return e.fail("Native selection was null (possibly issue 138?)"),!1;var b=A.createNativeRange(document),H=B(document),I=s.areHostProperties(F,["anchorNode","focusNode","anchorOffset","focusOffset"]);g.selectionHasAnchorAndFocus=I;var S=a(F,"extend");g.selectionHasExtend=S;var N=a(F,"setBaseAndExtent");g.selectionHasSetBaseAndExtent=N;var x=typeof F.rangeCount==o;g.selectionHasRangeCount=x;var D=!1,O=!0,T=S?function(e,t){var n=c.getRangeDocument(t),r=A.createRange(n);r.collapseToPoint(t.endContainer,t.endOffset),e.addRange(P(r)),e.extend(t.startContainer,t.startOffset)}:null;s.areHostMethods(F,["addRange","getRangeAt","removeAllRanges"])&&typeof F.rangeCount==o&&g.implementsDomRange&&function(){var e=window.getSelection();if(e){for(var t=e.rangeCount,n=t>1,r=[],o=y(e),s=0;s=36)D=!1;else{var d=l.cloneRange();l.setStart(c,0),d.setEnd(c,3),d.setStart(c,2),e.addRange(l),e.addRange(d),D=2==e.rangeCount}}for(i.removeNode(a),e.removeAllRanges(),s=0;s1)nA(this,A);else{this.removeAllRanges();for(var e=0,t=A.length;e1?nA(this,A):e&&this.addRange(A[0])}}if(tA.getRangeAt=function(A){if(A<0||A>=this.rangeCount)throw new u("INDEX_SIZE_ERR");return this._ranges[A].cloneRange()},U)eA=function(e){var t;A.isSelectionValid(e.win)?t=e.docSelection.createRange():(t=B(e.win.document).createTextRange()).collapse(!0),e.docSelection.type==h?$(e):X(t)?J(e,t):M(e)};else if(a(F,"getRangeAt")&&typeof F.rangeCount==o)eA=function(e){if(R&&v&&e.docSelection.type==h)$(e);else if(e._ranges.length=e.rangeCount=e.nativeSelection.rangeCount,e.rangeCount){for(var t=0,r=e.rangeCount;t(i.isCharacterDataNode(A)?A.length:A.childNodes.length))throw new u("INDEX_SIZE_ERR")}function cA(e){return function(t,n){var r;this.rangeCount?(r=this.getRangeAt(0))["set"+(e?"Start":"End")](t,n):(r=A.createRange(this.win.document)).setStartAndEnd(t,n),this.setSingleRange(r,this.isBackward())}}function lA(A){var e=[],t=new d(A.anchorNode,A.anchorOffset),n=new d(A.focusNode,A.focusOffset),r="function"==typeof A.getName?A.getName():"Selection";if(void 0!==A.rangeCount)for(var o=0,i=A.rangeCount;o0)return A.WrappedTextRange.rangeToTextRange(this.getRangeAt(0));throw e.createError("getNativeTextRange: selection contains no range")}),tA.getName=function(){return"WrappedSelection"},tA.inspect=function(){return lA(this)},tA.detach=function(){q(this.win,"delete"),Z(this)},j.detachAll=function(){q(null,"deleteAll")},j.inspect=lA,j.isDirectionBackward=m,A.Selection=j,A.selectionPrototype=tA,A.addShimListener((function(A){void 0===A.getSelection&&(A.getSelection=function(){return AA(A)}),A=null}))}));var _=!1,R=function(A){_||(_=!0,!Q.initialized&&Q.config.autoInitialize&&H())};return w&&("complete"==document.readyState?R():(s(document,"addEventListener")&&document.addEventListener("DOMContentLoaded",R,!1),f(window,"load",R))),Q}()),wm.exports}const Qm=fm(Cm());var ym;(ym=Cm()).createModule("ClassApplier",["WrappedSelection"],(function(A,e){var t=A.dom,n=t.DomPosition,r=t.arrayContains,o=A.util,i=o.forEach,s="span",a=o.isHostMethod(document,"createElementNS");function c(A,e){for(var t in A)if(A.hasOwnProperty(t)&&!1===e(t,A[t]))return!1;return!0}function l(A){return A.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}function u(A,e){return!!A&&new RegExp("(?:^|\\s)"+e+"(?:\\s|$)").test(A)}function d(A,e){return"object"==typeof A.classList?A.classList.contains(e):u("string"==typeof A.className?A.className:A.getAttribute("class"),e)}function g(A,e){if("object"==typeof A.classList)A.classList.add(e);else{var t="string"==typeof A.className,n=t?A.className:A.getAttribute("class");n?u(n,e)||(n+=" "+e):n=e,t?A.className=n:A.setAttribute("class",n)}}var h=function(){function A(A,e,t){return e&&t?" ":""}return function(e,t){if("object"==typeof e.classList)e.classList.remove(t);else{var n="string"==typeof e.className,r=n?e.className:e.getAttribute("class");r=r.replace(new RegExp("(^|\\s)"+t+"(\\s|$)"),A),n?e.className=r:e.setAttribute("class",r)}}}();function p(A){return"string"==typeof A.className?A.className:A.getAttribute("class")}function B(A){return A&&A.split(/\s+/).sort().join(" ")}function f(A){return B(p(A))}function m(A,e){return f(A)==f(e)}function w(A,e){for(var t=e.split(/\s+/),n=0,r=t.length;nr&&++a,o!=e||i!=t&&i!=t+1||(s=n,a+=r-t),o==e&&i>t+1&&--a,A.node=s,A.offset=a}function y(A,e,t){A.node==e&&A.offset>t&&--A.offset}function E(A,e,n,r){-1==n&&(n=e.childNodes.length);var o=A.parentNode,s=t.getNodeIndex(A);i(r,(function(A){Q(A,o,s,e,n)})),e.childNodes.length==n?e.appendChild(A):e.insertBefore(A,e.childNodes[n])}function v(A,e){var n=A.parentNode,r=t.getNodeIndex(A);i(e,(function(A){y(A,n,r)})),t.removeNode(A)}function U(A,e,t,n,r){for(var o,i=[];o=A.firstChild;)E(o,e,t++,r),i.push(o);return v(A,r),i}function F(A,e){return U(A,A.parentNode,t.getNodeIndex(A),!0,e)}function b(A,e){var t=A.cloneRange();t.selectNodeContents(e);var n=t.intersection(A);return""!=(n?n.toString():"")}function H(A){for(var e,t=A.getNodes([3]),n=0;(e=t[n])&&!b(A,e);)++n;for(var r=t.length-1;(e=t[r])&&!b(A,e);)--r;return t.slice(n,r+1)}function I(A,e){if(A.attributes.length!=e.attributes.length)return!1;for(var t,n,r,o=0,i=A.attributes.length;o0&&e1){var r,o=t.getNodeIndex(n),s=[],a=0;i(e,(function(c,l){r=c.parentNode,l>0&&(r.removeChild(c),r.hasChildNodes()||t.removeNode(r),A&&i(A,(function(A){A.node==c&&(A.node=n,A.offset+=a),A.node==r&&A.offset>o&&(--A.offset,A.offset==o+1&&lA.start},isContiguousWith:function(A){return this.start==A.end||this.end==A.start},union:function(A){return new h(Math.min(this.start,A.start),Math.max(this.end,A.end))},intersection:function(A){return new h(Math.max(this.start,A.start),Math.min(this.end,A.end))},getComplements:function(A){var e=[];if(this.start>=A.start){if(this.end<=A.end)return[];e.push(new h(A.end,this.end))}else e.push(new h(this.start,Math.min(this.end,A.start))),this.end>A.end&&e.push(new h(A.end,this.end));return e},toString:function(){return"[CharacterRange("+this.start+", "+this.end+")]"}},h.fromCharacterRange=function(A){return new h(A.start,A.end)};var p={rangeToCharacterRange:function(A,e){var t=A.getBookmark(e);return new h(t.start,t.end)},characterRangeToRange:function(e,t,n){var r=A.createRange(e);return r.moveToBookmark({start:t.start,end:t.end,containerNode:n}),r},serializeSelection:function(A,e){for(var t=A.getAllRanges(),n=[],r=1==t.length&&A.isBackward(),o=0,i=t.length;o0},serialize:function(A){var e,t,n,r,s=this,c=s.highlights;return c.sort(a),e=(A=o(A,{serializeHighlightText:!1,type:s.converter.type})).type,(n=e!=s.converter.type)&&(r=g(e)),t=["type:"+e],i(c,(function(e){var o,i=e.characterRange;n&&(o=e.getContainerElement(),i=r.rangeToCharacterRange(s.converter.characterRangeToRange(s.doc,i,o),o));var a=[i.start,i.end,e.id,e.classApplier.className,e.containerElementId];A.serializeHighlightText&&a.push(e.getText()),t.push(a.join("$"))})),t.join("|")},deserialize:function(A){var e,t,n,r,o,i,s,a,l=A.split("|"),u=[],d=l[0],p=!1;if(!d||!(e=/^type:(\w+)$/.exec(d)))throw new Error("Serialized highlights are invalid.");(t=e[1])!=this.converter.type&&(n=g(t),p=!0),l.shift();for(var f,m=l.length;m-- >0;){if(i=new h(+(f=l[m].split("$"))[0],+f[1]),s=f[4]||null,p&&(a=c(this.doc,s),i=this.converter.rangeToCharacterRange(n.characterRangeToRange(this.doc,i,a),a)),!(r=this.classAppliers[f[3]]))throw new Error("No class applier found for class '"+f[3]+"'");(o=new B(this.doc,i,r,this.converter,parseInt(f[2]),s)).apply(),u.push(o)}this.highlights=u}},A.Highlighter=f,A.createHighlighter=function(A,e){return new f(A,e)}})),A}(Cm())}({exports:{}});!function(A){A.exports=function(A){return A.createModule("Serializer",["WrappedSelection"],(function(A,e){var t="undefined",n=A.util;typeof encodeURIComponent!=t&&typeof decodeURIComponent!=t||e.fail("encodeURIComponent and/or decodeURIComponent method is missing");var r=function(){function A(A){for(var e,t=[],n=0,r=A.length;n>6|192,63&e|128):t.push(e>>12|224,e>>6&63|128,63&e|128);return t}var e=null;function t(){for(var A,e,t=[],n=0;n<256;++n){for(e=n,A=8;A--;)1&~e?e>>>=1:e=e>>>1^3988292384;t[n]=e>>>0}return t}function n(){return e||(e=t()),e}return function(e){for(var t=A(e),r=-1,o=n(),i=0,s=t.length;i>>8^o[255&(r^t[i])];return(-1^r)>>>0}}(),o=A.dom;function i(A){return A.replace(//g,">")}function s(A,e){e=e||[];var t=A.nodeType,n=A.childNodes,r=n.length,o=[t,A.nodeName,r].join(":"),a="",c="";switch(t){case 3:a=i(A.nodeValue);break;case 8:a="\x3c!--"+i(A.nodeValue)+"--\x3e";break;default:a="<"+o+">",c=""}a&&e.push(a);for(var l=0;la&&o(a,i,!1),e.includeTrailingSpace)for(;B.test(A[s]);)++s;o(i,s,!0),a=s}return a1

",!0),n=t.firstChild,(r=A.getSelection()).collapse(n.lastChild,2),r.setStart(n.firstChild,0),t.innerHTML="1
",r.collapse(t,2),r.setStart(t.firstChild,0),w=1==(""+r).length,t.innerHTML="1

1

",r.collapse(t,2),r.setStart(t.firstChild,0),C=1==(""+r).length,a.removeNode(t),r.removeAllRanges();var v={includeBlockContentTrailingSpace:!0,includeSpaceBeforeBr:!0,includeSpaceBeforeBlock:!0,includePreLineTrailingSpace:!0,ignoreCharacters:""};function U(A){var e=A||"",t="string"==typeof e?e.split(""):e;return t.sort((function(A,e){return A.charCodeAt(0)-e.charCodeAt(0)})),t.join("").replace(/(.)\1+/g,"$1")}var F={includeBlockContentTrailingSpace:!1,includeSpaceBeforeBr:!w,includeSpaceBeforeBlock:!C,includePreLineTrailingSpace:!0},b={en:{wordRegex:/[a-z0-9]+('[a-z0-9]+)*/gi,includeTrailingSpace:!1,tokenizer:Q}},H={caseSensitive:!1,withinRange:null,wholeWordsOnly:!1,wrap:!1,direction:"forward",wordOptions:null,characterOptions:null},I={wordOptions:null,characterOptions:null},S={wordOptions:null,characterOptions:null,trim:!1,trimStart:!0,trimEnd:!0},N={wordOptions:null,characterOptions:null,direction:"forward"};function x(A){var e,t;return A?(e=A.language||f,l(t={},b[e]||b[f]),l(t,A),t):b[f]}function D(A,e){var t=u(A,e);return e.hasOwnProperty("wordOptions")&&(t.wordOptions=x(t.wordOptions)),e.hasOwnProperty("characterOptions")&&(t.characterOptions=u(t.characterOptions,v)),t}var O,T,L,_=a.getComputedStyleProperty;T=document.createElement("table"),(L=d(document)).appendChild(T),O="block"==_(T,"display"),L.removeChild(T);var R={table:"table",caption:"table-caption",colgroup:"table-column-group",col:"table-column",thead:"table-header-group",tbody:"table-row-group",tfoot:"table-footer-group",tr:"table-row",td:"table-cell",th:"table-cell"};function K(A,e){var t=_(A,"display",e),n=A.tagName.toLowerCase();return"block"==t&&O&&R.hasOwnProperty(n)?R[n]:t}function k(A){for(var e=W(A),t=0,n=e.length;t0)if(3==e.nodeType){var i=e.data,s=i.charAt(t-1),a=A.nodeWrapper.getTextNodeInfo(),c=a.spaceRegex;a.collapseSpaces?c.test(s)?t>1&&c.test(i.charAt(t-2))||(a.preLine&&"\n"===i.charAt(t)?(n=" ",r=lA):(n=" ",r=iA)):(n=s,r=rA,o=!0):(n=s,r=oA,o=!0)}else{var l=e.childNodes[t-1];if(l&&1==l.nodeType&&!Z(l)&&("br"==l.tagName.toLowerCase()?(n="\n",A.isBr=!0,r=iA,o=!1):A.checkForTrailingSpace=!0),!n){var u=e.childNodes[t];u&&1==u.nodeType&&!Z(u)&&(A.checkForLeadingSpace=!0)}}A.prepopulatedChar=!0,A.character=n,A.characterType=r,A.isCharInvariant=o}},isDefinitelyNonEmpty:function(){var A=this.characterType;return A==rA||A==oA},resolveLeadingAndTrailingSpaces:function(){if(this.prepopulatedChar||this.prepopulateChar(),this.checkForTrailingSpace){var A=this.session.getNodeWrapper(this.node.childNodes[this.offset-1]).getTrailingSpace();A&&(this.isTrailingSpace=!0,this.character=A,this.characterType=iA),this.checkForTrailingSpace=!1}if(this.checkForLeadingSpace){var e=this.session.getNodeWrapper(this.node.childNodes[this.offset]).getLeadingSpace();e&&(this.isLeadingSpace=!0,this.character=e,this.characterType=iA),this.checkForLeadingSpace=!1}},getPrecedingUncollapsedPosition:function(A){for(var e=this;e=e.previousVisible();)if(""!==e.getCharacter(A))return e;return null},getCharacter:function(A){this.resolveLeadingAndTrailingSpaces();var e=this.character,t=U(A.ignoreCharacters),n=""!==e&&t.indexOf(e)>-1;if(this.isCharInvariant)return n?"":e;var r=["character",A.includeSpaceBeforeBr,A.includeBlockContentTrailingSpace,A.includePreLineTrailingSpace,t].join("_"),o=this.cache.get(r);if(null!==o)return o;var i,s,a="",c=this.characterType==iA,l=!1,u=this;function d(){return l||(s=u.getPrecedingUncollapsedPosition(A),l=!0),s}return c&&(this.type==dA?a="\n":" "==e&&(!d()||s.isTrailingSpace||"\n"==s.character||" "==s.character&&s.characterType==iA)||("\n"==e&&this.isLeadingSpace?d()&&"\n"!=s.character&&(a="\n"):(i=this.nextUncollapsed())&&(i.isBr?this.type=cA:i.isTrailingSpace&&"\n"==i.character?this.type=aA:i.isLeadingSpace&&"\n"==i.character&&(this.type=sA),"\n"==i.character?(this.type!=cA||A.includeSpaceBeforeBr)&&(this.type!=sA||A.includeSpaceBeforeBlock)&&(this.type==aA&&i.isTrailingSpace&&!A.includeBlockContentTrailingSpace||(this.type!=lA||i.type!=rA||A.includePreLineTrailingSpace)&&("\n"==e?i.isTrailingSpace?this.isTrailingSpace||this.isBr&&(i.type=uA,d()&&s.isLeadingSpace&&!s.isTrailingSpace&&"\n"==s.character?i.character="":i.type=dA):a="\n":" "==e&&(a=" "))):a=e))),t.indexOf(a)>-1&&(a=""),this.cache.set(r,a),a},equals:function(A){return!!A&&this.node===A.node&&this.offset===A.offset},inspect:hA,toString:function(){return this.character}};gA.prototype=pA,l(pA,{next:AA("nextPos",(function(A){var e,t,n,r=A.nodeWrapper,o=A.node,i=A.offset,s=r.session;return o?(i==r.getLength()?t=(e=o.parentNode)?r.getNodeIndex()+1:0:r.isCharacterDataNode()?(e=o,t=i+1):(n=o.childNodes[i],s.getNodeWrapper(n).containsPositions()?(e=n,t=0):(e=o,t=i+1)),e?s.getPosition(e,t):null):null})),previous:AA("previous",(function(A){var e,t,n,r=A.nodeWrapper,o=A.node,i=A.offset,s=r.session;return 0==i?t=(e=o.parentNode)?r.getNodeIndex():0:r.isCharacterDataNode()?(e=o,t=i-1):(n=o.childNodes[i-1],s.getNodeWrapper(n).containsPositions()?(e=n,t=a.getNodeLength(n)):(e=o,t=i-1)),e?s.getPosition(e,t):null})),nextVisible:AA("nextVisible",(function(A){var e=A.next();if(!e)return null;var t=e.nodeWrapper,n=e.node,r=e;return t.isCollapsed()&&(r=t.session.getPosition(n.parentNode,t.getNodeIndex()+1)),r})),nextUncollapsed:AA("nextUncollapsed",(function(A){for(var e=A;e=e.nextVisible();)if(e.resolveLeadingAndTrailingSpaces(),""!==e.character)return e;return null})),previousVisible:AA("previousVisible",(function(A){var e=A.previous();if(!e)return null;var t=e.nodeWrapper,n=e.node,r=e;return t.isCollapsed()&&(r=t.session.getPosition(n.parentNode,t.getNodeIndex())),r}))});var BA=null,fA=function(){function A(A){var e=new q;return{get:function(t){var n=e.get(t[A]);if(n)for(var r,o=0;r=n[o++];)if(r.node===t)return r;return null},set:function(t){var n=t.node[A];(e.get(n)||e.set(n,[])).push(t)}}}var e=c.isHostProperty(document.documentElement,"uniqueID");function t(){this.initCaches()}return t.prototype={initCaches:function(){var t;this.elementCache=e?(t=new q,{get:function(A){return t.get(A.uniqueID)},set:function(A){t.set(A.node.uniqueID,A)}}):A("tagName"),this.textNodeCache=A("data"),this.otherNodeCache=A("nodeName")},getNodeWrapper:function(A){var e;switch(A.nodeType){case 1:e=this.elementCache;break;case 3:e=this.textNodeCache;break;default:e=this.otherNodeCache}var t=e.get(A);return t||(t=new eA(A,this),e.set(t)),t},getPosition:function(A,e){return this.getNodeWrapper(A).getPosition(e)},getRangeBoundaryPosition:function(A,e){var t=e?"start":"end";return this.getPosition(A[t+"Container"],A[t+"Offset"])},detach:function(){this.elementCache=this.textNodeCache=this.otherNodeCache=null}},t}();function mA(){return CA(),BA=new fA}function wA(){return BA||mA()}function CA(){BA&&BA.detach(),BA=null}function QA(A,t,n,r){n&&(t?Z(n.node)&&(n=A.previousVisible()):Z(n.node)&&(n=n.nextVisible()));var o=A,i=!1;function s(){var A=null;return t?(A=o,i||(o=o.previousVisible(),i=!o||n&&o.equals(n))):i||(A=o=o.nextVisible(),i=!o||n&&o.equals(n)),i&&(o=null),A}var a,c=!1;return{next:function(){if(c)return c=!1,a;for(var A;A=s();)if(A.getCharacter(r))return a=A,A;return null},rewind:function(){if(!a)throw e.createError("createCharacterIterator: cannot rewind. Only one position can be rewound.");c=!0},dispose:function(){A=n=null}}}l(a,{nextNode:J,previousNode:$});var yA=Array.prototype.indexOf?function(A,e){return A.indexOf(e)}:function(A,e){for(var t=0,n=A.length;t0;)l=E(A.chars.concat(e),t,o);return l.shift()},previousStartToken:function(){for(var A,e;1==u.length&&!(A=u[0]).isWord&&(e=i(!1)).length>0;)u=E(e.reverse().concat(A.chars),t,o);return u.pop()},dispose:function(){n.dispose(),r.dispose(),l=u=null}}}function vA(A,e,t,n,r){var o,a,c,l,u=0,d=A,g=Math.abs(t);if(0!==t){var h=t<0;switch(e){case i:for(a=QA(A,h,null,n);(o=a.next())&&u0){p=B(s,a);break}}else l=!0}else if(-1!=(s=g.indexOf(e))){p=B(s,s+e.length);break}return l&&(p=B(s,a)),d.dispose(),p}function IA(A){return function(){var e=!!BA,t=[wA()].concat(c.toArray(arguments)),n=A.apply(this,t);return e||CA(),n}}function SA(A,e){return IA((function(t,n,r,s){typeof r==o&&(r=n,n=i),s=D(s,I);var a=A;e&&(a=r>=0,this.collapse(!a));var c=vA(t.getRangeBoundaryPosition(this,a),n,r,s.characterOptions,s.wordOptions),l=c.position;return this[a?"setStart":"setEnd"](l.node,l.offset),c.unitsMoved}))}function NA(A){return IA((function(e,t){for(var n,r=UA(e,this,t=u(t,v),!A),o=0;(n=r.next())&&p.test(n.character);)++o;r.dispose();var i=o>0;return i&&this[A?"moveStart":"moveEnd"]("character",A?o:-o,{characterOptions:t}),i}))}function xA(A){return IA((function(e,t){var n=!1;return this.changeEachRange((function(e){n=e[A](t)||n})),n}))}l(A.rangePrototype,{moveStart:SA(!0,!1),moveEnd:SA(!1,!1),move:SA(!0,!0),trimStart:NA(!0),trimEnd:NA(!1),trim:IA((function(A,e){var t=this.trimStart(e),n=this.trimEnd(e);return t||n})),expand:IA((function(A,e,t){var n=!1,r=(t=D(t,S)).characterOptions;if(e||(e=i),e==s){var o,a,c=t.wordOptions,l=A.getRangeBoundaryPosition(this,!0),u=A.getRangeBoundaryPosition(this,!1),d=EA(l,r,c).nextEndToken(),g=d.chars[0].previousVisible();return a=(o=this.collapsed?d:EA(u,r,c).previousStartToken()).chars[o.chars.length-1],g.equals(l)||(this.setStart(g.node,g.offset),n=!0),a&&!a.equals(u)&&(this.setEnd(a.node,a.offset),n=!0),t.trim&&(t.trimStart&&(n=this.trimStart(r)||n),t.trimEnd&&(n=this.trimEnd(r)||n)),n}return this.moveEnd(i,1,t)})),text:IA((function(A,e){return this.collapsed?"":FA(A,this,u(e,v)).join("")})),selectCharacters:IA((function(A,e,t,n,r){var o={characterOptions:r};e||(e=d(this.getDocument())),this.selectNodeContents(e),this.collapse(!0),this.moveStart("character",t,o),this.collapse(!0),this.moveEnd("character",n-t,o)})),toCharacterRange:IA((function(A,e,t){e||(e=d(this.getDocument()));var n,r=e.parentNode,o=a.getNodeIndex(e),i=-1==a.comparePoints(this.startContainer,this.endContainer,r,o),s=this.cloneRange();return i?(s.setStartAndEnd(this.startContainer,this.startOffset,r,o),n=-s.text(t).length):(s.setStartAndEnd(r,o,this.startContainer,this.startOffset),n=s.text(t).length),{start:n,end:n+this.text(t).length}})),findText:IA((function(e,t,n){(n=D(n,H)).wholeWordsOnly&&(n.wordOptions.includeTrailingSpace=!1);var r=m(n.direction),o=n.withinRange;o||(o=A.createRange()).selectNodeContents(this.getDocument());var i=t,s=!1;"string"==typeof i?n.caseSensitive||(i=i.toLowerCase()):s=!0;var a=e.getRangeBoundaryPosition(this,!r),c=o.comparePoint(a.node,a.offset);-1===c?a=e.getRangeBoundaryPosition(o,!0):1===c&&(a=e.getRangeBoundaryPosition(o,!1));for(var l,u=a,d=!1;;)if(l=HA(u,i,s,o,n)){if(l.valid)return this.setStartAndEnd(l.startPos.node,l.startPos.offset,l.endPos.node,l.endPos.offset),!0;u=r?l.startPos:l.endPos}else{if(!n.wrap||d)return!1;o=o.cloneRange(),u=e.getRangeBoundaryPosition(o,!r),o.setBoundary(a.node,a.offset,r),d=!0}})),pasteHtml:function(A){if(this.deleteContents(),A){var e=this.createContextualFragment(A),t=e.lastChild;this.insertNode(e),this.collapseAfter(t)}}}),l(A.selectionPrototype,{expand:IA((function(A,e,t){this.changeEachRange((function(A){A.expand(e,t)}))})),move:IA((function(A,e,t,n){var r=0;if(this.focusNode){this.collapse(this.focusNode,this.focusOffset);var o=this.getRangeAt(0);n||(n={}),n.characterOptions=u(n.characterOptions,F),r=o.move(e,t,n),this.setSingleRange(o)}return r})),trimStart:xA("trimStart"),trimEnd:xA("trimEnd"),trim:xA("trim"),selectCharacters:IA((function(e,t,n,r,o,i){var s=A.createRange(t);s.selectCharacters(t,n,r,i),this.setSingleRange(s,o)})),saveCharacterRanges:IA((function(A,e,t){for(var n=this.getAllRanges(),r=[],o=1==n.length&&this.isBackward(),i=0,s=n.length;i{const A=document.getElementById("smartcomments-app");if(A)try{const e=function(){const A=sA(!0),e=A.run((()=>Se({})));let t=[],n=[];const r=Fe({install(A){ki(r),r._a=A,A.provide(Mi,r),A.config.globalProperties.$pinia=r,"production"!==Ri.NODE_ENV&&"test"!==Ri.NODE_ENV&&Wi&&ms(A,r),n.forEach((A=>t.push(A))),n=[]},use(A){return this._a?t.push(A):n.push(A),this},_p:t,_a:null,_e:A,_s:new Map,state:e});return"production"!==Ri.NODE_ENV&&"test"!==Ri.NODE_ENV&&Wi&&"undefined"!=typeof Proxy&&r.use(ys),r}(),t=Hi(Bm);t.use(e),Promise.resolve().then((()=>Ks)).then((({useAppStateStore:e})=>{const n=e();if("SmartComments"===mw.config.get("wgCanonicalSpecialPageName"))n.initializeSpecialPageState();else{n.initializeState();"1"===mw.util.getParamValue("scenabled")?n.enableAppState():n.disableAppState()}t.mount(A)})).catch((A=>{mw.log.error("SmartComments: Failed to load store:",A)}))}catch(e){mw.log.error("SmartComments: Failed to initialize:",e)}else mw.log.error("SmartComments: Mount element #smartcomments-app not found.")}))}(); //# sourceMappingURL=smartcomments.min.js.map diff --git a/resources/frontend/dist/smartcomments.min.js.map b/resources/frontend/dist/smartcomments.min.js.map index 5e68d45..6614954 100644 --- a/resources/frontend/dist/smartcomments.min.js.map +++ b/resources/frontend/dist/smartcomments.min.js.map @@ -1 +1 @@ -{"version":3,"file":"smartcomments.min.js","sources":["../node_modules/@vue/shared/dist/shared.esm-bundler.js","../node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js","../node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js","../node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js","../node_modules/vue-demi/lib/index.mjs","../node_modules/@vue/devtools-api/lib/esm/env.js","../node_modules/vue/dist/vue.runtime.esm-bundler.js","../node_modules/@vue/devtools-api/lib/esm/time.js","../node_modules/@vue/devtools-api/lib/esm/proxy.js","../node_modules/@vue/devtools-api/lib/esm/const.js","../node_modules/@vue/devtools-api/lib/esm/index.js","../node_modules/pinia/dist/pinia.mjs","../src/store/userStore.js","../src/store/appStateStore.js","../src/composables/selection/shared/SelectionConstants.js","../src/utils/constants.js","../src/utils/sanitize.js","../src/composables/selection/shared/SelectionUtils.js","../src/composables/core/useMessages.js","../src/composables/features/useComments.js","../src/composables/highlights/shared/HighlightErrorHandler.js","../src/composables/highlights/shared/HighlightUtils.js","../src/composables/highlights/useHighlightData.js","../src/composables/setup/useSmartCommentsSetup.js","../src/composables/selection/shared/SelectionErrorHandler.js","../src/utils/screenshotTargetManager.js","../node_modules/html2canvas/dist/html2canvas.esm.js","../src/composables/features/useScreenshot.js","../src/strategies/BaseSelectionStrategy.js","../src/composables/features/useSelectionScreenshot.js","../src/strategies/TextSelectionStrategy.js","../src/strategies/ImageSelectionStrategy.js","../src/strategies/SVGSelectionStrategy.js","../src/strategies/DynamicBlockSelectionStrategy.js","../src/factories/SelectionStrategyFactory.js","../src/composables/selection/useSelection.js","../src/composables/ui/useHoverEffects.js","../src/utils/smartCommentsEvents.js","../src/composables/selection/useSelectionEvents.js","../src/composables/features/useLinkPrevention.js","../src/composables/highlights/useTextHighlight.js","../src/composables/highlights/useSelectorHighlight.js","../src/composables/highlights/useHighlightListeners.js","../src/composables/highlights/useHighlightManager.js","../src/composables/highlights/useSVGHighlight.js","../src/store/commentsStore.js","../src/directives/highlightDirective.js","../src/components/ReplyForm.vue","../src/components/CommentMessage.vue","../src/components/ReplyList.vue","../src/components/CommentActions.vue","../src/components/CommentBody.vue","../src/components/ImageModal.vue","../src/components/Comment.vue","../src/components/NewCommentDialog.vue","../src/components/CommentTimeline.vue","../src/SmartComments.vue","../src/composables/highlights/useHighlightOrchestrator.js","../src/composables/ui/useKeyboardShortcuts.js","../src/composables/core/useCustomProperties.js","../src/composables/ui/useSmartCommentsEventHandlers.js","../src/composables/features/useUrlNavigation.js","../node_modules/rangy/lib/rangy-core.js","../node_modules/rangy/lib/rangy-classapplier.js","../node_modules/rangy/lib/rangy-highlighter.js","../node_modules/rangy/lib/rangy-serializer.js","../node_modules/rangy/lib/rangy-textrange.js","../src/App.js"],"sourcesContent":["/**\n* @vue/shared v3.5.16\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction makeMap(str) {\n const map = /* @__PURE__ */ Object.create(null);\n for (const key of str.split(\",\")) map[key] = 1;\n return (val) => val in map;\n}\n\nconst EMPTY_OBJ = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze({}) : {};\nconst EMPTY_ARR = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze([]) : [];\nconst NOOP = () => {\n};\nconst NO = () => false;\nconst isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter\n(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);\nconst isModelListener = (key) => key.startsWith(\"onUpdate:\");\nconst extend = Object.assign;\nconst remove = (arr, el) => {\n const i = arr.indexOf(el);\n if (i > -1) {\n arr.splice(i, 1);\n }\n};\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst isArray = Array.isArray;\nconst isMap = (val) => toTypeString(val) === \"[object Map]\";\nconst isSet = (val) => toTypeString(val) === \"[object Set]\";\nconst isDate = (val) => toTypeString(val) === \"[object Date]\";\nconst isRegExp = (val) => toTypeString(val) === \"[object RegExp]\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isString = (val) => typeof val === \"string\";\nconst isSymbol = (val) => typeof val === \"symbol\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isPromise = (val) => {\n return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);\n};\nconst objectToString = Object.prototype.toString;\nconst toTypeString = (value) => objectToString.call(value);\nconst toRawType = (value) => {\n return toTypeString(value).slice(8, -1);\n};\nconst isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\nconst isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\nconst isReservedProp = /* @__PURE__ */ makeMap(\n // the leading comma is intentional so empty string \"\" is also included\n \",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n);\nconst isBuiltInDirective = /* @__PURE__ */ makeMap(\n \"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"\n);\nconst cacheStringFunction = (fn) => {\n const cache = /* @__PURE__ */ Object.create(null);\n return (str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n };\n};\nconst camelizeRE = /-(\\w)/g;\nconst camelize = cacheStringFunction(\n (str) => {\n return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n }\n);\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction(\n (str) => str.replace(hyphenateRE, \"-$1\").toLowerCase()\n);\nconst capitalize = cacheStringFunction((str) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n});\nconst toHandlerKey = cacheStringFunction(\n (str) => {\n const s = str ? `on${capitalize(str)}` : ``;\n return s;\n }\n);\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\nconst invokeArrayFns = (fns, ...arg) => {\n for (let i = 0; i < fns.length; i++) {\n fns[i](...arg);\n }\n};\nconst def = (obj, key, value, writable = false) => {\n Object.defineProperty(obj, key, {\n configurable: true,\n enumerable: false,\n writable,\n value\n });\n};\nconst looseToNumber = (val) => {\n const n = parseFloat(val);\n return isNaN(n) ? val : n;\n};\nconst toNumber = (val) => {\n const n = isString(val) ? Number(val) : NaN;\n return isNaN(n) ? val : n;\n};\nlet _globalThis;\nconst getGlobalThis = () => {\n return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n};\nconst identRE = /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;\nfunction genPropsAccessExp(name) {\n return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`;\n}\nfunction genCacheKey(source, options) {\n return source + JSON.stringify(\n options,\n (_, val) => typeof val === \"function\" ? val.toString() : val\n );\n}\n\nconst PatchFlags = {\n \"TEXT\": 1,\n \"1\": \"TEXT\",\n \"CLASS\": 2,\n \"2\": \"CLASS\",\n \"STYLE\": 4,\n \"4\": \"STYLE\",\n \"PROPS\": 8,\n \"8\": \"PROPS\",\n \"FULL_PROPS\": 16,\n \"16\": \"FULL_PROPS\",\n \"NEED_HYDRATION\": 32,\n \"32\": \"NEED_HYDRATION\",\n \"STABLE_FRAGMENT\": 64,\n \"64\": \"STABLE_FRAGMENT\",\n \"KEYED_FRAGMENT\": 128,\n \"128\": \"KEYED_FRAGMENT\",\n \"UNKEYED_FRAGMENT\": 256,\n \"256\": \"UNKEYED_FRAGMENT\",\n \"NEED_PATCH\": 512,\n \"512\": \"NEED_PATCH\",\n \"DYNAMIC_SLOTS\": 1024,\n \"1024\": \"DYNAMIC_SLOTS\",\n \"DEV_ROOT_FRAGMENT\": 2048,\n \"2048\": \"DEV_ROOT_FRAGMENT\",\n \"CACHED\": -1,\n \"-1\": \"CACHED\",\n \"BAIL\": -2,\n \"-2\": \"BAIL\"\n};\nconst PatchFlagNames = {\n [1]: `TEXT`,\n [2]: `CLASS`,\n [4]: `STYLE`,\n [8]: `PROPS`,\n [16]: `FULL_PROPS`,\n [32]: `NEED_HYDRATION`,\n [64]: `STABLE_FRAGMENT`,\n [128]: `KEYED_FRAGMENT`,\n [256]: `UNKEYED_FRAGMENT`,\n [512]: `NEED_PATCH`,\n [1024]: `DYNAMIC_SLOTS`,\n [2048]: `DEV_ROOT_FRAGMENT`,\n [-1]: `HOISTED`,\n [-2]: `BAIL`\n};\n\nconst ShapeFlags = {\n \"ELEMENT\": 1,\n \"1\": \"ELEMENT\",\n \"FUNCTIONAL_COMPONENT\": 2,\n \"2\": \"FUNCTIONAL_COMPONENT\",\n \"STATEFUL_COMPONENT\": 4,\n \"4\": \"STATEFUL_COMPONENT\",\n \"TEXT_CHILDREN\": 8,\n \"8\": \"TEXT_CHILDREN\",\n \"ARRAY_CHILDREN\": 16,\n \"16\": \"ARRAY_CHILDREN\",\n \"SLOTS_CHILDREN\": 32,\n \"32\": \"SLOTS_CHILDREN\",\n \"TELEPORT\": 64,\n \"64\": \"TELEPORT\",\n \"SUSPENSE\": 128,\n \"128\": \"SUSPENSE\",\n \"COMPONENT_SHOULD_KEEP_ALIVE\": 256,\n \"256\": \"COMPONENT_SHOULD_KEEP_ALIVE\",\n \"COMPONENT_KEPT_ALIVE\": 512,\n \"512\": \"COMPONENT_KEPT_ALIVE\",\n \"COMPONENT\": 6,\n \"6\": \"COMPONENT\"\n};\n\nconst SlotFlags = {\n \"STABLE\": 1,\n \"1\": \"STABLE\",\n \"DYNAMIC\": 2,\n \"2\": \"DYNAMIC\",\n \"FORWARDED\": 3,\n \"3\": \"FORWARDED\"\n};\nconst slotFlagsText = {\n [1]: \"STABLE\",\n [2]: \"DYNAMIC\",\n [3]: \"FORWARDED\"\n};\n\nconst GLOBALS_ALLOWED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol\";\nconst isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);\nconst isGloballyWhitelisted = isGloballyAllowed;\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n start = Math.max(0, Math.min(start, source.length));\n end = Math.max(0, Math.min(end, source.length));\n if (start > end) return \"\";\n let lines = source.split(/(\\r?\\n)/);\n const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n lines = lines.filter((_, idx) => idx % 2 === 0);\n let count = 0;\n const res = [];\n for (let i = 0; i < lines.length; i++) {\n count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n if (count >= start) {\n for (let j = i - range; j <= i + range || end > count; j++) {\n if (j < 0 || j >= lines.length) continue;\n const line = j + 1;\n res.push(\n `${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`\n );\n const lineLength = lines[j].length;\n const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n if (j === i) {\n const pad = start - (count - (lineLength + newLineSeqLength));\n const length = Math.max(\n 1,\n end > count ? lineLength - pad : end - start\n );\n res.push(` | ` + \" \".repeat(pad) + \"^\".repeat(length));\n } else if (j > i) {\n if (end > count) {\n const length = Math.max(Math.min(end - count, lineLength), 1);\n res.push(` | ` + \"^\".repeat(length));\n }\n count += lineLength + newLineSeqLength;\n }\n }\n break;\n }\n }\n return res.join(\"\\n\");\n}\n\nfunction normalizeStyle(value) {\n if (isArray(value)) {\n const res = {};\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);\n if (normalized) {\n for (const key in normalized) {\n res[key] = normalized[key];\n }\n }\n }\n return res;\n } else if (isString(value) || isObject(value)) {\n return value;\n }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*[^]*?\\*\\//g;\nfunction parseStringStyle(cssText) {\n const ret = {};\n cssText.replace(styleCommentRE, \"\").split(listDelimiterRE).forEach((item) => {\n if (item) {\n const tmp = item.split(propertyDelimiterRE);\n tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n }\n });\n return ret;\n}\nfunction stringifyStyle(styles) {\n if (!styles) return \"\";\n if (isString(styles)) return styles;\n let ret = \"\";\n for (const key in styles) {\n const value = styles[key];\n if (isString(value) || typeof value === \"number\") {\n const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n ret += `${normalizedKey}:${value};`;\n }\n }\n return ret;\n}\nfunction normalizeClass(value) {\n let res = \"\";\n if (isString(value)) {\n res = value;\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const normalized = normalizeClass(value[i]);\n if (normalized) {\n res += normalized + \" \";\n }\n }\n } else if (isObject(value)) {\n for (const name in value) {\n if (value[name]) {\n res += name + \" \";\n }\n }\n }\n return res.trim();\n}\nfunction normalizeProps(props) {\n if (!props) return null;\n let { class: klass, style } = props;\n if (klass && !isString(klass)) {\n props.class = normalizeClass(klass);\n }\n if (style) {\n props.style = normalizeStyle(style);\n }\n return props;\n}\n\nconst HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\nconst SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\nconst MATH_TAGS = \"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\";\nconst VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\nconst isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\nconst isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\nconst isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS);\nconst isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\nconst isBooleanAttr = /* @__PURE__ */ makeMap(\n specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`\n);\nfunction includeBooleanAttr(value) {\n return !!value || value === \"\";\n}\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\nconst attrValidationCache = {};\nfunction isSSRSafeAttrName(name) {\n if (attrValidationCache.hasOwnProperty(name)) {\n return attrValidationCache[name];\n }\n const isUnsafe = unsafeAttrCharRE.test(name);\n if (isUnsafe) {\n console.error(`unsafe attribute name: ${name}`);\n }\n return attrValidationCache[name] = !isUnsafe;\n}\nconst propsToAttrMap = {\n acceptCharset: \"accept-charset\",\n className: \"class\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\"\n};\nconst isKnownHtmlAttr = /* @__PURE__ */ makeMap(\n `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`\n);\nconst isKnownSvgAttr = /* @__PURE__ */ makeMap(\n `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`\n);\nconst isKnownMathMLAttr = /* @__PURE__ */ makeMap(\n `accent,accentunder,actiontype,align,alignmentscope,altimg,altimg-height,altimg-valign,altimg-width,alttext,bevelled,close,columnsalign,columnlines,columnspan,denomalign,depth,dir,display,displaystyle,encoding,equalcolumns,equalrows,fence,fontstyle,fontweight,form,frame,framespacing,groupalign,height,href,id,indentalign,indentalignfirst,indentalignlast,indentshift,indentshiftfirst,indentshiftlast,indextype,justify,largetop,largeop,lquote,lspace,mathbackground,mathcolor,mathsize,mathvariant,maxsize,minlabelspacing,mode,other,overflow,position,rowalign,rowlines,rowspan,rquote,rspace,scriptlevel,scriptminsize,scriptsizemultiplier,selection,separator,separators,shift,side,src,stackalign,stretchy,subscriptshift,superscriptshift,symmetric,voffset,width,widths,xlink:href,xlink:show,xlink:type,xmlns`\n);\nfunction isRenderableAttrValue(value) {\n if (value == null) {\n return false;\n }\n const type = typeof value;\n return type === \"string\" || type === \"number\" || type === \"boolean\";\n}\n\nconst escapeRE = /[\"'&<>]/;\nfunction escapeHtml(string) {\n const str = \"\" + string;\n const match = escapeRE.exec(str);\n if (!match) {\n return str;\n }\n let html = \"\";\n let escaped;\n let index;\n let lastIndex = 0;\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escaped = \""\";\n break;\n case 38:\n escaped = \"&\";\n break;\n case 39:\n escaped = \"'\";\n break;\n case 60:\n escaped = \"<\";\n break;\n case 62:\n escaped = \">\";\n break;\n default:\n continue;\n }\n if (lastIndex !== index) {\n html += str.slice(lastIndex, index);\n }\n lastIndex = index + 1;\n html += escaped;\n }\n return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\n}\nconst commentStripRE = /^-?>||--!>|?@[\\\\\\]^`{|}~]/g;\nfunction getEscapedCssVarName(key, doubleEscape) {\n return key.replace(\n cssVarNameEscapeSymbolsRE,\n (s) => doubleEscape ? s === '\"' ? '\\\\\\\\\\\\\"' : `\\\\\\\\${s}` : `\\\\${s}`\n );\n}\n\nfunction looseCompareArrays(a, b) {\n if (a.length !== b.length) return false;\n let equal = true;\n for (let i = 0; equal && i < a.length; i++) {\n equal = looseEqual(a[i], b[i]);\n }\n return equal;\n}\nfunction looseEqual(a, b) {\n if (a === b) return true;\n let aValidType = isDate(a);\n let bValidType = isDate(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? a.getTime() === b.getTime() : false;\n }\n aValidType = isSymbol(a);\n bValidType = isSymbol(b);\n if (aValidType || bValidType) {\n return a === b;\n }\n aValidType = isArray(a);\n bValidType = isArray(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? looseCompareArrays(a, b) : false;\n }\n aValidType = isObject(a);\n bValidType = isObject(b);\n if (aValidType || bValidType) {\n if (!aValidType || !bValidType) {\n return false;\n }\n const aKeysCount = Object.keys(a).length;\n const bKeysCount = Object.keys(b).length;\n if (aKeysCount !== bKeysCount) {\n return false;\n }\n for (const key in a) {\n const aHasKey = a.hasOwnProperty(key);\n const bHasKey = b.hasOwnProperty(key);\n if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {\n return false;\n }\n }\n }\n return String(a) === String(b);\n}\nfunction looseIndexOf(arr, val) {\n return arr.findIndex((item) => looseEqual(item, val));\n}\n\nconst isRef = (val) => {\n return !!(val && val[\"__v_isRef\"] === true);\n};\nconst toDisplayString = (val) => {\n return isString(val) ? val : val == null ? \"\" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val);\n};\nconst replacer = (_key, val) => {\n if (isRef(val)) {\n return replacer(_key, val.value);\n } else if (isMap(val)) {\n return {\n [`Map(${val.size})`]: [...val.entries()].reduce(\n (entries, [key, val2], i) => {\n entries[stringifySymbol(key, i) + \" =>\"] = val2;\n return entries;\n },\n {}\n )\n };\n } else if (isSet(val)) {\n return {\n [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))\n };\n } else if (isSymbol(val)) {\n return stringifySymbol(val);\n } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n return String(val);\n }\n return val;\n};\nconst stringifySymbol = (v, i = \"\") => {\n var _a;\n return (\n // Symbol.description in es2019+ so we need to cast here to pass\n // the lib: es2016 check\n isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v\n );\n};\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, PatchFlags, ShapeFlags, SlotFlags, camelize, capitalize, cssVarNameEscapeSymbolsRE, def, escapeHtml, escapeHtmlComment, extend, genCacheKey, genPropsAccessExp, generateCodeFrame, getEscapedCssVarName, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isBuiltInDirective, isDate, isFunction, isGloballyAllowed, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownMathMLAttr, isKnownSvgAttr, isMap, isMathMLTag, isModelListener, isObject, isOn, isPlainObject, isPromise, isRegExp, isRenderableAttrValue, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, looseToNumber, makeMap, normalizeClass, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n","/**\n* @vue/reactivity v3.5.16\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { extend, hasChanged, isArray, isIntegerKey, isSymbol, isMap, hasOwn, makeMap, isObject, capitalize, toRawType, def, isFunction, EMPTY_OBJ, isSet, isPlainObject, remove, NOOP } from '@vue/shared';\n\nfunction warn(msg, ...args) {\n console.warn(`[Vue warn] ${msg}`, ...args);\n}\n\nlet activeEffectScope;\nclass EffectScope {\n constructor(detached = false) {\n this.detached = detached;\n /**\n * @internal\n */\n this._active = true;\n /**\n * @internal track `on` calls, allow `on` call multiple times\n */\n this._on = 0;\n /**\n * @internal\n */\n this.effects = [];\n /**\n * @internal\n */\n this.cleanups = [];\n this._isPaused = false;\n this.parent = activeEffectScope;\n if (!detached && activeEffectScope) {\n this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(\n this\n ) - 1;\n }\n }\n get active() {\n return this._active;\n }\n pause() {\n if (this._active) {\n this._isPaused = true;\n let i, l;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].pause();\n }\n }\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].pause();\n }\n }\n }\n /**\n * Resumes the effect scope, including all child scopes and effects.\n */\n resume() {\n if (this._active) {\n if (this._isPaused) {\n this._isPaused = false;\n let i, l;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].resume();\n }\n }\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].resume();\n }\n }\n }\n }\n run(fn) {\n if (this._active) {\n const currentEffectScope = activeEffectScope;\n try {\n activeEffectScope = this;\n return fn();\n } finally {\n activeEffectScope = currentEffectScope;\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(`cannot run an inactive effect scope.`);\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n on() {\n if (++this._on === 1) {\n this.prevScope = activeEffectScope;\n activeEffectScope = this;\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n off() {\n if (this._on > 0 && --this._on === 0) {\n activeEffectScope = this.prevScope;\n this.prevScope = void 0;\n }\n }\n stop(fromParent) {\n if (this._active) {\n this._active = false;\n let i, l;\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].stop();\n }\n this.effects.length = 0;\n for (i = 0, l = this.cleanups.length; i < l; i++) {\n this.cleanups[i]();\n }\n this.cleanups.length = 0;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].stop(true);\n }\n this.scopes.length = 0;\n }\n if (!this.detached && this.parent && !fromParent) {\n const last = this.parent.scopes.pop();\n if (last && last !== this) {\n this.parent.scopes[this.index] = last;\n last.index = this.index;\n }\n }\n this.parent = void 0;\n }\n }\n}\nfunction effectScope(detached) {\n return new EffectScope(detached);\n}\nfunction getCurrentScope() {\n return activeEffectScope;\n}\nfunction onScopeDispose(fn, failSilently = false) {\n if (activeEffectScope) {\n activeEffectScope.cleanups.push(fn);\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onScopeDispose() is called when there is no active effect scope to be associated with.`\n );\n }\n}\n\nlet activeSub;\nconst EffectFlags = {\n \"ACTIVE\": 1,\n \"1\": \"ACTIVE\",\n \"RUNNING\": 2,\n \"2\": \"RUNNING\",\n \"TRACKING\": 4,\n \"4\": \"TRACKING\",\n \"NOTIFIED\": 8,\n \"8\": \"NOTIFIED\",\n \"DIRTY\": 16,\n \"16\": \"DIRTY\",\n \"ALLOW_RECURSE\": 32,\n \"32\": \"ALLOW_RECURSE\",\n \"PAUSED\": 64,\n \"64\": \"PAUSED\",\n \"EVALUATED\": 128,\n \"128\": \"EVALUATED\"\n};\nconst pausedQueueEffects = /* @__PURE__ */ new WeakSet();\nclass ReactiveEffect {\n constructor(fn) {\n this.fn = fn;\n /**\n * @internal\n */\n this.deps = void 0;\n /**\n * @internal\n */\n this.depsTail = void 0;\n /**\n * @internal\n */\n this.flags = 1 | 4;\n /**\n * @internal\n */\n this.next = void 0;\n /**\n * @internal\n */\n this.cleanup = void 0;\n this.scheduler = void 0;\n if (activeEffectScope && activeEffectScope.active) {\n activeEffectScope.effects.push(this);\n }\n }\n pause() {\n this.flags |= 64;\n }\n resume() {\n if (this.flags & 64) {\n this.flags &= -65;\n if (pausedQueueEffects.has(this)) {\n pausedQueueEffects.delete(this);\n this.trigger();\n }\n }\n }\n /**\n * @internal\n */\n notify() {\n if (this.flags & 2 && !(this.flags & 32)) {\n return;\n }\n if (!(this.flags & 8)) {\n batch(this);\n }\n }\n run() {\n if (!(this.flags & 1)) {\n return this.fn();\n }\n this.flags |= 2;\n cleanupEffect(this);\n prepareDeps(this);\n const prevEffect = activeSub;\n const prevShouldTrack = shouldTrack;\n activeSub = this;\n shouldTrack = true;\n try {\n return this.fn();\n } finally {\n if (!!(process.env.NODE_ENV !== \"production\") && activeSub !== this) {\n warn(\n \"Active effect was not restored correctly - this is likely a Vue internal bug.\"\n );\n }\n cleanupDeps(this);\n activeSub = prevEffect;\n shouldTrack = prevShouldTrack;\n this.flags &= -3;\n }\n }\n stop() {\n if (this.flags & 1) {\n for (let link = this.deps; link; link = link.nextDep) {\n removeSub(link);\n }\n this.deps = this.depsTail = void 0;\n cleanupEffect(this);\n this.onStop && this.onStop();\n this.flags &= -2;\n }\n }\n trigger() {\n if (this.flags & 64) {\n pausedQueueEffects.add(this);\n } else if (this.scheduler) {\n this.scheduler();\n } else {\n this.runIfDirty();\n }\n }\n /**\n * @internal\n */\n runIfDirty() {\n if (isDirty(this)) {\n this.run();\n }\n }\n get dirty() {\n return isDirty(this);\n }\n}\nlet batchDepth = 0;\nlet batchedSub;\nlet batchedComputed;\nfunction batch(sub, isComputed = false) {\n sub.flags |= 8;\n if (isComputed) {\n sub.next = batchedComputed;\n batchedComputed = sub;\n return;\n }\n sub.next = batchedSub;\n batchedSub = sub;\n}\nfunction startBatch() {\n batchDepth++;\n}\nfunction endBatch() {\n if (--batchDepth > 0) {\n return;\n }\n if (batchedComputed) {\n let e = batchedComputed;\n batchedComputed = void 0;\n while (e) {\n const next = e.next;\n e.next = void 0;\n e.flags &= -9;\n e = next;\n }\n }\n let error;\n while (batchedSub) {\n let e = batchedSub;\n batchedSub = void 0;\n while (e) {\n const next = e.next;\n e.next = void 0;\n e.flags &= -9;\n if (e.flags & 1) {\n try {\n ;\n e.trigger();\n } catch (err) {\n if (!error) error = err;\n }\n }\n e = next;\n }\n }\n if (error) throw error;\n}\nfunction prepareDeps(sub) {\n for (let link = sub.deps; link; link = link.nextDep) {\n link.version = -1;\n link.prevActiveLink = link.dep.activeLink;\n link.dep.activeLink = link;\n }\n}\nfunction cleanupDeps(sub) {\n let head;\n let tail = sub.depsTail;\n let link = tail;\n while (link) {\n const prev = link.prevDep;\n if (link.version === -1) {\n if (link === tail) tail = prev;\n removeSub(link);\n removeDep(link);\n } else {\n head = link;\n }\n link.dep.activeLink = link.prevActiveLink;\n link.prevActiveLink = void 0;\n link = prev;\n }\n sub.deps = head;\n sub.depsTail = tail;\n}\nfunction isDirty(sub) {\n for (let link = sub.deps; link; link = link.nextDep) {\n if (link.dep.version !== link.version || link.dep.computed && (refreshComputed(link.dep.computed) || link.dep.version !== link.version)) {\n return true;\n }\n }\n if (sub._dirty) {\n return true;\n }\n return false;\n}\nfunction refreshComputed(computed) {\n if (computed.flags & 4 && !(computed.flags & 16)) {\n return;\n }\n computed.flags &= -17;\n if (computed.globalVersion === globalVersion) {\n return;\n }\n computed.globalVersion = globalVersion;\n if (!computed.isSSR && computed.flags & 128 && (!computed.deps && !computed._dirty || !isDirty(computed))) {\n return;\n }\n computed.flags |= 2;\n const dep = computed.dep;\n const prevSub = activeSub;\n const prevShouldTrack = shouldTrack;\n activeSub = computed;\n shouldTrack = true;\n try {\n prepareDeps(computed);\n const value = computed.fn(computed._value);\n if (dep.version === 0 || hasChanged(value, computed._value)) {\n computed.flags |= 128;\n computed._value = value;\n dep.version++;\n }\n } catch (err) {\n dep.version++;\n throw err;\n } finally {\n activeSub = prevSub;\n shouldTrack = prevShouldTrack;\n cleanupDeps(computed);\n computed.flags &= -3;\n }\n}\nfunction removeSub(link, soft = false) {\n const { dep, prevSub, nextSub } = link;\n if (prevSub) {\n prevSub.nextSub = nextSub;\n link.prevSub = void 0;\n }\n if (nextSub) {\n nextSub.prevSub = prevSub;\n link.nextSub = void 0;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && dep.subsHead === link) {\n dep.subsHead = nextSub;\n }\n if (dep.subs === link) {\n dep.subs = prevSub;\n if (!prevSub && dep.computed) {\n dep.computed.flags &= -5;\n for (let l = dep.computed.deps; l; l = l.nextDep) {\n removeSub(l, true);\n }\n }\n }\n if (!soft && !--dep.sc && dep.map) {\n dep.map.delete(dep.key);\n }\n}\nfunction removeDep(link) {\n const { prevDep, nextDep } = link;\n if (prevDep) {\n prevDep.nextDep = nextDep;\n link.prevDep = void 0;\n }\n if (nextDep) {\n nextDep.prevDep = prevDep;\n link.nextDep = void 0;\n }\n}\nfunction effect(fn, options) {\n if (fn.effect instanceof ReactiveEffect) {\n fn = fn.effect.fn;\n }\n const e = new ReactiveEffect(fn);\n if (options) {\n extend(e, options);\n }\n try {\n e.run();\n } catch (err) {\n e.stop();\n throw err;\n }\n const runner = e.run.bind(e);\n runner.effect = e;\n return runner;\n}\nfunction stop(runner) {\n runner.effect.stop();\n}\nlet shouldTrack = true;\nconst trackStack = [];\nfunction pauseTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = false;\n}\nfunction enableTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = true;\n}\nfunction resetTracking() {\n const last = trackStack.pop();\n shouldTrack = last === void 0 ? true : last;\n}\nfunction onEffectCleanup(fn, failSilently = false) {\n if (activeSub instanceof ReactiveEffect) {\n activeSub.cleanup = fn;\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onEffectCleanup() was called when there was no active effect to associate with.`\n );\n }\n}\nfunction cleanupEffect(e) {\n const { cleanup } = e;\n e.cleanup = void 0;\n if (cleanup) {\n const prevSub = activeSub;\n activeSub = void 0;\n try {\n cleanup();\n } finally {\n activeSub = prevSub;\n }\n }\n}\n\nlet globalVersion = 0;\nclass Link {\n constructor(sub, dep) {\n this.sub = sub;\n this.dep = dep;\n this.version = dep.version;\n this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0;\n }\n}\nclass Dep {\n constructor(computed) {\n this.computed = computed;\n this.version = 0;\n /**\n * Link between this dep and the current active effect\n */\n this.activeLink = void 0;\n /**\n * Doubly linked list representing the subscribing effects (tail)\n */\n this.subs = void 0;\n /**\n * For object property deps cleanup\n */\n this.map = void 0;\n this.key = void 0;\n /**\n * Subscriber counter\n */\n this.sc = 0;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.subsHead = void 0;\n }\n }\n track(debugInfo) {\n if (!activeSub || !shouldTrack || activeSub === this.computed) {\n return;\n }\n let link = this.activeLink;\n if (link === void 0 || link.sub !== activeSub) {\n link = this.activeLink = new Link(activeSub, this);\n if (!activeSub.deps) {\n activeSub.deps = activeSub.depsTail = link;\n } else {\n link.prevDep = activeSub.depsTail;\n activeSub.depsTail.nextDep = link;\n activeSub.depsTail = link;\n }\n addSub(link);\n } else if (link.version === -1) {\n link.version = this.version;\n if (link.nextDep) {\n const next = link.nextDep;\n next.prevDep = link.prevDep;\n if (link.prevDep) {\n link.prevDep.nextDep = next;\n }\n link.prevDep = activeSub.depsTail;\n link.nextDep = void 0;\n activeSub.depsTail.nextDep = link;\n activeSub.depsTail = link;\n if (activeSub.deps === link) {\n activeSub.deps = next;\n }\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") && activeSub.onTrack) {\n activeSub.onTrack(\n extend(\n {\n effect: activeSub\n },\n debugInfo\n )\n );\n }\n return link;\n }\n trigger(debugInfo) {\n this.version++;\n globalVersion++;\n this.notify(debugInfo);\n }\n notify(debugInfo) {\n startBatch();\n try {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n for (let head = this.subsHead; head; head = head.nextSub) {\n if (head.sub.onTrigger && !(head.sub.flags & 8)) {\n head.sub.onTrigger(\n extend(\n {\n effect: head.sub\n },\n debugInfo\n )\n );\n }\n }\n }\n for (let link = this.subs; link; link = link.prevSub) {\n if (link.sub.notify()) {\n ;\n link.sub.dep.notify();\n }\n }\n } finally {\n endBatch();\n }\n }\n}\nfunction addSub(link) {\n link.dep.sc++;\n if (link.sub.flags & 4) {\n const computed = link.dep.computed;\n if (computed && !link.dep.subs) {\n computed.flags |= 4 | 16;\n for (let l = computed.deps; l; l = l.nextDep) {\n addSub(l);\n }\n }\n const currentTail = link.dep.subs;\n if (currentTail !== link) {\n link.prevSub = currentTail;\n if (currentTail) currentTail.nextSub = link;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && link.dep.subsHead === void 0) {\n link.dep.subsHead = link;\n }\n link.dep.subs = link;\n }\n}\nconst targetMap = /* @__PURE__ */ new WeakMap();\nconst ITERATE_KEY = Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Object iterate\" : \"\"\n);\nconst MAP_KEY_ITERATE_KEY = Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Map keys iterate\" : \"\"\n);\nconst ARRAY_ITERATE_KEY = Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Array iterate\" : \"\"\n);\nfunction track(target, type, key) {\n if (shouldTrack && activeSub) {\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n }\n let dep = depsMap.get(key);\n if (!dep) {\n depsMap.set(key, dep = new Dep());\n dep.map = depsMap;\n dep.key = key;\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n dep.track({\n target,\n type,\n key\n });\n } else {\n dep.track();\n }\n }\n}\nfunction trigger(target, type, key, newValue, oldValue, oldTarget) {\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n globalVersion++;\n return;\n }\n const run = (dep) => {\n if (dep) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n dep.trigger({\n target,\n type,\n key,\n newValue,\n oldValue,\n oldTarget\n });\n } else {\n dep.trigger();\n }\n }\n };\n startBatch();\n if (type === \"clear\") {\n depsMap.forEach(run);\n } else {\n const targetIsArray = isArray(target);\n const isArrayIndex = targetIsArray && isIntegerKey(key);\n if (targetIsArray && key === \"length\") {\n const newLength = Number(newValue);\n depsMap.forEach((dep, key2) => {\n if (key2 === \"length\" || key2 === ARRAY_ITERATE_KEY || !isSymbol(key2) && key2 >= newLength) {\n run(dep);\n }\n });\n } else {\n if (key !== void 0 || depsMap.has(void 0)) {\n run(depsMap.get(key));\n }\n if (isArrayIndex) {\n run(depsMap.get(ARRAY_ITERATE_KEY));\n }\n switch (type) {\n case \"add\":\n if (!targetIsArray) {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n } else if (isArrayIndex) {\n run(depsMap.get(\"length\"));\n }\n break;\n case \"delete\":\n if (!targetIsArray) {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n }\n break;\n case \"set\":\n if (isMap(target)) {\n run(depsMap.get(ITERATE_KEY));\n }\n break;\n }\n }\n }\n endBatch();\n}\nfunction getDepFromReactive(object, key) {\n const depMap = targetMap.get(object);\n return depMap && depMap.get(key);\n}\n\nfunction reactiveReadArray(array) {\n const raw = toRaw(array);\n if (raw === array) return raw;\n track(raw, \"iterate\", ARRAY_ITERATE_KEY);\n return isShallow(array) ? raw : raw.map(toReactive);\n}\nfunction shallowReadArray(arr) {\n track(arr = toRaw(arr), \"iterate\", ARRAY_ITERATE_KEY);\n return arr;\n}\nconst arrayInstrumentations = {\n __proto__: null,\n [Symbol.iterator]() {\n return iterator(this, Symbol.iterator, toReactive);\n },\n concat(...args) {\n return reactiveReadArray(this).concat(\n ...args.map((x) => isArray(x) ? reactiveReadArray(x) : x)\n );\n },\n entries() {\n return iterator(this, \"entries\", (value) => {\n value[1] = toReactive(value[1]);\n return value;\n });\n },\n every(fn, thisArg) {\n return apply(this, \"every\", fn, thisArg, void 0, arguments);\n },\n filter(fn, thisArg) {\n return apply(this, \"filter\", fn, thisArg, (v) => v.map(toReactive), arguments);\n },\n find(fn, thisArg) {\n return apply(this, \"find\", fn, thisArg, toReactive, arguments);\n },\n findIndex(fn, thisArg) {\n return apply(this, \"findIndex\", fn, thisArg, void 0, arguments);\n },\n findLast(fn, thisArg) {\n return apply(this, \"findLast\", fn, thisArg, toReactive, arguments);\n },\n findLastIndex(fn, thisArg) {\n return apply(this, \"findLastIndex\", fn, thisArg, void 0, arguments);\n },\n // flat, flatMap could benefit from ARRAY_ITERATE but are not straight-forward to implement\n forEach(fn, thisArg) {\n return apply(this, \"forEach\", fn, thisArg, void 0, arguments);\n },\n includes(...args) {\n return searchProxy(this, \"includes\", args);\n },\n indexOf(...args) {\n return searchProxy(this, \"indexOf\", args);\n },\n join(separator) {\n return reactiveReadArray(this).join(separator);\n },\n // keys() iterator only reads `length`, no optimisation required\n lastIndexOf(...args) {\n return searchProxy(this, \"lastIndexOf\", args);\n },\n map(fn, thisArg) {\n return apply(this, \"map\", fn, thisArg, void 0, arguments);\n },\n pop() {\n return noTracking(this, \"pop\");\n },\n push(...args) {\n return noTracking(this, \"push\", args);\n },\n reduce(fn, ...args) {\n return reduce(this, \"reduce\", fn, args);\n },\n reduceRight(fn, ...args) {\n return reduce(this, \"reduceRight\", fn, args);\n },\n shift() {\n return noTracking(this, \"shift\");\n },\n // slice could use ARRAY_ITERATE but also seems to beg for range tracking\n some(fn, thisArg) {\n return apply(this, \"some\", fn, thisArg, void 0, arguments);\n },\n splice(...args) {\n return noTracking(this, \"splice\", args);\n },\n toReversed() {\n return reactiveReadArray(this).toReversed();\n },\n toSorted(comparer) {\n return reactiveReadArray(this).toSorted(comparer);\n },\n toSpliced(...args) {\n return reactiveReadArray(this).toSpliced(...args);\n },\n unshift(...args) {\n return noTracking(this, \"unshift\", args);\n },\n values() {\n return iterator(this, \"values\", toReactive);\n }\n};\nfunction iterator(self, method, wrapValue) {\n const arr = shallowReadArray(self);\n const iter = arr[method]();\n if (arr !== self && !isShallow(self)) {\n iter._next = iter.next;\n iter.next = () => {\n const result = iter._next();\n if (result.value) {\n result.value = wrapValue(result.value);\n }\n return result;\n };\n }\n return iter;\n}\nconst arrayProto = Array.prototype;\nfunction apply(self, method, fn, thisArg, wrappedRetFn, args) {\n const arr = shallowReadArray(self);\n const needsWrap = arr !== self && !isShallow(self);\n const methodFn = arr[method];\n if (methodFn !== arrayProto[method]) {\n const result2 = methodFn.apply(self, args);\n return needsWrap ? toReactive(result2) : result2;\n }\n let wrappedFn = fn;\n if (arr !== self) {\n if (needsWrap) {\n wrappedFn = function(item, index) {\n return fn.call(this, toReactive(item), index, self);\n };\n } else if (fn.length > 2) {\n wrappedFn = function(item, index) {\n return fn.call(this, item, index, self);\n };\n }\n }\n const result = methodFn.call(arr, wrappedFn, thisArg);\n return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result;\n}\nfunction reduce(self, method, fn, args) {\n const arr = shallowReadArray(self);\n let wrappedFn = fn;\n if (arr !== self) {\n if (!isShallow(self)) {\n wrappedFn = function(acc, item, index) {\n return fn.call(this, acc, toReactive(item), index, self);\n };\n } else if (fn.length > 3) {\n wrappedFn = function(acc, item, index) {\n return fn.call(this, acc, item, index, self);\n };\n }\n }\n return arr[method](wrappedFn, ...args);\n}\nfunction searchProxy(self, method, args) {\n const arr = toRaw(self);\n track(arr, \"iterate\", ARRAY_ITERATE_KEY);\n const res = arr[method](...args);\n if ((res === -1 || res === false) && isProxy(args[0])) {\n args[0] = toRaw(args[0]);\n return arr[method](...args);\n }\n return res;\n}\nfunction noTracking(self, method, args = []) {\n pauseTracking();\n startBatch();\n const res = toRaw(self)[method].apply(self, args);\n endBatch();\n resetTracking();\n return res;\n}\n\nconst isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\nconst builtInSymbols = new Set(\n /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== \"arguments\" && key !== \"caller\").map((key) => Symbol[key]).filter(isSymbol)\n);\nfunction hasOwnProperty(key) {\n if (!isSymbol(key)) key = String(key);\n const obj = toRaw(this);\n track(obj, \"has\", key);\n return obj.hasOwnProperty(key);\n}\nclass BaseReactiveHandler {\n constructor(_isReadonly = false, _isShallow = false) {\n this._isReadonly = _isReadonly;\n this._isShallow = _isShallow;\n }\n get(target, key, receiver) {\n if (key === \"__v_skip\") return target[\"__v_skip\"];\n const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_isShallow\") {\n return isShallow2;\n } else if (key === \"__v_raw\") {\n if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype\n // this means the receiver is a user proxy of the reactive proxy\n Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) {\n return target;\n }\n return;\n }\n const targetIsArray = isArray(target);\n if (!isReadonly2) {\n let fn;\n if (targetIsArray && (fn = arrayInstrumentations[key])) {\n return fn;\n }\n if (key === \"hasOwnProperty\") {\n return hasOwnProperty;\n }\n }\n const res = Reflect.get(\n target,\n key,\n // if this is a proxy wrapping a ref, return methods using the raw ref\n // as receiver so that we don't have to call `toRaw` on the ref in all\n // its class methods\n isRef(target) ? target : receiver\n );\n if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n return res;\n }\n if (!isReadonly2) {\n track(target, \"get\", key);\n }\n if (isShallow2) {\n return res;\n }\n if (isRef(res)) {\n return targetIsArray && isIntegerKey(key) ? res : res.value;\n }\n if (isObject(res)) {\n return isReadonly2 ? readonly(res) : reactive(res);\n }\n return res;\n }\n}\nclass MutableReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(false, isShallow2);\n }\n set(target, key, value, receiver) {\n let oldValue = target[key];\n if (!this._isShallow) {\n const isOldValueReadonly = isReadonly(oldValue);\n if (!isShallow(value) && !isReadonly(value)) {\n oldValue = toRaw(oldValue);\n value = toRaw(value);\n }\n if (!isArray(target) && isRef(oldValue) && !isRef(value)) {\n if (isOldValueReadonly) {\n return false;\n } else {\n oldValue.value = value;\n return true;\n }\n }\n }\n const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);\n const result = Reflect.set(\n target,\n key,\n value,\n isRef(target) ? target : receiver\n );\n if (target === toRaw(receiver)) {\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n }\n return result;\n }\n deleteProperty(target, key) {\n const hadKey = hasOwn(target, key);\n const oldValue = target[key];\n const result = Reflect.deleteProperty(target, key);\n if (result && hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n }\n has(target, key) {\n const result = Reflect.has(target, key);\n if (!isSymbol(key) || !builtInSymbols.has(key)) {\n track(target, \"has\", key);\n }\n return result;\n }\n ownKeys(target) {\n track(\n target,\n \"iterate\",\n isArray(target) ? \"length\" : ITERATE_KEY\n );\n return Reflect.ownKeys(target);\n }\n}\nclass ReadonlyReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(true, isShallow2);\n }\n set(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n deleteProperty(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Delete operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n}\nconst mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();\nconst readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();\nconst shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(true);\nconst shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);\n\nconst toShallow = (value) => value;\nconst getProto = (v) => Reflect.getPrototypeOf(v);\nfunction createIterableMethod(method, isReadonly2, isShallow2) {\n return function(...args) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const targetIsMap = isMap(rawTarget);\n const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n const isKeyOnly = method === \"keys\" && targetIsMap;\n const innerIterator = target[method](...args);\n const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;\n !isReadonly2 && track(\n rawTarget,\n \"iterate\",\n isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY\n );\n return {\n // iterator protocol\n next() {\n const { value, done } = innerIterator.next();\n return done ? { value, done } : {\n value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n done\n };\n },\n // iterable protocol\n [Symbol.iterator]() {\n return this;\n }\n };\n };\n}\nfunction createReadonlyMethod(type) {\n return function(...args) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n warn(\n `${capitalize(type)} operation ${key}failed: target is readonly.`,\n toRaw(this)\n );\n }\n return type === \"delete\" ? false : type === \"clear\" ? void 0 : this;\n };\n}\nfunction createInstrumentations(readonly, shallow) {\n const instrumentations = {\n get(key) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!readonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"get\", key);\n }\n track(rawTarget, \"get\", rawKey);\n }\n const { has } = getProto(rawTarget);\n const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n if (has.call(rawTarget, key)) {\n return wrap(target.get(key));\n } else if (has.call(rawTarget, rawKey)) {\n return wrap(target.get(rawKey));\n } else if (target !== rawTarget) {\n target.get(key);\n }\n },\n get size() {\n const target = this[\"__v_raw\"];\n !readonly && track(toRaw(target), \"iterate\", ITERATE_KEY);\n return Reflect.get(target, \"size\", target);\n },\n has(key) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!readonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"has\", key);\n }\n track(rawTarget, \"has\", rawKey);\n }\n return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n },\n forEach(callback, thisArg) {\n const observed = this;\n const target = observed[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n !readonly && track(rawTarget, \"iterate\", ITERATE_KEY);\n return target.forEach((value, key) => {\n return callback.call(thisArg, wrap(value), wrap(key), observed);\n });\n }\n };\n extend(\n instrumentations,\n readonly ? {\n add: createReadonlyMethod(\"add\"),\n set: createReadonlyMethod(\"set\"),\n delete: createReadonlyMethod(\"delete\"),\n clear: createReadonlyMethod(\"clear\")\n } : {\n add(value) {\n if (!shallow && !isShallow(value) && !isReadonly(value)) {\n value = toRaw(value);\n }\n const target = toRaw(this);\n const proto = getProto(target);\n const hadKey = proto.has.call(target, value);\n if (!hadKey) {\n target.add(value);\n trigger(target, \"add\", value, value);\n }\n return this;\n },\n set(key, value) {\n if (!shallow && !isShallow(value) && !isReadonly(value)) {\n value = toRaw(value);\n }\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has, key);\n }\n const oldValue = get.call(target, key);\n target.set(key, value);\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n return this;\n },\n delete(key) {\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has, key);\n }\n const oldValue = get ? get.call(target, key) : void 0;\n const result = target.delete(key);\n if (hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n },\n clear() {\n const target = toRaw(this);\n const hadItems = target.size !== 0;\n const oldTarget = !!(process.env.NODE_ENV !== \"production\") ? isMap(target) ? new Map(target) : new Set(target) : void 0;\n const result = target.clear();\n if (hadItems) {\n trigger(\n target,\n \"clear\",\n void 0,\n void 0,\n oldTarget\n );\n }\n return result;\n }\n }\n );\n const iteratorMethods = [\n \"keys\",\n \"values\",\n \"entries\",\n Symbol.iterator\n ];\n iteratorMethods.forEach((method) => {\n instrumentations[method] = createIterableMethod(method, readonly, shallow);\n });\n return instrumentations;\n}\nfunction createInstrumentationGetter(isReadonly2, shallow) {\n const instrumentations = createInstrumentations(isReadonly2, shallow);\n return (target, key, receiver) => {\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_raw\") {\n return target;\n }\n return Reflect.get(\n hasOwn(instrumentations, key) && key in target ? instrumentations : target,\n key,\n receiver\n );\n };\n}\nconst mutableCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n};\nconst shallowCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, true)\n};\nconst readonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n};\nconst shallowReadonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, true)\n};\nfunction checkIdentityKeys(target, has, key) {\n const rawKey = toRaw(key);\n if (rawKey !== key && has.call(target, rawKey)) {\n const type = toRawType(target);\n warn(\n `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`\n );\n }\n}\n\nconst reactiveMap = /* @__PURE__ */ new WeakMap();\nconst shallowReactiveMap = /* @__PURE__ */ new WeakMap();\nconst readonlyMap = /* @__PURE__ */ new WeakMap();\nconst shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\nfunction targetTypeMap(rawType) {\n switch (rawType) {\n case \"Object\":\n case \"Array\":\n return 1 /* COMMON */;\n case \"Map\":\n case \"Set\":\n case \"WeakMap\":\n case \"WeakSet\":\n return 2 /* COLLECTION */;\n default:\n return 0 /* INVALID */;\n }\n}\nfunction getTargetType(value) {\n return value[\"__v_skip\"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap(toRawType(value));\n}\nfunction reactive(target) {\n if (isReadonly(target)) {\n return target;\n }\n return createReactiveObject(\n target,\n false,\n mutableHandlers,\n mutableCollectionHandlers,\n reactiveMap\n );\n}\nfunction shallowReactive(target) {\n return createReactiveObject(\n target,\n false,\n shallowReactiveHandlers,\n shallowCollectionHandlers,\n shallowReactiveMap\n );\n}\nfunction readonly(target) {\n return createReactiveObject(\n target,\n true,\n readonlyHandlers,\n readonlyCollectionHandlers,\n readonlyMap\n );\n}\nfunction shallowReadonly(target) {\n return createReactiveObject(\n target,\n true,\n shallowReadonlyHandlers,\n shallowReadonlyCollectionHandlers,\n shallowReadonlyMap\n );\n}\nfunction createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {\n if (!isObject(target)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `value cannot be made ${isReadonly2 ? \"readonly\" : \"reactive\"}: ${String(\n target\n )}`\n );\n }\n return target;\n }\n if (target[\"__v_raw\"] && !(isReadonly2 && target[\"__v_isReactive\"])) {\n return target;\n }\n const targetType = getTargetType(target);\n if (targetType === 0 /* INVALID */) {\n return target;\n }\n const existingProxy = proxyMap.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n const proxy = new Proxy(\n target,\n targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers\n );\n proxyMap.set(target, proxy);\n return proxy;\n}\nfunction isReactive(value) {\n if (isReadonly(value)) {\n return isReactive(value[\"__v_raw\"]);\n }\n return !!(value && value[\"__v_isReactive\"]);\n}\nfunction isReadonly(value) {\n return !!(value && value[\"__v_isReadonly\"]);\n}\nfunction isShallow(value) {\n return !!(value && value[\"__v_isShallow\"]);\n}\nfunction isProxy(value) {\n return value ? !!value[\"__v_raw\"] : false;\n}\nfunction toRaw(observed) {\n const raw = observed && observed[\"__v_raw\"];\n return raw ? toRaw(raw) : observed;\n}\nfunction markRaw(value) {\n if (!hasOwn(value, \"__v_skip\") && Object.isExtensible(value)) {\n def(value, \"__v_skip\", true);\n }\n return value;\n}\nconst toReactive = (value) => isObject(value) ? reactive(value) : value;\nconst toReadonly = (value) => isObject(value) ? readonly(value) : value;\n\nfunction isRef(r) {\n return r ? r[\"__v_isRef\"] === true : false;\n}\nfunction ref(value) {\n return createRef(value, false);\n}\nfunction shallowRef(value) {\n return createRef(value, true);\n}\nfunction createRef(rawValue, shallow) {\n if (isRef(rawValue)) {\n return rawValue;\n }\n return new RefImpl(rawValue, shallow);\n}\nclass RefImpl {\n constructor(value, isShallow2) {\n this.dep = new Dep();\n this[\"__v_isRef\"] = true;\n this[\"__v_isShallow\"] = false;\n this._rawValue = isShallow2 ? value : toRaw(value);\n this._value = isShallow2 ? value : toReactive(value);\n this[\"__v_isShallow\"] = isShallow2;\n }\n get value() {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.dep.track({\n target: this,\n type: \"get\",\n key: \"value\"\n });\n } else {\n this.dep.track();\n }\n return this._value;\n }\n set value(newValue) {\n const oldValue = this._rawValue;\n const useDirectValue = this[\"__v_isShallow\"] || isShallow(newValue) || isReadonly(newValue);\n newValue = useDirectValue ? newValue : toRaw(newValue);\n if (hasChanged(newValue, oldValue)) {\n this._rawValue = newValue;\n this._value = useDirectValue ? newValue : toReactive(newValue);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.dep.trigger({\n target: this,\n type: \"set\",\n key: \"value\",\n newValue,\n oldValue\n });\n } else {\n this.dep.trigger();\n }\n }\n }\n}\nfunction triggerRef(ref2) {\n if (ref2.dep) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n ref2.dep.trigger({\n target: ref2,\n type: \"set\",\n key: \"value\",\n newValue: ref2._value\n });\n } else {\n ref2.dep.trigger();\n }\n }\n}\nfunction unref(ref2) {\n return isRef(ref2) ? ref2.value : ref2;\n}\nfunction toValue(source) {\n return isFunction(source) ? source() : unref(source);\n}\nconst shallowUnwrapHandlers = {\n get: (target, key, receiver) => key === \"__v_raw\" ? target : unref(Reflect.get(target, key, receiver)),\n set: (target, key, value, receiver) => {\n const oldValue = target[key];\n if (isRef(oldValue) && !isRef(value)) {\n oldValue.value = value;\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n }\n};\nfunction proxyRefs(objectWithRefs) {\n return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n}\nclass CustomRefImpl {\n constructor(factory) {\n this[\"__v_isRef\"] = true;\n this._value = void 0;\n const dep = this.dep = new Dep();\n const { get, set } = factory(dep.track.bind(dep), dep.trigger.bind(dep));\n this._get = get;\n this._set = set;\n }\n get value() {\n return this._value = this._get();\n }\n set value(newVal) {\n this._set(newVal);\n }\n}\nfunction customRef(factory) {\n return new CustomRefImpl(factory);\n}\nfunction toRefs(object) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isProxy(object)) {\n warn(`toRefs() expects a reactive object but received a plain one.`);\n }\n const ret = isArray(object) ? new Array(object.length) : {};\n for (const key in object) {\n ret[key] = propertyToRef(object, key);\n }\n return ret;\n}\nclass ObjectRefImpl {\n constructor(_object, _key, _defaultValue) {\n this._object = _object;\n this._key = _key;\n this._defaultValue = _defaultValue;\n this[\"__v_isRef\"] = true;\n this._value = void 0;\n }\n get value() {\n const val = this._object[this._key];\n return this._value = val === void 0 ? this._defaultValue : val;\n }\n set value(newVal) {\n this._object[this._key] = newVal;\n }\n get dep() {\n return getDepFromReactive(toRaw(this._object), this._key);\n }\n}\nclass GetterRefImpl {\n constructor(_getter) {\n this._getter = _getter;\n this[\"__v_isRef\"] = true;\n this[\"__v_isReadonly\"] = true;\n this._value = void 0;\n }\n get value() {\n return this._value = this._getter();\n }\n}\nfunction toRef(source, key, defaultValue) {\n if (isRef(source)) {\n return source;\n } else if (isFunction(source)) {\n return new GetterRefImpl(source);\n } else if (isObject(source) && arguments.length > 1) {\n return propertyToRef(source, key, defaultValue);\n } else {\n return ref(source);\n }\n}\nfunction propertyToRef(source, key, defaultValue) {\n const val = source[key];\n return isRef(val) ? val : new ObjectRefImpl(source, key, defaultValue);\n}\n\nclass ComputedRefImpl {\n constructor(fn, setter, isSSR) {\n this.fn = fn;\n this.setter = setter;\n /**\n * @internal\n */\n this._value = void 0;\n /**\n * @internal\n */\n this.dep = new Dep(this);\n /**\n * @internal\n */\n this.__v_isRef = true;\n // TODO isolatedDeclarations \"__v_isReadonly\"\n // A computed is also a subscriber that tracks other deps\n /**\n * @internal\n */\n this.deps = void 0;\n /**\n * @internal\n */\n this.depsTail = void 0;\n /**\n * @internal\n */\n this.flags = 16;\n /**\n * @internal\n */\n this.globalVersion = globalVersion - 1;\n /**\n * @internal\n */\n this.next = void 0;\n // for backwards compat\n this.effect = this;\n this[\"__v_isReadonly\"] = !setter;\n this.isSSR = isSSR;\n }\n /**\n * @internal\n */\n notify() {\n this.flags |= 16;\n if (!(this.flags & 8) && // avoid infinite self recursion\n activeSub !== this) {\n batch(this, true);\n return true;\n } else if (!!(process.env.NODE_ENV !== \"production\")) ;\n }\n get value() {\n const link = !!(process.env.NODE_ENV !== \"production\") ? this.dep.track({\n target: this,\n type: \"get\",\n key: \"value\"\n }) : this.dep.track();\n refreshComputed(this);\n if (link) {\n link.version = this.dep.version;\n }\n return this._value;\n }\n set value(newValue) {\n if (this.setter) {\n this.setter(newValue);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\"Write operation failed: computed value is readonly\");\n }\n }\n}\nfunction computed(getterOrOptions, debugOptions, isSSR = false) {\n let getter;\n let setter;\n if (isFunction(getterOrOptions)) {\n getter = getterOrOptions;\n } else {\n getter = getterOrOptions.get;\n setter = getterOrOptions.set;\n }\n const cRef = new ComputedRefImpl(getter, setter, isSSR);\n if (!!(process.env.NODE_ENV !== \"production\") && debugOptions && !isSSR) {\n cRef.onTrack = debugOptions.onTrack;\n cRef.onTrigger = debugOptions.onTrigger;\n }\n return cRef;\n}\n\nconst TrackOpTypes = {\n \"GET\": \"get\",\n \"HAS\": \"has\",\n \"ITERATE\": \"iterate\"\n};\nconst TriggerOpTypes = {\n \"SET\": \"set\",\n \"ADD\": \"add\",\n \"DELETE\": \"delete\",\n \"CLEAR\": \"clear\"\n};\nconst ReactiveFlags = {\n \"SKIP\": \"__v_skip\",\n \"IS_REACTIVE\": \"__v_isReactive\",\n \"IS_READONLY\": \"__v_isReadonly\",\n \"IS_SHALLOW\": \"__v_isShallow\",\n \"RAW\": \"__v_raw\",\n \"IS_REF\": \"__v_isRef\"\n};\n\nconst WatchErrorCodes = {\n \"WATCH_GETTER\": 2,\n \"2\": \"WATCH_GETTER\",\n \"WATCH_CALLBACK\": 3,\n \"3\": \"WATCH_CALLBACK\",\n \"WATCH_CLEANUP\": 4,\n \"4\": \"WATCH_CLEANUP\"\n};\nconst INITIAL_WATCHER_VALUE = {};\nconst cleanupMap = /* @__PURE__ */ new WeakMap();\nlet activeWatcher = void 0;\nfunction getCurrentWatcher() {\n return activeWatcher;\n}\nfunction onWatcherCleanup(cleanupFn, failSilently = false, owner = activeWatcher) {\n if (owner) {\n let cleanups = cleanupMap.get(owner);\n if (!cleanups) cleanupMap.set(owner, cleanups = []);\n cleanups.push(cleanupFn);\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onWatcherCleanup() was called when there was no active watcher to associate with.`\n );\n }\n}\nfunction watch(source, cb, options = EMPTY_OBJ) {\n const { immediate, deep, once, scheduler, augmentJob, call } = options;\n const warnInvalidSource = (s) => {\n (options.onWarn || warn)(\n `Invalid watch source: `,\n s,\n `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`\n );\n };\n const reactiveGetter = (source2) => {\n if (deep) return source2;\n if (isShallow(source2) || deep === false || deep === 0)\n return traverse(source2, 1);\n return traverse(source2);\n };\n let effect;\n let getter;\n let cleanup;\n let boundCleanup;\n let forceTrigger = false;\n let isMultiSource = false;\n if (isRef(source)) {\n getter = () => source.value;\n forceTrigger = isShallow(source);\n } else if (isReactive(source)) {\n getter = () => reactiveGetter(source);\n forceTrigger = true;\n } else if (isArray(source)) {\n isMultiSource = true;\n forceTrigger = source.some((s) => isReactive(s) || isShallow(s));\n getter = () => source.map((s) => {\n if (isRef(s)) {\n return s.value;\n } else if (isReactive(s)) {\n return reactiveGetter(s);\n } else if (isFunction(s)) {\n return call ? call(s, 2) : s();\n } else {\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(s);\n }\n });\n } else if (isFunction(source)) {\n if (cb) {\n getter = call ? () => call(source, 2) : source;\n } else {\n getter = () => {\n if (cleanup) {\n pauseTracking();\n try {\n cleanup();\n } finally {\n resetTracking();\n }\n }\n const currentEffect = activeWatcher;\n activeWatcher = effect;\n try {\n return call ? call(source, 3, [boundCleanup]) : source(boundCleanup);\n } finally {\n activeWatcher = currentEffect;\n }\n };\n }\n } else {\n getter = NOOP;\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(source);\n }\n if (cb && deep) {\n const baseGetter = getter;\n const depth = deep === true ? Infinity : deep;\n getter = () => traverse(baseGetter(), depth);\n }\n const scope = getCurrentScope();\n const watchHandle = () => {\n effect.stop();\n if (scope && scope.active) {\n remove(scope.effects, effect);\n }\n };\n if (once && cb) {\n const _cb = cb;\n cb = (...args) => {\n _cb(...args);\n watchHandle();\n };\n }\n let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;\n const job = (immediateFirstRun) => {\n if (!(effect.flags & 1) || !effect.dirty && !immediateFirstRun) {\n return;\n }\n if (cb) {\n const newValue = effect.run();\n if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue))) {\n if (cleanup) {\n cleanup();\n }\n const currentWatcher = activeWatcher;\n activeWatcher = effect;\n try {\n const args = [\n newValue,\n // pass undefined as the old value when it's changed for the first time\n oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,\n boundCleanup\n ];\n oldValue = newValue;\n call ? call(cb, 3, args) : (\n // @ts-expect-error\n cb(...args)\n );\n } finally {\n activeWatcher = currentWatcher;\n }\n }\n } else {\n effect.run();\n }\n };\n if (augmentJob) {\n augmentJob(job);\n }\n effect = new ReactiveEffect(getter);\n effect.scheduler = scheduler ? () => scheduler(job, false) : job;\n boundCleanup = (fn) => onWatcherCleanup(fn, false, effect);\n cleanup = effect.onStop = () => {\n const cleanups = cleanupMap.get(effect);\n if (cleanups) {\n if (call) {\n call(cleanups, 4);\n } else {\n for (const cleanup2 of cleanups) cleanup2();\n }\n cleanupMap.delete(effect);\n }\n };\n if (!!(process.env.NODE_ENV !== \"production\")) {\n effect.onTrack = options.onTrack;\n effect.onTrigger = options.onTrigger;\n }\n if (cb) {\n if (immediate) {\n job(true);\n } else {\n oldValue = effect.run();\n }\n } else if (scheduler) {\n scheduler(job.bind(null, true), true);\n } else {\n effect.run();\n }\n watchHandle.pause = effect.pause.bind(effect);\n watchHandle.resume = effect.resume.bind(effect);\n watchHandle.stop = watchHandle;\n return watchHandle;\n}\nfunction traverse(value, depth = Infinity, seen) {\n if (depth <= 0 || !isObject(value) || value[\"__v_skip\"]) {\n return value;\n }\n seen = seen || /* @__PURE__ */ new Set();\n if (seen.has(value)) {\n return value;\n }\n seen.add(value);\n depth--;\n if (isRef(value)) {\n traverse(value.value, depth, seen);\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n traverse(value[i], depth, seen);\n }\n } else if (isSet(value) || isMap(value)) {\n value.forEach((v) => {\n traverse(v, depth, seen);\n });\n } else if (isPlainObject(value)) {\n for (const key in value) {\n traverse(value[key], depth, seen);\n }\n for (const key of Object.getOwnPropertySymbols(value)) {\n if (Object.prototype.propertyIsEnumerable.call(value, key)) {\n traverse(value[key], depth, seen);\n }\n }\n }\n return value;\n}\n\nexport { ARRAY_ITERATE_KEY, EffectFlags, EffectScope, ITERATE_KEY, MAP_KEY_ITERATE_KEY, ReactiveEffect, ReactiveFlags, TrackOpTypes, TriggerOpTypes, WatchErrorCodes, computed, customRef, effect, effectScope, enableTracking, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onEffectCleanup, onScopeDispose, onWatcherCleanup, pauseTracking, proxyRefs, reactive, reactiveReadArray, readonly, ref, resetTracking, shallowReactive, shallowReadArray, shallowReadonly, shallowRef, stop, toRaw, toReactive, toReadonly, toRef, toRefs, toValue, track, traverse, trigger, triggerRef, unref, watch };\n","/**\n* @vue/runtime-core v3.5.16\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { pauseTracking, resetTracking, isRef, toRaw, traverse, shallowRef, readonly, isReactive, ref, isShallow, isReadonly, shallowReadArray, toReadonly, toReactive, shallowReadonly, track, reactive, shallowReactive, trigger, ReactiveEffect, watch as watch$1, customRef, isProxy, proxyRefs, markRaw, EffectScope, computed as computed$1 } from '@vue/reactivity';\nexport { EffectScope, ReactiveEffect, TrackOpTypes, TriggerOpTypes, customRef, effect, effectScope, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onScopeDispose, onWatcherCleanup, proxyRefs, reactive, readonly, ref, shallowReactive, shallowReadonly, shallowRef, stop, toRaw, toRef, toRefs, toValue, triggerRef, unref } from '@vue/reactivity';\nimport { isString, isFunction, EMPTY_OBJ, isPromise, isArray, NOOP, getGlobalThis, extend, isBuiltInDirective, hasOwn, remove, def, isOn, isReservedProp, normalizeClass, stringifyStyle, normalizeStyle, isKnownSvgAttr, isBooleanAttr, isKnownHtmlAttr, includeBooleanAttr, isRenderableAttrValue, getEscapedCssVarName, isObject, isRegExp, invokeArrayFns, toHandlerKey, camelize, capitalize, isSymbol, isGloballyAllowed, NO, EMPTY_ARR, hyphenate, makeMap, toRawType, hasChanged, looseToNumber, isModelListener, toNumber } from '@vue/shared';\nexport { camelize, capitalize, normalizeClass, normalizeProps, normalizeStyle, toDisplayString, toHandlerKey } from '@vue/shared';\n\nconst stack = [];\nfunction pushWarningContext(vnode) {\n stack.push(vnode);\n}\nfunction popWarningContext() {\n stack.pop();\n}\nlet isWarning = false;\nfunction warn$1(msg, ...args) {\n if (isWarning) return;\n isWarning = true;\n pauseTracking();\n const instance = stack.length ? stack[stack.length - 1].component : null;\n const appWarnHandler = instance && instance.appContext.config.warnHandler;\n const trace = getComponentTrace();\n if (appWarnHandler) {\n callWithErrorHandling(\n appWarnHandler,\n instance,\n 11,\n [\n // eslint-disable-next-line no-restricted-syntax\n msg + args.map((a) => {\n var _a, _b;\n return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a);\n }).join(\"\"),\n instance && instance.proxy,\n trace.map(\n ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`\n ).join(\"\\n\"),\n trace\n ]\n );\n } else {\n const warnArgs = [`[Vue warn]: ${msg}`, ...args];\n if (trace.length && // avoid spamming console during tests\n true) {\n warnArgs.push(`\n`, ...formatTrace(trace));\n }\n console.warn(...warnArgs);\n }\n resetTracking();\n isWarning = false;\n}\nfunction getComponentTrace() {\n let currentVNode = stack[stack.length - 1];\n if (!currentVNode) {\n return [];\n }\n const normalizedStack = [];\n while (currentVNode) {\n const last = normalizedStack[0];\n if (last && last.vnode === currentVNode) {\n last.recurseCount++;\n } else {\n normalizedStack.push({\n vnode: currentVNode,\n recurseCount: 0\n });\n }\n const parentInstance = currentVNode.component && currentVNode.component.parent;\n currentVNode = parentInstance && parentInstance.vnode;\n }\n return normalizedStack;\n}\nfunction formatTrace(trace) {\n const logs = [];\n trace.forEach((entry, i) => {\n logs.push(...i === 0 ? [] : [`\n`], ...formatTraceEntry(entry));\n });\n return logs;\n}\nfunction formatTraceEntry({ vnode, recurseCount }) {\n const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;\n const isRoot = vnode.component ? vnode.component.parent == null : false;\n const open = ` at <${formatComponentName(\n vnode.component,\n vnode.type,\n isRoot\n )}`;\n const close = `>` + postfix;\n return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];\n}\nfunction formatProps(props) {\n const res = [];\n const keys = Object.keys(props);\n keys.slice(0, 3).forEach((key) => {\n res.push(...formatProp(key, props[key]));\n });\n if (keys.length > 3) {\n res.push(` ...`);\n }\n return res;\n}\nfunction formatProp(key, value, raw) {\n if (isString(value)) {\n value = JSON.stringify(value);\n return raw ? value : [`${key}=${value}`];\n } else if (typeof value === \"number\" || typeof value === \"boolean\" || value == null) {\n return raw ? value : [`${key}=${value}`];\n } else if (isRef(value)) {\n value = formatProp(key, toRaw(value.value), true);\n return raw ? value : [`${key}=Ref<`, value, `>`];\n } else if (isFunction(value)) {\n return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];\n } else {\n value = toRaw(value);\n return raw ? value : [`${key}=`, value];\n }\n}\nfunction assertNumber(val, type) {\n if (!!!(process.env.NODE_ENV !== \"production\")) return;\n if (val === void 0) {\n return;\n } else if (typeof val !== \"number\") {\n warn$1(`${type} is not a valid number - got ${JSON.stringify(val)}.`);\n } else if (isNaN(val)) {\n warn$1(`${type} is NaN - the duration expression might be incorrect.`);\n }\n}\n\nconst ErrorCodes = {\n \"SETUP_FUNCTION\": 0,\n \"0\": \"SETUP_FUNCTION\",\n \"RENDER_FUNCTION\": 1,\n \"1\": \"RENDER_FUNCTION\",\n \"NATIVE_EVENT_HANDLER\": 5,\n \"5\": \"NATIVE_EVENT_HANDLER\",\n \"COMPONENT_EVENT_HANDLER\": 6,\n \"6\": \"COMPONENT_EVENT_HANDLER\",\n \"VNODE_HOOK\": 7,\n \"7\": \"VNODE_HOOK\",\n \"DIRECTIVE_HOOK\": 8,\n \"8\": \"DIRECTIVE_HOOK\",\n \"TRANSITION_HOOK\": 9,\n \"9\": \"TRANSITION_HOOK\",\n \"APP_ERROR_HANDLER\": 10,\n \"10\": \"APP_ERROR_HANDLER\",\n \"APP_WARN_HANDLER\": 11,\n \"11\": \"APP_WARN_HANDLER\",\n \"FUNCTION_REF\": 12,\n \"12\": \"FUNCTION_REF\",\n \"ASYNC_COMPONENT_LOADER\": 13,\n \"13\": \"ASYNC_COMPONENT_LOADER\",\n \"SCHEDULER\": 14,\n \"14\": \"SCHEDULER\",\n \"COMPONENT_UPDATE\": 15,\n \"15\": \"COMPONENT_UPDATE\",\n \"APP_UNMOUNT_CLEANUP\": 16,\n \"16\": \"APP_UNMOUNT_CLEANUP\"\n};\nconst ErrorTypeStrings$1 = {\n [\"sp\"]: \"serverPrefetch hook\",\n [\"bc\"]: \"beforeCreate hook\",\n [\"c\"]: \"created hook\",\n [\"bm\"]: \"beforeMount hook\",\n [\"m\"]: \"mounted hook\",\n [\"bu\"]: \"beforeUpdate hook\",\n [\"u\"]: \"updated\",\n [\"bum\"]: \"beforeUnmount hook\",\n [\"um\"]: \"unmounted hook\",\n [\"a\"]: \"activated hook\",\n [\"da\"]: \"deactivated hook\",\n [\"ec\"]: \"errorCaptured hook\",\n [\"rtc\"]: \"renderTracked hook\",\n [\"rtg\"]: \"renderTriggered hook\",\n [0]: \"setup function\",\n [1]: \"render function\",\n [2]: \"watcher getter\",\n [3]: \"watcher callback\",\n [4]: \"watcher cleanup function\",\n [5]: \"native event handler\",\n [6]: \"component event handler\",\n [7]: \"vnode hook\",\n [8]: \"directive hook\",\n [9]: \"transition hook\",\n [10]: \"app errorHandler\",\n [11]: \"app warnHandler\",\n [12]: \"ref function\",\n [13]: \"async component loader\",\n [14]: \"scheduler flush\",\n [15]: \"component update\",\n [16]: \"app unmount cleanup function\"\n};\nfunction callWithErrorHandling(fn, instance, type, args) {\n try {\n return args ? fn(...args) : fn();\n } catch (err) {\n handleError(err, instance, type);\n }\n}\nfunction callWithAsyncErrorHandling(fn, instance, type, args) {\n if (isFunction(fn)) {\n const res = callWithErrorHandling(fn, instance, type, args);\n if (res && isPromise(res)) {\n res.catch((err) => {\n handleError(err, instance, type);\n });\n }\n return res;\n }\n if (isArray(fn)) {\n const values = [];\n for (let i = 0; i < fn.length; i++) {\n values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));\n }\n return values;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `Invalid value type passed to callWithAsyncErrorHandling(): ${typeof fn}`\n );\n }\n}\nfunction handleError(err, instance, type, throwInDev = true) {\n const contextVNode = instance ? instance.vnode : null;\n const { errorHandler, throwUnhandledErrorInProduction } = instance && instance.appContext.config || EMPTY_OBJ;\n if (instance) {\n let cur = instance.parent;\n const exposedInstance = instance.proxy;\n const errorInfo = !!(process.env.NODE_ENV !== \"production\") ? ErrorTypeStrings$1[type] : `https://vuejs.org/error-reference/#runtime-${type}`;\n while (cur) {\n const errorCapturedHooks = cur.ec;\n if (errorCapturedHooks) {\n for (let i = 0; i < errorCapturedHooks.length; i++) {\n if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {\n return;\n }\n }\n }\n cur = cur.parent;\n }\n if (errorHandler) {\n pauseTracking();\n callWithErrorHandling(errorHandler, null, 10, [\n err,\n exposedInstance,\n errorInfo\n ]);\n resetTracking();\n return;\n }\n }\n logError(err, type, contextVNode, throwInDev, throwUnhandledErrorInProduction);\n}\nfunction logError(err, type, contextVNode, throwInDev = true, throwInProd = false) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const info = ErrorTypeStrings$1[type];\n if (contextVNode) {\n pushWarningContext(contextVNode);\n }\n warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`);\n if (contextVNode) {\n popWarningContext();\n }\n if (throwInDev) {\n throw err;\n } else {\n console.error(err);\n }\n } else if (throwInProd) {\n throw err;\n } else {\n console.error(err);\n }\n}\n\nconst queue = [];\nlet flushIndex = -1;\nconst pendingPostFlushCbs = [];\nlet activePostFlushCbs = null;\nlet postFlushIndex = 0;\nconst resolvedPromise = /* @__PURE__ */ Promise.resolve();\nlet currentFlushPromise = null;\nconst RECURSION_LIMIT = 100;\nfunction nextTick(fn) {\n const p = currentFlushPromise || resolvedPromise;\n return fn ? p.then(this ? fn.bind(this) : fn) : p;\n}\nfunction findInsertionIndex(id) {\n let start = flushIndex + 1;\n let end = queue.length;\n while (start < end) {\n const middle = start + end >>> 1;\n const middleJob = queue[middle];\n const middleJobId = getId(middleJob);\n if (middleJobId < id || middleJobId === id && middleJob.flags & 2) {\n start = middle + 1;\n } else {\n end = middle;\n }\n }\n return start;\n}\nfunction queueJob(job) {\n if (!(job.flags & 1)) {\n const jobId = getId(job);\n const lastJob = queue[queue.length - 1];\n if (!lastJob || // fast path when the job id is larger than the tail\n !(job.flags & 2) && jobId >= getId(lastJob)) {\n queue.push(job);\n } else {\n queue.splice(findInsertionIndex(jobId), 0, job);\n }\n job.flags |= 1;\n queueFlush();\n }\n}\nfunction queueFlush() {\n if (!currentFlushPromise) {\n currentFlushPromise = resolvedPromise.then(flushJobs);\n }\n}\nfunction queuePostFlushCb(cb) {\n if (!isArray(cb)) {\n if (activePostFlushCbs && cb.id === -1) {\n activePostFlushCbs.splice(postFlushIndex + 1, 0, cb);\n } else if (!(cb.flags & 1)) {\n pendingPostFlushCbs.push(cb);\n cb.flags |= 1;\n }\n } else {\n pendingPostFlushCbs.push(...cb);\n }\n queueFlush();\n}\nfunction flushPreFlushCbs(instance, seen, i = flushIndex + 1) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n for (; i < queue.length; i++) {\n const cb = queue[i];\n if (cb && cb.flags & 2) {\n if (instance && cb.id !== instance.uid) {\n continue;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n continue;\n }\n queue.splice(i, 1);\n i--;\n if (cb.flags & 4) {\n cb.flags &= -2;\n }\n cb();\n if (!(cb.flags & 4)) {\n cb.flags &= -2;\n }\n }\n }\n}\nfunction flushPostFlushCbs(seen) {\n if (pendingPostFlushCbs.length) {\n const deduped = [...new Set(pendingPostFlushCbs)].sort(\n (a, b) => getId(a) - getId(b)\n );\n pendingPostFlushCbs.length = 0;\n if (activePostFlushCbs) {\n activePostFlushCbs.push(...deduped);\n return;\n }\n activePostFlushCbs = deduped;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {\n const cb = activePostFlushCbs[postFlushIndex];\n if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n continue;\n }\n if (cb.flags & 4) {\n cb.flags &= -2;\n }\n if (!(cb.flags & 8)) cb();\n cb.flags &= -2;\n }\n activePostFlushCbs = null;\n postFlushIndex = 0;\n }\n}\nconst getId = (job) => job.id == null ? job.flags & 2 ? -1 : Infinity : job.id;\nfunction flushJobs(seen) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n const check = !!(process.env.NODE_ENV !== \"production\") ? (job) => checkRecursiveUpdates(seen, job) : NOOP;\n try {\n for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {\n const job = queue[flushIndex];\n if (job && !(job.flags & 8)) {\n if (!!(process.env.NODE_ENV !== \"production\") && check(job)) {\n continue;\n }\n if (job.flags & 4) {\n job.flags &= ~1;\n }\n callWithErrorHandling(\n job,\n job.i,\n job.i ? 15 : 14\n );\n if (!(job.flags & 4)) {\n job.flags &= ~1;\n }\n }\n }\n } finally {\n for (; flushIndex < queue.length; flushIndex++) {\n const job = queue[flushIndex];\n if (job) {\n job.flags &= -2;\n }\n }\n flushIndex = -1;\n queue.length = 0;\n flushPostFlushCbs(seen);\n currentFlushPromise = null;\n if (queue.length || pendingPostFlushCbs.length) {\n flushJobs(seen);\n }\n }\n}\nfunction checkRecursiveUpdates(seen, fn) {\n const count = seen.get(fn) || 0;\n if (count > RECURSION_LIMIT) {\n const instance = fn.i;\n const componentName = instance && getComponentName(instance.type);\n handleError(\n `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`,\n null,\n 10\n );\n return true;\n }\n seen.set(fn, count + 1);\n return false;\n}\n\nlet isHmrUpdating = false;\nconst hmrDirtyComponents = /* @__PURE__ */ new Map();\nif (!!(process.env.NODE_ENV !== \"production\")) {\n getGlobalThis().__VUE_HMR_RUNTIME__ = {\n createRecord: tryWrap(createRecord),\n rerender: tryWrap(rerender),\n reload: tryWrap(reload)\n };\n}\nconst map = /* @__PURE__ */ new Map();\nfunction registerHMR(instance) {\n const id = instance.type.__hmrId;\n let record = map.get(id);\n if (!record) {\n createRecord(id, instance.type);\n record = map.get(id);\n }\n record.instances.add(instance);\n}\nfunction unregisterHMR(instance) {\n map.get(instance.type.__hmrId).instances.delete(instance);\n}\nfunction createRecord(id, initialDef) {\n if (map.has(id)) {\n return false;\n }\n map.set(id, {\n initialDef: normalizeClassComponent(initialDef),\n instances: /* @__PURE__ */ new Set()\n });\n return true;\n}\nfunction normalizeClassComponent(component) {\n return isClassComponent(component) ? component.__vccOpts : component;\n}\nfunction rerender(id, newRender) {\n const record = map.get(id);\n if (!record) {\n return;\n }\n record.initialDef.render = newRender;\n [...record.instances].forEach((instance) => {\n if (newRender) {\n instance.render = newRender;\n normalizeClassComponent(instance.type).render = newRender;\n }\n instance.renderCache = [];\n isHmrUpdating = true;\n instance.update();\n isHmrUpdating = false;\n });\n}\nfunction reload(id, newComp) {\n const record = map.get(id);\n if (!record) return;\n newComp = normalizeClassComponent(newComp);\n updateComponentDef(record.initialDef, newComp);\n const instances = [...record.instances];\n for (let i = 0; i < instances.length; i++) {\n const instance = instances[i];\n const oldComp = normalizeClassComponent(instance.type);\n let dirtyInstances = hmrDirtyComponents.get(oldComp);\n if (!dirtyInstances) {\n if (oldComp !== record.initialDef) {\n updateComponentDef(oldComp, newComp);\n }\n hmrDirtyComponents.set(oldComp, dirtyInstances = /* @__PURE__ */ new Set());\n }\n dirtyInstances.add(instance);\n instance.appContext.propsCache.delete(instance.type);\n instance.appContext.emitsCache.delete(instance.type);\n instance.appContext.optionsCache.delete(instance.type);\n if (instance.ceReload) {\n dirtyInstances.add(instance);\n instance.ceReload(newComp.styles);\n dirtyInstances.delete(instance);\n } else if (instance.parent) {\n queueJob(() => {\n isHmrUpdating = true;\n instance.parent.update();\n isHmrUpdating = false;\n dirtyInstances.delete(instance);\n });\n } else if (instance.appContext.reload) {\n instance.appContext.reload();\n } else if (typeof window !== \"undefined\") {\n window.location.reload();\n } else {\n console.warn(\n \"[HMR] Root or manually mounted instance modified. Full reload required.\"\n );\n }\n if (instance.root.ce && instance !== instance.root) {\n instance.root.ce._removeChildStyle(oldComp);\n }\n }\n queuePostFlushCb(() => {\n hmrDirtyComponents.clear();\n });\n}\nfunction updateComponentDef(oldComp, newComp) {\n extend(oldComp, newComp);\n for (const key in oldComp) {\n if (key !== \"__file\" && !(key in newComp)) {\n delete oldComp[key];\n }\n }\n}\nfunction tryWrap(fn) {\n return (id, arg) => {\n try {\n return fn(id, arg);\n } catch (e) {\n console.error(e);\n console.warn(\n `[HMR] Something went wrong during Vue component hot-reload. Full reload required.`\n );\n }\n };\n}\n\nlet devtools$1;\nlet buffer = [];\nlet devtoolsNotInstalled = false;\nfunction emit$1(event, ...args) {\n if (devtools$1) {\n devtools$1.emit(event, ...args);\n } else if (!devtoolsNotInstalled) {\n buffer.push({ event, args });\n }\n}\nfunction setDevtoolsHook$1(hook, target) {\n var _a, _b;\n devtools$1 = hook;\n if (devtools$1) {\n devtools$1.enabled = true;\n buffer.forEach(({ event, args }) => devtools$1.emit(event, ...args));\n buffer = [];\n } else if (\n // handle late devtools injection - only do this if we are in an actual\n // browser environment to avoid the timer handle stalling test runner exit\n // (#4815)\n typeof window !== \"undefined\" && // some envs mock window but not fully\n window.HTMLElement && // also exclude jsdom\n // eslint-disable-next-line no-restricted-syntax\n !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes(\"jsdom\"))\n ) {\n const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];\n replay.push((newHook) => {\n setDevtoolsHook$1(newHook, target);\n });\n setTimeout(() => {\n if (!devtools$1) {\n target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;\n devtoolsNotInstalled = true;\n buffer = [];\n }\n }, 3e3);\n } else {\n devtoolsNotInstalled = true;\n buffer = [];\n }\n}\nfunction devtoolsInitApp(app, version) {\n emit$1(\"app:init\" /* APP_INIT */, app, version, {\n Fragment,\n Text,\n Comment,\n Static\n });\n}\nfunction devtoolsUnmountApp(app) {\n emit$1(\"app:unmount\" /* APP_UNMOUNT */, app);\n}\nconst devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(\"component:added\" /* COMPONENT_ADDED */);\nconst devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook(\"component:updated\" /* COMPONENT_UPDATED */);\nconst _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(\n \"component:removed\" /* COMPONENT_REMOVED */\n);\nconst devtoolsComponentRemoved = (component) => {\n if (devtools$1 && typeof devtools$1.cleanupBuffer === \"function\" && // remove the component if it wasn't buffered\n !devtools$1.cleanupBuffer(component)) {\n _devtoolsComponentRemoved(component);\n }\n};\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction createDevtoolsComponentHook(hook) {\n return (component) => {\n emit$1(\n hook,\n component.appContext.app,\n component.uid,\n component.parent ? component.parent.uid : void 0,\n component\n );\n };\n}\nconst devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(\"perf:start\" /* PERFORMANCE_START */);\nconst devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(\"perf:end\" /* PERFORMANCE_END */);\nfunction createDevtoolsPerformanceHook(hook) {\n return (component, type, time) => {\n emit$1(hook, component.appContext.app, component.uid, component, type, time);\n };\n}\nfunction devtoolsComponentEmit(component, event, params) {\n emit$1(\n \"component:emit\" /* COMPONENT_EMIT */,\n component.appContext.app,\n component,\n event,\n params\n );\n}\n\nlet currentRenderingInstance = null;\nlet currentScopeId = null;\nfunction setCurrentRenderingInstance(instance) {\n const prev = currentRenderingInstance;\n currentRenderingInstance = instance;\n currentScopeId = instance && instance.type.__scopeId || null;\n return prev;\n}\nfunction pushScopeId(id) {\n currentScopeId = id;\n}\nfunction popScopeId() {\n currentScopeId = null;\n}\nconst withScopeId = (_id) => withCtx;\nfunction withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {\n if (!ctx) return fn;\n if (fn._n) {\n return fn;\n }\n const renderFnWithContext = (...args) => {\n if (renderFnWithContext._d) {\n setBlockTracking(-1);\n }\n const prevInstance = setCurrentRenderingInstance(ctx);\n let res;\n try {\n res = fn(...args);\n } finally {\n setCurrentRenderingInstance(prevInstance);\n if (renderFnWithContext._d) {\n setBlockTracking(1);\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentUpdated(ctx);\n }\n return res;\n };\n renderFnWithContext._n = true;\n renderFnWithContext._c = true;\n renderFnWithContext._d = true;\n return renderFnWithContext;\n}\n\nfunction validateDirectiveName(name) {\n if (isBuiltInDirective(name)) {\n warn$1(\"Do not use built-in directive ids as custom directive id: \" + name);\n }\n}\nfunction withDirectives(vnode, directives) {\n if (currentRenderingInstance === null) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(`withDirectives can only be used inside render functions.`);\n return vnode;\n }\n const instance = getComponentPublicInstance(currentRenderingInstance);\n const bindings = vnode.dirs || (vnode.dirs = []);\n for (let i = 0; i < directives.length; i++) {\n let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];\n if (dir) {\n if (isFunction(dir)) {\n dir = {\n mounted: dir,\n updated: dir\n };\n }\n if (dir.deep) {\n traverse(value);\n }\n bindings.push({\n dir,\n instance,\n value,\n oldValue: void 0,\n arg,\n modifiers\n });\n }\n }\n return vnode;\n}\nfunction invokeDirectiveHook(vnode, prevVNode, instance, name) {\n const bindings = vnode.dirs;\n const oldBindings = prevVNode && prevVNode.dirs;\n for (let i = 0; i < bindings.length; i++) {\n const binding = bindings[i];\n if (oldBindings) {\n binding.oldValue = oldBindings[i].value;\n }\n let hook = binding.dir[name];\n if (hook) {\n pauseTracking();\n callWithAsyncErrorHandling(hook, instance, 8, [\n vnode.el,\n binding,\n vnode,\n prevVNode\n ]);\n resetTracking();\n }\n }\n}\n\nconst TeleportEndKey = Symbol(\"_vte\");\nconst isTeleport = (type) => type.__isTeleport;\nconst isTeleportDisabled = (props) => props && (props.disabled || props.disabled === \"\");\nconst isTeleportDeferred = (props) => props && (props.defer || props.defer === \"\");\nconst isTargetSVG = (target) => typeof SVGElement !== \"undefined\" && target instanceof SVGElement;\nconst isTargetMathML = (target) => typeof MathMLElement === \"function\" && target instanceof MathMLElement;\nconst resolveTarget = (props, select) => {\n const targetSelector = props && props.to;\n if (isString(targetSelector)) {\n if (!select) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(\n `Current renderer does not support string target for Teleports. (missing querySelector renderer option)`\n );\n return null;\n } else {\n const target = select(targetSelector);\n if (!!(process.env.NODE_ENV !== \"production\") && !target && !isTeleportDisabled(props)) {\n warn$1(\n `Failed to locate Teleport target with selector \"${targetSelector}\". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.`\n );\n }\n return target;\n }\n } else {\n if (!!(process.env.NODE_ENV !== \"production\") && !targetSelector && !isTeleportDisabled(props)) {\n warn$1(`Invalid Teleport target: ${targetSelector}`);\n }\n return targetSelector;\n }\n};\nconst TeleportImpl = {\n name: \"Teleport\",\n __isTeleport: true,\n process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals) {\n const {\n mc: mountChildren,\n pc: patchChildren,\n pbc: patchBlockChildren,\n o: { insert, querySelector, createText, createComment }\n } = internals;\n const disabled = isTeleportDisabled(n2.props);\n let { shapeFlag, children, dynamicChildren } = n2;\n if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n optimized = false;\n dynamicChildren = null;\n }\n if (n1 == null) {\n const placeholder = n2.el = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport start\") : createText(\"\");\n const mainAnchor = n2.anchor = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport end\") : createText(\"\");\n insert(placeholder, container, anchor);\n insert(mainAnchor, container, anchor);\n const mount = (container2, anchor2) => {\n if (shapeFlag & 16) {\n if (parentComponent && parentComponent.isCE) {\n parentComponent.ce._teleportTarget = container2;\n }\n mountChildren(\n children,\n container2,\n anchor2,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n }\n };\n const mountToTarget = () => {\n const target = n2.target = resolveTarget(n2.props, querySelector);\n const targetAnchor = prepareAnchor(target, n2, createText, insert);\n if (target) {\n if (namespace !== \"svg\" && isTargetSVG(target)) {\n namespace = \"svg\";\n } else if (namespace !== \"mathml\" && isTargetMathML(target)) {\n namespace = \"mathml\";\n }\n if (!disabled) {\n mount(target, targetAnchor);\n updateCssVars(n2, false);\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && !disabled) {\n warn$1(\n \"Invalid Teleport target on mount:\",\n target,\n `(${typeof target})`\n );\n }\n };\n if (disabled) {\n mount(container, mainAnchor);\n updateCssVars(n2, true);\n }\n if (isTeleportDeferred(n2.props)) {\n n2.el.__isMounted = false;\n queuePostRenderEffect(() => {\n mountToTarget();\n delete n2.el.__isMounted;\n }, parentSuspense);\n } else {\n mountToTarget();\n }\n } else {\n if (isTeleportDeferred(n2.props) && n1.el.__isMounted === false) {\n queuePostRenderEffect(() => {\n TeleportImpl.process(\n n1,\n n2,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized,\n internals\n );\n }, parentSuspense);\n return;\n }\n n2.el = n1.el;\n n2.targetStart = n1.targetStart;\n const mainAnchor = n2.anchor = n1.anchor;\n const target = n2.target = n1.target;\n const targetAnchor = n2.targetAnchor = n1.targetAnchor;\n const wasDisabled = isTeleportDisabled(n1.props);\n const currentContainer = wasDisabled ? container : target;\n const currentAnchor = wasDisabled ? mainAnchor : targetAnchor;\n if (namespace === \"svg\" || isTargetSVG(target)) {\n namespace = \"svg\";\n } else if (namespace === \"mathml\" || isTargetMathML(target)) {\n namespace = \"mathml\";\n }\n if (dynamicChildren) {\n patchBlockChildren(\n n1.dynamicChildren,\n dynamicChildren,\n currentContainer,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds\n );\n traverseStaticChildren(n1, n2, !!!(process.env.NODE_ENV !== \"production\"));\n } else if (!optimized) {\n patchChildren(\n n1,\n n2,\n currentContainer,\n currentAnchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n false\n );\n }\n if (disabled) {\n if (!wasDisabled) {\n moveTeleport(\n n2,\n container,\n mainAnchor,\n internals,\n 1\n );\n } else {\n if (n2.props && n1.props && n2.props.to !== n1.props.to) {\n n2.props.to = n1.props.to;\n }\n }\n } else {\n if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) {\n const nextTarget = n2.target = resolveTarget(\n n2.props,\n querySelector\n );\n if (nextTarget) {\n moveTeleport(\n n2,\n nextTarget,\n null,\n internals,\n 0\n );\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n \"Invalid Teleport target on update:\",\n target,\n `(${typeof target})`\n );\n }\n } else if (wasDisabled) {\n moveTeleport(\n n2,\n target,\n targetAnchor,\n internals,\n 1\n );\n }\n }\n updateCssVars(n2, disabled);\n }\n },\n remove(vnode, parentComponent, parentSuspense, { um: unmount, o: { remove: hostRemove } }, doRemove) {\n const {\n shapeFlag,\n children,\n anchor,\n targetStart,\n targetAnchor,\n target,\n props\n } = vnode;\n if (target) {\n hostRemove(targetStart);\n hostRemove(targetAnchor);\n }\n doRemove && hostRemove(anchor);\n if (shapeFlag & 16) {\n const shouldRemove = doRemove || !isTeleportDisabled(props);\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n unmount(\n child,\n parentComponent,\n parentSuspense,\n shouldRemove,\n !!child.dynamicChildren\n );\n }\n }\n },\n move: moveTeleport,\n hydrate: hydrateTeleport\n};\nfunction moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) {\n if (moveType === 0) {\n insert(vnode.targetAnchor, container, parentAnchor);\n }\n const { el, anchor, shapeFlag, children, props } = vnode;\n const isReorder = moveType === 2;\n if (isReorder) {\n insert(el, container, parentAnchor);\n }\n if (!isReorder || isTeleportDisabled(props)) {\n if (shapeFlag & 16) {\n for (let i = 0; i < children.length; i++) {\n move(\n children[i],\n container,\n parentAnchor,\n 2\n );\n }\n }\n }\n if (isReorder) {\n insert(anchor, container, parentAnchor);\n }\n}\nfunction hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, {\n o: { nextSibling, parentNode, querySelector, insert, createText }\n}, hydrateChildren) {\n const target = vnode.target = resolveTarget(\n vnode.props,\n querySelector\n );\n if (target) {\n const disabled = isTeleportDisabled(vnode.props);\n const targetNode = target._lpa || target.firstChild;\n if (vnode.shapeFlag & 16) {\n if (disabled) {\n vnode.anchor = hydrateChildren(\n nextSibling(node),\n vnode,\n parentNode(node),\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n vnode.targetStart = targetNode;\n vnode.targetAnchor = targetNode && nextSibling(targetNode);\n } else {\n vnode.anchor = nextSibling(node);\n let targetAnchor = targetNode;\n while (targetAnchor) {\n if (targetAnchor && targetAnchor.nodeType === 8) {\n if (targetAnchor.data === \"teleport start anchor\") {\n vnode.targetStart = targetAnchor;\n } else if (targetAnchor.data === \"teleport anchor\") {\n vnode.targetAnchor = targetAnchor;\n target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor);\n break;\n }\n }\n targetAnchor = nextSibling(targetAnchor);\n }\n if (!vnode.targetAnchor) {\n prepareAnchor(target, vnode, createText, insert);\n }\n hydrateChildren(\n targetNode && nextSibling(targetNode),\n vnode,\n target,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n }\n updateCssVars(vnode, disabled);\n }\n return vnode.anchor && nextSibling(vnode.anchor);\n}\nconst Teleport = TeleportImpl;\nfunction updateCssVars(vnode, isDisabled) {\n const ctx = vnode.ctx;\n if (ctx && ctx.ut) {\n let node, anchor;\n if (isDisabled) {\n node = vnode.el;\n anchor = vnode.anchor;\n } else {\n node = vnode.targetStart;\n anchor = vnode.targetAnchor;\n }\n while (node && node !== anchor) {\n if (node.nodeType === 1) node.setAttribute(\"data-v-owner\", ctx.uid);\n node = node.nextSibling;\n }\n ctx.ut();\n }\n}\nfunction prepareAnchor(target, vnode, createText, insert) {\n const targetStart = vnode.targetStart = createText(\"\");\n const targetAnchor = vnode.targetAnchor = createText(\"\");\n targetStart[TeleportEndKey] = targetAnchor;\n if (target) {\n insert(targetStart, target);\n insert(targetAnchor, target);\n }\n return targetAnchor;\n}\n\nconst leaveCbKey = Symbol(\"_leaveCb\");\nconst enterCbKey = Symbol(\"_enterCb\");\nfunction useTransitionState() {\n const state = {\n isMounted: false,\n isLeaving: false,\n isUnmounting: false,\n leavingVNodes: /* @__PURE__ */ new Map()\n };\n onMounted(() => {\n state.isMounted = true;\n });\n onBeforeUnmount(() => {\n state.isUnmounting = true;\n });\n return state;\n}\nconst TransitionHookValidator = [Function, Array];\nconst BaseTransitionPropsValidators = {\n mode: String,\n appear: Boolean,\n persisted: Boolean,\n // enter\n onBeforeEnter: TransitionHookValidator,\n onEnter: TransitionHookValidator,\n onAfterEnter: TransitionHookValidator,\n onEnterCancelled: TransitionHookValidator,\n // leave\n onBeforeLeave: TransitionHookValidator,\n onLeave: TransitionHookValidator,\n onAfterLeave: TransitionHookValidator,\n onLeaveCancelled: TransitionHookValidator,\n // appear\n onBeforeAppear: TransitionHookValidator,\n onAppear: TransitionHookValidator,\n onAfterAppear: TransitionHookValidator,\n onAppearCancelled: TransitionHookValidator\n};\nconst recursiveGetSubtree = (instance) => {\n const subTree = instance.subTree;\n return subTree.component ? recursiveGetSubtree(subTree.component) : subTree;\n};\nconst BaseTransitionImpl = {\n name: `BaseTransition`,\n props: BaseTransitionPropsValidators,\n setup(props, { slots }) {\n const instance = getCurrentInstance();\n const state = useTransitionState();\n return () => {\n const children = slots.default && getTransitionRawChildren(slots.default(), true);\n if (!children || !children.length) {\n return;\n }\n const child = findNonCommentChild(children);\n const rawProps = toRaw(props);\n const { mode } = rawProps;\n if (!!(process.env.NODE_ENV !== \"production\") && mode && mode !== \"in-out\" && mode !== \"out-in\" && mode !== \"default\") {\n warn$1(`invalid mode: ${mode}`);\n }\n if (state.isLeaving) {\n return emptyPlaceholder(child);\n }\n const innerChild = getInnerChild$1(child);\n if (!innerChild) {\n return emptyPlaceholder(child);\n }\n let enterHooks = resolveTransitionHooks(\n innerChild,\n rawProps,\n state,\n instance,\n // #11061, ensure enterHooks is fresh after clone\n (hooks) => enterHooks = hooks\n );\n if (innerChild.type !== Comment) {\n setTransitionHooks(innerChild, enterHooks);\n }\n let oldInnerChild = instance.subTree && getInnerChild$1(instance.subTree);\n if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(innerChild, oldInnerChild) && recursiveGetSubtree(instance).type !== Comment) {\n let leavingHooks = resolveTransitionHooks(\n oldInnerChild,\n rawProps,\n state,\n instance\n );\n setTransitionHooks(oldInnerChild, leavingHooks);\n if (mode === \"out-in\" && innerChild.type !== Comment) {\n state.isLeaving = true;\n leavingHooks.afterLeave = () => {\n state.isLeaving = false;\n if (!(instance.job.flags & 8)) {\n instance.update();\n }\n delete leavingHooks.afterLeave;\n oldInnerChild = void 0;\n };\n return emptyPlaceholder(child);\n } else if (mode === \"in-out\" && innerChild.type !== Comment) {\n leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {\n const leavingVNodesCache = getLeavingNodesForType(\n state,\n oldInnerChild\n );\n leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;\n el[leaveCbKey] = () => {\n earlyRemove();\n el[leaveCbKey] = void 0;\n delete enterHooks.delayedLeave;\n oldInnerChild = void 0;\n };\n enterHooks.delayedLeave = () => {\n delayedLeave();\n delete enterHooks.delayedLeave;\n oldInnerChild = void 0;\n };\n };\n } else {\n oldInnerChild = void 0;\n }\n } else if (oldInnerChild) {\n oldInnerChild = void 0;\n }\n return child;\n };\n }\n};\nfunction findNonCommentChild(children) {\n let child = children[0];\n if (children.length > 1) {\n let hasFound = false;\n for (const c of children) {\n if (c.type !== Comment) {\n if (!!(process.env.NODE_ENV !== \"production\") && hasFound) {\n warn$1(\n \" can only be used on a single element or component. Use for lists.\"\n );\n break;\n }\n child = c;\n hasFound = true;\n if (!!!(process.env.NODE_ENV !== \"production\")) break;\n }\n }\n }\n return child;\n}\nconst BaseTransition = BaseTransitionImpl;\nfunction getLeavingNodesForType(state, vnode) {\n const { leavingVNodes } = state;\n let leavingVNodesCache = leavingVNodes.get(vnode.type);\n if (!leavingVNodesCache) {\n leavingVNodesCache = /* @__PURE__ */ Object.create(null);\n leavingVNodes.set(vnode.type, leavingVNodesCache);\n }\n return leavingVNodesCache;\n}\nfunction resolveTransitionHooks(vnode, props, state, instance, postClone) {\n const {\n appear,\n mode,\n persisted = false,\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n onBeforeAppear,\n onAppear,\n onAfterAppear,\n onAppearCancelled\n } = props;\n const key = String(vnode.key);\n const leavingVNodesCache = getLeavingNodesForType(state, vnode);\n const callHook = (hook, args) => {\n hook && callWithAsyncErrorHandling(\n hook,\n instance,\n 9,\n args\n );\n };\n const callAsyncHook = (hook, args) => {\n const done = args[1];\n callHook(hook, args);\n if (isArray(hook)) {\n if (hook.every((hook2) => hook2.length <= 1)) done();\n } else if (hook.length <= 1) {\n done();\n }\n };\n const hooks = {\n mode,\n persisted,\n beforeEnter(el) {\n let hook = onBeforeEnter;\n if (!state.isMounted) {\n if (appear) {\n hook = onBeforeAppear || onBeforeEnter;\n } else {\n return;\n }\n }\n if (el[leaveCbKey]) {\n el[leaveCbKey](\n true\n /* cancelled */\n );\n }\n const leavingVNode = leavingVNodesCache[key];\n if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) {\n leavingVNode.el[leaveCbKey]();\n }\n callHook(hook, [el]);\n },\n enter(el) {\n let hook = onEnter;\n let afterHook = onAfterEnter;\n let cancelHook = onEnterCancelled;\n if (!state.isMounted) {\n if (appear) {\n hook = onAppear || onEnter;\n afterHook = onAfterAppear || onAfterEnter;\n cancelHook = onAppearCancelled || onEnterCancelled;\n } else {\n return;\n }\n }\n let called = false;\n const done = el[enterCbKey] = (cancelled) => {\n if (called) return;\n called = true;\n if (cancelled) {\n callHook(cancelHook, [el]);\n } else {\n callHook(afterHook, [el]);\n }\n if (hooks.delayedLeave) {\n hooks.delayedLeave();\n }\n el[enterCbKey] = void 0;\n };\n if (hook) {\n callAsyncHook(hook, [el, done]);\n } else {\n done();\n }\n },\n leave(el, remove) {\n const key2 = String(vnode.key);\n if (el[enterCbKey]) {\n el[enterCbKey](\n true\n /* cancelled */\n );\n }\n if (state.isUnmounting) {\n return remove();\n }\n callHook(onBeforeLeave, [el]);\n let called = false;\n const done = el[leaveCbKey] = (cancelled) => {\n if (called) return;\n called = true;\n remove();\n if (cancelled) {\n callHook(onLeaveCancelled, [el]);\n } else {\n callHook(onAfterLeave, [el]);\n }\n el[leaveCbKey] = void 0;\n if (leavingVNodesCache[key2] === vnode) {\n delete leavingVNodesCache[key2];\n }\n };\n leavingVNodesCache[key2] = vnode;\n if (onLeave) {\n callAsyncHook(onLeave, [el, done]);\n } else {\n done();\n }\n },\n clone(vnode2) {\n const hooks2 = resolveTransitionHooks(\n vnode2,\n props,\n state,\n instance,\n postClone\n );\n if (postClone) postClone(hooks2);\n return hooks2;\n }\n };\n return hooks;\n}\nfunction emptyPlaceholder(vnode) {\n if (isKeepAlive(vnode)) {\n vnode = cloneVNode(vnode);\n vnode.children = null;\n return vnode;\n }\n}\nfunction getInnerChild$1(vnode) {\n if (!isKeepAlive(vnode)) {\n if (isTeleport(vnode.type) && vnode.children) {\n return findNonCommentChild(vnode.children);\n }\n return vnode;\n }\n if (vnode.component) {\n return vnode.component.subTree;\n }\n const { shapeFlag, children } = vnode;\n if (children) {\n if (shapeFlag & 16) {\n return children[0];\n }\n if (shapeFlag & 32 && isFunction(children.default)) {\n return children.default();\n }\n }\n}\nfunction setTransitionHooks(vnode, hooks) {\n if (vnode.shapeFlag & 6 && vnode.component) {\n vnode.transition = hooks;\n setTransitionHooks(vnode.component.subTree, hooks);\n } else if (vnode.shapeFlag & 128) {\n vnode.ssContent.transition = hooks.clone(vnode.ssContent);\n vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);\n } else {\n vnode.transition = hooks;\n }\n}\nfunction getTransitionRawChildren(children, keepComment = false, parentKey) {\n let ret = [];\n let keyedFragmentCount = 0;\n for (let i = 0; i < children.length; i++) {\n let child = children[i];\n const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i);\n if (child.type === Fragment) {\n if (child.patchFlag & 128) keyedFragmentCount++;\n ret = ret.concat(\n getTransitionRawChildren(child.children, keepComment, key)\n );\n } else if (keepComment || child.type !== Comment) {\n ret.push(key != null ? cloneVNode(child, { key }) : child);\n }\n }\n if (keyedFragmentCount > 1) {\n for (let i = 0; i < ret.length; i++) {\n ret[i].patchFlag = -2;\n }\n }\n return ret;\n}\n\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction defineComponent(options, extraOptions) {\n return isFunction(options) ? (\n // #8236: extend call and options.name access are considered side-effects\n // by Rollup, so we have to wrap it in a pure-annotated IIFE.\n /* @__PURE__ */ (() => extend({ name: options.name }, extraOptions, { setup: options }))()\n ) : options;\n}\n\nfunction useId() {\n const i = getCurrentInstance();\n if (i) {\n return (i.appContext.config.idPrefix || \"v\") + \"-\" + i.ids[0] + i.ids[1]++;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `useId() is called when there is no active component instance to be associated with.`\n );\n }\n return \"\";\n}\nfunction markAsyncBoundary(instance) {\n instance.ids = [instance.ids[0] + instance.ids[2]++ + \"-\", 0, 0];\n}\n\nconst knownTemplateRefs = /* @__PURE__ */ new WeakSet();\nfunction useTemplateRef(key) {\n const i = getCurrentInstance();\n const r = shallowRef(null);\n if (i) {\n const refs = i.refs === EMPTY_OBJ ? i.refs = {} : i.refs;\n let desc;\n if (!!(process.env.NODE_ENV !== \"production\") && (desc = Object.getOwnPropertyDescriptor(refs, key)) && !desc.configurable) {\n warn$1(`useTemplateRef('${key}') already exists.`);\n } else {\n Object.defineProperty(refs, key, {\n enumerable: true,\n get: () => r.value,\n set: (val) => r.value = val\n });\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `useTemplateRef() is called when there is no active component instance to be associated with.`\n );\n }\n const ret = !!(process.env.NODE_ENV !== \"production\") ? readonly(r) : r;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n knownTemplateRefs.add(ret);\n }\n return ret;\n}\n\nfunction setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {\n if (isArray(rawRef)) {\n rawRef.forEach(\n (r, i) => setRef(\n r,\n oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef),\n parentSuspense,\n vnode,\n isUnmount\n )\n );\n return;\n }\n if (isAsyncWrapper(vnode) && !isUnmount) {\n if (vnode.shapeFlag & 512 && vnode.type.__asyncResolved && vnode.component.subTree.component) {\n setRef(rawRef, oldRawRef, parentSuspense, vnode.component.subTree);\n }\n return;\n }\n const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el;\n const value = isUnmount ? null : refValue;\n const { i: owner, r: ref } = rawRef;\n if (!!(process.env.NODE_ENV !== \"production\") && !owner) {\n warn$1(\n `Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.`\n );\n return;\n }\n const oldRef = oldRawRef && oldRawRef.r;\n const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs;\n const setupState = owner.setupState;\n const rawSetupState = toRaw(setupState);\n const canSetSetupRef = setupState === EMPTY_OBJ ? () => false : (key) => {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n if (hasOwn(rawSetupState, key) && !isRef(rawSetupState[key])) {\n warn$1(\n `Template ref \"${key}\" used on a non-ref value. It will not work in the production build.`\n );\n }\n if (knownTemplateRefs.has(rawSetupState[key])) {\n return false;\n }\n }\n return hasOwn(rawSetupState, key);\n };\n if (oldRef != null && oldRef !== ref) {\n if (isString(oldRef)) {\n refs[oldRef] = null;\n if (canSetSetupRef(oldRef)) {\n setupState[oldRef] = null;\n }\n } else if (isRef(oldRef)) {\n oldRef.value = null;\n }\n }\n if (isFunction(ref)) {\n callWithErrorHandling(ref, owner, 12, [value, refs]);\n } else {\n const _isString = isString(ref);\n const _isRef = isRef(ref);\n if (_isString || _isRef) {\n const doSet = () => {\n if (rawRef.f) {\n const existing = _isString ? canSetSetupRef(ref) ? setupState[ref] : refs[ref] : ref.value;\n if (isUnmount) {\n isArray(existing) && remove(existing, refValue);\n } else {\n if (!isArray(existing)) {\n if (_isString) {\n refs[ref] = [refValue];\n if (canSetSetupRef(ref)) {\n setupState[ref] = refs[ref];\n }\n } else {\n ref.value = [refValue];\n if (rawRef.k) refs[rawRef.k] = ref.value;\n }\n } else if (!existing.includes(refValue)) {\n existing.push(refValue);\n }\n }\n } else if (_isString) {\n refs[ref] = value;\n if (canSetSetupRef(ref)) {\n setupState[ref] = value;\n }\n } else if (_isRef) {\n ref.value = value;\n if (rawRef.k) refs[rawRef.k] = value;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n }\n };\n if (value) {\n doSet.id = -1;\n queuePostRenderEffect(doSet, parentSuspense);\n } else {\n doSet();\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n }\n }\n}\n\nlet hasLoggedMismatchError = false;\nconst logMismatchError = () => {\n if (hasLoggedMismatchError) {\n return;\n }\n console.error(\"Hydration completed but contains mismatches.\");\n hasLoggedMismatchError = true;\n};\nconst isSVGContainer = (container) => container.namespaceURI.includes(\"svg\") && container.tagName !== \"foreignObject\";\nconst isMathMLContainer = (container) => container.namespaceURI.includes(\"MathML\");\nconst getContainerType = (container) => {\n if (container.nodeType !== 1) return void 0;\n if (isSVGContainer(container)) return \"svg\";\n if (isMathMLContainer(container)) return \"mathml\";\n return void 0;\n};\nconst isComment = (node) => node.nodeType === 8;\nfunction createHydrationFunctions(rendererInternals) {\n const {\n mt: mountComponent,\n p: patch,\n o: {\n patchProp,\n createText,\n nextSibling,\n parentNode,\n remove,\n insert,\n createComment\n }\n } = rendererInternals;\n const hydrate = (vnode, container) => {\n if (!container.hasChildNodes()) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Attempting to hydrate existing markup but container is empty. Performing full mount instead.`\n );\n patch(null, vnode, container);\n flushPostFlushCbs();\n container._vnode = vnode;\n return;\n }\n hydrateNode(container.firstChild, vnode, null, null, null);\n flushPostFlushCbs();\n container._vnode = vnode;\n };\n const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => {\n optimized = optimized || !!vnode.dynamicChildren;\n const isFragmentStart = isComment(node) && node.data === \"[\";\n const onMismatch = () => handleMismatch(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n isFragmentStart\n );\n const { type, ref, shapeFlag, patchFlag } = vnode;\n let domType = node.nodeType;\n vnode.el = node;\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n def(node, \"__vnode\", vnode, true);\n def(node, \"__vueParentComponent\", parentComponent, true);\n }\n if (patchFlag === -2) {\n optimized = false;\n vnode.dynamicChildren = null;\n }\n let nextNode = null;\n switch (type) {\n case Text:\n if (domType !== 3) {\n if (vnode.children === \"\") {\n insert(vnode.el = createText(\"\"), parentNode(node), node);\n nextNode = node;\n } else {\n nextNode = onMismatch();\n }\n } else {\n if (node.data !== vnode.children) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration text mismatch in`,\n node.parentNode,\n `\n - rendered on server: ${JSON.stringify(\n node.data\n )}\n - expected on client: ${JSON.stringify(vnode.children)}`\n );\n logMismatchError();\n node.data = vnode.children;\n }\n nextNode = nextSibling(node);\n }\n break;\n case Comment:\n if (isTemplateNode(node)) {\n nextNode = nextSibling(node);\n replaceNode(\n vnode.el = node.content.firstChild,\n node,\n parentComponent\n );\n } else if (domType !== 8 || isFragmentStart) {\n nextNode = onMismatch();\n } else {\n nextNode = nextSibling(node);\n }\n break;\n case Static:\n if (isFragmentStart) {\n node = nextSibling(node);\n domType = node.nodeType;\n }\n if (domType === 1 || domType === 3) {\n nextNode = node;\n const needToAdoptContent = !vnode.children.length;\n for (let i = 0; i < vnode.staticCount; i++) {\n if (needToAdoptContent)\n vnode.children += nextNode.nodeType === 1 ? nextNode.outerHTML : nextNode.data;\n if (i === vnode.staticCount - 1) {\n vnode.anchor = nextNode;\n }\n nextNode = nextSibling(nextNode);\n }\n return isFragmentStart ? nextSibling(nextNode) : nextNode;\n } else {\n onMismatch();\n }\n break;\n case Fragment:\n if (!isFragmentStart) {\n nextNode = onMismatch();\n } else {\n nextNode = hydrateFragment(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n break;\n default:\n if (shapeFlag & 1) {\n if ((domType !== 1 || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) && !isTemplateNode(node)) {\n nextNode = onMismatch();\n } else {\n nextNode = hydrateElement(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n } else if (shapeFlag & 6) {\n vnode.slotScopeIds = slotScopeIds;\n const container = parentNode(node);\n if (isFragmentStart) {\n nextNode = locateClosingAnchor(node);\n } else if (isComment(node) && node.data === \"teleport start\") {\n nextNode = locateClosingAnchor(node, node.data, \"teleport end\");\n } else {\n nextNode = nextSibling(node);\n }\n mountComponent(\n vnode,\n container,\n null,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n optimized\n );\n if (isAsyncWrapper(vnode) && !vnode.type.__asyncResolved) {\n let subTree;\n if (isFragmentStart) {\n subTree = createVNode(Fragment);\n subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild;\n } else {\n subTree = node.nodeType === 3 ? createTextVNode(\"\") : createVNode(\"div\");\n }\n subTree.el = node;\n vnode.component.subTree = subTree;\n }\n } else if (shapeFlag & 64) {\n if (domType !== 8) {\n nextNode = onMismatch();\n } else {\n nextNode = vnode.type.hydrate(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized,\n rendererInternals,\n hydrateChildren\n );\n }\n } else if (shapeFlag & 128) {\n nextNode = vnode.type.hydrate(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n getContainerType(parentNode(node)),\n slotScopeIds,\n optimized,\n rendererInternals,\n hydrateNode\n );\n } else if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) {\n warn$1(\"Invalid HostVNode type:\", type, `(${typeof type})`);\n }\n }\n if (ref != null) {\n setRef(ref, null, parentSuspense, vnode);\n }\n return nextNode;\n };\n const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n optimized = optimized || !!vnode.dynamicChildren;\n const { type, props, patchFlag, shapeFlag, dirs, transition } = vnode;\n const forcePatch = type === \"input\" || type === \"option\";\n if (!!(process.env.NODE_ENV !== \"production\") || forcePatch || patchFlag !== -1) {\n if (dirs) {\n invokeDirectiveHook(vnode, null, parentComponent, \"created\");\n }\n let needCallTransitionHooks = false;\n if (isTemplateNode(el)) {\n needCallTransitionHooks = needTransition(\n null,\n // no need check parentSuspense in hydration\n transition\n ) && parentComponent && parentComponent.vnode.props && parentComponent.vnode.props.appear;\n const content = el.content.firstChild;\n if (needCallTransitionHooks) {\n const cls = content.getAttribute(\"class\");\n if (cls) content.$cls = cls;\n transition.beforeEnter(content);\n }\n replaceNode(content, el, parentComponent);\n vnode.el = el = content;\n }\n if (shapeFlag & 16 && // skip if element has innerHTML / textContent\n !(props && (props.innerHTML || props.textContent))) {\n let next = hydrateChildren(\n el.firstChild,\n vnode,\n el,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n let hasWarned = false;\n while (next) {\n if (!isMismatchAllowed(el, 1 /* CHILDREN */)) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n warn$1(\n `Hydration children mismatch on`,\n el,\n `\nServer rendered element contains more child nodes than client vdom.`\n );\n hasWarned = true;\n }\n logMismatchError();\n }\n const cur = next;\n next = next.nextSibling;\n remove(cur);\n }\n } else if (shapeFlag & 8) {\n let clientText = vnode.children;\n if (clientText[0] === \"\\n\" && (el.tagName === \"PRE\" || el.tagName === \"TEXTAREA\")) {\n clientText = clientText.slice(1);\n }\n if (el.textContent !== clientText) {\n if (!isMismatchAllowed(el, 0 /* TEXT */)) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration text content mismatch on`,\n el,\n `\n - rendered on server: ${el.textContent}\n - expected on client: ${vnode.children}`\n );\n logMismatchError();\n }\n el.textContent = vnode.children;\n }\n }\n if (props) {\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ || forcePatch || !optimized || patchFlag & (16 | 32)) {\n const isCustomElement = el.tagName.includes(\"-\");\n for (const key in props) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && // #11189 skip if this node has directives that have created hooks\n // as it could have mutated the DOM in any possible way\n !(dirs && dirs.some((d) => d.dir.created)) && propHasMismatch(el, key, props[key], vnode, parentComponent)) {\n logMismatchError();\n }\n if (forcePatch && (key.endsWith(\"value\") || key === \"indeterminate\") || isOn(key) && !isReservedProp(key) || // force hydrate v-bind with .prop modifiers\n key[0] === \".\" || isCustomElement) {\n patchProp(el, key, null, props[key], void 0, parentComponent);\n }\n }\n } else if (props.onClick) {\n patchProp(\n el,\n \"onClick\",\n null,\n props.onClick,\n void 0,\n parentComponent\n );\n } else if (patchFlag & 4 && isReactive(props.style)) {\n for (const key in props.style) props.style[key];\n }\n }\n let vnodeHooks;\n if (vnodeHooks = props && props.onVnodeBeforeMount) {\n invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n }\n if (dirs) {\n invokeDirectiveHook(vnode, null, parentComponent, \"beforeMount\");\n }\n if ((vnodeHooks = props && props.onVnodeMounted) || dirs || needCallTransitionHooks) {\n queueEffectWithSuspense(() => {\n vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n needCallTransitionHooks && transition.enter(el);\n dirs && invokeDirectiveHook(vnode, null, parentComponent, \"mounted\");\n }, parentSuspense);\n }\n }\n return el.nextSibling;\n };\n const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n optimized = optimized || !!parentVNode.dynamicChildren;\n const children = parentVNode.children;\n const l = children.length;\n let hasWarned = false;\n for (let i = 0; i < l; i++) {\n const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]);\n const isText = vnode.type === Text;\n if (node) {\n if (isText && !optimized) {\n if (i + 1 < l && normalizeVNode(children[i + 1]).type === Text) {\n insert(\n createText(\n node.data.slice(vnode.children.length)\n ),\n container,\n nextSibling(node)\n );\n node.data = vnode.children;\n }\n }\n node = hydrateNode(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n } else if (isText && !vnode.children) {\n insert(vnode.el = createText(\"\"), container);\n } else {\n if (!isMismatchAllowed(container, 1 /* CHILDREN */)) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n warn$1(\n `Hydration children mismatch on`,\n container,\n `\nServer rendered element contains fewer child nodes than client vdom.`\n );\n hasWarned = true;\n }\n logMismatchError();\n }\n patch(\n null,\n vnode,\n container,\n null,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n slotScopeIds\n );\n }\n }\n return node;\n };\n const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n const { slotScopeIds: fragmentSlotScopeIds } = vnode;\n if (fragmentSlotScopeIds) {\n slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;\n }\n const container = parentNode(node);\n const next = hydrateChildren(\n nextSibling(node),\n vnode,\n container,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n if (next && isComment(next) && next.data === \"]\") {\n return nextSibling(vnode.anchor = next);\n } else {\n logMismatchError();\n insert(vnode.anchor = createComment(`]`), container, next);\n return next;\n }\n };\n const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => {\n if (!isMismatchAllowed(node.parentElement, 1 /* CHILDREN */)) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration node mismatch:\n- rendered on server:`,\n node,\n node.nodeType === 3 ? `(text)` : isComment(node) && node.data === \"[\" ? `(start of fragment)` : ``,\n `\n- expected on client:`,\n vnode.type\n );\n logMismatchError();\n }\n vnode.el = null;\n if (isFragment) {\n const end = locateClosingAnchor(node);\n while (true) {\n const next2 = nextSibling(node);\n if (next2 && next2 !== end) {\n remove(next2);\n } else {\n break;\n }\n }\n }\n const next = nextSibling(node);\n const container = parentNode(node);\n remove(node);\n patch(\n null,\n vnode,\n container,\n next,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n slotScopeIds\n );\n if (parentComponent) {\n parentComponent.vnode.el = vnode.el;\n updateHOCHostEl(parentComponent, vnode.el);\n }\n return next;\n };\n const locateClosingAnchor = (node, open = \"[\", close = \"]\") => {\n let match = 0;\n while (node) {\n node = nextSibling(node);\n if (node && isComment(node)) {\n if (node.data === open) match++;\n if (node.data === close) {\n if (match === 0) {\n return nextSibling(node);\n } else {\n match--;\n }\n }\n }\n }\n return node;\n };\n const replaceNode = (newNode, oldNode, parentComponent) => {\n const parentNode2 = oldNode.parentNode;\n if (parentNode2) {\n parentNode2.replaceChild(newNode, oldNode);\n }\n let parent = parentComponent;\n while (parent) {\n if (parent.vnode.el === oldNode) {\n parent.vnode.el = parent.subTree.el = newNode;\n }\n parent = parent.parent;\n }\n };\n const isTemplateNode = (node) => {\n return node.nodeType === 1 && node.tagName === \"TEMPLATE\";\n };\n return [hydrate, hydrateNode];\n}\nfunction propHasMismatch(el, key, clientValue, vnode, instance) {\n let mismatchType;\n let mismatchKey;\n let actual;\n let expected;\n if (key === \"class\") {\n if (el.$cls) {\n actual = el.$cls;\n delete el.$cls;\n } else {\n actual = el.getAttribute(\"class\");\n }\n expected = normalizeClass(clientValue);\n if (!isSetEqual(toClassSet(actual || \"\"), toClassSet(expected))) {\n mismatchType = 2 /* CLASS */;\n mismatchKey = `class`;\n }\n } else if (key === \"style\") {\n actual = el.getAttribute(\"style\") || \"\";\n expected = isString(clientValue) ? clientValue : stringifyStyle(normalizeStyle(clientValue));\n const actualMap = toStyleMap(actual);\n const expectedMap = toStyleMap(expected);\n if (vnode.dirs) {\n for (const { dir, value } of vnode.dirs) {\n if (dir.name === \"show\" && !value) {\n expectedMap.set(\"display\", \"none\");\n }\n }\n }\n if (instance) {\n resolveCssVars(instance, vnode, expectedMap);\n }\n if (!isMapEqual(actualMap, expectedMap)) {\n mismatchType = 3 /* STYLE */;\n mismatchKey = \"style\";\n }\n } else if (el instanceof SVGElement && isKnownSvgAttr(key) || el instanceof HTMLElement && (isBooleanAttr(key) || isKnownHtmlAttr(key))) {\n if (isBooleanAttr(key)) {\n actual = el.hasAttribute(key);\n expected = includeBooleanAttr(clientValue);\n } else if (clientValue == null) {\n actual = el.hasAttribute(key);\n expected = false;\n } else {\n if (el.hasAttribute(key)) {\n actual = el.getAttribute(key);\n } else if (key === \"value\" && el.tagName === \"TEXTAREA\") {\n actual = el.value;\n } else {\n actual = false;\n }\n expected = isRenderableAttrValue(clientValue) ? String(clientValue) : false;\n }\n if (actual !== expected) {\n mismatchType = 4 /* ATTRIBUTE */;\n mismatchKey = key;\n }\n }\n if (mismatchType != null && !isMismatchAllowed(el, mismatchType)) {\n const format = (v) => v === false ? `(not rendered)` : `${mismatchKey}=\"${v}\"`;\n const preSegment = `Hydration ${MismatchTypeString[mismatchType]} mismatch on`;\n const postSegment = `\n - rendered on server: ${format(actual)}\n - expected on client: ${format(expected)}\n Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead.\n You should fix the source of the mismatch.`;\n {\n warn$1(preSegment, el, postSegment);\n }\n return true;\n }\n return false;\n}\nfunction toClassSet(str) {\n return new Set(str.trim().split(/\\s+/));\n}\nfunction isSetEqual(a, b) {\n if (a.size !== b.size) {\n return false;\n }\n for (const s of a) {\n if (!b.has(s)) {\n return false;\n }\n }\n return true;\n}\nfunction toStyleMap(str) {\n const styleMap = /* @__PURE__ */ new Map();\n for (const item of str.split(\";\")) {\n let [key, value] = item.split(\":\");\n key = key.trim();\n value = value && value.trim();\n if (key && value) {\n styleMap.set(key, value);\n }\n }\n return styleMap;\n}\nfunction isMapEqual(a, b) {\n if (a.size !== b.size) {\n return false;\n }\n for (const [key, value] of a) {\n if (value !== b.get(key)) {\n return false;\n }\n }\n return true;\n}\nfunction resolveCssVars(instance, vnode, expectedMap) {\n const root = instance.subTree;\n if (instance.getCssVars && (vnode === root || root && root.type === Fragment && root.children.includes(vnode))) {\n const cssVars = instance.getCssVars();\n for (const key in cssVars) {\n expectedMap.set(\n `--${getEscapedCssVarName(key, false)}`,\n String(cssVars[key])\n );\n }\n }\n if (vnode === root && instance.parent) {\n resolveCssVars(instance.parent, instance.vnode, expectedMap);\n }\n}\nconst allowMismatchAttr = \"data-allow-mismatch\";\nconst MismatchTypeString = {\n [0 /* TEXT */]: \"text\",\n [1 /* CHILDREN */]: \"children\",\n [2 /* CLASS */]: \"class\",\n [3 /* STYLE */]: \"style\",\n [4 /* ATTRIBUTE */]: \"attribute\"\n};\nfunction isMismatchAllowed(el, allowedType) {\n if (allowedType === 0 /* TEXT */ || allowedType === 1 /* CHILDREN */) {\n while (el && !el.hasAttribute(allowMismatchAttr)) {\n el = el.parentElement;\n }\n }\n const allowedAttr = el && el.getAttribute(allowMismatchAttr);\n if (allowedAttr == null) {\n return false;\n } else if (allowedAttr === \"\") {\n return true;\n } else {\n const list = allowedAttr.split(\",\");\n if (allowedType === 0 /* TEXT */ && list.includes(\"children\")) {\n return true;\n }\n return allowedAttr.split(\",\").includes(MismatchTypeString[allowedType]);\n }\n}\n\nconst requestIdleCallback = getGlobalThis().requestIdleCallback || ((cb) => setTimeout(cb, 1));\nconst cancelIdleCallback = getGlobalThis().cancelIdleCallback || ((id) => clearTimeout(id));\nconst hydrateOnIdle = (timeout = 1e4) => (hydrate) => {\n const id = requestIdleCallback(hydrate, { timeout });\n return () => cancelIdleCallback(id);\n};\nfunction elementIsVisibleInViewport(el) {\n const { top, left, bottom, right } = el.getBoundingClientRect();\n const { innerHeight, innerWidth } = window;\n return (top > 0 && top < innerHeight || bottom > 0 && bottom < innerHeight) && (left > 0 && left < innerWidth || right > 0 && right < innerWidth);\n}\nconst hydrateOnVisible = (opts) => (hydrate, forEach) => {\n const ob = new IntersectionObserver((entries) => {\n for (const e of entries) {\n if (!e.isIntersecting) continue;\n ob.disconnect();\n hydrate();\n break;\n }\n }, opts);\n forEach((el) => {\n if (!(el instanceof Element)) return;\n if (elementIsVisibleInViewport(el)) {\n hydrate();\n ob.disconnect();\n return false;\n }\n ob.observe(el);\n });\n return () => ob.disconnect();\n};\nconst hydrateOnMediaQuery = (query) => (hydrate) => {\n if (query) {\n const mql = matchMedia(query);\n if (mql.matches) {\n hydrate();\n } else {\n mql.addEventListener(\"change\", hydrate, { once: true });\n return () => mql.removeEventListener(\"change\", hydrate);\n }\n }\n};\nconst hydrateOnInteraction = (interactions = []) => (hydrate, forEach) => {\n if (isString(interactions)) interactions = [interactions];\n let hasHydrated = false;\n const doHydrate = (e) => {\n if (!hasHydrated) {\n hasHydrated = true;\n teardown();\n hydrate();\n e.target.dispatchEvent(new e.constructor(e.type, e));\n }\n };\n const teardown = () => {\n forEach((el) => {\n for (const i of interactions) {\n el.removeEventListener(i, doHydrate);\n }\n });\n };\n forEach((el) => {\n for (const i of interactions) {\n el.addEventListener(i, doHydrate, { once: true });\n }\n });\n return teardown;\n};\nfunction forEachElement(node, cb) {\n if (isComment(node) && node.data === \"[\") {\n let depth = 1;\n let next = node.nextSibling;\n while (next) {\n if (next.nodeType === 1) {\n const result = cb(next);\n if (result === false) {\n break;\n }\n } else if (isComment(next)) {\n if (next.data === \"]\") {\n if (--depth === 0) break;\n } else if (next.data === \"[\") {\n depth++;\n }\n }\n next = next.nextSibling;\n }\n } else {\n cb(node);\n }\n}\n\nconst isAsyncWrapper = (i) => !!i.type.__asyncLoader;\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction defineAsyncComponent(source) {\n if (isFunction(source)) {\n source = { loader: source };\n }\n const {\n loader,\n loadingComponent,\n errorComponent,\n delay = 200,\n hydrate: hydrateStrategy,\n timeout,\n // undefined = never times out\n suspensible = true,\n onError: userOnError\n } = source;\n let pendingRequest = null;\n let resolvedComp;\n let retries = 0;\n const retry = () => {\n retries++;\n pendingRequest = null;\n return load();\n };\n const load = () => {\n let thisRequest;\n return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => {\n err = err instanceof Error ? err : new Error(String(err));\n if (userOnError) {\n return new Promise((resolve, reject) => {\n const userRetry = () => resolve(retry());\n const userFail = () => reject(err);\n userOnError(err, userRetry, userFail, retries + 1);\n });\n } else {\n throw err;\n }\n }).then((comp) => {\n if (thisRequest !== pendingRequest && pendingRequest) {\n return pendingRequest;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && !comp) {\n warn$1(\n `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.`\n );\n }\n if (comp && (comp.__esModule || comp[Symbol.toStringTag] === \"Module\")) {\n comp = comp.default;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && comp && !isObject(comp) && !isFunction(comp)) {\n throw new Error(`Invalid async component load result: ${comp}`);\n }\n resolvedComp = comp;\n return comp;\n }));\n };\n return defineComponent({\n name: \"AsyncComponentWrapper\",\n __asyncLoader: load,\n __asyncHydrate(el, instance, hydrate) {\n let patched = false;\n const doHydrate = hydrateStrategy ? () => {\n const performHydrate = () => {\n if (!!(process.env.NODE_ENV !== \"production\") && patched) {\n warn$1(\n `Skipping lazy hydration for component '${getComponentName(resolvedComp)}': it was updated before lazy hydration performed.`\n );\n return;\n }\n hydrate();\n };\n const teardown = hydrateStrategy(\n performHydrate,\n (cb) => forEachElement(el, cb)\n );\n if (teardown) {\n (instance.bum || (instance.bum = [])).push(teardown);\n }\n (instance.u || (instance.u = [])).push(() => patched = true);\n } : hydrate;\n if (resolvedComp) {\n doHydrate();\n } else {\n load().then(() => !instance.isUnmounted && doHydrate());\n }\n },\n get __asyncResolved() {\n return resolvedComp;\n },\n setup() {\n const instance = currentInstance;\n markAsyncBoundary(instance);\n if (resolvedComp) {\n return () => createInnerComp(resolvedComp, instance);\n }\n const onError = (err) => {\n pendingRequest = null;\n handleError(\n err,\n instance,\n 13,\n !errorComponent\n );\n };\n if (suspensible && instance.suspense || isInSSRComponentSetup) {\n return load().then((comp) => {\n return () => createInnerComp(comp, instance);\n }).catch((err) => {\n onError(err);\n return () => errorComponent ? createVNode(errorComponent, {\n error: err\n }) : null;\n });\n }\n const loaded = ref(false);\n const error = ref();\n const delayed = ref(!!delay);\n if (delay) {\n setTimeout(() => {\n delayed.value = false;\n }, delay);\n }\n if (timeout != null) {\n setTimeout(() => {\n if (!loaded.value && !error.value) {\n const err = new Error(\n `Async component timed out after ${timeout}ms.`\n );\n onError(err);\n error.value = err;\n }\n }, timeout);\n }\n load().then(() => {\n loaded.value = true;\n if (instance.parent && isKeepAlive(instance.parent.vnode)) {\n instance.parent.update();\n }\n }).catch((err) => {\n onError(err);\n error.value = err;\n });\n return () => {\n if (loaded.value && resolvedComp) {\n return createInnerComp(resolvedComp, instance);\n } else if (error.value && errorComponent) {\n return createVNode(errorComponent, {\n error: error.value\n });\n } else if (loadingComponent && !delayed.value) {\n return createVNode(loadingComponent);\n }\n };\n }\n });\n}\nfunction createInnerComp(comp, parent) {\n const { ref: ref2, props, children, ce } = parent.vnode;\n const vnode = createVNode(comp, props, children);\n vnode.ref = ref2;\n vnode.ce = ce;\n delete parent.vnode.ce;\n return vnode;\n}\n\nconst isKeepAlive = (vnode) => vnode.type.__isKeepAlive;\nconst KeepAliveImpl = {\n name: `KeepAlive`,\n // Marker for special handling inside the renderer. We are not using a ===\n // check directly on KeepAlive in the renderer, because importing it directly\n // would prevent it from being tree-shaken.\n __isKeepAlive: true,\n props: {\n include: [String, RegExp, Array],\n exclude: [String, RegExp, Array],\n max: [String, Number]\n },\n setup(props, { slots }) {\n const instance = getCurrentInstance();\n const sharedContext = instance.ctx;\n if (!sharedContext.renderer) {\n return () => {\n const children = slots.default && slots.default();\n return children && children.length === 1 ? children[0] : children;\n };\n }\n const cache = /* @__PURE__ */ new Map();\n const keys = /* @__PURE__ */ new Set();\n let current = null;\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n instance.__v_cache = cache;\n }\n const parentSuspense = instance.suspense;\n const {\n renderer: {\n p: patch,\n m: move,\n um: _unmount,\n o: { createElement }\n }\n } = sharedContext;\n const storageContainer = createElement(\"div\");\n sharedContext.activate = (vnode, container, anchor, namespace, optimized) => {\n const instance2 = vnode.component;\n move(vnode, container, anchor, 0, parentSuspense);\n patch(\n instance2.vnode,\n vnode,\n container,\n anchor,\n instance2,\n parentSuspense,\n namespace,\n vnode.slotScopeIds,\n optimized\n );\n queuePostRenderEffect(() => {\n instance2.isDeactivated = false;\n if (instance2.a) {\n invokeArrayFns(instance2.a);\n }\n const vnodeHook = vnode.props && vnode.props.onVnodeMounted;\n if (vnodeHook) {\n invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n }\n }, parentSuspense);\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentAdded(instance2);\n }\n };\n sharedContext.deactivate = (vnode) => {\n const instance2 = vnode.component;\n invalidateMount(instance2.m);\n invalidateMount(instance2.a);\n move(vnode, storageContainer, null, 1, parentSuspense);\n queuePostRenderEffect(() => {\n if (instance2.da) {\n invokeArrayFns(instance2.da);\n }\n const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;\n if (vnodeHook) {\n invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n }\n instance2.isDeactivated = true;\n }, parentSuspense);\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentAdded(instance2);\n }\n if (!!(process.env.NODE_ENV !== \"production\") && true) {\n instance2.__keepAliveStorageContainer = storageContainer;\n }\n };\n function unmount(vnode) {\n resetShapeFlag(vnode);\n _unmount(vnode, instance, parentSuspense, true);\n }\n function pruneCache(filter) {\n cache.forEach((vnode, key) => {\n const name = getComponentName(vnode.type);\n if (name && !filter(name)) {\n pruneCacheEntry(key);\n }\n });\n }\n function pruneCacheEntry(key) {\n const cached = cache.get(key);\n if (cached && (!current || !isSameVNodeType(cached, current))) {\n unmount(cached);\n } else if (current) {\n resetShapeFlag(current);\n }\n cache.delete(key);\n keys.delete(key);\n }\n watch(\n () => [props.include, props.exclude],\n ([include, exclude]) => {\n include && pruneCache((name) => matches(include, name));\n exclude && pruneCache((name) => !matches(exclude, name));\n },\n // prune post-render after `current` has been updated\n { flush: \"post\", deep: true }\n );\n let pendingCacheKey = null;\n const cacheSubtree = () => {\n if (pendingCacheKey != null) {\n if (isSuspense(instance.subTree.type)) {\n queuePostRenderEffect(() => {\n cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n }, instance.subTree.suspense);\n } else {\n cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n }\n }\n };\n onMounted(cacheSubtree);\n onUpdated(cacheSubtree);\n onBeforeUnmount(() => {\n cache.forEach((cached) => {\n const { subTree, suspense } = instance;\n const vnode = getInnerChild(subTree);\n if (cached.type === vnode.type && cached.key === vnode.key) {\n resetShapeFlag(vnode);\n const da = vnode.component.da;\n da && queuePostRenderEffect(da, suspense);\n return;\n }\n unmount(cached);\n });\n });\n return () => {\n pendingCacheKey = null;\n if (!slots.default) {\n return current = null;\n }\n const children = slots.default();\n const rawVNode = children[0];\n if (children.length > 1) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`KeepAlive should contain exactly one component child.`);\n }\n current = null;\n return children;\n } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) {\n current = null;\n return rawVNode;\n }\n let vnode = getInnerChild(rawVNode);\n if (vnode.type === Comment) {\n current = null;\n return vnode;\n }\n const comp = vnode.type;\n const name = getComponentName(\n isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp\n );\n const { include, exclude, max } = props;\n if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) {\n vnode.shapeFlag &= -257;\n current = vnode;\n return rawVNode;\n }\n const key = vnode.key == null ? comp : vnode.key;\n const cachedVNode = cache.get(key);\n if (vnode.el) {\n vnode = cloneVNode(vnode);\n if (rawVNode.shapeFlag & 128) {\n rawVNode.ssContent = vnode;\n }\n }\n pendingCacheKey = key;\n if (cachedVNode) {\n vnode.el = cachedVNode.el;\n vnode.component = cachedVNode.component;\n if (vnode.transition) {\n setTransitionHooks(vnode, vnode.transition);\n }\n vnode.shapeFlag |= 512;\n keys.delete(key);\n keys.add(key);\n } else {\n keys.add(key);\n if (max && keys.size > parseInt(max, 10)) {\n pruneCacheEntry(keys.values().next().value);\n }\n }\n vnode.shapeFlag |= 256;\n current = vnode;\n return isSuspense(rawVNode.type) ? rawVNode : vnode;\n };\n }\n};\nconst KeepAlive = KeepAliveImpl;\nfunction matches(pattern, name) {\n if (isArray(pattern)) {\n return pattern.some((p) => matches(p, name));\n } else if (isString(pattern)) {\n return pattern.split(\",\").includes(name);\n } else if (isRegExp(pattern)) {\n pattern.lastIndex = 0;\n return pattern.test(name);\n }\n return false;\n}\nfunction onActivated(hook, target) {\n registerKeepAliveHook(hook, \"a\", target);\n}\nfunction onDeactivated(hook, target) {\n registerKeepAliveHook(hook, \"da\", target);\n}\nfunction registerKeepAliveHook(hook, type, target = currentInstance) {\n const wrappedHook = hook.__wdc || (hook.__wdc = () => {\n let current = target;\n while (current) {\n if (current.isDeactivated) {\n return;\n }\n current = current.parent;\n }\n return hook();\n });\n injectHook(type, wrappedHook, target);\n if (target) {\n let current = target.parent;\n while (current && current.parent) {\n if (isKeepAlive(current.parent.vnode)) {\n injectToKeepAliveRoot(wrappedHook, type, target, current);\n }\n current = current.parent;\n }\n }\n}\nfunction injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {\n const injected = injectHook(\n type,\n hook,\n keepAliveRoot,\n true\n /* prepend */\n );\n onUnmounted(() => {\n remove(keepAliveRoot[type], injected);\n }, target);\n}\nfunction resetShapeFlag(vnode) {\n vnode.shapeFlag &= -257;\n vnode.shapeFlag &= -513;\n}\nfunction getInnerChild(vnode) {\n return vnode.shapeFlag & 128 ? vnode.ssContent : vnode;\n}\n\nfunction injectHook(type, hook, target = currentInstance, prepend = false) {\n if (target) {\n const hooks = target[type] || (target[type] = []);\n const wrappedHook = hook.__weh || (hook.__weh = (...args) => {\n pauseTracking();\n const reset = setCurrentInstance(target);\n const res = callWithAsyncErrorHandling(hook, target, type, args);\n reset();\n resetTracking();\n return res;\n });\n if (prepend) {\n hooks.unshift(wrappedHook);\n } else {\n hooks.push(wrappedHook);\n }\n return wrappedHook;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n const apiName = toHandlerKey(ErrorTypeStrings$1[type].replace(/ hook$/, \"\"));\n warn$1(\n `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + (` If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` )\n );\n }\n}\nconst createHook = (lifecycle) => (hook, target = currentInstance) => {\n if (!isInSSRComponentSetup || lifecycle === \"sp\") {\n injectHook(lifecycle, (...args) => hook(...args), target);\n }\n};\nconst onBeforeMount = createHook(\"bm\");\nconst onMounted = createHook(\"m\");\nconst onBeforeUpdate = createHook(\n \"bu\"\n);\nconst onUpdated = createHook(\"u\");\nconst onBeforeUnmount = createHook(\n \"bum\"\n);\nconst onUnmounted = createHook(\"um\");\nconst onServerPrefetch = createHook(\n \"sp\"\n);\nconst onRenderTriggered = createHook(\"rtg\");\nconst onRenderTracked = createHook(\"rtc\");\nfunction onErrorCaptured(hook, target = currentInstance) {\n injectHook(\"ec\", hook, target);\n}\n\nconst COMPONENTS = \"components\";\nconst DIRECTIVES = \"directives\";\nfunction resolveComponent(name, maybeSelfReference) {\n return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;\n}\nconst NULL_DYNAMIC_COMPONENT = Symbol.for(\"v-ndc\");\nfunction resolveDynamicComponent(component) {\n if (isString(component)) {\n return resolveAsset(COMPONENTS, component, false) || component;\n } else {\n return component || NULL_DYNAMIC_COMPONENT;\n }\n}\nfunction resolveDirective(name) {\n return resolveAsset(DIRECTIVES, name);\n}\nfunction resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {\n const instance = currentRenderingInstance || currentInstance;\n if (instance) {\n const Component = instance.type;\n if (type === COMPONENTS) {\n const selfName = getComponentName(\n Component,\n false\n );\n if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {\n return Component;\n }\n }\n const res = (\n // local registration\n // check instance[type] first which is resolved for options API\n resolve(instance[type] || Component[type], name) || // global registration\n resolve(instance.appContext[type], name)\n );\n if (!res && maybeSelfReference) {\n return Component;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && warnMissing && !res) {\n const extra = type === COMPONENTS ? `\nIf this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;\n warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);\n }\n return res;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`\n );\n }\n}\nfunction resolve(registry, name) {\n return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);\n}\n\nfunction renderList(source, renderItem, cache, index) {\n let ret;\n const cached = cache && cache[index];\n const sourceIsArray = isArray(source);\n if (sourceIsArray || isString(source)) {\n const sourceIsReactiveArray = sourceIsArray && isReactive(source);\n let needsWrap = false;\n let isReadonlySource = false;\n if (sourceIsReactiveArray) {\n needsWrap = !isShallow(source);\n isReadonlySource = isReadonly(source);\n source = shallowReadArray(source);\n }\n ret = new Array(source.length);\n for (let i = 0, l = source.length; i < l; i++) {\n ret[i] = renderItem(\n needsWrap ? isReadonlySource ? toReadonly(toReactive(source[i])) : toReactive(source[i]) : source[i],\n i,\n void 0,\n cached && cached[i]\n );\n }\n } else if (typeof source === \"number\") {\n if (!!(process.env.NODE_ENV !== \"production\") && !Number.isInteger(source)) {\n warn$1(`The v-for range expect an integer value but got ${source}.`);\n }\n ret = new Array(source);\n for (let i = 0; i < source; i++) {\n ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]);\n }\n } else if (isObject(source)) {\n if (source[Symbol.iterator]) {\n ret = Array.from(\n source,\n (item, i) => renderItem(item, i, void 0, cached && cached[i])\n );\n } else {\n const keys = Object.keys(source);\n ret = new Array(keys.length);\n for (let i = 0, l = keys.length; i < l; i++) {\n const key = keys[i];\n ret[i] = renderItem(source[key], key, i, cached && cached[i]);\n }\n }\n } else {\n ret = [];\n }\n if (cache) {\n cache[index] = ret;\n }\n return ret;\n}\n\nfunction createSlots(slots, dynamicSlots) {\n for (let i = 0; i < dynamicSlots.length; i++) {\n const slot = dynamicSlots[i];\n if (isArray(slot)) {\n for (let j = 0; j < slot.length; j++) {\n slots[slot[j].name] = slot[j].fn;\n }\n } else if (slot) {\n slots[slot.name] = slot.key ? (...args) => {\n const res = slot.fn(...args);\n if (res) res.key = slot.key;\n return res;\n } : slot.fn;\n }\n }\n return slots;\n}\n\nfunction renderSlot(slots, name, props = {}, fallback, noSlotted) {\n if (currentRenderingInstance.ce || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.ce) {\n if (name !== \"default\") props.name = name;\n return openBlock(), createBlock(\n Fragment,\n null,\n [createVNode(\"slot\", props, fallback && fallback())],\n 64\n );\n }\n let slot = slots[name];\n if (!!(process.env.NODE_ENV !== \"production\") && slot && slot.length > 1) {\n warn$1(\n `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.`\n );\n slot = () => [];\n }\n if (slot && slot._c) {\n slot._d = false;\n }\n openBlock();\n const validSlotContent = slot && ensureValidVNode(slot(props));\n const slotKey = props.key || // slot content array of a dynamic conditional slot may have a branch\n // key attached in the `createSlots` helper, respect that\n validSlotContent && validSlotContent.key;\n const rendered = createBlock(\n Fragment,\n {\n key: (slotKey && !isSymbol(slotKey) ? slotKey : `_${name}`) + // #7256 force differentiate fallback content from actual content\n (!validSlotContent && fallback ? \"_fb\" : \"\")\n },\n validSlotContent || (fallback ? fallback() : []),\n validSlotContent && slots._ === 1 ? 64 : -2\n );\n if (!noSlotted && rendered.scopeId) {\n rendered.slotScopeIds = [rendered.scopeId + \"-s\"];\n }\n if (slot && slot._c) {\n slot._d = true;\n }\n return rendered;\n}\nfunction ensureValidVNode(vnodes) {\n return vnodes.some((child) => {\n if (!isVNode(child)) return true;\n if (child.type === Comment) return false;\n if (child.type === Fragment && !ensureValidVNode(child.children))\n return false;\n return true;\n }) ? vnodes : null;\n}\n\nfunction toHandlers(obj, preserveCaseIfNecessary) {\n const ret = {};\n if (!!(process.env.NODE_ENV !== \"production\") && !isObject(obj)) {\n warn$1(`v-on with no argument expects an object value.`);\n return ret;\n }\n for (const key in obj) {\n ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key];\n }\n return ret;\n}\n\nconst getPublicInstance = (i) => {\n if (!i) return null;\n if (isStatefulComponent(i)) return getComponentPublicInstance(i);\n return getPublicInstance(i.parent);\n};\nconst publicPropertiesMap = (\n // Move PURE marker to new line to workaround compiler discarding it\n // due to type annotation\n /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), {\n $: (i) => i,\n $el: (i) => i.vnode.el,\n $data: (i) => i.data,\n $props: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.props) : i.props,\n $attrs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.attrs) : i.attrs,\n $slots: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.slots) : i.slots,\n $refs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.refs) : i.refs,\n $parent: (i) => getPublicInstance(i.parent),\n $root: (i) => getPublicInstance(i.root),\n $host: (i) => i.ce,\n $emit: (i) => i.emit,\n $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type,\n $forceUpdate: (i) => i.f || (i.f = () => {\n queueJob(i.update);\n }),\n $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),\n $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP\n })\n);\nconst isReservedPrefix = (key) => key === \"_\" || key === \"$\";\nconst hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);\nconst PublicInstanceProxyHandlers = {\n get({ _: instance }, key) {\n if (key === \"__v_skip\") {\n return true;\n }\n const { ctx, setupState, data, props, accessCache, type, appContext } = instance;\n if (!!(process.env.NODE_ENV !== \"production\") && key === \"__isVue\") {\n return true;\n }\n let normalizedProps;\n if (key[0] !== \"$\") {\n const n = accessCache[key];\n if (n !== void 0) {\n switch (n) {\n case 1 /* SETUP */:\n return setupState[key];\n case 2 /* DATA */:\n return data[key];\n case 4 /* CONTEXT */:\n return ctx[key];\n case 3 /* PROPS */:\n return props[key];\n }\n } else if (hasSetupBinding(setupState, key)) {\n accessCache[key] = 1 /* SETUP */;\n return setupState[key];\n } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {\n accessCache[key] = 2 /* DATA */;\n return data[key];\n } else if (\n // only cache other properties when instance has declared (thus stable)\n // props\n (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key)\n ) {\n accessCache[key] = 3 /* PROPS */;\n return props[key];\n } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n accessCache[key] = 4 /* CONTEXT */;\n return ctx[key];\n } else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) {\n accessCache[key] = 0 /* OTHER */;\n }\n }\n const publicGetter = publicPropertiesMap[key];\n let cssModule, globalProperties;\n if (publicGetter) {\n if (key === \"$attrs\") {\n track(instance.attrs, \"get\", \"\");\n !!(process.env.NODE_ENV !== \"production\") && markAttrsAccessed();\n } else if (!!(process.env.NODE_ENV !== \"production\") && key === \"$slots\") {\n track(instance, \"get\", key);\n }\n return publicGetter(instance);\n } else if (\n // css module (injected by vue-loader)\n (cssModule = type.__cssModules) && (cssModule = cssModule[key])\n ) {\n return cssModule;\n } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n accessCache[key] = 4 /* CONTEXT */;\n return ctx[key];\n } else if (\n // global properties\n globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)\n ) {\n {\n return globalProperties[key];\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading\n // to infinite warning loop\n key.indexOf(\"__v\") !== 0)) {\n if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {\n warn$1(\n `Property ${JSON.stringify(\n key\n )} must be accessed via $data because it starts with a reserved character (\"$\" or \"_\") and is not proxied on the render context.`\n );\n } else if (instance === currentRenderingInstance) {\n warn$1(\n `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`\n );\n }\n }\n },\n set({ _: instance }, key, value) {\n const { data, setupState, ctx } = instance;\n if (hasSetupBinding(setupState, key)) {\n setupState[key] = value;\n return true;\n } else if (!!(process.env.NODE_ENV !== \"production\") && setupState.__isScriptSetup && hasOwn(setupState, key)) {\n warn$1(`Cannot mutate \n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n","\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","import { ref } from \"vue\";\nimport {\n applyHighlights,\n clearAllHighlights,\n} from \"../../directives/highlightDirective.js\";\n\n/**\n * Composable for orchestrating the entire highlighting system\n * This handles DOM operations, event management, and integration with stores\n */\nfunction useHighlightOrchestrator(\n smartCommentsSetup,\n commentsStore,\n smartCommentsEvents,\n) {\n const isRefreshing = ref(false);\n\n /**\n * Get the target element for highlights\n */\n const getTargetElement = () => {\n return document.getElementById(\"mw-content-text\") || document.body;\n };\n\n /**\n * Handle highlight click events\n */\n const handleHighlightClick = (event, commentData, position) => {\n if (event && event.preventDefault) {\n event.preventDefault();\n }\n\n // Trigger events\n smartCommentsEvents.triggerHighlightClicked(commentData, position);\n smartCommentsEvents.triggerCommentGroupOpen(commentData, position);\n\n commentsStore.openCommentDialog(commentData, position);\n };\n\n /**\n * Reload highlights and update comments store\n */\n const reloadHighlightsAndComments = async () => {\n if (isRefreshing.value) return;\n\n try {\n isRefreshing.value = true;\n const targetElement = getTargetElement();\n\n // Clear existing highlights first\n if (smartCommentsSetup.highlightedAnchors?.value) {\n clearAllHighlights(\n targetElement,\n smartCommentsSetup.highlightedAnchors.value,\n );\n }\n\n // Reload comments and highlights from server\n await smartCommentsSetup.loadAndSetHighlights();\n\n // Update the comments store with the freshly loaded comments\n if (smartCommentsSetup.comments?.value !== undefined) {\n commentsStore.setComments(smartCommentsSetup.comments.value);\n } else {\n console.warn(\n \"useHighlightOrchestrator: comments.value is undefined after loadAndSetHighlights, setting empty array\",\n );\n commentsStore.setComments([]);\n }\n\n // Apply the fresh highlights\n if (smartCommentsSetup.highlightedAnchors?.value) {\n applyHighlights(\n targetElement,\n smartCommentsSetup.highlightedAnchors.value,\n handleHighlightClick,\n );\n }\n\n // Restore active highlight if dialog is open\n if (commentsStore.isCommentDialogVisible && commentsStore.activeComment) {\n const commentId =\n commentsStore.activeComment.data_id || commentsStore.activeComment.id;\n commentsStore.setActiveHighlight(commentId);\n }\n } catch (error) {\n console.error(\n \"useHighlightOrchestrator: Error reloading highlights:\",\n error,\n );\n } finally {\n isRefreshing.value = false;\n }\n };\n\n /**\n * Clear all highlights\n */\n const clearHighlights = () => {\n const targetElement = getTargetElement();\n if (smartCommentsSetup.highlightedAnchors?.value) {\n clearAllHighlights(\n targetElement,\n smartCommentsSetup.highlightedAnchors.value,\n );\n }\n };\n\n /**\n * Setup highlight refresh event listener\n */\n const setupHighlightRefreshListener = () => {\n const handleHighlightRefresh = async () => {\n await reloadHighlightsAndComments();\n };\n\n document.addEventListener(\n \"smartcomments:refresh-highlights\",\n handleHighlightRefresh,\n );\n\n return () => {\n document.removeEventListener(\n \"smartcomments:refresh-highlights\",\n handleHighlightRefresh,\n );\n };\n };\n\n /**\n * Manual highlight reload (for debugging)\n */\n const reloadHighlights = async (isEnabled) => {\n if (!isEnabled) {\n console.warn(\n \"useHighlightOrchestrator: Cannot reload highlights, system is disabled.\",\n );\n return;\n }\n\n if (!smartCommentsSetup?.loadAndSetHighlights) {\n console.error(\n \"useHighlightOrchestrator: smartCommentsSetup.loadAndSetHighlights not available.\",\n );\n return;\n }\n\n try {\n clearHighlights();\n await reloadHighlightsAndComments();\n } catch (error) {\n console.error(\"useHighlightOrchestrator reloadHighlights: Error:\", error);\n }\n };\n\n return {\n isRefreshing,\n reloadHighlightsAndComments,\n clearHighlights,\n setupHighlightRefreshListener,\n reloadHighlights,\n handleHighlightClick,\n };\n}\n\nexport default useHighlightOrchestrator;\n","/**\n * Composable for managing keyboard shortcuts\n */\nfunction useKeyboardShortcuts(commentsStore) {\n /**\n * Handle keyboard shortcuts\n */\n const handleKeydown = (event) => {\n if (event.key === \"Escape\" && commentsStore.isCommentDialogVisible) {\n // If image modal is open, close it first\n if (commentsStore.isImageModalVisible) {\n commentsStore.closeImageModal();\n } else {\n // Otherwise close the comment dialog\n commentsStore.closeCommentDialog();\n }\n } else if (event.key === \"Delete\" && commentsStore.activeComment) {\n commentsStore.deleteComment(commentsStore.activeComment);\n } else if (event.key === \"ArrowDown\" && commentsStore.hasNextComment) {\n commentsStore.navigateComment(\"next\");\n } else if (event.key === \"ArrowUp\" && commentsStore.hasPreviousComment) {\n commentsStore.navigateComment(\"previous\");\n }\n };\n\n /**\n * Setup keyboard event listeners\n */\n const setupKeyboardShortcuts = () => {\n document.addEventListener(\"keydown\", handleKeydown);\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeydown);\n };\n };\n\n return {\n setupKeyboardShortcuts,\n };\n}\n\nexport default useKeyboardShortcuts;\n","import { watch } from \"vue\";\n\n/**\n * Composable for managing CSS custom properties\n */\nfunction useCustomProperties(messages) {\n /**\n * Update CSS custom property for annotate tooltip text\n */\n const updateAnnotateTooltipText = (text) => {\n document.documentElement.style.setProperty(\n \"--smartcomments-annotate-text\",\n `\"${text}\"`,\n );\n };\n\n /**\n * Update CSS custom property for button open text\n */\n const updateButtonOpenText = (text) => {\n document.documentElement.style.setProperty(\n \"--smartcomments-button-open-text\",\n `\"${text}\"`,\n );\n };\n\n /**\n * Setup watchers for CSS custom properties\n */\n const setupCustomPropertiesWatchers = () => {\n const annotateTooltipText = () => messages.msg(\"sic-annotate-tooltip\");\n const buttonOpenText = () => messages.msg(\"sic-button-open\");\n\n // Initial setup\n updateAnnotateTooltipText(annotateTooltipText());\n updateButtonOpenText(buttonOpenText());\n\n // Watch for changes (e.g., language changes)\n const stopAnnotateWatcher = watch(annotateTooltipText, (newText) => {\n updateAnnotateTooltipText(newText);\n });\n\n const stopButtonWatcher = watch(buttonOpenText, (newText) => {\n updateButtonOpenText(newText);\n });\n\n return () => {\n stopAnnotateWatcher();\n stopButtonWatcher();\n };\n };\n\n return {\n setupCustomPropertiesWatchers,\n updateAnnotateTooltipText,\n updateButtonOpenText,\n };\n}\n\nexport default useCustomProperties;\n","/**\n * Composable for managing SmartComments event handlers\n */\nfunction useSmartCommentsEventHandlers(\n smartCommentsEvents,\n EVENTS,\n store,\n commentsStore,\n highlightsManager,\n) {\n /**\n * Setup SmartComments events\n */\n const setupSmartCommentsEvents = () => {\n const cleanupFunctions = [];\n\n // Listen for debug mode events\n cleanupFunctions.push(\n smartCommentsEvents.on(EVENTS.DEBUG_MODE, (event) => {\n if (event.detail.enabled && !store.isEnabled) {\n store.setEnabled(true);\n }\n }),\n );\n\n // Listen for selection active events\n cleanupFunctions.push(\n smartCommentsEvents.on(EVENTS.SELECTION_ACTIVE, (event) => {\n // Close any open comment dialogs when a new selection is made\n if (commentsStore.isCommentDialogVisible) {\n commentsStore.closeCommentDialog();\n }\n }),\n );\n\n // Listen for open comment events\n cleanupFunctions.push(\n smartCommentsEvents.on(EVENTS.OPEN_COMMENT_ID, (event) => {\n if (event.detail.commentId) {\n // Handle opening specific comment\n commentsStore.openCommentDialogById(event.detail.commentId);\n }\n }),\n );\n\n // Listen for open comment with position events\n cleanupFunctions.push(\n smartCommentsEvents.on(EVENTS.OPEN_COMMENT_WITH_POSITION, (event) => {\n if (event.detail.commentId && event.detail.position) {\n // Handle opening specific comment with custom position\n commentsStore.openCommentDialogByIdWithPosition(event.detail.commentId, event.detail.position);\n }\n }),\n );\n\n // Listen for comment created events\n cleanupFunctions.push(\n smartCommentsEvents.on(EVENTS.COMMENT_CREATED, (event) => {\n if (highlightsManager) {\n highlightsManager.reloadHighlightsAndComments();\n }\n }),\n );\n\n return () => {\n cleanupFunctions.forEach((cleanup) => cleanup());\n };\n };\n\n return {\n setupSmartCommentsEvents,\n };\n}\n\nexport default useSmartCommentsEventHandlers;\n","/**\n * Composable for managing URL navigation and parameters\n */\nfunction useUrlNavigation(commentsStore) {\n /**\n * Setup URL navigation handlers\n */\n const setupUrlNavigation = (isEnabled) => {\n // Handle URL changes (back/forward navigation)\n const handlePopState = async () => {\n if (isEnabled()) {\n await commentsStore.checkAndOpenCommentFromUrl();\n }\n };\n\n window.addEventListener(\"popstate\", handlePopState);\n\n return () => {\n window.removeEventListener(\"popstate\", handlePopState);\n };\n };\n\n /**\n * Check URL parameters and open comment (for debugging)\n */\n const checkUrlParameters = async (isEnabled) => {\n if (!isEnabled()) {\n console.warn(\n \"useUrlNavigation: Cannot check URL parameters, system is disabled.\",\n );\n return;\n }\n await commentsStore.checkAndOpenCommentFromUrl();\n };\n\n return {\n setupUrlNavigation,\n checkUrlParameters,\n };\n}\n\nexport default useUrlNavigation;\n","/**\n * Rangy, a cross-browser JavaScript range and selection library\n * https://github.com/timdown/rangy\n *\n * Copyright 2024, Tim Down\n * Licensed under the MIT license.\n * Version: 1.3.2\n * Build date: 2 November 2024\n */\n\n(function(factory, root) {\n if (typeof define == \"function\" && define.amd) {\n // AMD. Register as an anonymous module.\n define(factory);\n } else if (typeof module != \"undefined\" && typeof exports == \"object\") {\n // Node/CommonJS style\n module.exports = factory();\n } else {\n // No AMD or CommonJS support so we place Rangy in (probably) the global variable\n root.rangy = factory();\n }\n})(function() {\n\n var OBJECT = \"object\", FUNCTION = \"function\", UNDEFINED = \"undefined\";\n\n // Minimal set of properties required for DOM Level 2 Range compliance. Comparison constants such as START_TO_START\n // are omitted because ranges in KHTML do not have them but otherwise work perfectly well. See issue 113.\n var domRangeProperties = [\"startContainer\", \"startOffset\", \"endContainer\", \"endOffset\", \"collapsed\",\n \"commonAncestorContainer\"];\n\n // Minimal set of methods required for DOM Level 2 Range compliance\n var domRangeMethods = [\"setStart\", \"setStartBefore\", \"setStartAfter\", \"setEnd\", \"setEndBefore\",\n \"setEndAfter\", \"collapse\", \"selectNode\", \"selectNodeContents\", \"compareBoundaryPoints\", \"deleteContents\",\n \"extractContents\", \"cloneContents\", \"insertNode\", \"surroundContents\", \"cloneRange\", \"toString\", \"detach\"];\n\n var textRangeProperties = [\"boundingHeight\", \"boundingLeft\", \"boundingTop\", \"boundingWidth\", \"htmlText\", \"text\"];\n\n // Subset of TextRange's full set of methods that we're interested in\n var textRangeMethods = [\"collapse\", \"compareEndPoints\", \"duplicate\", \"moveToElementText\", \"parentElement\", \"select\",\n \"setEndPoint\", \"getBoundingClientRect\"];\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Trio of functions taken from Peter Michaux's article:\n // http://peter.michaux.ca/articles/feature-detection-state-of-the-art-browser-scripting\n function isHostMethod(o, p) {\n var t = typeof o[p];\n return t == FUNCTION || (!!(t == OBJECT && o[p])) || t == \"unknown\";\n }\n\n function isHostObject(o, p) {\n return !!(typeof o[p] == OBJECT && o[p]);\n }\n\n function isHostProperty(o, p) {\n return typeof o[p] != UNDEFINED;\n }\n\n // Creates a convenience function to save verbose repeated calls to tests functions\n function createMultiplePropertyTest(testFunc) {\n return function(o, props) {\n var i = props.length;\n while (i--) {\n if (!testFunc(o, props[i])) {\n return false;\n }\n }\n return true;\n };\n }\n\n // Next trio of functions are a convenience to save verbose repeated calls to previous two functions\n var areHostMethods = createMultiplePropertyTest(isHostMethod);\n var areHostObjects = createMultiplePropertyTest(isHostObject);\n var areHostProperties = createMultiplePropertyTest(isHostProperty);\n\n function isTextRange(range) {\n return range && areHostMethods(range, textRangeMethods) && areHostProperties(range, textRangeProperties);\n }\n\n function getBody(doc) {\n return isHostObject(doc, \"body\") ? doc.body : doc.getElementsByTagName(\"body\")[0];\n }\n\n var forEach = [].forEach ?\n function(arr, func) {\n arr.forEach(func);\n } :\n function(arr, func) {\n for (var i = 0, len = arr.length; i < len; ++i) {\n func(arr[i], i);\n }\n };\n\n var modules = {};\n\n var isBrowser = (typeof window != UNDEFINED && typeof document != UNDEFINED);\n\n var util = {\n isHostMethod: isHostMethod,\n isHostObject: isHostObject,\n isHostProperty: isHostProperty,\n areHostMethods: areHostMethods,\n areHostObjects: areHostObjects,\n areHostProperties: areHostProperties,\n isTextRange: isTextRange,\n getBody: getBody,\n forEach: forEach\n };\n\n var api = {\n version: \"1.3.2\",\n initialized: false,\n isBrowser: isBrowser,\n supported: true,\n util: util,\n features: {},\n modules: modules,\n config: {\n alertOnFail: false,\n alertOnWarn: false,\n preferTextRange: false,\n autoInitialize: (typeof rangyAutoInitialize == UNDEFINED) ? true : rangyAutoInitialize\n }\n };\n\n function consoleLog(msg) {\n if (typeof console != UNDEFINED && isHostMethod(console, \"log\")) {\n console.log(msg);\n }\n }\n\n function alertOrLog(msg, shouldAlert) {\n if (isBrowser && shouldAlert) {\n alert(msg);\n } else {\n consoleLog(msg);\n }\n }\n\n function fail(reason) {\n api.initialized = true;\n api.supported = false;\n alertOrLog(\"Rangy is not supported in this environment. Reason: \" + reason, api.config.alertOnFail);\n }\n\n api.fail = fail;\n\n function warn(msg) {\n alertOrLog(\"Rangy warning: \" + msg, api.config.alertOnWarn);\n }\n\n api.warn = warn;\n\n // Add utility extend() method\n var extend;\n if ({}.hasOwnProperty) {\n util.extend = extend = function(obj, props, deep) {\n var o, p;\n for (var i in props) {\n if (i === \"__proto__\" || i === \"constructor\" || i === \"prototype\") {\n continue;\n }\n if (props.hasOwnProperty(i)) {\n o = obj[i];\n p = props[i];\n if (deep && o !== null && typeof o == \"object\" && p !== null && typeof p == \"object\") {\n extend(o, p, true);\n }\n obj[i] = p;\n }\n }\n // Special case for toString, which does not show up in for...in loops in IE <= 8\n if (props.hasOwnProperty(\"toString\")) {\n obj.toString = props.toString;\n }\n return obj;\n };\n\n util.createOptions = function(optionsParam, defaults) {\n var options = {};\n extend(options, defaults);\n if (optionsParam) {\n extend(options, optionsParam);\n }\n return options;\n };\n } else {\n fail(\"hasOwnProperty not supported\");\n }\n\n // Test whether we're in a browser and bail out if not\n if (!isBrowser) {\n fail(\"Rangy can only run in a browser\");\n }\n\n // Test whether Array.prototype.slice can be relied on for NodeLists and use an alternative toArray() if not\n (function() {\n var toArray;\n\n if (isBrowser) {\n var el = document.createElement(\"div\");\n el.appendChild(document.createElement(\"span\"));\n var slice = [].slice;\n try {\n if (slice.call(el.childNodes, 0)[0].nodeType == 1) {\n toArray = function(arrayLike) {\n return slice.call(arrayLike, 0);\n };\n }\n } catch (e) {}\n }\n\n if (!toArray) {\n toArray = function(arrayLike) {\n var arr = [];\n for (var i = 0, len = arrayLike.length; i < len; ++i) {\n arr[i] = arrayLike[i];\n }\n return arr;\n };\n }\n\n util.toArray = toArray;\n })();\n\n // Very simple event handler wrapper function that doesn't attempt to solve issues such as \"this\" handling or\n // normalization of event properties because we don't need this.\n var addListener;\n if (isBrowser) {\n if (isHostMethod(document, \"addEventListener\")) {\n addListener = function(obj, eventType, listener) {\n obj.addEventListener(eventType, listener, false);\n };\n } else if (isHostMethod(document, \"attachEvent\")) {\n addListener = function(obj, eventType, listener) {\n obj.attachEvent(\"on\" + eventType, listener);\n };\n } else {\n fail(\"Document does not have required addEventListener or attachEvent method\");\n }\n\n util.addListener = addListener;\n }\n\n var initListeners = [];\n\n function getErrorDesc(ex) {\n return ex.message || ex.description || String(ex);\n }\n\n // Initialization\n function init() {\n if (!isBrowser || api.initialized) {\n return;\n }\n var testRange;\n var implementsDomRange = false, implementsTextRange = false;\n\n // First, perform basic feature tests\n\n if (isHostMethod(document, \"createRange\")) {\n testRange = document.createRange();\n if (areHostMethods(testRange, domRangeMethods) && areHostProperties(testRange, domRangeProperties)) {\n implementsDomRange = true;\n }\n }\n\n var body = getBody(document);\n if (!body || body.nodeName.toLowerCase() != \"body\") {\n fail(\"No body element found\");\n return;\n }\n\n if (body && isHostMethod(body, \"createTextRange\")) {\n testRange = body.createTextRange();\n if (isTextRange(testRange)) {\n implementsTextRange = true;\n }\n }\n\n if (!implementsDomRange && !implementsTextRange) {\n fail(\"Neither Range nor TextRange are available\");\n return;\n }\n\n api.initialized = true;\n api.features = {\n implementsDomRange: implementsDomRange,\n implementsTextRange: implementsTextRange\n };\n\n // Initialize modules\n var module, errorMessage;\n for (var moduleName in modules) {\n if ( (module = modules[moduleName]) instanceof Module ) {\n module.init(module, api);\n }\n }\n\n // Call init listeners\n for (var i = 0, len = initListeners.length; i < len; ++i) {\n try {\n initListeners[i](api);\n } catch (ex) {\n errorMessage = \"Rangy init listener threw an exception. Continuing. Detail: \" + getErrorDesc(ex);\n consoleLog(errorMessage);\n }\n }\n }\n\n function deprecationNotice(deprecated, replacement, module) {\n if (module) {\n deprecated += \" in module \" + module.name;\n }\n api.warn(\"DEPRECATED: \" + deprecated + \" is deprecated. Please use \" +\n replacement + \" instead.\");\n }\n\n function createAliasForDeprecatedMethod(owner, deprecated, replacement, module) {\n owner[deprecated] = function() {\n deprecationNotice(deprecated, replacement, module);\n return owner[replacement].apply(owner, util.toArray(arguments));\n };\n }\n\n util.deprecationNotice = deprecationNotice;\n util.createAliasForDeprecatedMethod = createAliasForDeprecatedMethod;\n\n // Allow external scripts to initialize this library in case it's loaded after the document has loaded\n api.init = init;\n\n // Execute listener immediately if already initialized\n api.addInitListener = function(listener) {\n if (api.initialized) {\n listener(api);\n } else {\n initListeners.push(listener);\n }\n };\n\n var shimListeners = [];\n\n api.addShimListener = function(listener) {\n shimListeners.push(listener);\n };\n\n function shim(win) {\n win = win || window;\n init();\n\n // Notify listeners\n for (var i = 0, len = shimListeners.length; i < len; ++i) {\n shimListeners[i](win);\n }\n }\n\n if (isBrowser) {\n api.shim = api.createMissingNativeApi = shim;\n createAliasForDeprecatedMethod(api, \"createMissingNativeApi\", \"shim\");\n }\n\n function Module(name, dependencies, initializer) {\n this.name = name;\n this.dependencies = dependencies;\n this.initialized = false;\n this.supported = false;\n this.initializer = initializer;\n }\n\n Module.prototype = {\n init: function() {\n var requiredModuleNames = this.dependencies || [];\n for (var i = 0, len = requiredModuleNames.length, requiredModule, moduleName; i < len; ++i) {\n moduleName = requiredModuleNames[i];\n\n requiredModule = modules[moduleName];\n if (!requiredModule || !(requiredModule instanceof Module)) {\n throw new Error(\"required module '\" + moduleName + \"' not found\");\n }\n\n requiredModule.init();\n\n if (!requiredModule.supported) {\n throw new Error(\"required module '\" + moduleName + \"' not supported\");\n }\n }\n\n // Now run initializer\n this.initializer(this);\n },\n\n fail: function(reason) {\n this.initialized = true;\n this.supported = false;\n throw new Error(reason);\n },\n\n warn: function(msg) {\n api.warn(\"Module \" + this.name + \": \" + msg);\n },\n\n deprecationNotice: function(deprecated, replacement) {\n api.warn(\"DEPRECATED: \" + deprecated + \" in module \" + this.name + \" is deprecated. Please use \" +\n replacement + \" instead\");\n },\n\n createError: function(msg) {\n return new Error(\"Error in Rangy \" + this.name + \" module: \" + msg);\n }\n };\n\n function createModule(name, dependencies, initFunc) {\n var newModule = new Module(name, dependencies, function(module) {\n if (!module.initialized) {\n module.initialized = true;\n try {\n initFunc(api, module);\n module.supported = true;\n } catch (ex) {\n var errorMessage = \"Module '\" + name + \"' failed to load: \" + getErrorDesc(ex);\n consoleLog(errorMessage);\n if (ex.stack) {\n consoleLog(ex.stack);\n }\n }\n }\n });\n modules[name] = newModule;\n return newModule;\n }\n\n api.createModule = function(name) {\n // Allow 2 or 3 arguments (second argument is an optional array of dependencies)\n var initFunc, dependencies;\n if (arguments.length == 2) {\n initFunc = arguments[1];\n dependencies = [];\n } else {\n initFunc = arguments[2];\n dependencies = arguments[1];\n }\n\n var module = createModule(name, dependencies, initFunc);\n\n // Initialize the module immediately if the core is already initialized\n if (api.initialized && api.supported) {\n module.init();\n }\n };\n\n api.createCoreModule = function(name, dependencies, initFunc) {\n createModule(name, dependencies, initFunc);\n };\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Ensure rangy.rangePrototype and rangy.selectionPrototype are available immediately\n\n function RangePrototype() {}\n api.RangePrototype = RangePrototype;\n api.rangePrototype = new RangePrototype();\n\n function SelectionPrototype() {}\n api.selectionPrototype = new SelectionPrototype();\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // DOM utility methods used by Rangy\n api.createCoreModule(\"DomUtil\", [], function(api, module) {\n var UNDEF = \"undefined\";\n var util = api.util;\n var getBody = util.getBody;\n\n // Perform feature tests\n if (!util.areHostMethods(document, [\"createDocumentFragment\", \"createElement\", \"createTextNode\"])) {\n module.fail(\"document missing a Node creation method\");\n }\n\n if (!util.isHostMethod(document, \"getElementsByTagName\")) {\n module.fail(\"document missing getElementsByTagName method\");\n }\n\n var el = document.createElement(\"div\");\n if (!util.areHostMethods(el, [\"insertBefore\", \"appendChild\", \"cloneNode\"] ||\n !util.areHostObjects(el, [\"previousSibling\", \"nextSibling\", \"childNodes\", \"parentNode\"]))) {\n module.fail(\"Incomplete Element implementation\");\n }\n\n // innerHTML is required for Range's createContextualFragment method\n if (!util.isHostProperty(el, \"innerHTML\")) {\n module.fail(\"Element is missing innerHTML property\");\n }\n\n var textNode = document.createTextNode(\"test\");\n if (!util.areHostMethods(textNode, [\"splitText\", \"deleteData\", \"insertData\", \"appendData\", \"cloneNode\"] ||\n !util.areHostObjects(el, [\"previousSibling\", \"nextSibling\", \"childNodes\", \"parentNode\"]) ||\n !util.areHostProperties(textNode, [\"data\"]))) {\n module.fail(\"Incomplete Text Node implementation\");\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Removed use of indexOf because of a bizarre bug in Opera that is thrown in one of the Acid3 tests. I haven't been\n // able to replicate it outside of the test. The bug is that indexOf returns -1 when called on an Array that\n // contains just the document as a single element and the value searched for is the document.\n var arrayContains = /*Array.prototype.indexOf ?\n function(arr, val) {\n return arr.indexOf(val) > -1;\n }:*/\n\n function(arr, val) {\n var i = arr.length;\n while (i--) {\n if (arr[i] === val) {\n return true;\n }\n }\n return false;\n };\n\n // Opera 11 puts HTML elements in the null namespace, it seems, and IE 7 has undefined namespaceURI\n function isHtmlNamespace(node) {\n var ns;\n return typeof node.namespaceURI == UNDEF || ((ns = node.namespaceURI) === null || ns == \"http://www.w3.org/1999/xhtml\");\n }\n\n function parentElement(node) {\n var parent = node.parentNode;\n return (parent.nodeType == 1) ? parent : null;\n }\n\n function getNodeIndex(node) {\n var i = 0;\n while( (node = node.previousSibling) ) {\n ++i;\n }\n return i;\n }\n\n function getNodeLength(node) {\n switch (node.nodeType) {\n case 7:\n case 10:\n return 0;\n case 3:\n case 8:\n return node.length;\n default:\n return node.childNodes.length;\n }\n }\n\n function getCommonAncestor(node1, node2) {\n var ancestors = [], n;\n for (n = node1; n; n = n.parentNode) {\n ancestors.push(n);\n }\n\n for (n = node2; n; n = n.parentNode) {\n if (arrayContains(ancestors, n)) {\n return n;\n }\n }\n\n return null;\n }\n\n function isAncestorOf(ancestor, descendant, selfIsAncestor) {\n var n = selfIsAncestor ? descendant : descendant.parentNode;\n while (n) {\n if (n === ancestor) {\n return true;\n } else {\n n = n.parentNode;\n }\n }\n return false;\n }\n\n function isOrIsAncestorOf(ancestor, descendant) {\n return isAncestorOf(ancestor, descendant, true);\n }\n\n function getClosestAncestorIn(node, ancestor, selfIsAncestor) {\n var p, n = selfIsAncestor ? node : node.parentNode;\n while (n) {\n p = n.parentNode;\n if (p === ancestor) {\n return n;\n }\n n = p;\n }\n return null;\n }\n\n function isCharacterDataNode(node) {\n var t = node.nodeType;\n return t == 3 || t == 4 || t == 8 ; // Text, CDataSection or Comment\n }\n\n function isTextOrCommentNode(node) {\n if (!node) {\n return false;\n }\n var t = node.nodeType;\n return t == 3 || t == 8 ; // Text or Comment\n }\n\n function insertAfter(node, precedingNode) {\n var nextNode = precedingNode.nextSibling, parent = precedingNode.parentNode;\n if (nextNode) {\n parent.insertBefore(node, nextNode);\n } else {\n parent.appendChild(node);\n }\n return node;\n }\n\n // Note that we cannot use splitText() because it is bugridden in IE 9.\n function splitDataNode(node, index, positionsToPreserve) {\n var newNode = node.cloneNode(false);\n newNode.deleteData(0, index);\n node.deleteData(index, node.length - index);\n insertAfter(newNode, node);\n\n // Preserve positions\n if (positionsToPreserve) {\n for (var i = 0, position; position = positionsToPreserve[i++]; ) {\n // Handle case where position was inside the portion of node after the split point\n if (position.node == node && position.offset > index) {\n position.node = newNode;\n position.offset -= index;\n }\n // Handle the case where the position is a node offset within node's parent\n else if (position.node == node.parentNode && position.offset > getNodeIndex(node)) {\n ++position.offset;\n }\n }\n }\n return newNode;\n }\n\n function getDocument(node) {\n if (node.nodeType == 9) {\n return node;\n } else if (typeof node.ownerDocument != UNDEF) {\n return node.ownerDocument;\n } else if (typeof node.document != UNDEF) {\n return node.document;\n } else if (node.parentNode) {\n return getDocument(node.parentNode);\n } else {\n throw module.createError(\"getDocument: no document found for node\");\n }\n }\n\n function getWindow(node) {\n var doc = getDocument(node);\n if (typeof doc.defaultView != UNDEF) {\n return doc.defaultView;\n } else if (typeof doc.parentWindow != UNDEF) {\n return doc.parentWindow;\n } else {\n throw module.createError(\"Cannot get a window object for node\");\n }\n }\n\n function getIframeDocument(iframeEl) {\n if (typeof iframeEl.contentDocument != UNDEF) {\n return iframeEl.contentDocument;\n } else if (typeof iframeEl.contentWindow != UNDEF) {\n return iframeEl.contentWindow.document;\n } else {\n throw module.createError(\"getIframeDocument: No Document object found for iframe element\");\n }\n }\n\n function getIframeWindow(iframeEl) {\n if (typeof iframeEl.contentWindow != UNDEF) {\n return iframeEl.contentWindow;\n } else if (typeof iframeEl.contentDocument != UNDEF) {\n return iframeEl.contentDocument.defaultView;\n } else {\n throw module.createError(\"getIframeWindow: No Window object found for iframe element\");\n }\n }\n\n // This looks bad. Is it worth it?\n function isWindow(obj) {\n return obj && util.isHostMethod(obj, \"setTimeout\") && util.isHostObject(obj, \"document\");\n }\n\n function getContentDocument(obj, module, methodName) {\n var doc;\n\n if (!obj) {\n doc = document;\n }\n\n // Test if a DOM node has been passed and obtain a document object for it if so\n else if (util.isHostProperty(obj, \"nodeType\")) {\n doc = (obj.nodeType == 1 && obj.tagName.toLowerCase() == \"iframe\") ?\n getIframeDocument(obj) : getDocument(obj);\n }\n\n // Test if the doc parameter appears to be a Window object\n else if (isWindow(obj)) {\n doc = obj.document;\n }\n\n if (!doc) {\n throw module.createError(methodName + \"(): Parameter must be a Window object or DOM node\");\n }\n\n return doc;\n }\n\n function getRootContainer(node) {\n var parent;\n while ( (parent = node.parentNode) ) {\n node = parent;\n }\n return node;\n }\n\n function comparePoints(nodeA, offsetA, nodeB, offsetB) {\n // See http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Comparing\n var nodeC, root, childA, childB, n;\n if (nodeA == nodeB) {\n // Case 1: nodes are the same\n return offsetA === offsetB ? 0 : (offsetA < offsetB) ? -1 : 1;\n } else if ( (nodeC = getClosestAncestorIn(nodeB, nodeA, true)) ) {\n // Case 2: node C (container B or an ancestor) is a child node of A\n return offsetA <= getNodeIndex(nodeC) ? -1 : 1;\n } else if ( (nodeC = getClosestAncestorIn(nodeA, nodeB, true)) ) {\n // Case 3: node C (container A or an ancestor) is a child node of B\n return getNodeIndex(nodeC) < offsetB ? -1 : 1;\n } else {\n root = getCommonAncestor(nodeA, nodeB);\n if (!root) {\n throw new Error(\"comparePoints error: nodes have no common ancestor\");\n }\n\n // Case 4: containers are siblings or descendants of siblings\n childA = (nodeA === root) ? root : getClosestAncestorIn(nodeA, root, true);\n childB = (nodeB === root) ? root : getClosestAncestorIn(nodeB, root, true);\n\n if (childA === childB) {\n // This shouldn't be possible\n throw module.createError(\"comparePoints got to case 4 and childA and childB are the same!\");\n } else {\n n = root.firstChild;\n while (n) {\n if (n === childA) {\n return -1;\n } else if (n === childB) {\n return 1;\n }\n n = n.nextSibling;\n }\n }\n }\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Test for IE's crash (IE 6/7) or exception (IE >= 8) when a reference to garbage-collected text node is queried\n var crashyTextNodes = false;\n\n function isBrokenNode(node) {\n var n;\n try {\n n = node.parentNode;\n return false;\n } catch (e) {\n return true;\n }\n }\n\n (function() {\n var el = document.createElement(\"b\");\n el.innerHTML = \"1\";\n var textNode = el.firstChild;\n el.innerHTML = \"
\";\n crashyTextNodes = isBrokenNode(textNode);\n\n api.features.crashyTextNodes = crashyTextNodes;\n })();\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n function inspectNode(node) {\n if (!node) {\n return \"[No node]\";\n }\n if (crashyTextNodes && isBrokenNode(node)) {\n return \"[Broken node]\";\n }\n if (isCharacterDataNode(node)) {\n return '\"' + node.data + '\"';\n }\n if (node.nodeType == 1) {\n var idAttr = node.id ? ' id=\"' + node.id + '\"' : \"\";\n return \"<\" + node.nodeName + idAttr + \">[index:\" + getNodeIndex(node) + \",length:\" + node.childNodes.length + \"][\" + (node.innerHTML || \"[innerHTML not supported]\").slice(0, 25) + \"]\";\n }\n return node.nodeName;\n }\n\n function fragmentFromNodeChildren(node) {\n var fragment = getDocument(node).createDocumentFragment(), child;\n while ( (child = node.firstChild) ) {\n fragment.appendChild(child);\n }\n return fragment;\n }\n\n var getComputedStyleProperty;\n if (typeof window.getComputedStyle != UNDEF) {\n getComputedStyleProperty = function(el, propName) {\n return getWindow(el).getComputedStyle(el, null)[propName];\n };\n } else if (typeof document.documentElement.currentStyle != UNDEF) {\n getComputedStyleProperty = function(el, propName) {\n return el.currentStyle ? el.currentStyle[propName] : \"\";\n };\n } else {\n module.fail(\"No means of obtaining computed style properties found\");\n }\n\n function createTestElement(doc, html, contentEditable) {\n var body = getBody(doc);\n var el = doc.createElement(\"div\");\n el.contentEditable = \"\" + !!contentEditable;\n if (html) {\n el.innerHTML = html;\n }\n\n // Insert the test element at the start of the body to prevent scrolling to the bottom in iOS (issue #292)\n var bodyFirstChild = body.firstChild;\n if (bodyFirstChild) {\n body.insertBefore(el, bodyFirstChild);\n } else {\n body.appendChild(el);\n }\n\n return el;\n }\n\n function removeNode(node) {\n return node.parentNode.removeChild(node);\n }\n\n function NodeIterator(root) {\n this.root = root;\n this._next = root;\n }\n\n NodeIterator.prototype = {\n _current: null,\n\n hasNext: function() {\n return !!this._next;\n },\n\n next: function() {\n var n = this._current = this._next;\n var child, next;\n if (this._current) {\n child = n.firstChild;\n if (child) {\n this._next = child;\n } else {\n next = null;\n while ((n !== this.root) && !(next = n.nextSibling)) {\n n = n.parentNode;\n }\n this._next = next;\n }\n }\n return this._current;\n },\n\n detach: function() {\n this._current = this._next = this.root = null;\n }\n };\n\n function createIterator(root) {\n return new NodeIterator(root);\n }\n\n function DomPosition(node, offset) {\n this.node = node;\n this.offset = offset;\n }\n\n DomPosition.prototype = {\n equals: function(pos) {\n return !!pos && this.node === pos.node && this.offset == pos.offset;\n },\n\n inspect: function() {\n return \"[DomPosition(\" + inspectNode(this.node) + \":\" + this.offset + \")]\";\n },\n\n toString: function() {\n return this.inspect();\n }\n };\n\n function DOMException(codeName) {\n this.code = this[codeName];\n this.codeName = codeName;\n this.message = \"DOMException: \" + this.codeName;\n }\n\n DOMException.prototype = {\n INDEX_SIZE_ERR: 1,\n HIERARCHY_REQUEST_ERR: 3,\n WRONG_DOCUMENT_ERR: 4,\n NO_MODIFICATION_ALLOWED_ERR: 7,\n NOT_FOUND_ERR: 8,\n NOT_SUPPORTED_ERR: 9,\n INVALID_STATE_ERR: 11,\n INVALID_NODE_TYPE_ERR: 24\n };\n\n DOMException.prototype.toString = function() {\n return this.message;\n };\n\n api.dom = {\n arrayContains: arrayContains,\n isHtmlNamespace: isHtmlNamespace,\n parentElement: parentElement,\n getNodeIndex: getNodeIndex,\n getNodeLength: getNodeLength,\n getCommonAncestor: getCommonAncestor,\n isAncestorOf: isAncestorOf,\n isOrIsAncestorOf: isOrIsAncestorOf,\n getClosestAncestorIn: getClosestAncestorIn,\n isCharacterDataNode: isCharacterDataNode,\n isTextOrCommentNode: isTextOrCommentNode,\n insertAfter: insertAfter,\n splitDataNode: splitDataNode,\n getDocument: getDocument,\n getWindow: getWindow,\n getIframeWindow: getIframeWindow,\n getIframeDocument: getIframeDocument,\n getBody: getBody,\n isWindow: isWindow,\n getContentDocument: getContentDocument,\n getRootContainer: getRootContainer,\n comparePoints: comparePoints,\n isBrokenNode: isBrokenNode,\n inspectNode: inspectNode,\n getComputedStyleProperty: getComputedStyleProperty,\n createTestElement: createTestElement,\n removeNode: removeNode,\n fragmentFromNodeChildren: fragmentFromNodeChildren,\n createIterator: createIterator,\n DomPosition: DomPosition\n };\n\n api.DOMException = DOMException;\n });\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Pure JavaScript implementation of DOM Range\n api.createCoreModule(\"DomRange\", [\"DomUtil\"], function(api, module) {\n var dom = api.dom;\n var util = api.util;\n var DomPosition = dom.DomPosition;\n var DOMException = api.DOMException;\n\n var isCharacterDataNode = dom.isCharacterDataNode;\n var getNodeIndex = dom.getNodeIndex;\n var isOrIsAncestorOf = dom.isOrIsAncestorOf;\n var getDocument = dom.getDocument;\n var comparePoints = dom.comparePoints;\n var splitDataNode = dom.splitDataNode;\n var getClosestAncestorIn = dom.getClosestAncestorIn;\n var getNodeLength = dom.getNodeLength;\n var arrayContains = dom.arrayContains;\n var getRootContainer = dom.getRootContainer;\n var crashyTextNodes = api.features.crashyTextNodes;\n\n var removeNode = dom.removeNode;\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Utility functions\n\n function isNonTextPartiallySelected(node, range) {\n return (node.nodeType != 3) &&\n (isOrIsAncestorOf(node, range.startContainer) || isOrIsAncestorOf(node, range.endContainer));\n }\n\n function getRangeDocument(range) {\n return range.document || getDocument(range.startContainer);\n }\n\n function getRangeRoot(range) {\n return getRootContainer(range.startContainer);\n }\n\n function getBoundaryBeforeNode(node) {\n return new DomPosition(node.parentNode, getNodeIndex(node));\n }\n\n function getBoundaryAfterNode(node) {\n return new DomPosition(node.parentNode, getNodeIndex(node) + 1);\n }\n\n function insertNodeAtPosition(node, n, o) {\n var firstNodeInserted = node.nodeType == 11 ? node.firstChild : node;\n if (isCharacterDataNode(n)) {\n if (o == n.length) {\n dom.insertAfter(node, n);\n } else {\n n.parentNode.insertBefore(node, o == 0 ? n : splitDataNode(n, o));\n }\n } else if (o >= n.childNodes.length) {\n n.appendChild(node);\n } else {\n n.insertBefore(node, n.childNodes[o]);\n }\n return firstNodeInserted;\n }\n\n function rangesIntersect(rangeA, rangeB, touchingIsIntersecting) {\n assertRangeValid(rangeA);\n assertRangeValid(rangeB);\n\n if (getRangeDocument(rangeB) != getRangeDocument(rangeA)) {\n throw new DOMException(\"WRONG_DOCUMENT_ERR\");\n }\n\n var startComparison = comparePoints(rangeA.startContainer, rangeA.startOffset, rangeB.endContainer, rangeB.endOffset),\n endComparison = comparePoints(rangeA.endContainer, rangeA.endOffset, rangeB.startContainer, rangeB.startOffset);\n\n return touchingIsIntersecting ? startComparison <= 0 && endComparison >= 0 : startComparison < 0 && endComparison > 0;\n }\n\n function cloneSubtree(iterator) {\n var partiallySelected;\n for (var node, frag = getRangeDocument(iterator.range).createDocumentFragment(), subIterator; node = iterator.next(); ) {\n partiallySelected = iterator.isPartiallySelectedSubtree();\n node = node.cloneNode(!partiallySelected);\n if (partiallySelected) {\n subIterator = iterator.getSubtreeIterator();\n node.appendChild(cloneSubtree(subIterator));\n subIterator.detach();\n }\n\n if (node.nodeType == 10) { // DocumentType\n throw new DOMException(\"HIERARCHY_REQUEST_ERR\");\n }\n frag.appendChild(node);\n }\n return frag;\n }\n\n function iterateSubtree(rangeIterator, func, iteratorState) {\n var it, n;\n iteratorState = iteratorState || { stop: false };\n for (var node, subRangeIterator; node = rangeIterator.next(); ) {\n if (rangeIterator.isPartiallySelectedSubtree()) {\n if (func(node) === false) {\n iteratorState.stop = true;\n return;\n } else {\n // The node is partially selected by the Range, so we can use a new RangeIterator on the portion of\n // the node selected by the Range.\n subRangeIterator = rangeIterator.getSubtreeIterator();\n iterateSubtree(subRangeIterator, func, iteratorState);\n subRangeIterator.detach();\n if (iteratorState.stop) {\n return;\n }\n }\n } else {\n // The whole node is selected, so we can use efficient DOM iteration to iterate over the node and its\n // descendants\n it = dom.createIterator(node);\n while ( (n = it.next()) ) {\n if (func(n) === false) {\n iteratorState.stop = true;\n return;\n }\n }\n }\n }\n }\n\n function deleteSubtree(iterator) {\n var subIterator;\n while (iterator.next()) {\n if (iterator.isPartiallySelectedSubtree()) {\n subIterator = iterator.getSubtreeIterator();\n deleteSubtree(subIterator);\n subIterator.detach();\n } else {\n iterator.remove();\n }\n }\n }\n\n function extractSubtree(iterator) {\n for (var node, frag = getRangeDocument(iterator.range).createDocumentFragment(), subIterator; node = iterator.next(); ) {\n\n if (iterator.isPartiallySelectedSubtree()) {\n node = node.cloneNode(false);\n subIterator = iterator.getSubtreeIterator();\n node.appendChild(extractSubtree(subIterator));\n subIterator.detach();\n } else {\n iterator.remove();\n }\n if (node.nodeType == 10) { // DocumentType\n throw new DOMException(\"HIERARCHY_REQUEST_ERR\");\n }\n frag.appendChild(node);\n }\n return frag;\n }\n\n function getNodesInRange(range, nodeTypes, filter) {\n var filterNodeTypes = !!(nodeTypes && nodeTypes.length), regex;\n var filterExists = !!filter;\n if (filterNodeTypes) {\n regex = new RegExp(\"^(\" + nodeTypes.join(\"|\") + \")$\");\n }\n\n var nodes = [];\n iterateSubtree(new RangeIterator(range, false), function(node) {\n if (filterNodeTypes && !regex.test(node.nodeType)) {\n return;\n }\n if (filterExists && !filter(node)) {\n return;\n }\n // Don't include a boundary container if it is a character data node and the range does not contain any\n // of its character data. See issue 190.\n var sc = range.startContainer;\n if (node == sc && isCharacterDataNode(sc) && range.startOffset == sc.length) {\n return;\n }\n\n var ec = range.endContainer;\n if (node == ec && isCharacterDataNode(ec) && range.endOffset == 0) {\n return;\n }\n\n nodes.push(node);\n });\n return nodes;\n }\n\n function inspect(range) {\n var name = (typeof range.getName == \"undefined\") ? \"Range\" : range.getName();\n return \"[\" + name + \"(\" + dom.inspectNode(range.startContainer) + \":\" + range.startOffset + \", \" +\n dom.inspectNode(range.endContainer) + \":\" + range.endOffset + \")]\";\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // RangeIterator code partially borrows from IERange by Tim Ryan (http://github.com/timcameronryan/IERange)\n\n function RangeIterator(range, clonePartiallySelectedTextNodes) {\n this.range = range;\n this.clonePartiallySelectedTextNodes = clonePartiallySelectedTextNodes;\n\n\n if (!range.collapsed) {\n this.sc = range.startContainer;\n this.so = range.startOffset;\n this.ec = range.endContainer;\n this.eo = range.endOffset;\n var root = range.commonAncestorContainer;\n\n if (this.sc === this.ec && isCharacterDataNode(this.sc)) {\n this.isSingleCharacterDataNode = true;\n this._first = this._last = this._next = this.sc;\n } else {\n this._first = this._next = (this.sc === root && !isCharacterDataNode(this.sc)) ?\n this.sc.childNodes[this.so] : getClosestAncestorIn(this.sc, root, true);\n this._last = (this.ec === root && !isCharacterDataNode(this.ec)) ?\n this.ec.childNodes[this.eo - 1] : getClosestAncestorIn(this.ec, root, true);\n }\n }\n }\n\n RangeIterator.prototype = {\n _current: null,\n _next: null,\n _first: null,\n _last: null,\n isSingleCharacterDataNode: false,\n\n reset: function() {\n this._current = null;\n this._next = this._first;\n },\n\n hasNext: function() {\n return !!this._next;\n },\n\n next: function() {\n // Move to next node\n var current = this._current = this._next;\n if (current) {\n this._next = (current !== this._last) ? current.nextSibling : null;\n\n // Check for partially selected text nodes\n if (isCharacterDataNode(current) && this.clonePartiallySelectedTextNodes) {\n if (current === this.ec) {\n (current = current.cloneNode(true)).deleteData(this.eo, current.length - this.eo);\n }\n if (this._current === this.sc) {\n (current = current.cloneNode(true)).deleteData(0, this.so);\n }\n }\n }\n\n return current;\n },\n\n remove: function() {\n var current = this._current, start, end;\n\n if (isCharacterDataNode(current) && (current === this.sc || current === this.ec)) {\n start = (current === this.sc) ? this.so : 0;\n end = (current === this.ec) ? this.eo : current.length;\n if (start != end) {\n current.deleteData(start, end - start);\n }\n } else {\n if (current.parentNode) {\n removeNode(current);\n } else {\n }\n }\n },\n\n // Checks if the current node is partially selected\n isPartiallySelectedSubtree: function() {\n var current = this._current;\n return isNonTextPartiallySelected(current, this.range);\n },\n\n getSubtreeIterator: function() {\n var subRange;\n if (this.isSingleCharacterDataNode) {\n subRange = this.range.cloneRange();\n subRange.collapse(false);\n } else {\n subRange = new Range(getRangeDocument(this.range));\n var current = this._current;\n var startContainer = current, startOffset = 0, endContainer = current, endOffset = getNodeLength(current);\n\n if (isOrIsAncestorOf(current, this.sc)) {\n startContainer = this.sc;\n startOffset = this.so;\n }\n if (isOrIsAncestorOf(current, this.ec)) {\n endContainer = this.ec;\n endOffset = this.eo;\n }\n\n updateBoundaries(subRange, startContainer, startOffset, endContainer, endOffset);\n }\n return new RangeIterator(subRange, this.clonePartiallySelectedTextNodes);\n },\n\n detach: function() {\n this.range = this._current = this._next = this._first = this._last = this.sc = this.so = this.ec = this.eo = null;\n }\n };\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n var beforeAfterNodeTypes = [1, 3, 4, 5, 7, 8, 10];\n var rootContainerNodeTypes = [2, 9, 11];\n var readonlyNodeTypes = [5, 6, 10, 12];\n var insertableNodeTypes = [1, 3, 4, 5, 7, 8, 10, 11];\n var surroundNodeTypes = [1, 3, 4, 5, 7, 8];\n\n function createAncestorFinder(nodeTypes) {\n return function(node, selfIsAncestor) {\n var t, n = selfIsAncestor ? node : node.parentNode;\n while (n) {\n t = n.nodeType;\n if (arrayContains(nodeTypes, t)) {\n return n;\n }\n n = n.parentNode;\n }\n return null;\n };\n }\n\n var getDocumentOrFragmentContainer = createAncestorFinder( [9, 11] );\n var getReadonlyAncestor = createAncestorFinder(readonlyNodeTypes);\n var getDocTypeNotationEntityAncestor = createAncestorFinder( [6, 10, 12] );\n var getElementAncestor = createAncestorFinder( [1] );\n\n function assertNoDocTypeNotationEntityAncestor(node, allowSelf) {\n if (getDocTypeNotationEntityAncestor(node, allowSelf)) {\n throw new DOMException(\"INVALID_NODE_TYPE_ERR\");\n }\n }\n\n function assertValidNodeType(node, invalidTypes) {\n if (!arrayContains(invalidTypes, node.nodeType)) {\n throw new DOMException(\"INVALID_NODE_TYPE_ERR\");\n }\n }\n\n function assertValidOffset(node, offset) {\n if (offset < 0 || offset > (isCharacterDataNode(node) ? node.length : node.childNodes.length)) {\n throw new DOMException(\"INDEX_SIZE_ERR\");\n }\n }\n\n function assertSameDocumentOrFragment(node1, node2) {\n if (getDocumentOrFragmentContainer(node1, true) !== getDocumentOrFragmentContainer(node2, true)) {\n throw new DOMException(\"WRONG_DOCUMENT_ERR\");\n }\n }\n\n function assertNodeNotReadOnly(node) {\n if (getReadonlyAncestor(node, true)) {\n throw new DOMException(\"NO_MODIFICATION_ALLOWED_ERR\");\n }\n }\n\n function assertNode(node, codeName) {\n if (!node) {\n throw new DOMException(codeName);\n }\n }\n\n function isValidOffset(node, offset) {\n return offset <= (isCharacterDataNode(node) ? node.length : node.childNodes.length);\n }\n\n function isRangeValid(range) {\n return (!!range.startContainer && !!range.endContainer &&\n !(crashyTextNodes && (dom.isBrokenNode(range.startContainer) || dom.isBrokenNode(range.endContainer))) &&\n getRootContainer(range.startContainer) == getRootContainer(range.endContainer) &&\n isValidOffset(range.startContainer, range.startOffset) &&\n isValidOffset(range.endContainer, range.endOffset));\n }\n\n function assertRangeValid(range) {\n if (!isRangeValid(range)) {\n throw new Error(\"Range error: Range is not valid. This usually happens after DOM mutation. Range: (\" + range.inspect() + \")\");\n }\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Test the browser's innerHTML support to decide how to implement createContextualFragment\n var styleEl = document.createElement(\"style\");\n var htmlParsingConforms = false;\n try {\n styleEl.innerHTML = \"x\";\n htmlParsingConforms = (styleEl.firstChild.nodeType == 3); // Pre-Blink Opera incorrectly creates an element node\n } catch (e) {\n // IE 6 and 7 throw\n }\n\n api.features.htmlParsingConforms = htmlParsingConforms;\n\n var createContextualFragment = htmlParsingConforms ?\n\n // Implementation as per HTML parsing spec, trusting in the browser's implementation of innerHTML. See\n // discussion and base code for this implementation at issue 67.\n // Spec: http://html5.org/specs/dom-parsing.html#extensions-to-the-range-interface\n // Thanks to Aleks Williams.\n function(fragmentStr) {\n // \"Let node the context object's start's node.\"\n var node = this.startContainer;\n var doc = getDocument(node);\n\n // \"If the context object's start's node is null, raise an INVALID_STATE_ERR\n // exception and abort these steps.\"\n if (!node) {\n throw new DOMException(\"INVALID_STATE_ERR\");\n }\n\n // \"Let element be as follows, depending on node's interface:\"\n // Document, Document Fragment: null\n var el = null;\n\n // \"Element: node\"\n if (node.nodeType == 1) {\n el = node;\n\n // \"Text, Comment: node's parentElement\"\n } else if (isCharacterDataNode(node)) {\n el = dom.parentElement(node);\n }\n\n // \"If either element is null or element's ownerDocument is an HTML document\n // and element's local name is \"html\" and element's namespace is the HTML\n // namespace\"\n if (el === null || (\n el.nodeName == \"HTML\" &&\n dom.isHtmlNamespace(getDocument(el).documentElement) &&\n dom.isHtmlNamespace(el)\n )) {\n\n // \"let element be a new Element with \"body\" as its local name and the HTML\n // namespace as its namespace.\"\"\n el = doc.createElement(\"body\");\n } else {\n el = el.cloneNode(false);\n }\n\n // \"If the node's document is an HTML document: Invoke the HTML fragment parsing algorithm.\"\n // \"If the node's document is an XML document: Invoke the XML fragment parsing algorithm.\"\n // \"In either case, the algorithm must be invoked with fragment as the input\n // and element as the context element.\"\n el.innerHTML = fragmentStr;\n\n // \"If this raises an exception, then abort these steps. Otherwise, let new\n // children be the nodes returned.\"\n\n // \"Let fragment be a new DocumentFragment.\"\n // \"Append all new children to fragment.\"\n // \"Return fragment.\"\n return dom.fragmentFromNodeChildren(el);\n } :\n\n // In this case, innerHTML cannot be trusted, so fall back to a simpler, non-conformant implementation that\n // previous versions of Rangy used (with the exception of using a body element rather than a div)\n function(fragmentStr) {\n var doc = getRangeDocument(this);\n var el = doc.createElement(\"body\");\n el.innerHTML = fragmentStr;\n\n return dom.fragmentFromNodeChildren(el);\n };\n\n function splitRangeBoundaries(range, positionsToPreserve) {\n assertRangeValid(range);\n\n var sc = range.startContainer, so = range.startOffset, ec = range.endContainer, eo = range.endOffset;\n var startEndSame = (sc === ec);\n\n if (isCharacterDataNode(ec) && eo > 0 && eo < ec.length) {\n splitDataNode(ec, eo, positionsToPreserve);\n }\n\n if (isCharacterDataNode(sc) && so > 0 && so < sc.length) {\n sc = splitDataNode(sc, so, positionsToPreserve);\n if (startEndSame) {\n eo -= so;\n ec = sc;\n } else if (ec == sc.parentNode && eo >= getNodeIndex(sc)) {\n eo++;\n }\n so = 0;\n }\n range.setStartAndEnd(sc, so, ec, eo);\n }\n\n function rangeToHtml(range) {\n assertRangeValid(range);\n var container = range.commonAncestorContainer.parentNode.cloneNode(false);\n container.appendChild( range.cloneContents() );\n return container.innerHTML;\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n var rangeProperties = [\"startContainer\", \"startOffset\", \"endContainer\", \"endOffset\", \"collapsed\",\n \"commonAncestorContainer\"];\n\n var s2s = 0, s2e = 1, e2e = 2, e2s = 3;\n var n_b = 0, n_a = 1, n_b_a = 2, n_i = 3;\n\n util.extend(api.rangePrototype, {\n compareBoundaryPoints: function(how, range) {\n assertRangeValid(this);\n assertSameDocumentOrFragment(this.startContainer, range.startContainer);\n\n var nodeA, offsetA, nodeB, offsetB;\n var prefixA = (how == e2s || how == s2s) ? \"start\" : \"end\";\n var prefixB = (how == s2e || how == s2s) ? \"start\" : \"end\";\n nodeA = this[prefixA + \"Container\"];\n offsetA = this[prefixA + \"Offset\"];\n nodeB = range[prefixB + \"Container\"];\n offsetB = range[prefixB + \"Offset\"];\n return comparePoints(nodeA, offsetA, nodeB, offsetB);\n },\n\n insertNode: function(node) {\n assertRangeValid(this);\n assertValidNodeType(node, insertableNodeTypes);\n assertNodeNotReadOnly(this.startContainer);\n\n if (isOrIsAncestorOf(node, this.startContainer)) {\n throw new DOMException(\"HIERARCHY_REQUEST_ERR\");\n }\n\n // No check for whether the container of the start of the Range is of a type that does not allow\n // children of the type of node: the browser's DOM implementation should do this for us when we attempt\n // to add the node\n\n var firstNodeInserted = insertNodeAtPosition(node, this.startContainer, this.startOffset);\n this.setStartBefore(firstNodeInserted);\n },\n\n cloneContents: function() {\n assertRangeValid(this);\n\n var clone, frag;\n if (this.collapsed) {\n return getRangeDocument(this).createDocumentFragment();\n } else {\n if (this.startContainer === this.endContainer && isCharacterDataNode(this.startContainer)) {\n clone = this.startContainer.cloneNode(true);\n clone.data = clone.data.slice(this.startOffset, this.endOffset);\n frag = getRangeDocument(this).createDocumentFragment();\n frag.appendChild(clone);\n return frag;\n } else {\n var iterator = new RangeIterator(this, true);\n clone = cloneSubtree(iterator);\n iterator.detach();\n }\n return clone;\n }\n },\n\n canSurroundContents: function() {\n assertRangeValid(this);\n assertNodeNotReadOnly(this.startContainer);\n assertNodeNotReadOnly(this.endContainer);\n\n // Check if the contents can be surrounded. Specifically, this means whether the range partially selects\n // no non-text nodes.\n var iterator = new RangeIterator(this, true);\n var boundariesInvalid = (iterator._first && (isNonTextPartiallySelected(iterator._first, this)) ||\n (iterator._last && isNonTextPartiallySelected(iterator._last, this)));\n iterator.detach();\n return !boundariesInvalid;\n },\n\n surroundContents: function(node) {\n assertValidNodeType(node, surroundNodeTypes);\n\n if (!this.canSurroundContents()) {\n throw new DOMException(\"INVALID_STATE_ERR\");\n }\n\n // Extract the contents\n var content = this.extractContents();\n\n // Clear the children of the node\n if (node.hasChildNodes()) {\n while (node.lastChild) {\n node.removeChild(node.lastChild);\n }\n }\n\n // Insert the new node and add the extracted contents\n insertNodeAtPosition(node, this.startContainer, this.startOffset);\n node.appendChild(content);\n\n this.selectNode(node);\n },\n\n cloneRange: function() {\n assertRangeValid(this);\n var range = new Range(getRangeDocument(this));\n var i = rangeProperties.length, prop;\n while (i--) {\n prop = rangeProperties[i];\n range[prop] = this[prop];\n }\n return range;\n },\n\n toString: function() {\n assertRangeValid(this);\n var sc = this.startContainer;\n if (sc === this.endContainer && isCharacterDataNode(sc)) {\n return (sc.nodeType == 3 || sc.nodeType == 4) ? sc.data.slice(this.startOffset, this.endOffset) : \"\";\n } else {\n var textParts = [], iterator = new RangeIterator(this, true);\n iterateSubtree(iterator, function(node) {\n // Accept only text or CDATA nodes, not comments\n if (node.nodeType == 3 || node.nodeType == 4) {\n textParts.push(node.data);\n }\n });\n iterator.detach();\n return textParts.join(\"\");\n }\n },\n\n // The methods below are all non-standard. The following batch were introduced by Mozilla but have since\n // been removed from Mozilla.\n\n compareNode: function(node) {\n assertRangeValid(this);\n\n var parent = node.parentNode;\n var nodeIndex = getNodeIndex(node);\n\n if (!parent) {\n throw new DOMException(\"NOT_FOUND_ERR\");\n }\n\n var startComparison = this.comparePoint(parent, nodeIndex),\n endComparison = this.comparePoint(parent, nodeIndex + 1);\n\n if (startComparison < 0) { // Node starts before\n return (endComparison > 0) ? n_b_a : n_b;\n } else {\n return (endComparison > 0) ? n_a : n_i;\n }\n },\n\n comparePoint: function(node, offset) {\n assertRangeValid(this);\n assertNode(node, \"HIERARCHY_REQUEST_ERR\");\n assertSameDocumentOrFragment(node, this.startContainer);\n\n if (comparePoints(node, offset, this.startContainer, this.startOffset) < 0) {\n return -1;\n } else if (comparePoints(node, offset, this.endContainer, this.endOffset) > 0) {\n return 1;\n }\n return 0;\n },\n\n createContextualFragment: createContextualFragment,\n\n toHtml: function() {\n return rangeToHtml(this);\n },\n\n // touchingIsIntersecting determines whether this method considers a node that borders a range intersects\n // with it (as in WebKit) or not (as in Gecko pre-1.9, and the default)\n intersectsNode: function(node, touchingIsIntersecting) {\n assertRangeValid(this);\n if (getRootContainer(node) != getRangeRoot(this)) {\n return false;\n }\n\n var parent = node.parentNode, offset = getNodeIndex(node);\n if (!parent) {\n return true;\n }\n\n var startComparison = comparePoints(parent, offset, this.endContainer, this.endOffset),\n endComparison = comparePoints(parent, offset + 1, this.startContainer, this.startOffset);\n\n return touchingIsIntersecting ? startComparison <= 0 && endComparison >= 0 : startComparison < 0 && endComparison > 0;\n },\n\n isPointInRange: function(node, offset) {\n assertRangeValid(this);\n assertNode(node, \"HIERARCHY_REQUEST_ERR\");\n assertSameDocumentOrFragment(node, this.startContainer);\n\n return (comparePoints(node, offset, this.startContainer, this.startOffset) >= 0) &&\n (comparePoints(node, offset, this.endContainer, this.endOffset) <= 0);\n },\n\n // The methods below are non-standard and invented by me.\n\n // Sharing a boundary start-to-end or end-to-start does not count as intersection.\n intersectsRange: function(range) {\n return rangesIntersect(this, range, false);\n },\n\n // Sharing a boundary start-to-end or end-to-start does count as intersection.\n intersectsOrTouchesRange: function(range) {\n return rangesIntersect(this, range, true);\n },\n\n intersection: function(range) {\n if (this.intersectsRange(range)) {\n var startComparison = comparePoints(this.startContainer, this.startOffset, range.startContainer, range.startOffset),\n endComparison = comparePoints(this.endContainer, this.endOffset, range.endContainer, range.endOffset);\n\n var intersectionRange = this.cloneRange();\n if (startComparison == -1) {\n intersectionRange.setStart(range.startContainer, range.startOffset);\n }\n if (endComparison == 1) {\n intersectionRange.setEnd(range.endContainer, range.endOffset);\n }\n return intersectionRange;\n }\n return null;\n },\n\n union: function(range) {\n if (this.intersectsOrTouchesRange(range)) {\n var unionRange = this.cloneRange();\n if (comparePoints(range.startContainer, range.startOffset, this.startContainer, this.startOffset) == -1) {\n unionRange.setStart(range.startContainer, range.startOffset);\n }\n if (comparePoints(range.endContainer, range.endOffset, this.endContainer, this.endOffset) == 1) {\n unionRange.setEnd(range.endContainer, range.endOffset);\n }\n return unionRange;\n } else {\n throw new DOMException(\"Ranges do not intersect\");\n }\n },\n\n containsNode: function(node, allowPartial) {\n if (allowPartial) {\n return this.intersectsNode(node, false);\n } else {\n return this.compareNode(node) == n_i;\n }\n },\n\n containsNodeContents: function(node) {\n return this.comparePoint(node, 0) >= 0 && this.comparePoint(node, getNodeLength(node)) <= 0;\n },\n\n containsRange: function(range) {\n var intersection = this.intersection(range);\n return intersection !== null && range.equals(intersection);\n },\n\n containsNodeText: function(node) {\n var nodeRange = this.cloneRange();\n nodeRange.selectNode(node);\n var textNodes = nodeRange.getNodes([3]);\n if (textNodes.length > 0) {\n nodeRange.setStart(textNodes[0], 0);\n var lastTextNode = textNodes.pop();\n nodeRange.setEnd(lastTextNode, lastTextNode.length);\n return this.containsRange(nodeRange);\n } else {\n return this.containsNodeContents(node);\n }\n },\n\n getNodes: function(nodeTypes, filter) {\n assertRangeValid(this);\n return getNodesInRange(this, nodeTypes, filter);\n },\n\n getDocument: function() {\n return getRangeDocument(this);\n },\n\n collapseBefore: function(node) {\n this.setEndBefore(node);\n this.collapse(false);\n },\n\n collapseAfter: function(node) {\n this.setStartAfter(node);\n this.collapse(true);\n },\n\n getBookmark: function(containerNode) {\n var doc = getRangeDocument(this);\n var preSelectionRange = api.createRange(doc);\n containerNode = containerNode || dom.getBody(doc);\n preSelectionRange.selectNodeContents(containerNode);\n var range = this.intersection(preSelectionRange);\n var start = 0, end = 0;\n if (range) {\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n start = preSelectionRange.toString().length;\n end = start + range.toString().length;\n }\n\n return {\n start: start,\n end: end,\n containerNode: containerNode\n };\n },\n\n moveToBookmark: function(bookmark) {\n var containerNode = bookmark.containerNode;\n var charIndex = 0;\n this.setStart(containerNode, 0);\n this.collapse(true);\n var nodeStack = [containerNode], node, foundStart = false, stop = false;\n var nextCharIndex, i, childNodes;\n\n while (!stop && (node = nodeStack.pop())) {\n if (node.nodeType == 3) {\n nextCharIndex = charIndex + node.length;\n if (!foundStart && bookmark.start >= charIndex && bookmark.start <= nextCharIndex) {\n this.setStart(node, bookmark.start - charIndex);\n foundStart = true;\n }\n if (foundStart && bookmark.end >= charIndex && bookmark.end <= nextCharIndex) {\n this.setEnd(node, bookmark.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n childNodes = node.childNodes;\n i = childNodes.length;\n while (i--) {\n nodeStack.push(childNodes[i]);\n }\n }\n }\n },\n\n getName: function() {\n return \"DomRange\";\n },\n\n equals: function(range) {\n return Range.rangesEqual(this, range);\n },\n\n isValid: function() {\n return isRangeValid(this);\n },\n\n inspect: function() {\n return inspect(this);\n },\n\n detach: function() {\n // In DOM4, detach() is now a no-op.\n }\n });\n\n function copyComparisonConstantsToObject(obj) {\n obj.START_TO_START = s2s;\n obj.START_TO_END = s2e;\n obj.END_TO_END = e2e;\n obj.END_TO_START = e2s;\n\n obj.NODE_BEFORE = n_b;\n obj.NODE_AFTER = n_a;\n obj.NODE_BEFORE_AND_AFTER = n_b_a;\n obj.NODE_INSIDE = n_i;\n }\n\n function copyComparisonConstants(constructor) {\n copyComparisonConstantsToObject(constructor);\n copyComparisonConstantsToObject(constructor.prototype);\n }\n\n function createRangeContentRemover(remover, boundaryUpdater) {\n return function() {\n assertRangeValid(this);\n\n var sc = this.startContainer, so = this.startOffset, root = this.commonAncestorContainer;\n\n var iterator = new RangeIterator(this, true);\n\n // Work out where to position the range after content removal\n var node, boundary;\n if (sc !== root) {\n node = getClosestAncestorIn(sc, root, true);\n boundary = getBoundaryAfterNode(node);\n sc = boundary.node;\n so = boundary.offset;\n }\n\n // Check none of the range is read-only\n iterateSubtree(iterator, assertNodeNotReadOnly);\n\n iterator.reset();\n\n // Remove the content\n var returnValue = remover(iterator);\n iterator.detach();\n\n // Move to the new position\n boundaryUpdater(this, sc, so, sc, so);\n\n return returnValue;\n };\n }\n\n function createPrototypeRange(constructor, boundaryUpdater) {\n function createBeforeAfterNodeSetter(isBefore, isStart) {\n return function(node) {\n assertValidNodeType(node, beforeAfterNodeTypes);\n assertValidNodeType(getRootContainer(node), rootContainerNodeTypes);\n\n var boundary = (isBefore ? getBoundaryBeforeNode : getBoundaryAfterNode)(node);\n (isStart ? setRangeStart : setRangeEnd)(this, boundary.node, boundary.offset);\n };\n }\n\n function setRangeStart(range, node, offset) {\n var ec = range.endContainer, eo = range.endOffset;\n if (node !== range.startContainer || offset !== range.startOffset) {\n // Check the root containers of the range and the new boundary, and also check whether the new boundary\n // is after the current end. In either case, collapse the range to the new position\n if (getRootContainer(node) != getRootContainer(ec) || comparePoints(node, offset, ec, eo) == 1) {\n ec = node;\n eo = offset;\n }\n boundaryUpdater(range, node, offset, ec, eo);\n }\n }\n\n function setRangeEnd(range, node, offset) {\n var sc = range.startContainer, so = range.startOffset;\n if (node !== range.endContainer || offset !== range.endOffset) {\n // Check the root containers of the range and the new boundary, and also check whether the new boundary\n // is after the current end. In either case, collapse the range to the new position\n if (getRootContainer(node) != getRootContainer(sc) || comparePoints(node, offset, sc, so) == -1) {\n sc = node;\n so = offset;\n }\n boundaryUpdater(range, sc, so, node, offset);\n }\n }\n\n // Set up inheritance\n var F = function() {};\n F.prototype = api.rangePrototype;\n constructor.prototype = new F();\n\n util.extend(constructor.prototype, {\n setStart: function(node, offset) {\n assertNoDocTypeNotationEntityAncestor(node, true);\n assertValidOffset(node, offset);\n\n setRangeStart(this, node, offset);\n },\n\n setEnd: function(node, offset) {\n assertNoDocTypeNotationEntityAncestor(node, true);\n assertValidOffset(node, offset);\n\n setRangeEnd(this, node, offset);\n },\n\n /**\n * Convenience method to set a range's start and end boundaries. Overloaded as follows:\n * - Two parameters (node, offset) creates a collapsed range at that position\n * - Three parameters (node, startOffset, endOffset) creates a range contained with node starting at\n * startOffset and ending at endOffset\n * - Four parameters (startNode, startOffset, endNode, endOffset) creates a range starting at startOffset in\n * startNode and ending at endOffset in endNode\n */\n setStartAndEnd: function() {\n var args = arguments;\n var sc = args[0], so = args[1], ec = sc, eo = so;\n\n switch (args.length) {\n case 3:\n eo = args[2];\n break;\n case 4:\n ec = args[2];\n eo = args[3];\n break;\n }\n\n assertNoDocTypeNotationEntityAncestor(sc, true);\n assertValidOffset(sc, so);\n\n assertNoDocTypeNotationEntityAncestor(ec, true);\n assertValidOffset(ec, eo);\n\n boundaryUpdater(this, sc, so, ec, eo);\n },\n\n setBoundary: function(node, offset, isStart) {\n this[\"set\" + (isStart ? \"Start\" : \"End\")](node, offset);\n },\n\n setStartBefore: createBeforeAfterNodeSetter(true, true),\n setStartAfter: createBeforeAfterNodeSetter(false, true),\n setEndBefore: createBeforeAfterNodeSetter(true, false),\n setEndAfter: createBeforeAfterNodeSetter(false, false),\n\n collapse: function(isStart) {\n assertRangeValid(this);\n if (isStart) {\n boundaryUpdater(this, this.startContainer, this.startOffset, this.startContainer, this.startOffset);\n } else {\n boundaryUpdater(this, this.endContainer, this.endOffset, this.endContainer, this.endOffset);\n }\n },\n\n selectNodeContents: function(node) {\n assertNoDocTypeNotationEntityAncestor(node, true);\n\n boundaryUpdater(this, node, 0, node, getNodeLength(node));\n },\n\n selectNode: function(node) {\n assertNoDocTypeNotationEntityAncestor(node, false);\n assertValidNodeType(node, beforeAfterNodeTypes);\n\n var start = getBoundaryBeforeNode(node), end = getBoundaryAfterNode(node);\n boundaryUpdater(this, start.node, start.offset, end.node, end.offset);\n },\n\n extractContents: createRangeContentRemover(extractSubtree, boundaryUpdater),\n\n deleteContents: createRangeContentRemover(deleteSubtree, boundaryUpdater),\n\n canSurroundContents: function() {\n assertRangeValid(this);\n assertNodeNotReadOnly(this.startContainer);\n assertNodeNotReadOnly(this.endContainer);\n\n // Check if the contents can be surrounded. Specifically, this means whether the range partially selects\n // no non-text nodes.\n var iterator = new RangeIterator(this, true);\n var boundariesInvalid = (iterator._first && isNonTextPartiallySelected(iterator._first, this) ||\n (iterator._last && isNonTextPartiallySelected(iterator._last, this)));\n iterator.detach();\n return !boundariesInvalid;\n },\n\n splitBoundaries: function() {\n splitRangeBoundaries(this);\n },\n\n splitBoundariesPreservingPositions: function(positionsToPreserve) {\n splitRangeBoundaries(this, positionsToPreserve);\n },\n\n normalizeBoundaries: function() {\n assertRangeValid(this);\n\n var sc = this.startContainer, so = this.startOffset, ec = this.endContainer, eo = this.endOffset;\n\n var mergeForward = function(node) {\n var sibling = node.nextSibling;\n if (sibling && sibling.nodeType == node.nodeType) {\n ec = node;\n eo = node.length;\n node.appendData(sibling.data);\n removeNode(sibling);\n }\n };\n\n var mergeBackward = function(node) {\n var sibling = node.previousSibling;\n if (sibling && sibling.nodeType == node.nodeType) {\n sc = node;\n var nodeLength = node.length;\n so = sibling.length;\n node.insertData(0, sibling.data);\n removeNode(sibling);\n if (sc == ec) {\n eo += so;\n ec = sc;\n } else if (ec == node.parentNode) {\n var nodeIndex = getNodeIndex(node);\n if (eo == nodeIndex) {\n ec = node;\n eo = nodeLength;\n } else if (eo > nodeIndex) {\n eo--;\n }\n }\n }\n };\n\n var normalizeStart = true;\n var sibling;\n\n if (isCharacterDataNode(ec)) {\n if (eo == ec.length) {\n mergeForward(ec);\n } else if (eo == 0) {\n sibling = ec.previousSibling;\n if (sibling && sibling.nodeType == ec.nodeType) {\n eo = sibling.length;\n if (sc == ec) {\n normalizeStart = false;\n }\n sibling.appendData(ec.data);\n removeNode(ec);\n ec = sibling;\n }\n }\n } else {\n if (eo > 0) {\n var endNode = ec.childNodes[eo - 1];\n if (endNode && isCharacterDataNode(endNode)) {\n mergeForward(endNode);\n }\n }\n normalizeStart = !this.collapsed;\n }\n\n if (normalizeStart) {\n if (isCharacterDataNode(sc)) {\n if (so == 0) {\n mergeBackward(sc);\n } else if (so == sc.length) {\n sibling = sc.nextSibling;\n if (sibling && sibling.nodeType == sc.nodeType) {\n if (ec == sibling) {\n ec = sc;\n eo += sc.length;\n }\n sc.appendData(sibling.data);\n removeNode(sibling);\n }\n }\n } else {\n if (so < sc.childNodes.length) {\n var startNode = sc.childNodes[so];\n if (startNode && isCharacterDataNode(startNode)) {\n mergeBackward(startNode);\n }\n }\n }\n } else {\n sc = ec;\n so = eo;\n }\n\n boundaryUpdater(this, sc, so, ec, eo);\n },\n\n collapseToPoint: function(node, offset) {\n assertNoDocTypeNotationEntityAncestor(node, true);\n assertValidOffset(node, offset);\n this.setStartAndEnd(node, offset);\n },\n\n parentElement: function() {\n assertRangeValid(this);\n var parentNode = this.commonAncestorContainer;\n return parentNode ? getElementAncestor(this.commonAncestorContainer, true) : null;\n }\n });\n\n copyComparisonConstants(constructor);\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Updates commonAncestorContainer and collapsed after boundary change\n function updateCollapsedAndCommonAncestor(range) {\n range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset);\n range.commonAncestorContainer = range.collapsed ?\n range.startContainer : dom.getCommonAncestor(range.startContainer, range.endContainer);\n }\n\n function updateBoundaries(range, startContainer, startOffset, endContainer, endOffset) {\n range.startContainer = startContainer;\n range.startOffset = startOffset;\n range.endContainer = endContainer;\n range.endOffset = endOffset;\n range.document = dom.getDocument(startContainer);\n updateCollapsedAndCommonAncestor(range);\n }\n\n function Range(doc) {\n updateBoundaries(this, doc, 0, doc, 0);\n }\n\n createPrototypeRange(Range, updateBoundaries);\n\n util.extend(Range, {\n rangeProperties: rangeProperties,\n RangeIterator: RangeIterator,\n copyComparisonConstants: copyComparisonConstants,\n createPrototypeRange: createPrototypeRange,\n inspect: inspect,\n toHtml: rangeToHtml,\n getRangeDocument: getRangeDocument,\n rangesEqual: function(r1, r2) {\n return r1.startContainer === r2.startContainer &&\n r1.startOffset === r2.startOffset &&\n r1.endContainer === r2.endContainer &&\n r1.endOffset === r2.endOffset;\n }\n });\n\n api.DomRange = Range;\n });\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Wrappers for the browser's native DOM Range and/or TextRange implementation\n api.createCoreModule(\"WrappedRange\", [\"DomRange\"], function(api, module) {\n var WrappedRange, WrappedTextRange;\n var dom = api.dom;\n var util = api.util;\n var DomPosition = dom.DomPosition;\n var DomRange = api.DomRange;\n var getBody = dom.getBody;\n var getContentDocument = dom.getContentDocument;\n var isCharacterDataNode = dom.isCharacterDataNode;\n\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n if (api.features.implementsDomRange) {\n // This is a wrapper around the browser's native DOM Range. It has two aims:\n // - Provide workarounds for specific browser bugs\n // - provide convenient extensions, which are inherited from Rangy's DomRange\n\n (function() {\n var rangeProto;\n var rangeProperties = DomRange.rangeProperties;\n\n function updateRangeProperties(range) {\n var i = rangeProperties.length, prop;\n while (i--) {\n prop = rangeProperties[i];\n range[prop] = range.nativeRange[prop];\n }\n // Fix for broken collapsed property in IE 9.\n range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset);\n }\n\n function updateNativeRange(range, startContainer, startOffset, endContainer, endOffset) {\n var startMoved = (range.startContainer !== startContainer || range.startOffset != startOffset);\n var endMoved = (range.endContainer !== endContainer || range.endOffset != endOffset);\n var nativeRangeDifferent = !range.equals(range.nativeRange);\n\n // Always set both boundaries for the benefit of IE9 (see issue 35)\n if (startMoved || endMoved || nativeRangeDifferent) {\n range.setEnd(endContainer, endOffset);\n range.setStart(startContainer, startOffset);\n }\n }\n\n var createBeforeAfterNodeSetter;\n\n WrappedRange = function(range) {\n if (!range) {\n throw module.createError(\"WrappedRange: Range must be specified\");\n }\n this.nativeRange = range;\n updateRangeProperties(this);\n };\n\n DomRange.createPrototypeRange(WrappedRange, updateNativeRange);\n\n rangeProto = WrappedRange.prototype;\n\n rangeProto.selectNode = function(node) {\n this.nativeRange.selectNode(node);\n updateRangeProperties(this);\n };\n\n rangeProto.cloneContents = function() {\n return this.nativeRange.cloneContents();\n };\n\n // Due to a long-standing Firefox bug that I have not been able to find a reliable way to detect,\n // insertNode() is never delegated to the native range.\n\n rangeProto.surroundContents = function(node) {\n this.nativeRange.surroundContents(node);\n updateRangeProperties(this);\n };\n\n rangeProto.collapse = function(isStart) {\n this.nativeRange.collapse(isStart);\n updateRangeProperties(this);\n };\n\n rangeProto.cloneRange = function() {\n return new WrappedRange(this.nativeRange.cloneRange());\n };\n\n rangeProto.refresh = function() {\n updateRangeProperties(this);\n };\n\n rangeProto.toString = function() {\n return this.nativeRange.toString();\n };\n\n // Create test range and node for feature detection\n\n var testTextNode = document.createTextNode(\"test\");\n getBody(document).appendChild(testTextNode);\n var range = document.createRange();\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Test for Firefox 2 bug that prevents moving the start of a Range to a point after its current end and\n // correct for it\n\n range.setStart(testTextNode, 0);\n range.setEnd(testTextNode, 0);\n\n try {\n range.setStart(testTextNode, 1);\n\n rangeProto.setStart = function(node, offset) {\n this.nativeRange.setStart(node, offset);\n updateRangeProperties(this);\n };\n\n rangeProto.setEnd = function(node, offset) {\n this.nativeRange.setEnd(node, offset);\n updateRangeProperties(this);\n };\n\n createBeforeAfterNodeSetter = function(name) {\n return function(node) {\n this.nativeRange[name](node);\n updateRangeProperties(this);\n };\n };\n\n } catch(ex) {\n\n rangeProto.setStart = function(node, offset) {\n try {\n this.nativeRange.setStart(node, offset);\n } catch (ex) {\n this.nativeRange.setEnd(node, offset);\n this.nativeRange.setStart(node, offset);\n }\n updateRangeProperties(this);\n };\n\n rangeProto.setEnd = function(node, offset) {\n try {\n this.nativeRange.setEnd(node, offset);\n } catch (ex) {\n this.nativeRange.setStart(node, offset);\n this.nativeRange.setEnd(node, offset);\n }\n updateRangeProperties(this);\n };\n\n createBeforeAfterNodeSetter = function(name, oppositeName) {\n return function(node) {\n try {\n this.nativeRange[name](node);\n } catch (ex) {\n this.nativeRange[oppositeName](node);\n this.nativeRange[name](node);\n }\n updateRangeProperties(this);\n };\n };\n }\n\n rangeProto.setStartBefore = createBeforeAfterNodeSetter(\"setStartBefore\", \"setEndBefore\");\n rangeProto.setStartAfter = createBeforeAfterNodeSetter(\"setStartAfter\", \"setEndAfter\");\n rangeProto.setEndBefore = createBeforeAfterNodeSetter(\"setEndBefore\", \"setStartBefore\");\n rangeProto.setEndAfter = createBeforeAfterNodeSetter(\"setEndAfter\", \"setStartAfter\");\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Always use DOM4-compliant selectNodeContents implementation: it's simpler and less code than testing\n // whether the native implementation can be trusted\n rangeProto.selectNodeContents = function(node) {\n this.setStartAndEnd(node, 0, dom.getNodeLength(node));\n };\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Test for and correct WebKit bug that has the behaviour of compareBoundaryPoints round the wrong way for\n // constants START_TO_END and END_TO_START: https://bugs.webkit.org/show_bug.cgi?id=20738\n\n range.selectNodeContents(testTextNode);\n range.setEnd(testTextNode, 3);\n\n var range2 = document.createRange();\n range2.selectNodeContents(testTextNode);\n range2.setEnd(testTextNode, 4);\n range2.setStart(testTextNode, 2);\n\n if (range.compareBoundaryPoints(range.START_TO_END, range2) == -1 &&\n range.compareBoundaryPoints(range.END_TO_START, range2) == 1) {\n // This is the wrong way round, so correct for it\n\n rangeProto.compareBoundaryPoints = function(type, range) {\n range = range.nativeRange || range;\n if (type == range.START_TO_END) {\n type = range.END_TO_START;\n } else if (type == range.END_TO_START) {\n type = range.START_TO_END;\n }\n return this.nativeRange.compareBoundaryPoints(type, range);\n };\n } else {\n rangeProto.compareBoundaryPoints = function(type, range) {\n return this.nativeRange.compareBoundaryPoints(type, range.nativeRange || range);\n };\n }\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Test for IE deleteContents() and extractContents() bug and correct it. See issue 107.\n\n var el = document.createElement(\"div\");\n el.innerHTML = \"123\";\n var textNode = el.firstChild;\n var body = getBody(document);\n body.appendChild(el);\n\n range.setStart(textNode, 1);\n range.setEnd(textNode, 2);\n range.deleteContents();\n\n if (textNode.data == \"13\") {\n // Behaviour is correct per DOM4 Range so wrap the browser's implementation of deleteContents() and\n // extractContents()\n rangeProto.deleteContents = function() {\n this.nativeRange.deleteContents();\n updateRangeProperties(this);\n };\n\n rangeProto.extractContents = function() {\n var frag = this.nativeRange.extractContents();\n updateRangeProperties(this);\n return frag;\n };\n } else {\n }\n\n body.removeChild(el);\n body = null;\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Test for existence of createContextualFragment and delegate to it if it exists\n if (util.isHostMethod(range, \"createContextualFragment\")) {\n rangeProto.createContextualFragment = function(fragmentStr) {\n return this.nativeRange.createContextualFragment(fragmentStr);\n };\n }\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Clean up\n getBody(document).removeChild(testTextNode);\n\n rangeProto.getName = function() {\n return \"WrappedRange\";\n };\n\n api.WrappedRange = WrappedRange;\n\n api.createNativeRange = function(doc) {\n doc = getContentDocument(doc, module, \"createNativeRange\");\n return doc.createRange();\n };\n })();\n }\n\n if (api.features.implementsTextRange) {\n /*\n This is a workaround for a bug where IE returns the wrong container element from the TextRange's parentElement()\n method. For example, in the following (where pipes denote the selection boundaries):\n\n
  • | a
  • b |
\n\n var range = document.selection.createRange();\n alert(range.parentElement().id); // Should alert \"ul\" but alerts \"b\"\n\n This method returns the common ancestor node of the following:\n - the parentElement() of the textRange\n - the parentElement() of the textRange after calling collapse(true)\n - the parentElement() of the textRange after calling collapse(false)\n */\n var getTextRangeContainerElement = function(textRange) {\n var parentEl = textRange.parentElement();\n var range = textRange.duplicate();\n range.collapse(true);\n var startEl = range.parentElement();\n range = textRange.duplicate();\n range.collapse(false);\n var endEl = range.parentElement();\n var startEndContainer = (startEl == endEl) ? startEl : dom.getCommonAncestor(startEl, endEl);\n\n return startEndContainer == parentEl ? startEndContainer : dom.getCommonAncestor(parentEl, startEndContainer);\n };\n\n var textRangeIsCollapsed = function(textRange) {\n return textRange.compareEndPoints(\"StartToEnd\", textRange) == 0;\n };\n\n // Gets the boundary of a TextRange expressed as a node and an offset within that node. This function started\n // out as an improved version of code found in Tim Cameron Ryan's IERange (http://code.google.com/p/ierange/)\n // but has grown, fixing problems with line breaks in preformatted text, adding workaround for IE TextRange\n // bugs, handling for inputs and images, plus optimizations.\n var getTextRangeBoundaryPosition = function(textRange, wholeRangeContainerElement, isStart, isCollapsed, startInfo) {\n var workingRange = textRange.duplicate();\n workingRange.collapse(isStart);\n var containerElement = workingRange.parentElement();\n\n // Sometimes collapsing a TextRange that's at the start of a text node can move it into the previous node, so\n // check for that\n if (!dom.isOrIsAncestorOf(wholeRangeContainerElement, containerElement)) {\n containerElement = wholeRangeContainerElement;\n }\n\n\n // Deal with nodes that cannot \"contain rich HTML markup\". In practice, this means form inputs, images and\n // similar. See http://msdn.microsoft.com/en-us/library/aa703950%28VS.85%29.aspx\n if (!containerElement.canHaveHTML) {\n var pos = new DomPosition(containerElement.parentNode, dom.getNodeIndex(containerElement));\n return {\n boundaryPosition: pos,\n nodeInfo: {\n nodeIndex: pos.offset,\n containerElement: pos.node\n }\n };\n }\n\n var workingNode = dom.getDocument(containerElement).createElement(\"span\");\n\n // Workaround for HTML5 Shiv's insane violation of document.createElement(). See Rangy issue 104 and HTML5\n // Shiv issue 64: https://github.com/aFarkas/html5shiv/issues/64\n if (workingNode.parentNode) {\n dom.removeNode(workingNode);\n }\n\n var comparison, workingComparisonType = isStart ? \"StartToStart\" : \"StartToEnd\";\n var previousNode, nextNode, boundaryPosition, boundaryNode;\n var start = (startInfo && startInfo.containerElement == containerElement) ? startInfo.nodeIndex : 0;\n var childNodeCount = containerElement.childNodes.length;\n var end = childNodeCount;\n\n // Check end first. Code within the loop assumes that the endth child node of the container is definitely\n // after the range boundary.\n var nodeIndex = end;\n\n while (true) {\n if (nodeIndex == childNodeCount) {\n containerElement.appendChild(workingNode);\n } else {\n containerElement.insertBefore(workingNode, containerElement.childNodes[nodeIndex]);\n }\n workingRange.moveToElementText(workingNode);\n comparison = workingRange.compareEndPoints(workingComparisonType, textRange);\n if (comparison == 0 || start == end) {\n break;\n } else if (comparison == -1) {\n if (end == start + 1) {\n // We know the endth child node is after the range boundary, so we must be done.\n break;\n } else {\n start = nodeIndex;\n }\n } else {\n end = (end == start + 1) ? start : nodeIndex;\n }\n nodeIndex = Math.floor((start + end) / 2);\n containerElement.removeChild(workingNode);\n }\n\n\n // We've now reached or gone past the boundary of the text range we're interested in\n // so have identified the node we want\n boundaryNode = workingNode.nextSibling;\n\n if (comparison == -1 && boundaryNode && isCharacterDataNode(boundaryNode)) {\n // This is a character data node (text, comment, cdata). The working range is collapsed at the start of\n // the node containing the text range's boundary, so we move the end of the working range to the\n // boundary point and measure the length of its text to get the boundary's offset within the node.\n workingRange.setEndPoint(isStart ? \"EndToStart\" : \"EndToEnd\", textRange);\n\n var offset;\n\n if (/[\\r\\n]/.test(boundaryNode.data)) {\n /*\n For the particular case of a boundary within a text node containing rendered line breaks (within a\n
 element, for example), we need a slightly complicated approach to get the boundary's offset in\n                        IE. The facts:\n\n                        - Each line break is represented as \\r in the text node's data/nodeValue properties\n                        - Each line break is represented as \\r\\n in the TextRange's 'text' property\n                        - The 'text' property of the TextRange does not contain trailing line breaks\n\n                        To get round the problem presented by the final fact above, we can use the fact that TextRange's\n                        moveStart() and moveEnd() methods return the actual number of characters moved, which is not\n                        necessarily the same as the number of characters it was instructed to move. The simplest approach is\n                        to use this to store the characters moved when moving both the start and end of the range to the\n                        start of the document body and subtracting the start offset from the end offset (the\n                        \"move-negative-gazillion\" method). However, this is extremely slow when the document is large and\n                        the range is near the end of it. Clearly doing the mirror image (i.e. moving the range boundaries to\n                        the end of the document) has the same problem.\n\n                        Another approach that works is to use moveStart() to move the start boundary of the range up to the\n                        end boundary one character at a time and incrementing a counter with the value returned by the\n                        moveStart() call. However, the check for whether the start boundary has reached the end boundary is\n                        expensive, so this method is slow (although unlike \"move-negative-gazillion\" is largely unaffected\n                        by the location of the range within the document).\n\n                        The approach used below is a hybrid of the two methods above. It uses the fact that a string\n                        containing the TextRange's 'text' property with each \\r\\n converted to a single \\r character cannot\n                        be longer than the text of the TextRange, so the start of the range is moved that length initially\n                        and then a character at a time to make up for any trailing line breaks not contained in the 'text'\n                        property. This has good performance in most situations compared to the previous two methods.\n                        */\n                        var tempRange = workingRange.duplicate();\n                        var rangeLength = tempRange.text.replace(/\\r\\n/g, \"\\r\").length;\n\n                        offset = tempRange.moveStart(\"character\", rangeLength);\n                        while ( (comparison = tempRange.compareEndPoints(\"StartToEnd\", tempRange)) == -1) {\n                            offset++;\n                            tempRange.moveStart(\"character\", 1);\n                        }\n                    } else {\n                        offset = workingRange.text.length;\n                    }\n                    boundaryPosition = new DomPosition(boundaryNode, offset);\n                } else {\n\n                    // If the boundary immediately follows a character data node and this is the end boundary, we should favour\n                    // a position within that, and likewise for a start boundary preceding a character data node\n                    previousNode = (isCollapsed || !isStart) && workingNode.previousSibling;\n                    nextNode = (isCollapsed || isStart) && workingNode.nextSibling;\n                    if (nextNode && isCharacterDataNode(nextNode)) {\n                        boundaryPosition = new DomPosition(nextNode, 0);\n                    } else if (previousNode && isCharacterDataNode(previousNode)) {\n                        boundaryPosition = new DomPosition(previousNode, previousNode.data.length);\n                    } else {\n                        boundaryPosition = new DomPosition(containerElement, dom.getNodeIndex(workingNode));\n                    }\n                }\n\n                // Clean up\n                dom.removeNode(workingNode);\n\n                return {\n                    boundaryPosition: boundaryPosition,\n                    nodeInfo: {\n                        nodeIndex: nodeIndex,\n                        containerElement: containerElement\n                    }\n                };\n            };\n\n            // Returns a TextRange representing the boundary of a TextRange expressed as a node and an offset within that\n            // node. This function started out as an optimized version of code found in Tim Cameron Ryan's IERange\n            // (http://code.google.com/p/ierange/)\n            var createBoundaryTextRange = function(boundaryPosition, isStart) {\n                var boundaryNode, boundaryParent, boundaryOffset = boundaryPosition.offset;\n                var doc = dom.getDocument(boundaryPosition.node);\n                var workingNode, childNodes, workingRange = getBody(doc).createTextRange();\n                var nodeIsDataNode = isCharacterDataNode(boundaryPosition.node);\n\n                if (nodeIsDataNode) {\n                    boundaryNode = boundaryPosition.node;\n                    boundaryParent = boundaryNode.parentNode;\n                } else {\n                    childNodes = boundaryPosition.node.childNodes;\n                    boundaryNode = (boundaryOffset < childNodes.length) ? childNodes[boundaryOffset] : null;\n                    boundaryParent = boundaryPosition.node;\n                }\n\n                // Position the range immediately before the node containing the boundary\n                workingNode = doc.createElement(\"span\");\n\n                // Making the working element non-empty element persuades IE to consider the TextRange boundary to be within\n                // the element rather than immediately before or after it\n                workingNode.innerHTML = \"&#feff;\";\n\n                // insertBefore is supposed to work like appendChild if the second parameter is null. However, a bug report\n                // for IERange suggests that it can crash the browser: http://code.google.com/p/ierange/issues/detail?id=12\n                if (boundaryNode) {\n                    boundaryParent.insertBefore(workingNode, boundaryNode);\n                } else {\n                    boundaryParent.appendChild(workingNode);\n                }\n\n                workingRange.moveToElementText(workingNode);\n                workingRange.collapse(!isStart);\n\n                // Clean up\n                boundaryParent.removeChild(workingNode);\n\n                // Move the working range to the text offset, if required\n                if (nodeIsDataNode) {\n                    workingRange[isStart ? \"moveStart\" : \"moveEnd\"](\"character\", boundaryOffset);\n                }\n\n                return workingRange;\n            };\n\n            /*------------------------------------------------------------------------------------------------------------*/\n\n            // This is a wrapper around a TextRange, providing full DOM Range functionality using rangy's DomRange as a\n            // prototype\n\n            WrappedTextRange = function(textRange) {\n                this.textRange = textRange;\n                this.refresh();\n            };\n\n            WrappedTextRange.prototype = new DomRange(document);\n\n            WrappedTextRange.prototype.refresh = function() {\n                var start, end, startBoundary;\n\n                // TextRange's parentElement() method cannot be trusted. getTextRangeContainerElement() works around that.\n                var rangeContainerElement = getTextRangeContainerElement(this.textRange);\n\n                if (textRangeIsCollapsed(this.textRange)) {\n                    end = start = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, true,\n                        true).boundaryPosition;\n                } else {\n                    startBoundary = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, true, false);\n                    start = startBoundary.boundaryPosition;\n\n                    // An optimization used here is that if the start and end boundaries have the same parent element, the\n                    // search scope for the end boundary can be limited to exclude the portion of the element that precedes\n                    // the start boundary\n                    end = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, false, false,\n                        startBoundary.nodeInfo).boundaryPosition;\n                }\n\n                this.setStart(start.node, start.offset);\n                this.setEnd(end.node, end.offset);\n            };\n\n            WrappedTextRange.prototype.getName = function() {\n                return \"WrappedTextRange\";\n            };\n\n            DomRange.copyComparisonConstants(WrappedTextRange);\n\n            var rangeToTextRange = function(range) {\n                if (range.collapsed) {\n                    return createBoundaryTextRange(new DomPosition(range.startContainer, range.startOffset), true);\n                } else {\n                    var startRange = createBoundaryTextRange(new DomPosition(range.startContainer, range.startOffset), true);\n                    var endRange = createBoundaryTextRange(new DomPosition(range.endContainer, range.endOffset), false);\n                    var textRange = getBody( DomRange.getRangeDocument(range) ).createTextRange();\n                    textRange.setEndPoint(\"StartToStart\", startRange);\n                    textRange.setEndPoint(\"EndToEnd\", endRange);\n                    return textRange;\n                }\n            };\n\n            WrappedTextRange.rangeToTextRange = rangeToTextRange;\n\n            WrappedTextRange.prototype.toTextRange = function() {\n                return rangeToTextRange(this);\n            };\n\n            api.WrappedTextRange = WrappedTextRange;\n\n            // IE 9 and above have both implementations and Rangy makes both available. The next few lines sets which\n            // implementation to use by default.\n            if (!api.features.implementsDomRange || api.config.preferTextRange) {\n                // Add WrappedTextRange as the Range property of the global object to allow expression like Range.END_TO_END to work\n                var globalObj = (function(f) { return f(\"return this;\")(); })(Function);\n                if (typeof globalObj.Range == \"undefined\") {\n                    globalObj.Range = WrappedTextRange;\n                }\n\n                api.createNativeRange = function(doc) {\n                    doc = getContentDocument(doc, module, \"createNativeRange\");\n                    return getBody(doc).createTextRange();\n                };\n\n                api.WrappedRange = WrappedTextRange;\n            }\n        }\n\n        api.createRange = function(doc) {\n            doc = getContentDocument(doc, module, \"createRange\");\n            return new api.WrappedRange(api.createNativeRange(doc));\n        };\n\n        api.createRangyRange = function(doc) {\n            doc = getContentDocument(doc, module, \"createRangyRange\");\n            return new DomRange(doc);\n        };\n\n        util.createAliasForDeprecatedMethod(api, \"createIframeRange\", \"createRange\");\n        util.createAliasForDeprecatedMethod(api, \"createIframeRangyRange\", \"createRangyRange\");\n\n        api.addShimListener(function(win) {\n            var doc = win.document;\n            if (typeof doc.createRange == \"undefined\") {\n                doc.createRange = function() {\n                    return api.createRange(doc);\n                };\n            }\n            doc = win = null;\n        });\n    });\n\n    /*----------------------------------------------------------------------------------------------------------------*/\n\n    // This module creates a selection object wrapper that conforms as closely as possible to the Selection specification\n    // in the W3C Selection API spec (https://www.w3.org/TR/selection-api)\n    api.createCoreModule(\"WrappedSelection\", [\"DomRange\", \"WrappedRange\"], function(api, module) {\n        api.config.checkSelectionRanges = true;\n\n        var BOOLEAN = \"boolean\";\n        var NUMBER = \"number\";\n        var dom = api.dom;\n        var util = api.util;\n        var isHostMethod = util.isHostMethod;\n        var DomRange = api.DomRange;\n        var WrappedRange = api.WrappedRange;\n        var DOMException = api.DOMException;\n        var DomPosition = dom.DomPosition;\n        var getNativeSelection;\n        var selectionIsCollapsed;\n        var features = api.features;\n        var CONTROL = \"Control\";\n        var getDocument = dom.getDocument;\n        var getBody = dom.getBody;\n        var rangesEqual = DomRange.rangesEqual;\n\n\n        // Utility function to support direction parameters in the API that may be a string (\"backward\", \"backwards\",\n        // \"forward\" or \"forwards\") or a Boolean (true for backwards).\n        function isDirectionBackward(dir) {\n            return (typeof dir == \"string\") ? /^backward(s)?$/i.test(dir) : !!dir;\n        }\n\n        function getWindow(win, methodName) {\n            if (!win) {\n                return window;\n            } else if (dom.isWindow(win)) {\n                return win;\n            } else if (win instanceof WrappedSelection) {\n                return win.win;\n            } else {\n                var doc = dom.getContentDocument(win, module, methodName);\n                return dom.getWindow(doc);\n            }\n        }\n\n        function getWinSelection(winParam) {\n            return getWindow(winParam, \"getWinSelection\").getSelection();\n        }\n\n        function getDocSelection(winParam) {\n            return getWindow(winParam, \"getDocSelection\").document.selection;\n        }\n\n        function winSelectionIsBackward(sel) {\n            var backward = false;\n            if (sel.anchorNode) {\n                backward = (dom.comparePoints(sel.anchorNode, sel.anchorOffset, sel.focusNode, sel.focusOffset) == 1);\n            }\n            return backward;\n        }\n\n        // Test for the Range/TextRange and Selection features required\n        // Test for ability to retrieve selection\n        var implementsWinGetSelection = isHostMethod(window, \"getSelection\"),\n            implementsDocSelection = util.isHostObject(document, \"selection\");\n\n        features.implementsWinGetSelection = implementsWinGetSelection;\n        features.implementsDocSelection = implementsDocSelection;\n\n        var useDocumentSelection = implementsDocSelection && (!implementsWinGetSelection || api.config.preferTextRange);\n\n        if (useDocumentSelection) {\n            getNativeSelection = getDocSelection;\n            api.isSelectionValid = function(winParam) {\n                var doc = getWindow(winParam, \"isSelectionValid\").document, nativeSel = doc.selection;\n\n                // Check whether the selection TextRange is actually contained within the correct document\n                return (nativeSel.type != \"None\" || getDocument(nativeSel.createRange().parentElement()) == doc);\n            };\n        } else if (implementsWinGetSelection) {\n            getNativeSelection = getWinSelection;\n            api.isSelectionValid = function() {\n                return true;\n            };\n        } else {\n            module.fail(\"Neither document.selection or window.getSelection() detected.\");\n            return false;\n        }\n\n        api.getNativeSelection = getNativeSelection;\n\n        var testSelection = getNativeSelection();\n\n        // In Firefox, the selection is null in an iframe with display: none. See issue #138.\n        if (!testSelection) {\n            module.fail(\"Native selection was null (possibly issue 138?)\");\n            return false;\n        }\n\n        var testRange = api.createNativeRange(document);\n        var body = getBody(document);\n\n        // Obtaining a range from a selection\n        var selectionHasAnchorAndFocus = util.areHostProperties(testSelection,\n            [\"anchorNode\", \"focusNode\", \"anchorOffset\", \"focusOffset\"]);\n\n        features.selectionHasAnchorAndFocus = selectionHasAnchorAndFocus;\n\n        // Test for existence of native selection extend() method\n        var selectionHasExtend = isHostMethod(testSelection, \"extend\");\n        features.selectionHasExtend = selectionHasExtend;\n\n        // Test for existence of native selection setBaseAndExtent() method\n        var selectionHasSetBaseAndExtent = isHostMethod(testSelection, \"setBaseAndExtent\");\n        features.selectionHasSetBaseAndExtent = selectionHasSetBaseAndExtent;\n\n        // Test if rangeCount exists\n        var selectionHasRangeCount = (typeof testSelection.rangeCount == NUMBER);\n        features.selectionHasRangeCount = selectionHasRangeCount;\n\n        var selectionSupportsMultipleRanges = false;\n        var collapsedNonEditableSelectionsSupported = true;\n\n        var addRangeBackwardToNative = selectionHasExtend ?\n            function(nativeSelection, range) {\n                var doc = DomRange.getRangeDocument(range);\n                var endRange = api.createRange(doc);\n                endRange.collapseToPoint(range.endContainer, range.endOffset);\n                nativeSelection.addRange(getNativeRange(endRange));\n                nativeSelection.extend(range.startContainer, range.startOffset);\n            } : null;\n\n        if (util.areHostMethods(testSelection, [\"addRange\", \"getRangeAt\", \"removeAllRanges\"]) &&\n                typeof testSelection.rangeCount == NUMBER && features.implementsDomRange) {\n\n            (function() {\n                // Previously an iframe was used but this caused problems in some circumstances in IE, so tests are\n                // performed on the current document's selection. See issue 109.\n\n                // Note also that if a selection previously existed, it is wiped and later restored by these tests. This\n                // will result in the selection direction being reversed if the original selection was backwards and the\n                // browser does not support setting backwards selections (Internet Explorer, I'm looking at you).\n                var sel = window.getSelection();\n                if (sel) {\n                    // Store the current selection\n                    var originalSelectionRangeCount = sel.rangeCount;\n                    var selectionHasMultipleRanges = (originalSelectionRangeCount > 1);\n                    var originalSelectionRanges = [];\n                    var originalSelectionBackward = winSelectionIsBackward(sel);\n                    for (var i = 0; i < originalSelectionRangeCount; ++i) {\n                        originalSelectionRanges[i] = sel.getRangeAt(i);\n                    }\n\n                    // Create some test elements\n                    var testEl = dom.createTestElement(document, \"\", false);\n                    var textNode = testEl.appendChild( document.createTextNode(\"\\u00a0\\u00a0\\u00a0\") );\n\n                    // Test whether the native selection will allow a collapsed selection within a non-editable element\n                    var r1 = document.createRange();\n\n                    r1.setStart(textNode, 1);\n                    r1.collapse(true);\n                    sel.removeAllRanges();\n                    sel.addRange(r1);\n                    collapsedNonEditableSelectionsSupported = (sel.rangeCount == 1);\n                    sel.removeAllRanges();\n\n                    // Test whether the native selection is capable of supporting multiple ranges.\n                    if (!selectionHasMultipleRanges) {\n                        // Doing the original feature test here in Chrome 36 (and presumably later versions) prints a\n                        // console error of \"Discontiguous selection is not supported.\" that cannot be suppressed. There's\n                        // nothing we can do about this while retaining the feature test so we have to resort to a browser\n                        // sniff. I'm not happy about it. See\n                        // https://code.google.com/p/chromium/issues/detail?id=399791\n                        var chromeMatch = window.navigator.appVersion.match(/Chrome\\/(.*?) /);\n                        if (chromeMatch && parseInt(chromeMatch[1]) >= 36) {\n                            selectionSupportsMultipleRanges = false;\n                        } else {\n                            var r2 = r1.cloneRange();\n                            r1.setStart(textNode, 0);\n                            r2.setEnd(textNode, 3);\n                            r2.setStart(textNode, 2);\n                            sel.addRange(r1);\n                            sel.addRange(r2);\n                            selectionSupportsMultipleRanges = (sel.rangeCount == 2);\n                        }\n                    }\n\n                    // Clean up\n                    dom.removeNode(testEl);\n                    sel.removeAllRanges();\n\n                    for (i = 0; i < originalSelectionRangeCount; ++i) {\n                        if (i == 0 && originalSelectionBackward) {\n                            if (addRangeBackwardToNative) {\n                                addRangeBackwardToNative(sel, originalSelectionRanges[i]);\n                            } else {\n                                api.warn(\"Rangy initialization: original selection was backwards but selection has been restored forwards because the browser does not support Selection.extend\");\n                                sel.addRange(originalSelectionRanges[i]);\n                            }\n                        } else {\n                            sel.addRange(originalSelectionRanges[i]);\n                        }\n                    }\n                }\n            })();\n        }\n\n        features.selectionSupportsMultipleRanges = selectionSupportsMultipleRanges;\n        features.collapsedNonEditableSelectionsSupported = collapsedNonEditableSelectionsSupported;\n\n        // ControlRanges\n        var implementsControlRange = false, testControlRange;\n\n        if (body && isHostMethod(body, \"createControlRange\")) {\n            testControlRange = body.createControlRange();\n            if (util.areHostProperties(testControlRange, [\"item\", \"add\"])) {\n                implementsControlRange = true;\n            }\n        }\n        features.implementsControlRange = implementsControlRange;\n\n        // Selection collapsedness\n        if (selectionHasAnchorAndFocus) {\n            selectionIsCollapsed = function(sel) {\n                return sel.anchorNode === sel.focusNode && sel.anchorOffset === sel.focusOffset;\n            };\n        } else {\n            selectionIsCollapsed = function(sel) {\n                return sel.rangeCount ? sel.getRangeAt(sel.rangeCount - 1).collapsed : false;\n            };\n        }\n\n        function updateAnchorAndFocusFromRange(sel, range, backward) {\n            var anchorPrefix = backward ? \"end\" : \"start\", focusPrefix = backward ? \"start\" : \"end\";\n            sel.anchorNode = range[anchorPrefix + \"Container\"];\n            sel.anchorOffset = range[anchorPrefix + \"Offset\"];\n            sel.focusNode = range[focusPrefix + \"Container\"];\n            sel.focusOffset = range[focusPrefix + \"Offset\"];\n        }\n\n        function updateAnchorAndFocusFromNativeSelection(sel) {\n            var nativeSel = sel.nativeSelection;\n            sel.anchorNode = nativeSel.anchorNode;\n            sel.anchorOffset = nativeSel.anchorOffset;\n            sel.focusNode = nativeSel.focusNode;\n            sel.focusOffset = nativeSel.focusOffset;\n        }\n\n        function updateEmptySelection(sel) {\n            sel.anchorNode = sel.focusNode = null;\n            sel.anchorOffset = sel.focusOffset = 0;\n            sel.rangeCount = 0;\n            sel.isCollapsed = true;\n            sel._ranges.length = 0;\n            updateType(sel);\n        }\n\n        function updateType(sel) {\n            sel.type = (sel.rangeCount == 0) ? \"None\" : (selectionIsCollapsed(sel) ? \"Caret\" : \"Range\");\n        }\n\n        function getNativeRange(range) {\n            var nativeRange;\n            if (range instanceof DomRange) {\n                nativeRange = api.createNativeRange(range.getDocument());\n                nativeRange.setEnd(range.endContainer, range.endOffset);\n                nativeRange.setStart(range.startContainer, range.startOffset);\n            } else if (range instanceof WrappedRange) {\n                nativeRange = range.nativeRange;\n            } else if (features.implementsDomRange && (range instanceof dom.getWindow(range.startContainer).Range)) {\n                nativeRange = range;\n            }\n            return nativeRange;\n        }\n\n        function rangeContainsSingleElement(rangeNodes) {\n            if (!rangeNodes.length || rangeNodes[0].nodeType != 1) {\n                return false;\n            }\n            for (var i = 1, len = rangeNodes.length; i < len; ++i) {\n                if (!dom.isAncestorOf(rangeNodes[0], rangeNodes[i])) {\n                    return false;\n                }\n            }\n            return true;\n        }\n\n        function getSingleElementFromRange(range) {\n            var nodes = range.getNodes();\n            if (!rangeContainsSingleElement(nodes)) {\n                throw module.createError(\"getSingleElementFromRange: range \" + range.inspect() + \" did not consist of a single element\");\n            }\n            return nodes[0];\n        }\n\n        // Simple, quick test which only needs to distinguish between a TextRange and a ControlRange\n        function isTextRange(range) {\n            return !!range && typeof range.text != \"undefined\";\n        }\n\n        function updateFromTextRange(sel, range) {\n            // Create a Range from the selected TextRange\n            var wrappedRange = new WrappedRange(range);\n            sel._ranges = [wrappedRange];\n\n            updateAnchorAndFocusFromRange(sel, wrappedRange, false);\n            sel.rangeCount = 1;\n            sel.isCollapsed = wrappedRange.collapsed;\n            updateType(sel);\n        }\n\n        function updateControlSelection(sel) {\n            // Update the wrapped selection based on what's now in the native selection\n            sel._ranges.length = 0;\n            if (sel.docSelection.type == \"None\") {\n                updateEmptySelection(sel);\n            } else {\n                var controlRange = sel.docSelection.createRange();\n                if (isTextRange(controlRange)) {\n                    // This case (where the selection type is \"Control\" and calling createRange() on the selection returns\n                    // a TextRange) can happen in IE 9. It happens, for example, when all elements in the selected\n                    // ControlRange have been removed from the ControlRange and removed from the document.\n                    updateFromTextRange(sel, controlRange);\n                } else {\n                    sel.rangeCount = controlRange.length;\n                    var range, doc = getDocument(controlRange.item(0));\n                    for (var i = 0; i < sel.rangeCount; ++i) {\n                        range = api.createRange(doc);\n                        range.selectNode(controlRange.item(i));\n                        sel._ranges.push(range);\n                    }\n                    sel.isCollapsed = sel.rangeCount == 1 && sel._ranges[0].collapsed;\n                    updateAnchorAndFocusFromRange(sel, sel._ranges[sel.rangeCount - 1], false);\n                    updateType(sel);\n                }\n            }\n        }\n\n        function addRangeToControlSelection(sel, range) {\n            var controlRange = sel.docSelection.createRange();\n            var rangeElement = getSingleElementFromRange(range);\n\n            // Create a new ControlRange containing all the elements in the selected ControlRange plus the element\n            // contained by the supplied range\n            var doc = getDocument(controlRange.item(0));\n            var newControlRange = getBody(doc).createControlRange();\n            for (var i = 0, len = controlRange.length; i < len; ++i) {\n                newControlRange.add(controlRange.item(i));\n            }\n            try {\n                newControlRange.add(rangeElement);\n            } catch (ex) {\n                throw module.createError(\"addRange(): Element within the specified Range could not be added to control selection (does it have layout?)\");\n            }\n            newControlRange.select();\n\n            // Update the wrapped selection based on what's now in the native selection\n            updateControlSelection(sel);\n        }\n\n        var getSelectionRangeAt;\n\n        if (isHostMethod(testSelection, \"getRangeAt\")) {\n            // try/catch is present because getRangeAt() must have thrown an error in some browser and some situation.\n            // Unfortunately, I didn't write a comment about the specifics and am now scared to take it out. Let that be a\n            // lesson to us all, especially me.\n            getSelectionRangeAt = function(sel, index) {\n                try {\n                    return sel.getRangeAt(index);\n                } catch (ex) {\n                    return null;\n                }\n            };\n        } else if (selectionHasAnchorAndFocus) {\n            getSelectionRangeAt = function(sel) {\n                var doc = getDocument(sel.anchorNode);\n                var range = api.createRange(doc);\n                range.setStartAndEnd(sel.anchorNode, sel.anchorOffset, sel.focusNode, sel.focusOffset);\n\n                // Handle the case when the selection was selected backwards (from the end to the start in the\n                // document)\n                if (range.collapsed !== this.isCollapsed) {\n                    range.setStartAndEnd(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset);\n                }\n\n                return range;\n            };\n        }\n\n        function WrappedSelection(selection, docSelection, win) {\n            this.nativeSelection = selection;\n            this.docSelection = docSelection;\n            this._ranges = [];\n            this.win = win;\n            this.refresh();\n        }\n\n        WrappedSelection.prototype = api.selectionPrototype;\n\n        function deleteProperties(sel) {\n            sel.win = sel.anchorNode = sel.focusNode = sel._ranges = null;\n            sel.rangeCount = sel.anchorOffset = sel.focusOffset = 0;\n            sel.detached = true;\n            updateType(sel);\n        }\n\n        var cachedRangySelections = [];\n\n        function actOnCachedSelection(win, action) {\n            var i = cachedRangySelections.length, cached, sel;\n            while (i--) {\n                cached = cachedRangySelections[i];\n                sel = cached.selection;\n                if (action == \"deleteAll\") {\n                    deleteProperties(sel);\n                } else if (cached.win == win) {\n                    if (action == \"delete\") {\n                        cachedRangySelections.splice(i, 1);\n                        return true;\n                    } else {\n                        return sel;\n                    }\n                }\n            }\n            if (action == \"deleteAll\") {\n                cachedRangySelections.length = 0;\n            }\n            return null;\n        }\n\n        var getSelection = function(win) {\n            // Check if the parameter is a Rangy Selection object\n            if (win && win instanceof WrappedSelection) {\n                win.refresh();\n                return win;\n            }\n\n            win = getWindow(win, \"getNativeSelection\");\n\n            var sel = actOnCachedSelection(win);\n            var nativeSel = getNativeSelection(win), docSel = implementsDocSelection ? getDocSelection(win) : null;\n            if (sel) {\n                sel.nativeSelection = nativeSel;\n                sel.docSelection = docSel;\n                sel.refresh();\n            } else {\n                sel = new WrappedSelection(nativeSel, docSel, win);\n                cachedRangySelections.push( { win: win, selection: sel } );\n            }\n            return sel;\n        };\n\n        api.getSelection = getSelection;\n\n        util.createAliasForDeprecatedMethod(api, \"getIframeSelection\", \"getSelection\");\n\n        var selProto = WrappedSelection.prototype;\n\n        function createControlSelection(sel, ranges) {\n            // Ensure that the selection becomes of type \"Control\"\n            var doc = getDocument(ranges[0].startContainer);\n            var controlRange = getBody(doc).createControlRange();\n            for (var i = 0, el, len = ranges.length; i < len; ++i) {\n                el = getSingleElementFromRange(ranges[i]);\n                try {\n                    controlRange.add(el);\n                } catch (ex) {\n                    throw module.createError(\"setRanges(): Element within one of the specified Ranges could not be added to control selection (does it have layout?)\");\n                }\n            }\n            controlRange.select();\n\n            // Update the wrapped selection based on what's now in the native selection\n            updateControlSelection(sel);\n        }\n\n        // Selecting a range\n        if (!useDocumentSelection && selectionHasAnchorAndFocus && util.areHostMethods(testSelection, [\"removeAllRanges\", \"addRange\"])) {\n            selProto.removeAllRanges = function() {\n                this.nativeSelection.removeAllRanges();\n                updateEmptySelection(this);\n            };\n\n            var addRangeBackward = function(sel, range) {\n                addRangeBackwardToNative(sel.nativeSelection, range);\n                sel.refresh();\n            };\n\n            if (selectionHasRangeCount) {\n                selProto.addRange = function(range, direction) {\n                    if (implementsControlRange && implementsDocSelection && this.docSelection.type == CONTROL) {\n                        addRangeToControlSelection(this, range);\n                    } else {\n                        if (isDirectionBackward(direction) && selectionHasExtend) {\n                            addRangeBackward(this, range);\n                        } else {\n                            var previousRangeCount;\n                            if (selectionSupportsMultipleRanges) {\n                                previousRangeCount = this.rangeCount;\n                            } else {\n                                this.removeAllRanges();\n                                previousRangeCount = 0;\n                            }\n                            // Clone the native range so that changing the selected range does not affect the selection.\n                            // This is contrary to the spec but is the only way to achieve consistency between browsers. See\n                            // issue 80.\n                            var clonedNativeRange = getNativeRange(range).cloneRange();\n                            try {\n                                this.nativeSelection.addRange(clonedNativeRange);\n                            } catch (ex) {\n                            }\n\n                            // Check whether adding the range was successful\n                            this.rangeCount = this.nativeSelection.rangeCount;\n\n                            if (this.rangeCount == previousRangeCount + 1) {\n                                // The range was added successfully\n\n                                // Check whether the range that we added to the selection is reflected in the last range extracted from\n                                // the selection\n                                if (api.config.checkSelectionRanges) {\n                                    var nativeRange = getSelectionRangeAt(this.nativeSelection, this.rangeCount - 1);\n                                    if (nativeRange && !rangesEqual(nativeRange, range)) {\n                                        // Happens in WebKit with, for example, a selection placed at the start of a text node\n                                        range = new WrappedRange(nativeRange);\n                                    }\n                                }\n                                this._ranges[this.rangeCount - 1] = range;\n                                updateAnchorAndFocusFromRange(this, range, selectionIsBackward(this.nativeSelection));\n                                this.isCollapsed = selectionIsCollapsed(this);\n                                updateType(this);\n                            } else {\n                                // The range was not added successfully. The simplest thing is to refresh\n                                this.refresh();\n                            }\n                        }\n                    }\n                };\n            } else {\n                selProto.addRange = function(range, direction) {\n                    if (isDirectionBackward(direction) && selectionHasExtend) {\n                        addRangeBackward(this, range);\n                    } else {\n                        this.nativeSelection.addRange(getNativeRange(range));\n                        this.refresh();\n                    }\n                };\n            }\n\n            selProto.setRanges = function(ranges) {\n                if (implementsControlRange && implementsDocSelection && ranges.length > 1) {\n                    createControlSelection(this, ranges);\n                } else {\n                    this.removeAllRanges();\n                    for (var i = 0, len = ranges.length; i < len; ++i) {\n                        this.addRange(ranges[i]);\n                    }\n                }\n            };\n        } else if (isHostMethod(testSelection, \"empty\") && isHostMethod(testRange, \"select\") &&\n                   implementsControlRange && useDocumentSelection) {\n\n            selProto.removeAllRanges = function() {\n                // Added try/catch as fix for issue #21\n                try {\n                    this.docSelection.empty();\n\n                    // Check for empty() not working (issue #24)\n                    if (this.docSelection.type != \"None\") {\n                        // Work around failure to empty a control selection by instead selecting a TextRange and then\n                        // calling empty()\n                        var doc;\n                        if (this.anchorNode) {\n                            doc = getDocument(this.anchorNode);\n                        } else if (this.docSelection.type == CONTROL) {\n                            var controlRange = this.docSelection.createRange();\n                            if (controlRange.length) {\n                                doc = getDocument( controlRange.item(0) );\n                            }\n                        }\n                        if (doc) {\n                            var textRange = getBody(doc).createTextRange();\n                            textRange.select();\n                            this.docSelection.empty();\n                        }\n                    }\n                } catch(ex) {}\n                updateEmptySelection(this);\n            };\n\n            selProto.addRange = function(range) {\n                if (this.docSelection.type == CONTROL) {\n                    addRangeToControlSelection(this, range);\n                } else {\n                    api.WrappedTextRange.rangeToTextRange(range).select();\n                    this._ranges[0] = range;\n                    this.rangeCount = 1;\n                    this.isCollapsed = this._ranges[0].collapsed;\n                    updateAnchorAndFocusFromRange(this, range, false);\n                    updateType(this);\n                }\n            };\n\n            selProto.setRanges = function(ranges) {\n                this.removeAllRanges();\n                var rangeCount = ranges.length;\n                if (rangeCount > 1) {\n                    createControlSelection(this, ranges);\n                } else if (rangeCount) {\n                    this.addRange(ranges[0]);\n                }\n            };\n        } else {\n            module.fail(\"No means of selecting a Range or TextRange was found\");\n            return false;\n        }\n\n        selProto.getRangeAt = function(index) {\n            if (index < 0 || index >= this.rangeCount) {\n                throw new DOMException(\"INDEX_SIZE_ERR\");\n            } else {\n                // Clone the range to preserve selection-range independence. See issue 80.\n                return this._ranges[index].cloneRange();\n            }\n        };\n\n        var refreshSelection;\n\n        if (useDocumentSelection) {\n            refreshSelection = function(sel) {\n                var range;\n                if (api.isSelectionValid(sel.win)) {\n                    range = sel.docSelection.createRange();\n                } else {\n                    range = getBody(sel.win.document).createTextRange();\n                    range.collapse(true);\n                }\n\n                if (sel.docSelection.type == CONTROL) {\n                    updateControlSelection(sel);\n                } else if (isTextRange(range)) {\n                    updateFromTextRange(sel, range);\n                } else {\n                    updateEmptySelection(sel);\n                }\n            };\n        } else if (isHostMethod(testSelection, \"getRangeAt\") && typeof testSelection.rangeCount == NUMBER) {\n            refreshSelection = function(sel) {\n                if (implementsControlRange && implementsDocSelection && sel.docSelection.type == CONTROL) {\n                    updateControlSelection(sel);\n                } else {\n                    sel._ranges.length = sel.rangeCount = sel.nativeSelection.rangeCount;\n                    if (sel.rangeCount) {\n                        for (var i = 0, len = sel.rangeCount; i < len; ++i) {\n                            sel._ranges[i] = new api.WrappedRange(sel.nativeSelection.getRangeAt(i));\n                        }\n                        updateAnchorAndFocusFromRange(sel, sel._ranges[sel.rangeCount - 1], selectionIsBackward(sel.nativeSelection));\n                        sel.isCollapsed = selectionIsCollapsed(sel);\n                        updateType(sel);\n                    } else {\n                        updateEmptySelection(sel);\n                    }\n                }\n            };\n        } else if (selectionHasAnchorAndFocus && typeof testSelection.isCollapsed == BOOLEAN && typeof testRange.collapsed == BOOLEAN && features.implementsDomRange) {\n            refreshSelection = function(sel) {\n                var range, nativeSel = sel.nativeSelection;\n                if (nativeSel.anchorNode) {\n                    range = getSelectionRangeAt(nativeSel, 0);\n                    sel._ranges = [range];\n                    sel.rangeCount = 1;\n                    updateAnchorAndFocusFromNativeSelection(sel);\n                    sel.isCollapsed = selectionIsCollapsed(sel);\n                    updateType(sel);\n                } else {\n                    updateEmptySelection(sel);\n                }\n            };\n        } else {\n            module.fail(\"No means of obtaining a Range or TextRange from the user's selection was found\");\n            return false;\n        }\n\n        selProto.refresh = function(checkForChanges) {\n            var oldRanges = checkForChanges ? this._ranges.slice(0) : null;\n            var oldAnchorNode = this.anchorNode, oldAnchorOffset = this.anchorOffset;\n\n            refreshSelection(this);\n            if (checkForChanges) {\n                // Check the range count first\n                var i = oldRanges.length;\n                if (i != this._ranges.length) {\n                    return true;\n                }\n\n                // Now check the direction. Checking the anchor position is the same is enough since we're checking all the\n                // ranges after this\n                if (this.anchorNode != oldAnchorNode || this.anchorOffset != oldAnchorOffset) {\n                    return true;\n                }\n\n                // Finally, compare each range in turn\n                while (i--) {\n                    if (!rangesEqual(oldRanges[i], this._ranges[i])) {\n                        return true;\n                    }\n                }\n                return false;\n            }\n        };\n\n        // Removal of a single range\n        var removeRangeManually = function(sel, range) {\n            var ranges = sel.getAllRanges();\n            sel.removeAllRanges();\n            for (var i = 0, len = ranges.length; i < len; ++i) {\n                if (!rangesEqual(range, ranges[i])) {\n                    sel.addRange(ranges[i]);\n                }\n            }\n            if (!sel.rangeCount) {\n                updateEmptySelection(sel);\n            }\n        };\n\n        if (implementsControlRange && implementsDocSelection) {\n            selProto.removeRange = function(range) {\n                if (this.docSelection.type == CONTROL) {\n                    var controlRange = this.docSelection.createRange();\n                    var rangeElement = getSingleElementFromRange(range);\n\n                    // Create a new ControlRange containing all the elements in the selected ControlRange minus the\n                    // element contained by the supplied range\n                    var doc = getDocument(controlRange.item(0));\n                    var newControlRange = getBody(doc).createControlRange();\n                    var el, removed = false;\n                    for (var i = 0, len = controlRange.length; i < len; ++i) {\n                        el = controlRange.item(i);\n                        if (el !== rangeElement || removed) {\n                            newControlRange.add(controlRange.item(i));\n                        } else {\n                            removed = true;\n                        }\n                    }\n                    newControlRange.select();\n\n                    // Update the wrapped selection based on what's now in the native selection\n                    updateControlSelection(this);\n                } else {\n                    removeRangeManually(this, range);\n                }\n            };\n        } else {\n            selProto.removeRange = function(range) {\n                removeRangeManually(this, range);\n            };\n        }\n\n        // Detecting if a selection is backward\n        var selectionIsBackward;\n        if (!useDocumentSelection && selectionHasAnchorAndFocus && features.implementsDomRange) {\n            selectionIsBackward = winSelectionIsBackward;\n\n            selProto.isBackward = function() {\n                return selectionIsBackward(this);\n            };\n        } else {\n            selectionIsBackward = selProto.isBackward = function() {\n                return false;\n            };\n        }\n\n        // Create an alias for backwards compatibility. From 1.3, everything is \"backward\" rather than \"backwards\"\n        selProto.isBackwards = selProto.isBackward;\n\n        // Selection stringifier\n        // This is conformant to the old HTML5 selections draft spec but differs from WebKit and Mozilla's implementation.\n        // The current spec does not yet define this method.\n        selProto.toString = function() {\n            var rangeTexts = [];\n            for (var i = 0, len = this.rangeCount; i < len; ++i) {\n                rangeTexts[i] = \"\" + this._ranges[i];\n            }\n            return rangeTexts.join(\"\");\n        };\n\n        function assertNodeInSameDocument(sel, node) {\n            if (sel.win.document != getDocument(node)) {\n                throw new DOMException(\"WRONG_DOCUMENT_ERR\");\n            }\n        }\n\n        function assertValidOffset(node, offset) {\n            if (offset < 0 || offset > (dom.isCharacterDataNode(node) ? node.length : node.childNodes.length)) {\n                throw new DOMException(\"INDEX_SIZE_ERR\");\n            }\n        }\n\n        // No current browser conforms fully to the spec for this method, so Rangy's own method is always used\n        selProto.collapse = function(node, offset) {\n            assertNodeInSameDocument(this, node);\n            var range = api.createRange(node);\n            range.collapseToPoint(node, offset);\n            this.setSingleRange(range);\n            this.isCollapsed = true;\n        };\n\n        selProto.collapseToStart = function() {\n            if (this.rangeCount) {\n                var range = this._ranges[0];\n                this.collapse(range.startContainer, range.startOffset);\n            } else {\n                throw new DOMException(\"INVALID_STATE_ERR\");\n            }\n        };\n\n        selProto.collapseToEnd = function() {\n            if (this.rangeCount) {\n                var range = this._ranges[this.rangeCount - 1];\n                this.collapse(range.endContainer, range.endOffset);\n            } else {\n                throw new DOMException(\"INVALID_STATE_ERR\");\n            }\n        };\n\n        // The spec is very specific on how selectAllChildren should be implemented and not all browsers implement it as\n        // specified so the native implementation is never used by Rangy.\n        selProto.selectAllChildren = function(node) {\n            assertNodeInSameDocument(this, node);\n            var range = api.createRange(node);\n            range.selectNodeContents(node);\n            this.setSingleRange(range);\n        };\n\n        if (selectionHasSetBaseAndExtent) {\n            selProto.setBaseAndExtent = function(anchorNode, anchorOffset, focusNode, focusOffset) {\n                this.nativeSelection.setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset);\n                this.refresh();\n            };\n        } else if (selectionHasExtend) {\n            selProto.setBaseAndExtent = function(anchorNode, anchorOffset, focusNode, focusOffset) {\n                assertValidOffset(anchorNode, anchorOffset);\n                assertValidOffset(focusNode, focusOffset);\n                assertNodeInSameDocument(this, anchorNode);\n                assertNodeInSameDocument(this, focusNode);\n                var range = api.createRange(node);\n                var isBackwards = (dom.comparePoints(anchorNode, anchorOffset, focusNode, focusOffset) == -1);\n                if (isBackwards) {\n                    range.setStartAndEnd(focusNode, focusOffset, anchorNode, anchorOffset);\n                } else {\n                    range.setStartAndEnd(anchorNode, anchorOffset, focusNode, focusOffset);\n                }\n                this.setSingleRange(range, isBackwards);\n            };\n        }\n\n        selProto.deleteFromDocument = function() {\n            // Sepcial behaviour required for IE's control selections\n            if (implementsControlRange && implementsDocSelection && this.docSelection.type == CONTROL) {\n                var controlRange = this.docSelection.createRange();\n                var element;\n                while (controlRange.length) {\n                    element = controlRange.item(0);\n                    controlRange.remove(element);\n                    dom.removeNode(element);\n                }\n                this.refresh();\n            } else if (this.rangeCount) {\n                var ranges = this.getAllRanges();\n                if (ranges.length) {\n                    this.removeAllRanges();\n                    for (var i = 0, len = ranges.length; i < len; ++i) {\n                        ranges[i].deleteContents();\n                    }\n                    // The spec says nothing about what the selection should contain after calling deleteContents on each\n                    // range. Firefox moves the selection to where the final selected range was, so we emulate that\n                    this.addRange(ranges[len - 1]);\n                }\n            }\n        };\n\n        // The following are non-standard extensions\n        selProto.eachRange = function(func, returnValue) {\n            for (var i = 0, len = this._ranges.length; i < len; ++i) {\n                if ( func( this.getRangeAt(i) ) ) {\n                    return returnValue;\n                }\n            }\n        };\n\n        selProto.getAllRanges = function() {\n            var ranges = [];\n            this.eachRange(function(range) {\n                ranges.push(range);\n            });\n            return ranges;\n        };\n\n        selProto.setSingleRange = function(range, direction) {\n            this.removeAllRanges();\n            this.addRange(range, direction);\n        };\n\n        selProto.callMethodOnEachRange = function(methodName, params) {\n            var results = [];\n            this.eachRange( function(range) {\n                results.push( range[methodName].apply(range, params || []) );\n            } );\n            return results;\n        };\n\n        function createStartOrEndSetter(isStart) {\n            return function(node, offset) {\n                var range;\n                if (this.rangeCount) {\n                    range = this.getRangeAt(0);\n                    range[\"set\" + (isStart ? \"Start\" : \"End\")](node, offset);\n                } else {\n                    range = api.createRange(this.win.document);\n                    range.setStartAndEnd(node, offset);\n                }\n                this.setSingleRange(range, this.isBackward());\n            };\n        }\n\n        selProto.setStart = createStartOrEndSetter(true);\n        selProto.setEnd = createStartOrEndSetter(false);\n\n        // Add select() method to Range prototype. Any existing selection will be removed.\n        api.rangePrototype.select = function(direction) {\n            getSelection( this.getDocument() ).setSingleRange(this, direction);\n        };\n\n        selProto.changeEachRange = function(func) {\n            var ranges = [];\n            var backward = this.isBackward();\n\n            this.eachRange(function(range) {\n                func(range);\n                ranges.push(range);\n            });\n\n            this.removeAllRanges();\n            if (backward && ranges.length == 1) {\n                this.addRange(ranges[0], \"backward\");\n            } else {\n                this.setRanges(ranges);\n            }\n        };\n\n        selProto.containsNode = function(node, allowPartial) {\n            return this.eachRange( function(range) {\n                return range.containsNode(node, allowPartial);\n            }, true ) || false;\n        };\n\n        selProto.getBookmark = function(containerNode) {\n            return {\n                backward: this.isBackward(),\n                rangeBookmarks: this.callMethodOnEachRange(\"getBookmark\", [containerNode])\n            };\n        };\n\n        selProto.moveToBookmark = function(bookmark) {\n            var selRanges = [];\n            for (var i = 0, rangeBookmark, range; rangeBookmark = bookmark.rangeBookmarks[i++]; ) {\n                range = api.createRange(this.win);\n                range.moveToBookmark(rangeBookmark);\n                selRanges.push(range);\n            }\n            if (bookmark.backward) {\n                this.setSingleRange(selRanges[0], \"backward\");\n            } else {\n                this.setRanges(selRanges);\n            }\n        };\n\n        selProto.saveRanges = function() {\n            return {\n                backward: this.isBackward(),\n                ranges: this.callMethodOnEachRange(\"cloneRange\")\n            };\n        };\n\n        selProto.restoreRanges = function(selRanges) {\n            this.removeAllRanges();\n            for (var i = 0, range; range = selRanges.ranges[i]; ++i) {\n                this.addRange(range, (selRanges.backward && i == 0));\n            }\n        };\n\n        selProto.toHtml = function() {\n            var rangeHtmls = [];\n            this.eachRange(function(range) {\n                rangeHtmls.push( DomRange.toHtml(range) );\n            });\n            return rangeHtmls.join(\"\");\n        };\n\n        if (features.implementsTextRange) {\n            selProto.getNativeTextRange = function() {\n                var sel, textRange;\n                if ( (sel = this.docSelection) ) {\n                    var range = sel.createRange();\n                    if (isTextRange(range)) {\n                        return range;\n                    } else {\n                        throw module.createError(\"getNativeTextRange: selection is a control selection\");\n                    }\n                } else if (this.rangeCount > 0) {\n                    return api.WrappedTextRange.rangeToTextRange( this.getRangeAt(0) );\n                } else {\n                    throw module.createError(\"getNativeTextRange: selection contains no range\");\n                }\n            };\n        }\n\n        function inspect(sel) {\n            var rangeInspects = [];\n            var anchor = new DomPosition(sel.anchorNode, sel.anchorOffset);\n            var focus = new DomPosition(sel.focusNode, sel.focusOffset);\n            var name = (typeof sel.getName == \"function\") ? sel.getName() : \"Selection\";\n\n            if (typeof sel.rangeCount != \"undefined\") {\n                for (var i = 0, len = sel.rangeCount; i < len; ++i) {\n                    rangeInspects[i] = DomRange.inspect(sel.getRangeAt(i));\n                }\n            }\n            return \"[\" + name + \"(Ranges: \" + rangeInspects.join(\", \") +\n                    \")(anchor: \" + anchor.inspect() + \", focus: \" + focus.inspect() + \"]\";\n        }\n\n        selProto.getName = function() {\n            return \"WrappedSelection\";\n        };\n\n        selProto.inspect = function() {\n            return inspect(this);\n        };\n\n        selProto.detach = function() {\n            actOnCachedSelection(this.win, \"delete\");\n            deleteProperties(this);\n        };\n\n        WrappedSelection.detachAll = function() {\n            actOnCachedSelection(null, \"deleteAll\");\n        };\n\n        WrappedSelection.inspect = inspect;\n        WrappedSelection.isDirectionBackward = isDirectionBackward;\n\n        api.Selection = WrappedSelection;\n\n        api.selectionPrototype = selProto;\n\n        api.addShimListener(function(win) {\n            if (typeof win.getSelection == \"undefined\") {\n                win.getSelection = function() {\n                    return getSelection(win);\n                };\n            }\n            win = null;\n        });\n    });\n    \n\n    /*----------------------------------------------------------------------------------------------------------------*/\n\n    // Wait for document to load before initializing\n    var docReady = false;\n\n    var loadHandler = function(e) {\n        if (!docReady) {\n            docReady = true;\n            if (!api.initialized && api.config.autoInitialize) {\n                init();\n            }\n        }\n    };\n\n    if (isBrowser) {\n        // Test whether the document has already been loaded and initialize immediately if so\n        if (document.readyState == \"complete\") {\n            loadHandler();\n        } else {\n            if (isHostMethod(document, \"addEventListener\")) {\n                document.addEventListener(\"DOMContentLoaded\", loadHandler, false);\n            }\n\n            // Add a fallback in case the DOMContentLoaded event isn't supported\n            addListener(window, \"load\", loadHandler);\n        }\n    }\n\n    return api;\n}, this);","/**\n * Class Applier module for Rangy.\n * Adds, removes and toggles classes on Ranges and Selections\n *\n * Part of Rangy, a cross-browser JavaScript range and selection library\n * https://github.com/timdown/rangy\n *\n * Depends on Rangy core.\n *\n * Copyright 2024, Tim Down\n * Licensed under the MIT license.\n * Version: 1.3.2\n * Build date: 2 November 2024\n */\n(function(factory, root) {\n    if (typeof define == \"function\" && define.amd) {\n        // AMD. Register as an anonymous module with a dependency on Rangy.\n        define([\"./rangy-core\"], factory);\n    } else if (typeof module != \"undefined\" && typeof exports == \"object\") {\n        // Node/CommonJS style\n        module.exports = factory( require(\"rangy\") );\n    } else {\n        // No AMD or CommonJS support so we use the rangy property of root (probably the global variable)\n        factory(root.rangy);\n    }\n})(function(rangy) {\n    rangy.createModule(\"ClassApplier\", [\"WrappedSelection\"], function(api, module) {\n        var dom = api.dom;\n        var DomPosition = dom.DomPosition;\n        var contains = dom.arrayContains;\n        var util = api.util;\n        var forEach = util.forEach;\n\n\n        var defaultTagName = \"span\";\n        var createElementNSSupported = util.isHostMethod(document, \"createElementNS\");\n\n        function each(obj, func) {\n            for (var i in obj) {\n                if (obj.hasOwnProperty(i)) {\n                    if (func(i, obj[i]) === false) {\n                        return false;\n                    }\n                }\n            }\n            return true;\n        }\n\n        function trim(str) {\n            return str.replace(/^\\s\\s*/, \"\").replace(/\\s\\s*$/, \"\");\n        }\n\n        function classNameContainsClass(fullClassName, className) {\n            return !!fullClassName && new RegExp(\"(?:^|\\\\s)\" + className + \"(?:\\\\s|$)\").test(fullClassName);\n        }\n\n        // Inefficient, inelegant nonsense for IE's svg element, which has no classList and non-HTML className implementation\n        function hasClass(el, className) {\n            if (typeof el.classList == \"object\") {\n                return el.classList.contains(className);\n            } else {\n                var classNameSupported = (typeof el.className == \"string\");\n                var elClass = classNameSupported ? el.className : el.getAttribute(\"class\");\n                return classNameContainsClass(elClass, className);\n            }\n        }\n\n        function addClass(el, className) {\n            if (typeof el.classList == \"object\") {\n                el.classList.add(className);\n            } else {\n                var classNameSupported = (typeof el.className == \"string\");\n                var elClass = classNameSupported ? el.className : el.getAttribute(\"class\");\n                if (elClass) {\n                    if (!classNameContainsClass(elClass, className)) {\n                        elClass += \" \" + className;\n                    }\n                } else {\n                    elClass = className;\n                }\n                if (classNameSupported) {\n                    el.className = elClass;\n                } else {\n                    el.setAttribute(\"class\", elClass);\n                }\n            }\n        }\n\n        var removeClass = (function() {\n            function replacer(matched, whiteSpaceBefore, whiteSpaceAfter) {\n                return (whiteSpaceBefore && whiteSpaceAfter) ? \" \" : \"\";\n            }\n\n            return function(el, className) {\n                if (typeof el.classList == \"object\") {\n                    el.classList.remove(className);\n                } else {\n                    var classNameSupported = (typeof el.className == \"string\");\n                    var elClass = classNameSupported ? el.className : el.getAttribute(\"class\");\n                    elClass = elClass.replace(new RegExp(\"(^|\\\\s)\" + className + \"(\\\\s|$)\"), replacer);\n                    if (classNameSupported) {\n                        el.className = elClass;\n                    } else {\n                        el.setAttribute(\"class\", elClass);\n                    }\n                }\n            };\n        })();\n\n        function getClass(el) {\n            var classNameSupported = (typeof el.className == \"string\");\n            return classNameSupported ? el.className : el.getAttribute(\"class\");\n        }\n\n        function sortClassName(className) {\n            return className && className.split(/\\s+/).sort().join(\" \");\n        }\n\n        function getSortedClassName(el) {\n            return sortClassName( getClass(el) );\n        }\n\n        function haveSameClasses(el1, el2) {\n            return getSortedClassName(el1) == getSortedClassName(el2);\n        }\n\n        function hasAllClasses(el, className) {\n            var classes = className.split(/\\s+/);\n            for (var i = 0, len = classes.length; i < len; ++i) {\n                if (!hasClass(el, trim(classes[i]))) {\n                    return false;\n                }\n            }\n            return true;\n        }\n\n        function canTextBeStyled(textNode) {\n            var parent = textNode.parentNode;\n            return (parent && parent.nodeType == 1 && !/^(textarea|style|script|select|iframe)$/i.test(parent.nodeName));\n        }\n\n        function movePosition(position, oldParent, oldIndex, newParent, newIndex) {\n            var posNode = position.node, posOffset = position.offset;\n            var newNode = posNode, newOffset = posOffset;\n\n            if (posNode == newParent && posOffset > newIndex) {\n                ++newOffset;\n            }\n\n            if (posNode == oldParent && (posOffset == oldIndex  || posOffset == oldIndex + 1)) {\n                newNode = newParent;\n                newOffset += newIndex - oldIndex;\n            }\n\n            if (posNode == oldParent && posOffset > oldIndex + 1) {\n                --newOffset;\n            }\n\n            position.node = newNode;\n            position.offset = newOffset;\n        }\n\n        function movePositionWhenRemovingNode(position, parentNode, index) {\n            if (position.node == parentNode && position.offset > index) {\n                --position.offset;\n            }\n        }\n\n        function movePreservingPositions(node, newParent, newIndex, positionsToPreserve) {\n            // For convenience, allow newIndex to be -1 to mean \"insert at the end\".\n            if (newIndex == -1) {\n                newIndex = newParent.childNodes.length;\n            }\n\n            var oldParent = node.parentNode;\n            var oldIndex = dom.getNodeIndex(node);\n\n            forEach(positionsToPreserve, function(position) {\n                movePosition(position, oldParent, oldIndex, newParent, newIndex);\n            });\n\n            // Now actually move the node.\n            if (newParent.childNodes.length == newIndex) {\n                newParent.appendChild(node);\n            } else {\n                newParent.insertBefore(node, newParent.childNodes[newIndex]);\n            }\n        }\n\n        function removePreservingPositions(node, positionsToPreserve) {\n\n            var oldParent = node.parentNode;\n            var oldIndex = dom.getNodeIndex(node);\n\n            forEach(positionsToPreserve, function(position) {\n                movePositionWhenRemovingNode(position, oldParent, oldIndex);\n            });\n\n            dom.removeNode(node);\n        }\n\n        function moveChildrenPreservingPositions(node, newParent, newIndex, removeNode, positionsToPreserve) {\n            var child, children = [];\n            while ( (child = node.firstChild) ) {\n                movePreservingPositions(child, newParent, newIndex++, positionsToPreserve);\n                children.push(child);\n            }\n            if (removeNode) {\n                removePreservingPositions(node, positionsToPreserve);\n            }\n            return children;\n        }\n\n        function replaceWithOwnChildrenPreservingPositions(element, positionsToPreserve) {\n            return moveChildrenPreservingPositions(element, element.parentNode, dom.getNodeIndex(element), true, positionsToPreserve);\n        }\n\n        function rangeSelectsAnyText(range, textNode) {\n            var textNodeRange = range.cloneRange();\n            textNodeRange.selectNodeContents(textNode);\n\n            var intersectionRange = textNodeRange.intersection(range);\n            var text = intersectionRange ? intersectionRange.toString() : \"\";\n\n            return text != \"\";\n        }\n\n        function getEffectiveTextNodes(range) {\n            var nodes = range.getNodes([3]);\n\n            // Optimization as per issue 145\n\n            // Remove non-intersecting text nodes from the start of the range\n            var start = 0, node;\n            while ( (node = nodes[start]) && !rangeSelectsAnyText(range, node) ) {\n                ++start;\n            }\n\n            // Remove non-intersecting text nodes from the start of the range\n            var end = nodes.length - 1;\n            while ( (node = nodes[end]) && !rangeSelectsAnyText(range, node) ) {\n                --end;\n            }\n\n            return nodes.slice(start, end + 1);\n        }\n\n        function elementsHaveSameNonClassAttributes(el1, el2) {\n            if (el1.attributes.length != el2.attributes.length) return false;\n            for (var i = 0, len = el1.attributes.length, attr1, attr2, name; i < len; ++i) {\n                attr1 = el1.attributes[i];\n                name = attr1.name;\n                if (name != \"class\") {\n                    attr2 = el2.attributes.getNamedItem(name);\n                    if ( (attr1 === null) != (attr2 === null) ) return false;\n                    if (attr1.specified != attr2.specified) return false;\n                    if (attr1.specified && attr1.nodeValue !== attr2.nodeValue) return false;\n                }\n            }\n            return true;\n        }\n\n        function elementHasNonClassAttributes(el, exceptions) {\n            for (var i = 0, len = el.attributes.length, attrName; i < len; ++i) {\n                attrName = el.attributes[i].name;\n                if ( !(exceptions && contains(exceptions, attrName)) && el.attributes[i].specified && attrName != \"class\") {\n                    return true;\n                }\n            }\n            return false;\n        }\n\n        var getComputedStyleProperty = dom.getComputedStyleProperty;\n        var isEditableElement = (function() {\n            var testEl = document.createElement(\"div\");\n            return typeof testEl.isContentEditable == \"boolean\" ?\n                function (node) {\n                    return node && node.nodeType == 1 && node.isContentEditable;\n                } :\n                function (node) {\n                    if (!node || node.nodeType != 1 || node.contentEditable == \"false\") {\n                        return false;\n                    }\n                    return node.contentEditable == \"true\" || isEditableElement(node.parentNode);\n                };\n        })();\n\n        function isEditingHost(node) {\n            var parent;\n            return node && node.nodeType == 1 &&\n                (( (parent = node.parentNode) && parent.nodeType == 9 && parent.designMode == \"on\") ||\n                (isEditableElement(node) && !isEditableElement(node.parentNode)));\n        }\n\n        function isEditable(node) {\n            return (isEditableElement(node) || (node.nodeType != 1 && isEditableElement(node.parentNode))) && !isEditingHost(node);\n        }\n\n        var inlineDisplayRegex = /^inline(-block|-table)?$/i;\n\n        function isNonInlineElement(node) {\n            return node && node.nodeType == 1 && !inlineDisplayRegex.test(getComputedStyleProperty(node, \"display\"));\n        }\n\n        // White space characters as defined by HTML 4 (http://www.w3.org/TR/html401/struct/text.html)\n        var htmlNonWhiteSpaceRegex = /[^\\r\\n\\t\\f \\u200B]/;\n\n        function isUnrenderedWhiteSpaceNode(node) {\n            if (node.data.length == 0) {\n                return true;\n            }\n            if (htmlNonWhiteSpaceRegex.test(node.data)) {\n                return false;\n            }\n            var cssWhiteSpace = getComputedStyleProperty(node.parentNode, \"whiteSpace\");\n            switch (cssWhiteSpace) {\n                case \"pre\":\n                case \"pre-wrap\":\n                case \"-moz-pre-wrap\":\n                    return false;\n                case \"pre-line\":\n                    if (/[\\r\\n]/.test(node.data)) {\n                        return false;\n                    }\n            }\n\n            // We now have a whitespace-only text node that may be rendered depending on its context. If it is adjacent to a\n            // non-inline element, it will not be rendered. This seems to be a good enough definition.\n            return isNonInlineElement(node.previousSibling) || isNonInlineElement(node.nextSibling);\n        }\n\n        function getRangeBoundaries(ranges) {\n            var positions = [], i, range;\n            for (i = 0; range = ranges[i++]; ) {\n                positions.push(\n                    new DomPosition(range.startContainer, range.startOffset),\n                    new DomPosition(range.endContainer, range.endOffset)\n                );\n            }\n            return positions;\n        }\n\n        function updateRangesFromBoundaries(ranges, positions) {\n            for (var i = 0, range, start, end, len = ranges.length; i < len; ++i) {\n                range = ranges[i];\n                start = positions[i * 2];\n                end = positions[i * 2 + 1];\n                range.setStartAndEnd(start.node, start.offset, end.node, end.offset);\n            }\n        }\n\n        function isSplitPoint(node, offset) {\n            if (dom.isCharacterDataNode(node)) {\n                if (offset == 0) {\n                    return !!node.previousSibling;\n                } else if (offset == node.length) {\n                    return !!node.nextSibling;\n                } else {\n                    return true;\n                }\n            }\n\n            return offset > 0 && offset < node.childNodes.length;\n        }\n\n        function splitNodeAt(node, descendantNode, descendantOffset, positionsToPreserve) {\n            var newNode, parentNode;\n            var splitAtStart = (descendantOffset == 0);\n\n            if (dom.isAncestorOf(descendantNode, node)) {\n                return node;\n            }\n\n            if (dom.isCharacterDataNode(descendantNode)) {\n                var descendantIndex = dom.getNodeIndex(descendantNode);\n                if (descendantOffset == 0) {\n                    descendantOffset = descendantIndex;\n                } else if (descendantOffset == descendantNode.length) {\n                    descendantOffset = descendantIndex + 1;\n                } else {\n                    throw module.createError(\"splitNodeAt() should not be called with offset in the middle of a data node (\" +\n                        descendantOffset + \" in \" + descendantNode.data);\n                }\n                descendantNode = descendantNode.parentNode;\n            }\n\n            if (isSplitPoint(descendantNode, descendantOffset)) {\n                // descendantNode is now guaranteed not to be a text or other character node\n                newNode = descendantNode.cloneNode(false);\n                parentNode = descendantNode.parentNode;\n                if (newNode.id) {\n                    newNode.removeAttribute(\"id\");\n                }\n                var child, newChildIndex = 0;\n\n                while ( (child = descendantNode.childNodes[descendantOffset]) ) {\n                    movePreservingPositions(child, newNode, newChildIndex++, positionsToPreserve);\n                }\n                movePreservingPositions(newNode, parentNode, dom.getNodeIndex(descendantNode) + 1, positionsToPreserve);\n                return (descendantNode == node) ? newNode : splitNodeAt(node, parentNode, dom.getNodeIndex(newNode), positionsToPreserve);\n            } else if (node != descendantNode) {\n                newNode = descendantNode.parentNode;\n\n                // Work out a new split point in the parent node\n                var newNodeIndex = dom.getNodeIndex(descendantNode);\n\n                if (!splitAtStart) {\n                    newNodeIndex++;\n                }\n                return splitNodeAt(node, newNode, newNodeIndex, positionsToPreserve);\n            }\n            return node;\n        }\n\n        function areElementsMergeable(el1, el2) {\n            return el1.namespaceURI == el2.namespaceURI &&\n                el1.tagName.toLowerCase() == el2.tagName.toLowerCase() &&\n                haveSameClasses(el1, el2) &&\n                elementsHaveSameNonClassAttributes(el1, el2) &&\n                getComputedStyleProperty(el1, \"display\") == \"inline\" &&\n                getComputedStyleProperty(el2, \"display\") == \"inline\";\n        }\n\n        function createAdjacentMergeableTextNodeGetter(forward) {\n            var siblingPropName = forward ? \"nextSibling\" : \"previousSibling\";\n\n            return function(textNode, checkParentElement) {\n                var el = textNode.parentNode;\n                var adjacentNode = textNode[siblingPropName];\n                if (adjacentNode) {\n                    // Can merge if the node's previous/next sibling is a text node\n                    if (adjacentNode && adjacentNode.nodeType == 3) {\n                        return adjacentNode;\n                    }\n                } else if (checkParentElement) {\n                    // Compare text node parent element with its sibling\n                    adjacentNode = el[siblingPropName];\n                    if (adjacentNode && adjacentNode.nodeType == 1 && areElementsMergeable(el, adjacentNode)) {\n                        var adjacentNodeChild = adjacentNode[forward ? \"firstChild\" : \"lastChild\"];\n                        if (adjacentNodeChild && adjacentNodeChild.nodeType == 3) {\n                            return adjacentNodeChild;\n                        }\n                    }\n                }\n                return null;\n            };\n        }\n\n        var getPreviousMergeableTextNode = createAdjacentMergeableTextNodeGetter(false),\n            getNextMergeableTextNode = createAdjacentMergeableTextNodeGetter(true);\n\n    \n        function Merge(firstNode) {\n            this.isElementMerge = (firstNode.nodeType == 1);\n            this.textNodes = [];\n            var firstTextNode = this.isElementMerge ? firstNode.lastChild : firstNode;\n            if (firstTextNode) {\n                this.textNodes[0] = firstTextNode;\n            }\n        }\n\n        Merge.prototype = {\n            doMerge: function(positionsToPreserve) {\n                var textNodes = this.textNodes;\n                var firstTextNode = textNodes[0];\n                if (textNodes.length > 1) {\n                    var firstTextNodeIndex = dom.getNodeIndex(firstTextNode);\n                    var textParts = [], combinedTextLength = 0, textNode, parent;\n                    forEach(textNodes, function(textNode, i) {\n                        parent = textNode.parentNode;\n                        if (i > 0) {\n                            parent.removeChild(textNode);\n                            if (!parent.hasChildNodes()) {\n                                dom.removeNode(parent);\n                            }\n                            if (positionsToPreserve) {\n                                forEach(positionsToPreserve, function(position) {\n                                    // Handle case where position is inside the text node being merged into a preceding node\n                                    if (position.node == textNode) {\n                                        position.node = firstTextNode;\n                                        position.offset += combinedTextLength;\n                                    }\n                                    // Handle case where both text nodes precede the position within the same parent node\n                                    if (position.node == parent && position.offset > firstTextNodeIndex) {\n                                        --position.offset;\n                                        if (position.offset == firstTextNodeIndex + 1 && i < textNodes.length - 1) {\n                                            position.node = firstTextNode;\n                                            position.offset = combinedTextLength;\n                                        }\n                                    }\n                                });\n                            }\n                        }\n                        textParts[i] = textNode.data;\n                        combinedTextLength += textNode.data.length;\n                    });\n                    firstTextNode.data = textParts.join(\"\");\n                }\n                return firstTextNode.data;\n            },\n\n            getLength: function() {\n                var i = this.textNodes.length, len = 0;\n                while (i--) {\n                    len += this.textNodes[i].length;\n                }\n                return len;\n            },\n\n            toString: function() {\n                var textParts = [];\n                forEach(this.textNodes, function(textNode, i) {\n                    textParts[i] = \"'\" + textNode.data + \"'\";\n                });\n                return \"[Merge(\" + textParts.join(\",\") + \")]\";\n            }\n        };\n\n        var optionProperties = [\"elementTagName\", \"ignoreWhiteSpace\", \"applyToEditableOnly\", \"useExistingElements\",\n            \"removeEmptyElements\", \"onElementCreate\"];\n\n        // TODO: Populate this with every attribute name that corresponds to a property with a different name. Really??\n        var attrNamesForProperties = {};\n\n        function ClassApplier(className, options, tagNames) {\n            var normalize, i, len, propName, applier = this;\n            applier.cssClass = applier.className = className; // cssClass property is for backward compatibility\n\n            var elementPropertiesFromOptions = null, elementAttributes = {};\n\n            // Initialize from options object\n            if (typeof options == \"object\" && options !== null) {\n                if (typeof options.elementTagName !== \"undefined\") {\n                    options.elementTagName = options.elementTagName.toLowerCase();\n                }\n                tagNames = options.tagNames;\n                elementPropertiesFromOptions = options.elementProperties;\n                elementAttributes = options.elementAttributes;\n\n                for (i = 0; propName = optionProperties[i++]; ) {\n                    if (options.hasOwnProperty(propName)) {\n                        applier[propName] = options[propName];\n                    }\n                }\n                normalize = options.normalize;\n            } else {\n                normalize = options;\n            }\n\n            // Backward compatibility: the second parameter can also be a Boolean indicating to normalize after unapplying\n            applier.normalize = (typeof normalize == \"undefined\") ? true : normalize;\n\n            // Initialize element properties and attribute exceptions\n            applier.attrExceptions = [];\n            var el = document.createElement(applier.elementTagName);\n            applier.elementProperties = applier.copyPropertiesToElement(elementPropertiesFromOptions, el, true);\n            each(elementAttributes, function(attrName, attrValue) {\n                applier.attrExceptions.push(attrName);\n                // Ensure each attribute value is a string\n                elementAttributes[attrName] = \"\" + attrValue;\n            });\n            applier.elementAttributes = elementAttributes;\n\n            applier.elementSortedClassName = applier.elementProperties.hasOwnProperty(\"className\") ?\n                sortClassName(applier.elementProperties.className + \" \" + className) : className;\n\n            // Initialize tag names\n            applier.applyToAnyTagName = false;\n            var type = typeof tagNames;\n            if (type == \"string\") {\n                if (tagNames == \"*\") {\n                    applier.applyToAnyTagName = true;\n                } else {\n                    applier.tagNames = trim(tagNames.toLowerCase()).split(/\\s*,\\s*/);\n                }\n            } else if (type == \"object\" && typeof tagNames.length == \"number\") {\n                applier.tagNames = [];\n                for (i = 0, len = tagNames.length; i < len; ++i) {\n                    if (tagNames[i] == \"*\") {\n                        applier.applyToAnyTagName = true;\n                    } else {\n                        applier.tagNames.push(tagNames[i].toLowerCase());\n                    }\n                }\n            } else {\n                applier.tagNames = [applier.elementTagName];\n            }\n        }\n\n        ClassApplier.prototype = {\n            elementTagName: defaultTagName,\n            elementProperties: {},\n            elementAttributes: {},\n            ignoreWhiteSpace: true,\n            applyToEditableOnly: false,\n            useExistingElements: true,\n            removeEmptyElements: true,\n            onElementCreate: null,\n\n            copyPropertiesToElement: function(props, el, createCopy) {\n                var s, elStyle, elProps = {}, elPropsStyle, propValue, elPropValue, attrName;\n\n                for (var p in props) {\n                    if (props.hasOwnProperty(p)) {\n                        propValue = props[p];\n                        elPropValue = el[p];\n\n                        // Special case for class. The copied properties object has the applier's class as well as its own\n                        // to simplify checks when removing styling elements\n                        if (p == \"className\") {\n                            addClass(el, propValue);\n                            addClass(el, this.className);\n                            el[p] = sortClassName(el[p]);\n                            if (createCopy) {\n                                elProps[p] = propValue;\n                            }\n                        }\n\n                        // Special case for style\n                        else if (p == \"style\") {\n                            elStyle = elPropValue;\n                            if (createCopy) {\n                                elProps[p] = elPropsStyle = {};\n                            }\n                            for (s in props[p]) {\n                                if (props[p].hasOwnProperty(s)) {\n                                    elStyle[s] = propValue[s];\n                                    if (createCopy) {\n                                        elPropsStyle[s] = elStyle[s];\n                                    }\n                                }\n                            }\n                            this.attrExceptions.push(p);\n                        } else {\n                            el[p] = propValue;\n                            // Copy the property back from the dummy element so that later comparisons to check whether\n                            // elements may be removed are checking against the right value. For example, the href property\n                            // of an element returns a fully qualified URL even if it was previously assigned a relative\n                            // URL.\n                            if (createCopy) {\n                                elProps[p] = el[p];\n\n                                // Not all properties map to identically-named attributes\n                                attrName = attrNamesForProperties.hasOwnProperty(p) ? attrNamesForProperties[p] : p;\n                                this.attrExceptions.push(attrName);\n                            }\n                        }\n                    }\n                }\n\n                return createCopy ? elProps : \"\";\n            },\n\n            copyAttributesToElement: function(attrs, el) {\n                for (var attrName in attrs) {\n                    if (attrs.hasOwnProperty(attrName) && !/^class(?:Name)?$/i.test(attrName)) {\n                        el.setAttribute(attrName, attrs[attrName]);\n                    }\n                }\n            },\n\n            appliesToElement: function(el) {\n                return contains(this.tagNames, el.tagName.toLowerCase());\n            },\n\n            getEmptyElements: function(range) {\n                var applier = this;\n                return range.getNodes([1], function(el) {\n                    return applier.appliesToElement(el) && !el.hasChildNodes();\n                });\n            },\n\n            hasClass: function(node) {\n                return node.nodeType == 1 &&\n                    (this.applyToAnyTagName || this.appliesToElement(node)) &&\n                    hasClass(node, this.className);\n            },\n\n            getSelfOrAncestorWithClass: function(node) {\n                while (node) {\n                    if (this.hasClass(node)) {\n                        return node;\n                    }\n                    node = node.parentNode;\n                }\n                return null;\n            },\n\n            isModifiable: function(node) {\n                return !this.applyToEditableOnly || isEditable(node);\n            },\n\n            // White space adjacent to an unwrappable node can be ignored for wrapping\n            isIgnorableWhiteSpaceNode: function(node) {\n                return this.ignoreWhiteSpace && node && node.nodeType == 3 && isUnrenderedWhiteSpaceNode(node);\n            },\n\n            // Normalizes nodes after applying a class to a Range.\n            postApply: function(textNodes, range, positionsToPreserve, isUndo) {\n                var firstNode = textNodes[0], lastNode = textNodes[textNodes.length - 1];\n                var merges = [], currentMerge;\n                var rangeStartNode = firstNode, rangeEndNode = lastNode;\n                var rangeStartOffset = 0, rangeEndOffset = lastNode.length;\n                var precedingTextNode;\n\n                // Check for every required merge and create a Merge object for each\n                forEach(textNodes, function(textNode) {\n                    precedingTextNode = getPreviousMergeableTextNode(textNode, !isUndo);\n                    if (precedingTextNode) {\n                        if (!currentMerge) {\n                            currentMerge = new Merge(precedingTextNode);\n                            merges.push(currentMerge);\n                        }\n                        currentMerge.textNodes.push(textNode);\n                        if (textNode === firstNode) {\n                            rangeStartNode = currentMerge.textNodes[0];\n                            rangeStartOffset = rangeStartNode.length;\n                        }\n                        if (textNode === lastNode) {\n                            rangeEndNode = currentMerge.textNodes[0];\n                            rangeEndOffset = currentMerge.getLength();\n                        }\n                    } else {\n                        currentMerge = null;\n                    }\n                });\n\n                // Test whether the first node after the range needs merging\n                var nextTextNode = getNextMergeableTextNode(lastNode, !isUndo);\n\n                if (nextTextNode) {\n                    if (!currentMerge) {\n                        currentMerge = new Merge(lastNode);\n                        merges.push(currentMerge);\n                    }\n                    currentMerge.textNodes.push(nextTextNode);\n                }\n\n                // Apply the merges\n                if (merges.length) {\n                    for (var i = 0, len = merges.length; i < len; ++i) {\n                        merges[i].doMerge(positionsToPreserve);\n                    }\n\n                    // Set the range boundaries\n                    range.setStartAndEnd(rangeStartNode, rangeStartOffset, rangeEndNode, rangeEndOffset);\n                }\n            },\n\n            createContainer: function(parentNode) {\n                var doc = dom.getDocument(parentNode);\n                var namespace;\n                var el = createElementNSSupported && !dom.isHtmlNamespace(parentNode) && (namespace = parentNode.namespaceURI) ?\n                    doc.createElementNS(parentNode.namespaceURI, this.elementTagName) :\n                    doc.createElement(this.elementTagName);\n\n                this.copyPropertiesToElement(this.elementProperties, el, false);\n                this.copyAttributesToElement(this.elementAttributes, el);\n                addClass(el, this.className);\n                if (this.onElementCreate) {\n                    this.onElementCreate(el, this);\n                }\n                return el;\n            },\n\n            elementHasProperties: function(el, props) {\n                var applier = this;\n                return each(props, function(p, propValue) {\n                    if (p == \"className\") {\n                        // For checking whether we should reuse an existing element, we just want to check that the element\n                        // has all the classes specified in the className property. When deciding whether the element is\n                        // removable when unapplying a class, there is separate special handling to check whether the\n                        // element has extra classes so the same simple check will do.\n                        return hasAllClasses(el, propValue);\n                    } else if (typeof propValue == \"object\") {\n                        if (!applier.elementHasProperties(el[p], propValue)) {\n                            return false;\n                        }\n                    } else if (el[p] !== propValue) {\n                        return false;\n                    }\n                });\n            },\n\n            elementHasAttributes: function(el, attrs) {\n                return each(attrs, function(name, value) {\n                    if (el.getAttribute(name) !== value) {\n                        return false;\n                    }\n                });\n            },\n\n            applyToTextNode: function(textNode, positionsToPreserve) {\n\n                // Check whether the text node can be styled. Text within a \n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n","\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","import { ref } from \"vue\";\nimport {\n  applyHighlights,\n  clearAllHighlights,\n} from \"../../directives/highlightDirective.js\";\n\n/**\n * Composable for orchestrating the entire highlighting system\n * This handles DOM operations, event management, and integration with stores\n */\nfunction useHighlightOrchestrator(\n  smartCommentsSetup,\n  commentsStore,\n  smartCommentsEvents,\n) {\n  const isRefreshing = ref(false);\n\n  /**\n   * Get the target element for highlights\n   */\n  const getTargetElement = () => {\n    return document.getElementById(\"mw-content-text\") || document.body;\n  };\n\n  /**\n   * Handle highlight click events\n   */\n  const handleHighlightClick = (event, commentData, position) => {\n    if (event && event.preventDefault) {\n      event.preventDefault();\n    }\n\n    // Trigger events\n    smartCommentsEvents.triggerHighlightClicked(commentData, position);\n    smartCommentsEvents.triggerCommentGroupOpen(commentData, position);\n\n    commentsStore.openCommentDialog(commentData, position);\n  };\n\n  /**\n   * Reload highlights and update comments store\n   */\n  const reloadHighlightsAndComments = async () => {\n    if (isRefreshing.value) return;\n\n    try {\n      isRefreshing.value = true;\n      const targetElement = getTargetElement();\n\n      // Clear existing highlights first\n      if (smartCommentsSetup.highlightedAnchors?.value) {\n        clearAllHighlights(\n          targetElement,\n          smartCommentsSetup.highlightedAnchors.value,\n        );\n      }\n\n      // Reload comments and highlights from server\n      await smartCommentsSetup.loadAndSetHighlights();\n\n      // Update the comments store with the freshly loaded comments\n      if (smartCommentsSetup.comments?.value !== undefined) {\n        commentsStore.setComments(smartCommentsSetup.comments.value);\n      } else {\n        console.warn(\n          \"useHighlightOrchestrator: comments.value is undefined after loadAndSetHighlights, setting empty array\",\n        );\n        commentsStore.setComments([]);\n      }\n\n      // Apply the fresh highlights\n      if (smartCommentsSetup.highlightedAnchors?.value) {\n        applyHighlights(\n          targetElement,\n          smartCommentsSetup.highlightedAnchors.value,\n          handleHighlightClick,\n        );\n      }\n\n      // Restore active highlight if dialog is open\n      if (commentsStore.isCommentDialogVisible && commentsStore.activeComment) {\n        const commentId =\n          commentsStore.activeComment.data_id || commentsStore.activeComment.id;\n        commentsStore.setActiveHighlight(commentId);\n      }\n    } catch (error) {\n      console.error(\n        \"useHighlightOrchestrator: Error reloading highlights:\",\n        error,\n      );\n    } finally {\n      isRefreshing.value = false;\n    }\n  };\n\n  /**\n   * Clear all highlights\n   */\n  const clearHighlights = () => {\n    const targetElement = getTargetElement();\n    if (smartCommentsSetup.highlightedAnchors?.value) {\n      clearAllHighlights(\n        targetElement,\n        smartCommentsSetup.highlightedAnchors.value,\n      );\n    }\n  };\n\n  /**\n   * Setup highlight refresh event listener\n   */\n  const setupHighlightRefreshListener = () => {\n    const handleHighlightRefresh = async () => {\n      await reloadHighlightsAndComments();\n    };\n\n    document.addEventListener(\n      \"smartcomments:refresh-highlights\",\n      handleHighlightRefresh,\n    );\n\n    return () => {\n      document.removeEventListener(\n        \"smartcomments:refresh-highlights\",\n        handleHighlightRefresh,\n      );\n    };\n  };\n\n  /**\n   * Manual highlight reload (for debugging)\n   */\n  const reloadHighlights = async (isEnabled) => {\n    if (!isEnabled) {\n      console.warn(\n        \"useHighlightOrchestrator: Cannot reload highlights, system is disabled.\",\n      );\n      return;\n    }\n\n    if (!smartCommentsSetup?.loadAndSetHighlights) {\n      console.error(\n        \"useHighlightOrchestrator: smartCommentsSetup.loadAndSetHighlights not available.\",\n      );\n      return;\n    }\n\n    try {\n      clearHighlights();\n      await reloadHighlightsAndComments();\n    } catch (error) {\n      console.error(\"useHighlightOrchestrator reloadHighlights: Error:\", error);\n    }\n  };\n\n  return {\n    isRefreshing,\n    reloadHighlightsAndComments,\n    clearHighlights,\n    setupHighlightRefreshListener,\n    reloadHighlights,\n    handleHighlightClick,\n  };\n}\n\nexport default useHighlightOrchestrator;\n","/**\n * Composable for managing keyboard shortcuts\n */\nfunction useKeyboardShortcuts(commentsStore) {\n  /**\n   * Handle keyboard shortcuts\n   */\n  const handleKeydown = (event) => {\n    if (event.key === \"Escape\" && commentsStore.isCommentDialogVisible) {\n      // If image modal is open, close it first\n      if (commentsStore.isImageModalVisible) {\n        commentsStore.closeImageModal();\n      } else {\n        // Otherwise close the comment dialog\n        commentsStore.closeCommentDialog();\n      }\n    } else if (event.key === \"ArrowDown\" && commentsStore.hasNextComment) {\n      commentsStore.navigateComment(\"next\");\n    } else if (event.key === \"ArrowUp\" && commentsStore.hasPreviousComment) {\n      commentsStore.navigateComment(\"previous\");\n    }\n  };\n\n  /**\n   * Setup keyboard event listeners\n   */\n  const setupKeyboardShortcuts = () => {\n    document.addEventListener(\"keydown\", handleKeydown);\n\n    return () => {\n      document.removeEventListener(\"keydown\", handleKeydown);\n    };\n  };\n\n  return {\n    setupKeyboardShortcuts,\n  };\n}\n\nexport default useKeyboardShortcuts;\n","import { watch } from \"vue\";\n\n/**\n * Composable for managing CSS custom properties\n */\nfunction useCustomProperties(messages) {\n  /**\n   * Update CSS custom property for annotate tooltip text\n   */\n  const updateAnnotateTooltipText = (text) => {\n    document.documentElement.style.setProperty(\n      \"--smartcomments-annotate-text\",\n      `\"${text}\"`,\n    );\n  };\n\n  /**\n   * Update CSS custom property for button open text\n   */\n  const updateButtonOpenText = (text) => {\n    document.documentElement.style.setProperty(\n      \"--smartcomments-button-open-text\",\n      `\"${text}\"`,\n    );\n  };\n\n  /**\n   * Setup watchers for CSS custom properties\n   */\n  const setupCustomPropertiesWatchers = () => {\n    const annotateTooltipText = () => messages.msg(\"sic-annotate-tooltip\");\n    const buttonOpenText = () => messages.msg(\"sic-button-open\");\n\n    // Initial setup\n    updateAnnotateTooltipText(annotateTooltipText());\n    updateButtonOpenText(buttonOpenText());\n\n    // Watch for changes (e.g., language changes)\n    const stopAnnotateWatcher = watch(annotateTooltipText, (newText) => {\n      updateAnnotateTooltipText(newText);\n    });\n\n    const stopButtonWatcher = watch(buttonOpenText, (newText) => {\n      updateButtonOpenText(newText);\n    });\n\n    return () => {\n      stopAnnotateWatcher();\n      stopButtonWatcher();\n    };\n  };\n\n  return {\n    setupCustomPropertiesWatchers,\n    updateAnnotateTooltipText,\n    updateButtonOpenText,\n  };\n}\n\nexport default useCustomProperties;\n","/**\n * Composable for managing SmartComments event handlers\n */\nfunction useSmartCommentsEventHandlers(\n  smartCommentsEvents,\n  EVENTS,\n  store,\n  commentsStore,\n  highlightsManager,\n) {\n  /**\n   * Setup SmartComments events\n   */\n  const setupSmartCommentsEvents = () => {\n    const cleanupFunctions = [];\n\n    // Listen for debug mode events\n    cleanupFunctions.push(\n      smartCommentsEvents.on(EVENTS.DEBUG_MODE, (event) => {\n        if (event.detail.enabled && !store.isEnabled) {\n          store.setEnabled(true);\n        }\n      }),\n    );\n\n    // Listen for selection active events\n    cleanupFunctions.push(\n      smartCommentsEvents.on(EVENTS.SELECTION_ACTIVE, (event) => {\n        // Close any open comment dialogs when a new selection is made\n        if (commentsStore.isCommentDialogVisible) {\n          commentsStore.closeCommentDialog();\n        }\n      }),\n    );\n\n    // Listen for open comment events\n    cleanupFunctions.push(\n      smartCommentsEvents.on(EVENTS.OPEN_COMMENT_ID, (event) => {\n        if (event.detail.commentId) {\n          // Handle opening specific comment\n          commentsStore.openCommentDialogById(event.detail.commentId);\n        }\n      }),\n    );\n\n    // Listen for open comment with position events\n    cleanupFunctions.push(\n      smartCommentsEvents.on(EVENTS.OPEN_COMMENT_WITH_POSITION, (event) => {\n        if (event.detail.commentId && event.detail.position) {\n          // Handle opening specific comment with custom position\n          commentsStore.openCommentDialogByIdWithPosition(event.detail.commentId, event.detail.position);\n        }\n      }),\n    );\n\n    // Listen for comment created events\n    cleanupFunctions.push(\n      smartCommentsEvents.on(EVENTS.COMMENT_CREATED, (event) => {\n        if (highlightsManager) {\n          highlightsManager.reloadHighlightsAndComments();\n        }\n      }),\n    );\n\n    return () => {\n      cleanupFunctions.forEach((cleanup) => cleanup());\n    };\n  };\n\n  return {\n    setupSmartCommentsEvents,\n  };\n}\n\nexport default useSmartCommentsEventHandlers;\n","/**\n * Composable for managing URL navigation and parameters\n */\nfunction useUrlNavigation(commentsStore) {\n  /**\n   * Setup URL navigation handlers\n   */\n  const setupUrlNavigation = (isEnabled) => {\n    // Handle URL changes (back/forward navigation)\n    const handlePopState = async () => {\n      if (isEnabled()) {\n        await commentsStore.checkAndOpenCommentFromUrl();\n      }\n    };\n\n    window.addEventListener(\"popstate\", handlePopState);\n\n    return () => {\n      window.removeEventListener(\"popstate\", handlePopState);\n    };\n  };\n\n  /**\n   * Check URL parameters and open comment (for debugging)\n   */\n  const checkUrlParameters = async (isEnabled) => {\n    if (!isEnabled()) {\n      console.warn(\n        \"useUrlNavigation: Cannot check URL parameters, system is disabled.\",\n      );\n      return;\n    }\n    await commentsStore.checkAndOpenCommentFromUrl();\n  };\n\n  return {\n    setupUrlNavigation,\n    checkUrlParameters,\n  };\n}\n\nexport default useUrlNavigation;\n","/**\n * Rangy, a cross-browser JavaScript range and selection library\n * https://github.com/timdown/rangy\n *\n * Copyright 2024, Tim Down\n * Licensed under the MIT license.\n * Version: 1.3.2\n * Build date: 2 November 2024\n */\n\n(function(factory, root) {\n    if (typeof define == \"function\" && define.amd) {\n        // AMD. Register as an anonymous module.\n        define(factory);\n    } else if (typeof module != \"undefined\" && typeof exports == \"object\") {\n        // Node/CommonJS style\n        module.exports = factory();\n    } else {\n        // No AMD or CommonJS support so we place Rangy in (probably) the global variable\n        root.rangy = factory();\n    }\n})(function() {\n\n    var OBJECT = \"object\", FUNCTION = \"function\", UNDEFINED = \"undefined\";\n\n    // Minimal set of properties required for DOM Level 2 Range compliance. Comparison constants such as START_TO_START\n    // are omitted because ranges in KHTML do not have them but otherwise work perfectly well. See issue 113.\n    var domRangeProperties = [\"startContainer\", \"startOffset\", \"endContainer\", \"endOffset\", \"collapsed\",\n        \"commonAncestorContainer\"];\n\n    // Minimal set of methods required for DOM Level 2 Range compliance\n    var domRangeMethods = [\"setStart\", \"setStartBefore\", \"setStartAfter\", \"setEnd\", \"setEndBefore\",\n        \"setEndAfter\", \"collapse\", \"selectNode\", \"selectNodeContents\", \"compareBoundaryPoints\", \"deleteContents\",\n        \"extractContents\", \"cloneContents\", \"insertNode\", \"surroundContents\", \"cloneRange\", \"toString\", \"detach\"];\n\n    var textRangeProperties = [\"boundingHeight\", \"boundingLeft\", \"boundingTop\", \"boundingWidth\", \"htmlText\", \"text\"];\n\n    // Subset of TextRange's full set of methods that we're interested in\n    var textRangeMethods = [\"collapse\", \"compareEndPoints\", \"duplicate\", \"moveToElementText\", \"parentElement\", \"select\",\n        \"setEndPoint\", \"getBoundingClientRect\"];\n\n    /*----------------------------------------------------------------------------------------------------------------*/\n\n    // Trio of functions taken from Peter Michaux's article:\n    // http://peter.michaux.ca/articles/feature-detection-state-of-the-art-browser-scripting\n    function isHostMethod(o, p) {\n        var t = typeof o[p];\n        return t == FUNCTION || (!!(t == OBJECT && o[p])) || t == \"unknown\";\n    }\n\n    function isHostObject(o, p) {\n        return !!(typeof o[p] == OBJECT && o[p]);\n    }\n\n    function isHostProperty(o, p) {\n        return typeof o[p] != UNDEFINED;\n    }\n\n    // Creates a convenience function to save verbose repeated calls to tests functions\n    function createMultiplePropertyTest(testFunc) {\n        return function(o, props) {\n            var i = props.length;\n            while (i--) {\n                if (!testFunc(o, props[i])) {\n                    return false;\n                }\n            }\n            return true;\n        };\n    }\n\n    // Next trio of functions are a convenience to save verbose repeated calls to previous two functions\n    var areHostMethods = createMultiplePropertyTest(isHostMethod);\n    var areHostObjects = createMultiplePropertyTest(isHostObject);\n    var areHostProperties = createMultiplePropertyTest(isHostProperty);\n\n    function isTextRange(range) {\n        return range && areHostMethods(range, textRangeMethods) && areHostProperties(range, textRangeProperties);\n    }\n\n    function getBody(doc) {\n        return isHostObject(doc, \"body\") ? doc.body : doc.getElementsByTagName(\"body\")[0];\n    }\n\n    var forEach = [].forEach ?\n        function(arr, func) {\n            arr.forEach(func);\n        } :\n        function(arr, func) {\n            for (var i = 0, len = arr.length; i < len; ++i) {\n                func(arr[i], i);\n            }\n        };\n\n    var modules = {};\n\n    var isBrowser = (typeof window != UNDEFINED && typeof document != UNDEFINED);\n\n    var util = {\n        isHostMethod: isHostMethod,\n        isHostObject: isHostObject,\n        isHostProperty: isHostProperty,\n        areHostMethods: areHostMethods,\n        areHostObjects: areHostObjects,\n        areHostProperties: areHostProperties,\n        isTextRange: isTextRange,\n        getBody: getBody,\n        forEach: forEach\n    };\n\n    var api = {\n        version: \"1.3.2\",\n        initialized: false,\n        isBrowser: isBrowser,\n        supported: true,\n        util: util,\n        features: {},\n        modules: modules,\n        config: {\n            alertOnFail: false,\n            alertOnWarn: false,\n            preferTextRange: false,\n            autoInitialize: (typeof rangyAutoInitialize == UNDEFINED) ? true : rangyAutoInitialize\n        }\n    };\n\n    function consoleLog(msg) {\n        if (typeof console != UNDEFINED && isHostMethod(console, \"log\")) {\n            console.log(msg);\n        }\n    }\n\n    function alertOrLog(msg, shouldAlert) {\n        if (isBrowser && shouldAlert) {\n            alert(msg);\n        } else  {\n            consoleLog(msg);\n        }\n    }\n\n    function fail(reason) {\n        api.initialized = true;\n        api.supported = false;\n        alertOrLog(\"Rangy is not supported in this environment. Reason: \" + reason, api.config.alertOnFail);\n    }\n\n    api.fail = fail;\n\n    function warn(msg) {\n        alertOrLog(\"Rangy warning: \" + msg, api.config.alertOnWarn);\n    }\n\n    api.warn = warn;\n\n    // Add utility extend() method\n    var extend;\n    if ({}.hasOwnProperty) {\n        util.extend = extend = function(obj, props, deep) {\n            var o, p;\n            for (var i in props) {\n                if (i === \"__proto__\" || i === \"constructor\" || i === \"prototype\") {\n                    continue;\n                }\n                if (props.hasOwnProperty(i)) {\n                    o = obj[i];\n                    p = props[i];\n                    if (deep && o !== null && typeof o == \"object\" && p !== null && typeof p == \"object\") {\n                        extend(o, p, true);\n                    }\n                    obj[i] = p;\n                }\n            }\n            // Special case for toString, which does not show up in for...in loops in IE <= 8\n            if (props.hasOwnProperty(\"toString\")) {\n                obj.toString = props.toString;\n            }\n            return obj;\n        };\n\n        util.createOptions = function(optionsParam, defaults) {\n            var options = {};\n            extend(options, defaults);\n            if (optionsParam) {\n                extend(options, optionsParam);\n            }\n            return options;\n        };\n    } else {\n        fail(\"hasOwnProperty not supported\");\n    }\n\n    // Test whether we're in a browser and bail out if not\n    if (!isBrowser) {\n        fail(\"Rangy can only run in a browser\");\n    }\n\n    // Test whether Array.prototype.slice can be relied on for NodeLists and use an alternative toArray() if not\n    (function() {\n        var toArray;\n\n        if (isBrowser) {\n            var el = document.createElement(\"div\");\n            el.appendChild(document.createElement(\"span\"));\n            var slice = [].slice;\n            try {\n                if (slice.call(el.childNodes, 0)[0].nodeType == 1) {\n                    toArray = function(arrayLike) {\n                        return slice.call(arrayLike, 0);\n                    };\n                }\n            } catch (e) {}\n        }\n\n        if (!toArray) {\n            toArray = function(arrayLike) {\n                var arr = [];\n                for (var i = 0, len = arrayLike.length; i < len; ++i) {\n                    arr[i] = arrayLike[i];\n                }\n                return arr;\n            };\n        }\n\n        util.toArray = toArray;\n    })();\n\n    // Very simple event handler wrapper function that doesn't attempt to solve issues such as \"this\" handling or\n    // normalization of event properties because we don't need this.\n    var addListener;\n    if (isBrowser) {\n        if (isHostMethod(document, \"addEventListener\")) {\n            addListener = function(obj, eventType, listener) {\n                obj.addEventListener(eventType, listener, false);\n            };\n        } else if (isHostMethod(document, \"attachEvent\")) {\n            addListener = function(obj, eventType, listener) {\n                obj.attachEvent(\"on\" + eventType, listener);\n            };\n        } else {\n            fail(\"Document does not have required addEventListener or attachEvent method\");\n        }\n\n        util.addListener = addListener;\n    }\n\n    var initListeners = [];\n\n    function getErrorDesc(ex) {\n        return ex.message || ex.description || String(ex);\n    }\n\n    // Initialization\n    function init() {\n        if (!isBrowser || api.initialized) {\n            return;\n        }\n        var testRange;\n        var implementsDomRange = false, implementsTextRange = false;\n\n        // First, perform basic feature tests\n\n        if (isHostMethod(document, \"createRange\")) {\n            testRange = document.createRange();\n            if (areHostMethods(testRange, domRangeMethods) && areHostProperties(testRange, domRangeProperties)) {\n                implementsDomRange = true;\n            }\n        }\n\n        var body = getBody(document);\n        if (!body || body.nodeName.toLowerCase() != \"body\") {\n            fail(\"No body element found\");\n            return;\n        }\n\n        if (body && isHostMethod(body, \"createTextRange\")) {\n            testRange = body.createTextRange();\n            if (isTextRange(testRange)) {\n                implementsTextRange = true;\n            }\n        }\n\n        if (!implementsDomRange && !implementsTextRange) {\n            fail(\"Neither Range nor TextRange are available\");\n            return;\n        }\n\n        api.initialized = true;\n        api.features = {\n            implementsDomRange: implementsDomRange,\n            implementsTextRange: implementsTextRange\n        };\n\n        // Initialize modules\n        var module, errorMessage;\n        for (var moduleName in modules) {\n            if ( (module = modules[moduleName]) instanceof Module ) {\n                module.init(module, api);\n            }\n        }\n\n        // Call init listeners\n        for (var i = 0, len = initListeners.length; i < len; ++i) {\n            try {\n                initListeners[i](api);\n            } catch (ex) {\n                errorMessage = \"Rangy init listener threw an exception. Continuing. Detail: \" + getErrorDesc(ex);\n                consoleLog(errorMessage);\n            }\n        }\n    }\n\n    function deprecationNotice(deprecated, replacement, module) {\n        if (module) {\n            deprecated += \" in module \" + module.name;\n        }\n        api.warn(\"DEPRECATED: \" + deprecated + \" is deprecated. Please use \" +\n        replacement + \" instead.\");\n    }\n\n    function createAliasForDeprecatedMethod(owner, deprecated, replacement, module) {\n        owner[deprecated] = function() {\n            deprecationNotice(deprecated, replacement, module);\n            return owner[replacement].apply(owner, util.toArray(arguments));\n        };\n    }\n\n    util.deprecationNotice = deprecationNotice;\n    util.createAliasForDeprecatedMethod = createAliasForDeprecatedMethod;\n\n    // Allow external scripts to initialize this library in case it's loaded after the document has loaded\n    api.init = init;\n\n    // Execute listener immediately if already initialized\n    api.addInitListener = function(listener) {\n        if (api.initialized) {\n            listener(api);\n        } else {\n            initListeners.push(listener);\n        }\n    };\n\n    var shimListeners = [];\n\n    api.addShimListener = function(listener) {\n        shimListeners.push(listener);\n    };\n\n    function shim(win) {\n        win = win || window;\n        init();\n\n        // Notify listeners\n        for (var i = 0, len = shimListeners.length; i < len; ++i) {\n            shimListeners[i](win);\n        }\n    }\n\n    if (isBrowser) {\n        api.shim = api.createMissingNativeApi = shim;\n        createAliasForDeprecatedMethod(api, \"createMissingNativeApi\", \"shim\");\n    }\n\n    function Module(name, dependencies, initializer) {\n        this.name = name;\n        this.dependencies = dependencies;\n        this.initialized = false;\n        this.supported = false;\n        this.initializer = initializer;\n    }\n\n    Module.prototype = {\n        init: function() {\n            var requiredModuleNames = this.dependencies || [];\n            for (var i = 0, len = requiredModuleNames.length, requiredModule, moduleName; i < len; ++i) {\n                moduleName = requiredModuleNames[i];\n\n                requiredModule = modules[moduleName];\n                if (!requiredModule || !(requiredModule instanceof Module)) {\n                    throw new Error(\"required module '\" + moduleName + \"' not found\");\n                }\n\n                requiredModule.init();\n\n                if (!requiredModule.supported) {\n                    throw new Error(\"required module '\" + moduleName + \"' not supported\");\n                }\n            }\n\n            // Now run initializer\n            this.initializer(this);\n        },\n\n        fail: function(reason) {\n            this.initialized = true;\n            this.supported = false;\n            throw new Error(reason);\n        },\n\n        warn: function(msg) {\n            api.warn(\"Module \" + this.name + \": \" + msg);\n        },\n\n        deprecationNotice: function(deprecated, replacement) {\n            api.warn(\"DEPRECATED: \" + deprecated + \" in module \" + this.name + \" is deprecated. Please use \" +\n                replacement + \" instead\");\n        },\n\n        createError: function(msg) {\n            return new Error(\"Error in Rangy \" + this.name + \" module: \" + msg);\n        }\n    };\n\n    function createModule(name, dependencies, initFunc) {\n        var newModule = new Module(name, dependencies, function(module) {\n            if (!module.initialized) {\n                module.initialized = true;\n                try {\n                    initFunc(api, module);\n                    module.supported = true;\n                } catch (ex) {\n                    var errorMessage = \"Module '\" + name + \"' failed to load: \" + getErrorDesc(ex);\n                    consoleLog(errorMessage);\n                    if (ex.stack) {\n                        consoleLog(ex.stack);\n                    }\n                }\n            }\n        });\n        modules[name] = newModule;\n        return newModule;\n    }\n\n    api.createModule = function(name) {\n        // Allow 2 or 3 arguments (second argument is an optional array of dependencies)\n        var initFunc, dependencies;\n        if (arguments.length == 2) {\n            initFunc = arguments[1];\n            dependencies = [];\n        } else {\n            initFunc = arguments[2];\n            dependencies = arguments[1];\n        }\n\n        var module = createModule(name, dependencies, initFunc);\n\n        // Initialize the module immediately if the core is already initialized\n        if (api.initialized && api.supported) {\n            module.init();\n        }\n    };\n\n    api.createCoreModule = function(name, dependencies, initFunc) {\n        createModule(name, dependencies, initFunc);\n    };\n\n    /*----------------------------------------------------------------------------------------------------------------*/\n\n    // Ensure rangy.rangePrototype and rangy.selectionPrototype are available immediately\n\n    function RangePrototype() {}\n    api.RangePrototype = RangePrototype;\n    api.rangePrototype = new RangePrototype();\n\n    function SelectionPrototype() {}\n    api.selectionPrototype = new SelectionPrototype();\n\n    /*----------------------------------------------------------------------------------------------------------------*/\n\n    // DOM utility methods used by Rangy\n    api.createCoreModule(\"DomUtil\", [], function(api, module) {\n        var UNDEF = \"undefined\";\n        var util = api.util;\n        var getBody = util.getBody;\n\n        // Perform feature tests\n        if (!util.areHostMethods(document, [\"createDocumentFragment\", \"createElement\", \"createTextNode\"])) {\n            module.fail(\"document missing a Node creation method\");\n        }\n\n        if (!util.isHostMethod(document, \"getElementsByTagName\")) {\n            module.fail(\"document missing getElementsByTagName method\");\n        }\n\n        var el = document.createElement(\"div\");\n        if (!util.areHostMethods(el, [\"insertBefore\", \"appendChild\", \"cloneNode\"] ||\n                !util.areHostObjects(el, [\"previousSibling\", \"nextSibling\", \"childNodes\", \"parentNode\"]))) {\n            module.fail(\"Incomplete Element implementation\");\n        }\n\n        // innerHTML is required for Range's createContextualFragment method\n        if (!util.isHostProperty(el, \"innerHTML\")) {\n            module.fail(\"Element is missing innerHTML property\");\n        }\n\n        var textNode = document.createTextNode(\"test\");\n        if (!util.areHostMethods(textNode, [\"splitText\", \"deleteData\", \"insertData\", \"appendData\", \"cloneNode\"] ||\n                !util.areHostObjects(el, [\"previousSibling\", \"nextSibling\", \"childNodes\", \"parentNode\"]) ||\n                !util.areHostProperties(textNode, [\"data\"]))) {\n            module.fail(\"Incomplete Text Node implementation\");\n        }\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        // Removed use of indexOf because of a bizarre bug in Opera that is thrown in one of the Acid3 tests. I haven't been\n        // able to replicate it outside of the test. The bug is that indexOf returns -1 when called on an Array that\n        // contains just the document as a single element and the value searched for is the document.\n        var arrayContains = /*Array.prototype.indexOf ?\n            function(arr, val) {\n                return arr.indexOf(val) > -1;\n            }:*/\n\n            function(arr, val) {\n                var i = arr.length;\n                while (i--) {\n                    if (arr[i] === val) {\n                        return true;\n                    }\n                }\n                return false;\n            };\n\n        // Opera 11 puts HTML elements in the null namespace, it seems, and IE 7 has undefined namespaceURI\n        function isHtmlNamespace(node) {\n            var ns;\n            return typeof node.namespaceURI == UNDEF || ((ns = node.namespaceURI) === null || ns == \"http://www.w3.org/1999/xhtml\");\n        }\n\n        function parentElement(node) {\n            var parent = node.parentNode;\n            return (parent.nodeType == 1) ? parent : null;\n        }\n\n        function getNodeIndex(node) {\n            var i = 0;\n            while( (node = node.previousSibling) ) {\n                ++i;\n            }\n            return i;\n        }\n\n        function getNodeLength(node) {\n            switch (node.nodeType) {\n                case 7:\n                case 10:\n                    return 0;\n                case 3:\n                case 8:\n                    return node.length;\n                default:\n                    return node.childNodes.length;\n            }\n        }\n\n        function getCommonAncestor(node1, node2) {\n            var ancestors = [], n;\n            for (n = node1; n; n = n.parentNode) {\n                ancestors.push(n);\n            }\n\n            for (n = node2; n; n = n.parentNode) {\n                if (arrayContains(ancestors, n)) {\n                    return n;\n                }\n            }\n\n            return null;\n        }\n\n        function isAncestorOf(ancestor, descendant, selfIsAncestor) {\n            var n = selfIsAncestor ? descendant : descendant.parentNode;\n            while (n) {\n                if (n === ancestor) {\n                    return true;\n                } else {\n                    n = n.parentNode;\n                }\n            }\n            return false;\n        }\n\n        function isOrIsAncestorOf(ancestor, descendant) {\n            return isAncestorOf(ancestor, descendant, true);\n        }\n\n        function getClosestAncestorIn(node, ancestor, selfIsAncestor) {\n            var p, n = selfIsAncestor ? node : node.parentNode;\n            while (n) {\n                p = n.parentNode;\n                if (p === ancestor) {\n                    return n;\n                }\n                n = p;\n            }\n            return null;\n        }\n\n        function isCharacterDataNode(node) {\n            var t = node.nodeType;\n            return t == 3 || t == 4 || t == 8 ; // Text, CDataSection or Comment\n        }\n\n        function isTextOrCommentNode(node) {\n            if (!node) {\n                return false;\n            }\n            var t = node.nodeType;\n            return t == 3 || t == 8 ; // Text or Comment\n        }\n\n        function insertAfter(node, precedingNode) {\n            var nextNode = precedingNode.nextSibling, parent = precedingNode.parentNode;\n            if (nextNode) {\n                parent.insertBefore(node, nextNode);\n            } else {\n                parent.appendChild(node);\n            }\n            return node;\n        }\n\n        // Note that we cannot use splitText() because it is bugridden in IE 9.\n        function splitDataNode(node, index, positionsToPreserve) {\n            var newNode = node.cloneNode(false);\n            newNode.deleteData(0, index);\n            node.deleteData(index, node.length - index);\n            insertAfter(newNode, node);\n\n            // Preserve positions\n            if (positionsToPreserve) {\n                for (var i = 0, position; position = positionsToPreserve[i++]; ) {\n                    // Handle case where position was inside the portion of node after the split point\n                    if (position.node == node && position.offset > index) {\n                        position.node = newNode;\n                        position.offset -= index;\n                    }\n                    // Handle the case where the position is a node offset within node's parent\n                    else if (position.node == node.parentNode && position.offset > getNodeIndex(node)) {\n                        ++position.offset;\n                    }\n                }\n            }\n            return newNode;\n        }\n\n        function getDocument(node) {\n            if (node.nodeType == 9) {\n                return node;\n            } else if (typeof node.ownerDocument != UNDEF) {\n                return node.ownerDocument;\n            } else if (typeof node.document != UNDEF) {\n                return node.document;\n            } else if (node.parentNode) {\n                return getDocument(node.parentNode);\n            } else {\n                throw module.createError(\"getDocument: no document found for node\");\n            }\n        }\n\n        function getWindow(node) {\n            var doc = getDocument(node);\n            if (typeof doc.defaultView != UNDEF) {\n                return doc.defaultView;\n            } else if (typeof doc.parentWindow != UNDEF) {\n                return doc.parentWindow;\n            } else {\n                throw module.createError(\"Cannot get a window object for node\");\n            }\n        }\n\n        function getIframeDocument(iframeEl) {\n            if (typeof iframeEl.contentDocument != UNDEF) {\n                return iframeEl.contentDocument;\n            } else if (typeof iframeEl.contentWindow != UNDEF) {\n                return iframeEl.contentWindow.document;\n            } else {\n                throw module.createError(\"getIframeDocument: No Document object found for iframe element\");\n            }\n        }\n\n        function getIframeWindow(iframeEl) {\n            if (typeof iframeEl.contentWindow != UNDEF) {\n                return iframeEl.contentWindow;\n            } else if (typeof iframeEl.contentDocument != UNDEF) {\n                return iframeEl.contentDocument.defaultView;\n            } else {\n                throw module.createError(\"getIframeWindow: No Window object found for iframe element\");\n            }\n        }\n\n        // This looks bad. Is it worth it?\n        function isWindow(obj) {\n            return obj && util.isHostMethod(obj, \"setTimeout\") && util.isHostObject(obj, \"document\");\n        }\n\n        function getContentDocument(obj, module, methodName) {\n            var doc;\n\n            if (!obj) {\n                doc = document;\n            }\n\n            // Test if a DOM node has been passed and obtain a document object for it if so\n            else if (util.isHostProperty(obj, \"nodeType\")) {\n                doc = (obj.nodeType == 1 && obj.tagName.toLowerCase() == \"iframe\") ?\n                    getIframeDocument(obj) : getDocument(obj);\n            }\n\n            // Test if the doc parameter appears to be a Window object\n            else if (isWindow(obj)) {\n                doc = obj.document;\n            }\n\n            if (!doc) {\n                throw module.createError(methodName + \"(): Parameter must be a Window object or DOM node\");\n            }\n\n            return doc;\n        }\n\n        function getRootContainer(node) {\n            var parent;\n            while ( (parent = node.parentNode) ) {\n                node = parent;\n            }\n            return node;\n        }\n\n        function comparePoints(nodeA, offsetA, nodeB, offsetB) {\n            // See http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Comparing\n            var nodeC, root, childA, childB, n;\n            if (nodeA == nodeB) {\n                // Case 1: nodes are the same\n                return offsetA === offsetB ? 0 : (offsetA < offsetB) ? -1 : 1;\n            } else if ( (nodeC = getClosestAncestorIn(nodeB, nodeA, true)) ) {\n                // Case 2: node C (container B or an ancestor) is a child node of A\n                return offsetA <= getNodeIndex(nodeC) ? -1 : 1;\n            } else if ( (nodeC = getClosestAncestorIn(nodeA, nodeB, true)) ) {\n                // Case 3: node C (container A or an ancestor) is a child node of B\n                return getNodeIndex(nodeC) < offsetB  ? -1 : 1;\n            } else {\n                root = getCommonAncestor(nodeA, nodeB);\n                if (!root) {\n                    throw new Error(\"comparePoints error: nodes have no common ancestor\");\n                }\n\n                // Case 4: containers are siblings or descendants of siblings\n                childA = (nodeA === root) ? root : getClosestAncestorIn(nodeA, root, true);\n                childB = (nodeB === root) ? root : getClosestAncestorIn(nodeB, root, true);\n\n                if (childA === childB) {\n                    // This shouldn't be possible\n                    throw module.createError(\"comparePoints got to case 4 and childA and childB are the same!\");\n                } else {\n                    n = root.firstChild;\n                    while (n) {\n                        if (n === childA) {\n                            return -1;\n                        } else if (n === childB) {\n                            return 1;\n                        }\n                        n = n.nextSibling;\n                    }\n                }\n            }\n        }\n\n        /*----------------------------------------------------------------------------------------------------------------*/\n\n        // Test for IE's crash (IE 6/7) or exception (IE >= 8) when a reference to garbage-collected text node is queried\n        var crashyTextNodes = false;\n\n        function isBrokenNode(node) {\n            var n;\n            try {\n                n = node.parentNode;\n                return false;\n            } catch (e) {\n                return true;\n            }\n        }\n\n        (function() {\n            var el = document.createElement(\"b\");\n            el.innerHTML = \"1\";\n            var textNode = el.firstChild;\n            el.innerHTML = \"
\";\n crashyTextNodes = isBrokenNode(textNode);\n\n api.features.crashyTextNodes = crashyTextNodes;\n })();\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n function inspectNode(node) {\n if (!node) {\n return \"[No node]\";\n }\n if (crashyTextNodes && isBrokenNode(node)) {\n return \"[Broken node]\";\n }\n if (isCharacterDataNode(node)) {\n return '\"' + node.data + '\"';\n }\n if (node.nodeType == 1) {\n var idAttr = node.id ? ' id=\"' + node.id + '\"' : \"\";\n return \"<\" + node.nodeName + idAttr + \">[index:\" + getNodeIndex(node) + \",length:\" + node.childNodes.length + \"][\" + (node.innerHTML || \"[innerHTML not supported]\").slice(0, 25) + \"]\";\n }\n return node.nodeName;\n }\n\n function fragmentFromNodeChildren(node) {\n var fragment = getDocument(node).createDocumentFragment(), child;\n while ( (child = node.firstChild) ) {\n fragment.appendChild(child);\n }\n return fragment;\n }\n\n var getComputedStyleProperty;\n if (typeof window.getComputedStyle != UNDEF) {\n getComputedStyleProperty = function(el, propName) {\n return getWindow(el).getComputedStyle(el, null)[propName];\n };\n } else if (typeof document.documentElement.currentStyle != UNDEF) {\n getComputedStyleProperty = function(el, propName) {\n return el.currentStyle ? el.currentStyle[propName] : \"\";\n };\n } else {\n module.fail(\"No means of obtaining computed style properties found\");\n }\n\n function createTestElement(doc, html, contentEditable) {\n var body = getBody(doc);\n var el = doc.createElement(\"div\");\n el.contentEditable = \"\" + !!contentEditable;\n if (html) {\n el.innerHTML = html;\n }\n\n // Insert the test element at the start of the body to prevent scrolling to the bottom in iOS (issue #292)\n var bodyFirstChild = body.firstChild;\n if (bodyFirstChild) {\n body.insertBefore(el, bodyFirstChild);\n } else {\n body.appendChild(el);\n }\n\n return el;\n }\n\n function removeNode(node) {\n return node.parentNode.removeChild(node);\n }\n\n function NodeIterator(root) {\n this.root = root;\n this._next = root;\n }\n\n NodeIterator.prototype = {\n _current: null,\n\n hasNext: function() {\n return !!this._next;\n },\n\n next: function() {\n var n = this._current = this._next;\n var child, next;\n if (this._current) {\n child = n.firstChild;\n if (child) {\n this._next = child;\n } else {\n next = null;\n while ((n !== this.root) && !(next = n.nextSibling)) {\n n = n.parentNode;\n }\n this._next = next;\n }\n }\n return this._current;\n },\n\n detach: function() {\n this._current = this._next = this.root = null;\n }\n };\n\n function createIterator(root) {\n return new NodeIterator(root);\n }\n\n function DomPosition(node, offset) {\n this.node = node;\n this.offset = offset;\n }\n\n DomPosition.prototype = {\n equals: function(pos) {\n return !!pos && this.node === pos.node && this.offset == pos.offset;\n },\n\n inspect: function() {\n return \"[DomPosition(\" + inspectNode(this.node) + \":\" + this.offset + \")]\";\n },\n\n toString: function() {\n return this.inspect();\n }\n };\n\n function DOMException(codeName) {\n this.code = this[codeName];\n this.codeName = codeName;\n this.message = \"DOMException: \" + this.codeName;\n }\n\n DOMException.prototype = {\n INDEX_SIZE_ERR: 1,\n HIERARCHY_REQUEST_ERR: 3,\n WRONG_DOCUMENT_ERR: 4,\n NO_MODIFICATION_ALLOWED_ERR: 7,\n NOT_FOUND_ERR: 8,\n NOT_SUPPORTED_ERR: 9,\n INVALID_STATE_ERR: 11,\n INVALID_NODE_TYPE_ERR: 24\n };\n\n DOMException.prototype.toString = function() {\n return this.message;\n };\n\n api.dom = {\n arrayContains: arrayContains,\n isHtmlNamespace: isHtmlNamespace,\n parentElement: parentElement,\n getNodeIndex: getNodeIndex,\n getNodeLength: getNodeLength,\n getCommonAncestor: getCommonAncestor,\n isAncestorOf: isAncestorOf,\n isOrIsAncestorOf: isOrIsAncestorOf,\n getClosestAncestorIn: getClosestAncestorIn,\n isCharacterDataNode: isCharacterDataNode,\n isTextOrCommentNode: isTextOrCommentNode,\n insertAfter: insertAfter,\n splitDataNode: splitDataNode,\n getDocument: getDocument,\n getWindow: getWindow,\n getIframeWindow: getIframeWindow,\n getIframeDocument: getIframeDocument,\n getBody: getBody,\n isWindow: isWindow,\n getContentDocument: getContentDocument,\n getRootContainer: getRootContainer,\n comparePoints: comparePoints,\n isBrokenNode: isBrokenNode,\n inspectNode: inspectNode,\n getComputedStyleProperty: getComputedStyleProperty,\n createTestElement: createTestElement,\n removeNode: removeNode,\n fragmentFromNodeChildren: fragmentFromNodeChildren,\n createIterator: createIterator,\n DomPosition: DomPosition\n };\n\n api.DOMException = DOMException;\n });\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Pure JavaScript implementation of DOM Range\n api.createCoreModule(\"DomRange\", [\"DomUtil\"], function(api, module) {\n var dom = api.dom;\n var util = api.util;\n var DomPosition = dom.DomPosition;\n var DOMException = api.DOMException;\n\n var isCharacterDataNode = dom.isCharacterDataNode;\n var getNodeIndex = dom.getNodeIndex;\n var isOrIsAncestorOf = dom.isOrIsAncestorOf;\n var getDocument = dom.getDocument;\n var comparePoints = dom.comparePoints;\n var splitDataNode = dom.splitDataNode;\n var getClosestAncestorIn = dom.getClosestAncestorIn;\n var getNodeLength = dom.getNodeLength;\n var arrayContains = dom.arrayContains;\n var getRootContainer = dom.getRootContainer;\n var crashyTextNodes = api.features.crashyTextNodes;\n\n var removeNode = dom.removeNode;\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Utility functions\n\n function isNonTextPartiallySelected(node, range) {\n return (node.nodeType != 3) &&\n (isOrIsAncestorOf(node, range.startContainer) || isOrIsAncestorOf(node, range.endContainer));\n }\n\n function getRangeDocument(range) {\n return range.document || getDocument(range.startContainer);\n }\n\n function getRangeRoot(range) {\n return getRootContainer(range.startContainer);\n }\n\n function getBoundaryBeforeNode(node) {\n return new DomPosition(node.parentNode, getNodeIndex(node));\n }\n\n function getBoundaryAfterNode(node) {\n return new DomPosition(node.parentNode, getNodeIndex(node) + 1);\n }\n\n function insertNodeAtPosition(node, n, o) {\n var firstNodeInserted = node.nodeType == 11 ? node.firstChild : node;\n if (isCharacterDataNode(n)) {\n if (o == n.length) {\n dom.insertAfter(node, n);\n } else {\n n.parentNode.insertBefore(node, o == 0 ? n : splitDataNode(n, o));\n }\n } else if (o >= n.childNodes.length) {\n n.appendChild(node);\n } else {\n n.insertBefore(node, n.childNodes[o]);\n }\n return firstNodeInserted;\n }\n\n function rangesIntersect(rangeA, rangeB, touchingIsIntersecting) {\n assertRangeValid(rangeA);\n assertRangeValid(rangeB);\n\n if (getRangeDocument(rangeB) != getRangeDocument(rangeA)) {\n throw new DOMException(\"WRONG_DOCUMENT_ERR\");\n }\n\n var startComparison = comparePoints(rangeA.startContainer, rangeA.startOffset, rangeB.endContainer, rangeB.endOffset),\n endComparison = comparePoints(rangeA.endContainer, rangeA.endOffset, rangeB.startContainer, rangeB.startOffset);\n\n return touchingIsIntersecting ? startComparison <= 0 && endComparison >= 0 : startComparison < 0 && endComparison > 0;\n }\n\n function cloneSubtree(iterator) {\n var partiallySelected;\n for (var node, frag = getRangeDocument(iterator.range).createDocumentFragment(), subIterator; node = iterator.next(); ) {\n partiallySelected = iterator.isPartiallySelectedSubtree();\n node = node.cloneNode(!partiallySelected);\n if (partiallySelected) {\n subIterator = iterator.getSubtreeIterator();\n node.appendChild(cloneSubtree(subIterator));\n subIterator.detach();\n }\n\n if (node.nodeType == 10) { // DocumentType\n throw new DOMException(\"HIERARCHY_REQUEST_ERR\");\n }\n frag.appendChild(node);\n }\n return frag;\n }\n\n function iterateSubtree(rangeIterator, func, iteratorState) {\n var it, n;\n iteratorState = iteratorState || { stop: false };\n for (var node, subRangeIterator; node = rangeIterator.next(); ) {\n if (rangeIterator.isPartiallySelectedSubtree()) {\n if (func(node) === false) {\n iteratorState.stop = true;\n return;\n } else {\n // The node is partially selected by the Range, so we can use a new RangeIterator on the portion of\n // the node selected by the Range.\n subRangeIterator = rangeIterator.getSubtreeIterator();\n iterateSubtree(subRangeIterator, func, iteratorState);\n subRangeIterator.detach();\n if (iteratorState.stop) {\n return;\n }\n }\n } else {\n // The whole node is selected, so we can use efficient DOM iteration to iterate over the node and its\n // descendants\n it = dom.createIterator(node);\n while ( (n = it.next()) ) {\n if (func(n) === false) {\n iteratorState.stop = true;\n return;\n }\n }\n }\n }\n }\n\n function deleteSubtree(iterator) {\n var subIterator;\n while (iterator.next()) {\n if (iterator.isPartiallySelectedSubtree()) {\n subIterator = iterator.getSubtreeIterator();\n deleteSubtree(subIterator);\n subIterator.detach();\n } else {\n iterator.remove();\n }\n }\n }\n\n function extractSubtree(iterator) {\n for (var node, frag = getRangeDocument(iterator.range).createDocumentFragment(), subIterator; node = iterator.next(); ) {\n\n if (iterator.isPartiallySelectedSubtree()) {\n node = node.cloneNode(false);\n subIterator = iterator.getSubtreeIterator();\n node.appendChild(extractSubtree(subIterator));\n subIterator.detach();\n } else {\n iterator.remove();\n }\n if (node.nodeType == 10) { // DocumentType\n throw new DOMException(\"HIERARCHY_REQUEST_ERR\");\n }\n frag.appendChild(node);\n }\n return frag;\n }\n\n function getNodesInRange(range, nodeTypes, filter) {\n var filterNodeTypes = !!(nodeTypes && nodeTypes.length), regex;\n var filterExists = !!filter;\n if (filterNodeTypes) {\n regex = new RegExp(\"^(\" + nodeTypes.join(\"|\") + \")$\");\n }\n\n var nodes = [];\n iterateSubtree(new RangeIterator(range, false), function(node) {\n if (filterNodeTypes && !regex.test(node.nodeType)) {\n return;\n }\n if (filterExists && !filter(node)) {\n return;\n }\n // Don't include a boundary container if it is a character data node and the range does not contain any\n // of its character data. See issue 190.\n var sc = range.startContainer;\n if (node == sc && isCharacterDataNode(sc) && range.startOffset == sc.length) {\n return;\n }\n\n var ec = range.endContainer;\n if (node == ec && isCharacterDataNode(ec) && range.endOffset == 0) {\n return;\n }\n\n nodes.push(node);\n });\n return nodes;\n }\n\n function inspect(range) {\n var name = (typeof range.getName == \"undefined\") ? \"Range\" : range.getName();\n return \"[\" + name + \"(\" + dom.inspectNode(range.startContainer) + \":\" + range.startOffset + \", \" +\n dom.inspectNode(range.endContainer) + \":\" + range.endOffset + \")]\";\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // RangeIterator code partially borrows from IERange by Tim Ryan (http://github.com/timcameronryan/IERange)\n\n function RangeIterator(range, clonePartiallySelectedTextNodes) {\n this.range = range;\n this.clonePartiallySelectedTextNodes = clonePartiallySelectedTextNodes;\n\n\n if (!range.collapsed) {\n this.sc = range.startContainer;\n this.so = range.startOffset;\n this.ec = range.endContainer;\n this.eo = range.endOffset;\n var root = range.commonAncestorContainer;\n\n if (this.sc === this.ec && isCharacterDataNode(this.sc)) {\n this.isSingleCharacterDataNode = true;\n this._first = this._last = this._next = this.sc;\n } else {\n this._first = this._next = (this.sc === root && !isCharacterDataNode(this.sc)) ?\n this.sc.childNodes[this.so] : getClosestAncestorIn(this.sc, root, true);\n this._last = (this.ec === root && !isCharacterDataNode(this.ec)) ?\n this.ec.childNodes[this.eo - 1] : getClosestAncestorIn(this.ec, root, true);\n }\n }\n }\n\n RangeIterator.prototype = {\n _current: null,\n _next: null,\n _first: null,\n _last: null,\n isSingleCharacterDataNode: false,\n\n reset: function() {\n this._current = null;\n this._next = this._first;\n },\n\n hasNext: function() {\n return !!this._next;\n },\n\n next: function() {\n // Move to next node\n var current = this._current = this._next;\n if (current) {\n this._next = (current !== this._last) ? current.nextSibling : null;\n\n // Check for partially selected text nodes\n if (isCharacterDataNode(current) && this.clonePartiallySelectedTextNodes) {\n if (current === this.ec) {\n (current = current.cloneNode(true)).deleteData(this.eo, current.length - this.eo);\n }\n if (this._current === this.sc) {\n (current = current.cloneNode(true)).deleteData(0, this.so);\n }\n }\n }\n\n return current;\n },\n\n remove: function() {\n var current = this._current, start, end;\n\n if (isCharacterDataNode(current) && (current === this.sc || current === this.ec)) {\n start = (current === this.sc) ? this.so : 0;\n end = (current === this.ec) ? this.eo : current.length;\n if (start != end) {\n current.deleteData(start, end - start);\n }\n } else {\n if (current.parentNode) {\n removeNode(current);\n } else {\n }\n }\n },\n\n // Checks if the current node is partially selected\n isPartiallySelectedSubtree: function() {\n var current = this._current;\n return isNonTextPartiallySelected(current, this.range);\n },\n\n getSubtreeIterator: function() {\n var subRange;\n if (this.isSingleCharacterDataNode) {\n subRange = this.range.cloneRange();\n subRange.collapse(false);\n } else {\n subRange = new Range(getRangeDocument(this.range));\n var current = this._current;\n var startContainer = current, startOffset = 0, endContainer = current, endOffset = getNodeLength(current);\n\n if (isOrIsAncestorOf(current, this.sc)) {\n startContainer = this.sc;\n startOffset = this.so;\n }\n if (isOrIsAncestorOf(current, this.ec)) {\n endContainer = this.ec;\n endOffset = this.eo;\n }\n\n updateBoundaries(subRange, startContainer, startOffset, endContainer, endOffset);\n }\n return new RangeIterator(subRange, this.clonePartiallySelectedTextNodes);\n },\n\n detach: function() {\n this.range = this._current = this._next = this._first = this._last = this.sc = this.so = this.ec = this.eo = null;\n }\n };\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n var beforeAfterNodeTypes = [1, 3, 4, 5, 7, 8, 10];\n var rootContainerNodeTypes = [2, 9, 11];\n var readonlyNodeTypes = [5, 6, 10, 12];\n var insertableNodeTypes = [1, 3, 4, 5, 7, 8, 10, 11];\n var surroundNodeTypes = [1, 3, 4, 5, 7, 8];\n\n function createAncestorFinder(nodeTypes) {\n return function(node, selfIsAncestor) {\n var t, n = selfIsAncestor ? node : node.parentNode;\n while (n) {\n t = n.nodeType;\n if (arrayContains(nodeTypes, t)) {\n return n;\n }\n n = n.parentNode;\n }\n return null;\n };\n }\n\n var getDocumentOrFragmentContainer = createAncestorFinder( [9, 11] );\n var getReadonlyAncestor = createAncestorFinder(readonlyNodeTypes);\n var getDocTypeNotationEntityAncestor = createAncestorFinder( [6, 10, 12] );\n var getElementAncestor = createAncestorFinder( [1] );\n\n function assertNoDocTypeNotationEntityAncestor(node, allowSelf) {\n if (getDocTypeNotationEntityAncestor(node, allowSelf)) {\n throw new DOMException(\"INVALID_NODE_TYPE_ERR\");\n }\n }\n\n function assertValidNodeType(node, invalidTypes) {\n if (!arrayContains(invalidTypes, node.nodeType)) {\n throw new DOMException(\"INVALID_NODE_TYPE_ERR\");\n }\n }\n\n function assertValidOffset(node, offset) {\n if (offset < 0 || offset > (isCharacterDataNode(node) ? node.length : node.childNodes.length)) {\n throw new DOMException(\"INDEX_SIZE_ERR\");\n }\n }\n\n function assertSameDocumentOrFragment(node1, node2) {\n if (getDocumentOrFragmentContainer(node1, true) !== getDocumentOrFragmentContainer(node2, true)) {\n throw new DOMException(\"WRONG_DOCUMENT_ERR\");\n }\n }\n\n function assertNodeNotReadOnly(node) {\n if (getReadonlyAncestor(node, true)) {\n throw new DOMException(\"NO_MODIFICATION_ALLOWED_ERR\");\n }\n }\n\n function assertNode(node, codeName) {\n if (!node) {\n throw new DOMException(codeName);\n }\n }\n\n function isValidOffset(node, offset) {\n return offset <= (isCharacterDataNode(node) ? node.length : node.childNodes.length);\n }\n\n function isRangeValid(range) {\n return (!!range.startContainer && !!range.endContainer &&\n !(crashyTextNodes && (dom.isBrokenNode(range.startContainer) || dom.isBrokenNode(range.endContainer))) &&\n getRootContainer(range.startContainer) == getRootContainer(range.endContainer) &&\n isValidOffset(range.startContainer, range.startOffset) &&\n isValidOffset(range.endContainer, range.endOffset));\n }\n\n function assertRangeValid(range) {\n if (!isRangeValid(range)) {\n throw new Error(\"Range error: Range is not valid. This usually happens after DOM mutation. Range: (\" + range.inspect() + \")\");\n }\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Test the browser's innerHTML support to decide how to implement createContextualFragment\n var styleEl = document.createElement(\"style\");\n var htmlParsingConforms = false;\n try {\n styleEl.innerHTML = \"x\";\n htmlParsingConforms = (styleEl.firstChild.nodeType == 3); // Pre-Blink Opera incorrectly creates an element node\n } catch (e) {\n // IE 6 and 7 throw\n }\n\n api.features.htmlParsingConforms = htmlParsingConforms;\n\n var createContextualFragment = htmlParsingConforms ?\n\n // Implementation as per HTML parsing spec, trusting in the browser's implementation of innerHTML. See\n // discussion and base code for this implementation at issue 67.\n // Spec: http://html5.org/specs/dom-parsing.html#extensions-to-the-range-interface\n // Thanks to Aleks Williams.\n function(fragmentStr) {\n // \"Let node the context object's start's node.\"\n var node = this.startContainer;\n var doc = getDocument(node);\n\n // \"If the context object's start's node is null, raise an INVALID_STATE_ERR\n // exception and abort these steps.\"\n if (!node) {\n throw new DOMException(\"INVALID_STATE_ERR\");\n }\n\n // \"Let element be as follows, depending on node's interface:\"\n // Document, Document Fragment: null\n var el = null;\n\n // \"Element: node\"\n if (node.nodeType == 1) {\n el = node;\n\n // \"Text, Comment: node's parentElement\"\n } else if (isCharacterDataNode(node)) {\n el = dom.parentElement(node);\n }\n\n // \"If either element is null or element's ownerDocument is an HTML document\n // and element's local name is \"html\" and element's namespace is the HTML\n // namespace\"\n if (el === null || (\n el.nodeName == \"HTML\" &&\n dom.isHtmlNamespace(getDocument(el).documentElement) &&\n dom.isHtmlNamespace(el)\n )) {\n\n // \"let element be a new Element with \"body\" as its local name and the HTML\n // namespace as its namespace.\"\"\n el = doc.createElement(\"body\");\n } else {\n el = el.cloneNode(false);\n }\n\n // \"If the node's document is an HTML document: Invoke the HTML fragment parsing algorithm.\"\n // \"If the node's document is an XML document: Invoke the XML fragment parsing algorithm.\"\n // \"In either case, the algorithm must be invoked with fragment as the input\n // and element as the context element.\"\n el.innerHTML = fragmentStr;\n\n // \"If this raises an exception, then abort these steps. Otherwise, let new\n // children be the nodes returned.\"\n\n // \"Let fragment be a new DocumentFragment.\"\n // \"Append all new children to fragment.\"\n // \"Return fragment.\"\n return dom.fragmentFromNodeChildren(el);\n } :\n\n // In this case, innerHTML cannot be trusted, so fall back to a simpler, non-conformant implementation that\n // previous versions of Rangy used (with the exception of using a body element rather than a div)\n function(fragmentStr) {\n var doc = getRangeDocument(this);\n var el = doc.createElement(\"body\");\n el.innerHTML = fragmentStr;\n\n return dom.fragmentFromNodeChildren(el);\n };\n\n function splitRangeBoundaries(range, positionsToPreserve) {\n assertRangeValid(range);\n\n var sc = range.startContainer, so = range.startOffset, ec = range.endContainer, eo = range.endOffset;\n var startEndSame = (sc === ec);\n\n if (isCharacterDataNode(ec) && eo > 0 && eo < ec.length) {\n splitDataNode(ec, eo, positionsToPreserve);\n }\n\n if (isCharacterDataNode(sc) && so > 0 && so < sc.length) {\n sc = splitDataNode(sc, so, positionsToPreserve);\n if (startEndSame) {\n eo -= so;\n ec = sc;\n } else if (ec == sc.parentNode && eo >= getNodeIndex(sc)) {\n eo++;\n }\n so = 0;\n }\n range.setStartAndEnd(sc, so, ec, eo);\n }\n\n function rangeToHtml(range) {\n assertRangeValid(range);\n var container = range.commonAncestorContainer.parentNode.cloneNode(false);\n container.appendChild( range.cloneContents() );\n return container.innerHTML;\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n var rangeProperties = [\"startContainer\", \"startOffset\", \"endContainer\", \"endOffset\", \"collapsed\",\n \"commonAncestorContainer\"];\n\n var s2s = 0, s2e = 1, e2e = 2, e2s = 3;\n var n_b = 0, n_a = 1, n_b_a = 2, n_i = 3;\n\n util.extend(api.rangePrototype, {\n compareBoundaryPoints: function(how, range) {\n assertRangeValid(this);\n assertSameDocumentOrFragment(this.startContainer, range.startContainer);\n\n var nodeA, offsetA, nodeB, offsetB;\n var prefixA = (how == e2s || how == s2s) ? \"start\" : \"end\";\n var prefixB = (how == s2e || how == s2s) ? \"start\" : \"end\";\n nodeA = this[prefixA + \"Container\"];\n offsetA = this[prefixA + \"Offset\"];\n nodeB = range[prefixB + \"Container\"];\n offsetB = range[prefixB + \"Offset\"];\n return comparePoints(nodeA, offsetA, nodeB, offsetB);\n },\n\n insertNode: function(node) {\n assertRangeValid(this);\n assertValidNodeType(node, insertableNodeTypes);\n assertNodeNotReadOnly(this.startContainer);\n\n if (isOrIsAncestorOf(node, this.startContainer)) {\n throw new DOMException(\"HIERARCHY_REQUEST_ERR\");\n }\n\n // No check for whether the container of the start of the Range is of a type that does not allow\n // children of the type of node: the browser's DOM implementation should do this for us when we attempt\n // to add the node\n\n var firstNodeInserted = insertNodeAtPosition(node, this.startContainer, this.startOffset);\n this.setStartBefore(firstNodeInserted);\n },\n\n cloneContents: function() {\n assertRangeValid(this);\n\n var clone, frag;\n if (this.collapsed) {\n return getRangeDocument(this).createDocumentFragment();\n } else {\n if (this.startContainer === this.endContainer && isCharacterDataNode(this.startContainer)) {\n clone = this.startContainer.cloneNode(true);\n clone.data = clone.data.slice(this.startOffset, this.endOffset);\n frag = getRangeDocument(this).createDocumentFragment();\n frag.appendChild(clone);\n return frag;\n } else {\n var iterator = new RangeIterator(this, true);\n clone = cloneSubtree(iterator);\n iterator.detach();\n }\n return clone;\n }\n },\n\n canSurroundContents: function() {\n assertRangeValid(this);\n assertNodeNotReadOnly(this.startContainer);\n assertNodeNotReadOnly(this.endContainer);\n\n // Check if the contents can be surrounded. Specifically, this means whether the range partially selects\n // no non-text nodes.\n var iterator = new RangeIterator(this, true);\n var boundariesInvalid = (iterator._first && (isNonTextPartiallySelected(iterator._first, this)) ||\n (iterator._last && isNonTextPartiallySelected(iterator._last, this)));\n iterator.detach();\n return !boundariesInvalid;\n },\n\n surroundContents: function(node) {\n assertValidNodeType(node, surroundNodeTypes);\n\n if (!this.canSurroundContents()) {\n throw new DOMException(\"INVALID_STATE_ERR\");\n }\n\n // Extract the contents\n var content = this.extractContents();\n\n // Clear the children of the node\n if (node.hasChildNodes()) {\n while (node.lastChild) {\n node.removeChild(node.lastChild);\n }\n }\n\n // Insert the new node and add the extracted contents\n insertNodeAtPosition(node, this.startContainer, this.startOffset);\n node.appendChild(content);\n\n this.selectNode(node);\n },\n\n cloneRange: function() {\n assertRangeValid(this);\n var range = new Range(getRangeDocument(this));\n var i = rangeProperties.length, prop;\n while (i--) {\n prop = rangeProperties[i];\n range[prop] = this[prop];\n }\n return range;\n },\n\n toString: function() {\n assertRangeValid(this);\n var sc = this.startContainer;\n if (sc === this.endContainer && isCharacterDataNode(sc)) {\n return (sc.nodeType == 3 || sc.nodeType == 4) ? sc.data.slice(this.startOffset, this.endOffset) : \"\";\n } else {\n var textParts = [], iterator = new RangeIterator(this, true);\n iterateSubtree(iterator, function(node) {\n // Accept only text or CDATA nodes, not comments\n if (node.nodeType == 3 || node.nodeType == 4) {\n textParts.push(node.data);\n }\n });\n iterator.detach();\n return textParts.join(\"\");\n }\n },\n\n // The methods below are all non-standard. The following batch were introduced by Mozilla but have since\n // been removed from Mozilla.\n\n compareNode: function(node) {\n assertRangeValid(this);\n\n var parent = node.parentNode;\n var nodeIndex = getNodeIndex(node);\n\n if (!parent) {\n throw new DOMException(\"NOT_FOUND_ERR\");\n }\n\n var startComparison = this.comparePoint(parent, nodeIndex),\n endComparison = this.comparePoint(parent, nodeIndex + 1);\n\n if (startComparison < 0) { // Node starts before\n return (endComparison > 0) ? n_b_a : n_b;\n } else {\n return (endComparison > 0) ? n_a : n_i;\n }\n },\n\n comparePoint: function(node, offset) {\n assertRangeValid(this);\n assertNode(node, \"HIERARCHY_REQUEST_ERR\");\n assertSameDocumentOrFragment(node, this.startContainer);\n\n if (comparePoints(node, offset, this.startContainer, this.startOffset) < 0) {\n return -1;\n } else if (comparePoints(node, offset, this.endContainer, this.endOffset) > 0) {\n return 1;\n }\n return 0;\n },\n\n createContextualFragment: createContextualFragment,\n\n toHtml: function() {\n return rangeToHtml(this);\n },\n\n // touchingIsIntersecting determines whether this method considers a node that borders a range intersects\n // with it (as in WebKit) or not (as in Gecko pre-1.9, and the default)\n intersectsNode: function(node, touchingIsIntersecting) {\n assertRangeValid(this);\n if (getRootContainer(node) != getRangeRoot(this)) {\n return false;\n }\n\n var parent = node.parentNode, offset = getNodeIndex(node);\n if (!parent) {\n return true;\n }\n\n var startComparison = comparePoints(parent, offset, this.endContainer, this.endOffset),\n endComparison = comparePoints(parent, offset + 1, this.startContainer, this.startOffset);\n\n return touchingIsIntersecting ? startComparison <= 0 && endComparison >= 0 : startComparison < 0 && endComparison > 0;\n },\n\n isPointInRange: function(node, offset) {\n assertRangeValid(this);\n assertNode(node, \"HIERARCHY_REQUEST_ERR\");\n assertSameDocumentOrFragment(node, this.startContainer);\n\n return (comparePoints(node, offset, this.startContainer, this.startOffset) >= 0) &&\n (comparePoints(node, offset, this.endContainer, this.endOffset) <= 0);\n },\n\n // The methods below are non-standard and invented by me.\n\n // Sharing a boundary start-to-end or end-to-start does not count as intersection.\n intersectsRange: function(range) {\n return rangesIntersect(this, range, false);\n },\n\n // Sharing a boundary start-to-end or end-to-start does count as intersection.\n intersectsOrTouchesRange: function(range) {\n return rangesIntersect(this, range, true);\n },\n\n intersection: function(range) {\n if (this.intersectsRange(range)) {\n var startComparison = comparePoints(this.startContainer, this.startOffset, range.startContainer, range.startOffset),\n endComparison = comparePoints(this.endContainer, this.endOffset, range.endContainer, range.endOffset);\n\n var intersectionRange = this.cloneRange();\n if (startComparison == -1) {\n intersectionRange.setStart(range.startContainer, range.startOffset);\n }\n if (endComparison == 1) {\n intersectionRange.setEnd(range.endContainer, range.endOffset);\n }\n return intersectionRange;\n }\n return null;\n },\n\n union: function(range) {\n if (this.intersectsOrTouchesRange(range)) {\n var unionRange = this.cloneRange();\n if (comparePoints(range.startContainer, range.startOffset, this.startContainer, this.startOffset) == -1) {\n unionRange.setStart(range.startContainer, range.startOffset);\n }\n if (comparePoints(range.endContainer, range.endOffset, this.endContainer, this.endOffset) == 1) {\n unionRange.setEnd(range.endContainer, range.endOffset);\n }\n return unionRange;\n } else {\n throw new DOMException(\"Ranges do not intersect\");\n }\n },\n\n containsNode: function(node, allowPartial) {\n if (allowPartial) {\n return this.intersectsNode(node, false);\n } else {\n return this.compareNode(node) == n_i;\n }\n },\n\n containsNodeContents: function(node) {\n return this.comparePoint(node, 0) >= 0 && this.comparePoint(node, getNodeLength(node)) <= 0;\n },\n\n containsRange: function(range) {\n var intersection = this.intersection(range);\n return intersection !== null && range.equals(intersection);\n },\n\n containsNodeText: function(node) {\n var nodeRange = this.cloneRange();\n nodeRange.selectNode(node);\n var textNodes = nodeRange.getNodes([3]);\n if (textNodes.length > 0) {\n nodeRange.setStart(textNodes[0], 0);\n var lastTextNode = textNodes.pop();\n nodeRange.setEnd(lastTextNode, lastTextNode.length);\n return this.containsRange(nodeRange);\n } else {\n return this.containsNodeContents(node);\n }\n },\n\n getNodes: function(nodeTypes, filter) {\n assertRangeValid(this);\n return getNodesInRange(this, nodeTypes, filter);\n },\n\n getDocument: function() {\n return getRangeDocument(this);\n },\n\n collapseBefore: function(node) {\n this.setEndBefore(node);\n this.collapse(false);\n },\n\n collapseAfter: function(node) {\n this.setStartAfter(node);\n this.collapse(true);\n },\n\n getBookmark: function(containerNode) {\n var doc = getRangeDocument(this);\n var preSelectionRange = api.createRange(doc);\n containerNode = containerNode || dom.getBody(doc);\n preSelectionRange.selectNodeContents(containerNode);\n var range = this.intersection(preSelectionRange);\n var start = 0, end = 0;\n if (range) {\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n start = preSelectionRange.toString().length;\n end = start + range.toString().length;\n }\n\n return {\n start: start,\n end: end,\n containerNode: containerNode\n };\n },\n\n moveToBookmark: function(bookmark) {\n var containerNode = bookmark.containerNode;\n var charIndex = 0;\n this.setStart(containerNode, 0);\n this.collapse(true);\n var nodeStack = [containerNode], node, foundStart = false, stop = false;\n var nextCharIndex, i, childNodes;\n\n while (!stop && (node = nodeStack.pop())) {\n if (node.nodeType == 3) {\n nextCharIndex = charIndex + node.length;\n if (!foundStart && bookmark.start >= charIndex && bookmark.start <= nextCharIndex) {\n this.setStart(node, bookmark.start - charIndex);\n foundStart = true;\n }\n if (foundStart && bookmark.end >= charIndex && bookmark.end <= nextCharIndex) {\n this.setEnd(node, bookmark.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n childNodes = node.childNodes;\n i = childNodes.length;\n while (i--) {\n nodeStack.push(childNodes[i]);\n }\n }\n }\n },\n\n getName: function() {\n return \"DomRange\";\n },\n\n equals: function(range) {\n return Range.rangesEqual(this, range);\n },\n\n isValid: function() {\n return isRangeValid(this);\n },\n\n inspect: function() {\n return inspect(this);\n },\n\n detach: function() {\n // In DOM4, detach() is now a no-op.\n }\n });\n\n function copyComparisonConstantsToObject(obj) {\n obj.START_TO_START = s2s;\n obj.START_TO_END = s2e;\n obj.END_TO_END = e2e;\n obj.END_TO_START = e2s;\n\n obj.NODE_BEFORE = n_b;\n obj.NODE_AFTER = n_a;\n obj.NODE_BEFORE_AND_AFTER = n_b_a;\n obj.NODE_INSIDE = n_i;\n }\n\n function copyComparisonConstants(constructor) {\n copyComparisonConstantsToObject(constructor);\n copyComparisonConstantsToObject(constructor.prototype);\n }\n\n function createRangeContentRemover(remover, boundaryUpdater) {\n return function() {\n assertRangeValid(this);\n\n var sc = this.startContainer, so = this.startOffset, root = this.commonAncestorContainer;\n\n var iterator = new RangeIterator(this, true);\n\n // Work out where to position the range after content removal\n var node, boundary;\n if (sc !== root) {\n node = getClosestAncestorIn(sc, root, true);\n boundary = getBoundaryAfterNode(node);\n sc = boundary.node;\n so = boundary.offset;\n }\n\n // Check none of the range is read-only\n iterateSubtree(iterator, assertNodeNotReadOnly);\n\n iterator.reset();\n\n // Remove the content\n var returnValue = remover(iterator);\n iterator.detach();\n\n // Move to the new position\n boundaryUpdater(this, sc, so, sc, so);\n\n return returnValue;\n };\n }\n\n function createPrototypeRange(constructor, boundaryUpdater) {\n function createBeforeAfterNodeSetter(isBefore, isStart) {\n return function(node) {\n assertValidNodeType(node, beforeAfterNodeTypes);\n assertValidNodeType(getRootContainer(node), rootContainerNodeTypes);\n\n var boundary = (isBefore ? getBoundaryBeforeNode : getBoundaryAfterNode)(node);\n (isStart ? setRangeStart : setRangeEnd)(this, boundary.node, boundary.offset);\n };\n }\n\n function setRangeStart(range, node, offset) {\n var ec = range.endContainer, eo = range.endOffset;\n if (node !== range.startContainer || offset !== range.startOffset) {\n // Check the root containers of the range and the new boundary, and also check whether the new boundary\n // is after the current end. In either case, collapse the range to the new position\n if (getRootContainer(node) != getRootContainer(ec) || comparePoints(node, offset, ec, eo) == 1) {\n ec = node;\n eo = offset;\n }\n boundaryUpdater(range, node, offset, ec, eo);\n }\n }\n\n function setRangeEnd(range, node, offset) {\n var sc = range.startContainer, so = range.startOffset;\n if (node !== range.endContainer || offset !== range.endOffset) {\n // Check the root containers of the range and the new boundary, and also check whether the new boundary\n // is after the current end. In either case, collapse the range to the new position\n if (getRootContainer(node) != getRootContainer(sc) || comparePoints(node, offset, sc, so) == -1) {\n sc = node;\n so = offset;\n }\n boundaryUpdater(range, sc, so, node, offset);\n }\n }\n\n // Set up inheritance\n var F = function() {};\n F.prototype = api.rangePrototype;\n constructor.prototype = new F();\n\n util.extend(constructor.prototype, {\n setStart: function(node, offset) {\n assertNoDocTypeNotationEntityAncestor(node, true);\n assertValidOffset(node, offset);\n\n setRangeStart(this, node, offset);\n },\n\n setEnd: function(node, offset) {\n assertNoDocTypeNotationEntityAncestor(node, true);\n assertValidOffset(node, offset);\n\n setRangeEnd(this, node, offset);\n },\n\n /**\n * Convenience method to set a range's start and end boundaries. Overloaded as follows:\n * - Two parameters (node, offset) creates a collapsed range at that position\n * - Three parameters (node, startOffset, endOffset) creates a range contained with node starting at\n * startOffset and ending at endOffset\n * - Four parameters (startNode, startOffset, endNode, endOffset) creates a range starting at startOffset in\n * startNode and ending at endOffset in endNode\n */\n setStartAndEnd: function() {\n var args = arguments;\n var sc = args[0], so = args[1], ec = sc, eo = so;\n\n switch (args.length) {\n case 3:\n eo = args[2];\n break;\n case 4:\n ec = args[2];\n eo = args[3];\n break;\n }\n\n assertNoDocTypeNotationEntityAncestor(sc, true);\n assertValidOffset(sc, so);\n\n assertNoDocTypeNotationEntityAncestor(ec, true);\n assertValidOffset(ec, eo);\n\n boundaryUpdater(this, sc, so, ec, eo);\n },\n\n setBoundary: function(node, offset, isStart) {\n this[\"set\" + (isStart ? \"Start\" : \"End\")](node, offset);\n },\n\n setStartBefore: createBeforeAfterNodeSetter(true, true),\n setStartAfter: createBeforeAfterNodeSetter(false, true),\n setEndBefore: createBeforeAfterNodeSetter(true, false),\n setEndAfter: createBeforeAfterNodeSetter(false, false),\n\n collapse: function(isStart) {\n assertRangeValid(this);\n if (isStart) {\n boundaryUpdater(this, this.startContainer, this.startOffset, this.startContainer, this.startOffset);\n } else {\n boundaryUpdater(this, this.endContainer, this.endOffset, this.endContainer, this.endOffset);\n }\n },\n\n selectNodeContents: function(node) {\n assertNoDocTypeNotationEntityAncestor(node, true);\n\n boundaryUpdater(this, node, 0, node, getNodeLength(node));\n },\n\n selectNode: function(node) {\n assertNoDocTypeNotationEntityAncestor(node, false);\n assertValidNodeType(node, beforeAfterNodeTypes);\n\n var start = getBoundaryBeforeNode(node), end = getBoundaryAfterNode(node);\n boundaryUpdater(this, start.node, start.offset, end.node, end.offset);\n },\n\n extractContents: createRangeContentRemover(extractSubtree, boundaryUpdater),\n\n deleteContents: createRangeContentRemover(deleteSubtree, boundaryUpdater),\n\n canSurroundContents: function() {\n assertRangeValid(this);\n assertNodeNotReadOnly(this.startContainer);\n assertNodeNotReadOnly(this.endContainer);\n\n // Check if the contents can be surrounded. Specifically, this means whether the range partially selects\n // no non-text nodes.\n var iterator = new RangeIterator(this, true);\n var boundariesInvalid = (iterator._first && isNonTextPartiallySelected(iterator._first, this) ||\n (iterator._last && isNonTextPartiallySelected(iterator._last, this)));\n iterator.detach();\n return !boundariesInvalid;\n },\n\n splitBoundaries: function() {\n splitRangeBoundaries(this);\n },\n\n splitBoundariesPreservingPositions: function(positionsToPreserve) {\n splitRangeBoundaries(this, positionsToPreserve);\n },\n\n normalizeBoundaries: function() {\n assertRangeValid(this);\n\n var sc = this.startContainer, so = this.startOffset, ec = this.endContainer, eo = this.endOffset;\n\n var mergeForward = function(node) {\n var sibling = node.nextSibling;\n if (sibling && sibling.nodeType == node.nodeType) {\n ec = node;\n eo = node.length;\n node.appendData(sibling.data);\n removeNode(sibling);\n }\n };\n\n var mergeBackward = function(node) {\n var sibling = node.previousSibling;\n if (sibling && sibling.nodeType == node.nodeType) {\n sc = node;\n var nodeLength = node.length;\n so = sibling.length;\n node.insertData(0, sibling.data);\n removeNode(sibling);\n if (sc == ec) {\n eo += so;\n ec = sc;\n } else if (ec == node.parentNode) {\n var nodeIndex = getNodeIndex(node);\n if (eo == nodeIndex) {\n ec = node;\n eo = nodeLength;\n } else if (eo > nodeIndex) {\n eo--;\n }\n }\n }\n };\n\n var normalizeStart = true;\n var sibling;\n\n if (isCharacterDataNode(ec)) {\n if (eo == ec.length) {\n mergeForward(ec);\n } else if (eo == 0) {\n sibling = ec.previousSibling;\n if (sibling && sibling.nodeType == ec.nodeType) {\n eo = sibling.length;\n if (sc == ec) {\n normalizeStart = false;\n }\n sibling.appendData(ec.data);\n removeNode(ec);\n ec = sibling;\n }\n }\n } else {\n if (eo > 0) {\n var endNode = ec.childNodes[eo - 1];\n if (endNode && isCharacterDataNode(endNode)) {\n mergeForward(endNode);\n }\n }\n normalizeStart = !this.collapsed;\n }\n\n if (normalizeStart) {\n if (isCharacterDataNode(sc)) {\n if (so == 0) {\n mergeBackward(sc);\n } else if (so == sc.length) {\n sibling = sc.nextSibling;\n if (sibling && sibling.nodeType == sc.nodeType) {\n if (ec == sibling) {\n ec = sc;\n eo += sc.length;\n }\n sc.appendData(sibling.data);\n removeNode(sibling);\n }\n }\n } else {\n if (so < sc.childNodes.length) {\n var startNode = sc.childNodes[so];\n if (startNode && isCharacterDataNode(startNode)) {\n mergeBackward(startNode);\n }\n }\n }\n } else {\n sc = ec;\n so = eo;\n }\n\n boundaryUpdater(this, sc, so, ec, eo);\n },\n\n collapseToPoint: function(node, offset) {\n assertNoDocTypeNotationEntityAncestor(node, true);\n assertValidOffset(node, offset);\n this.setStartAndEnd(node, offset);\n },\n\n parentElement: function() {\n assertRangeValid(this);\n var parentNode = this.commonAncestorContainer;\n return parentNode ? getElementAncestor(this.commonAncestorContainer, true) : null;\n }\n });\n\n copyComparisonConstants(constructor);\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Updates commonAncestorContainer and collapsed after boundary change\n function updateCollapsedAndCommonAncestor(range) {\n range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset);\n range.commonAncestorContainer = range.collapsed ?\n range.startContainer : dom.getCommonAncestor(range.startContainer, range.endContainer);\n }\n\n function updateBoundaries(range, startContainer, startOffset, endContainer, endOffset) {\n range.startContainer = startContainer;\n range.startOffset = startOffset;\n range.endContainer = endContainer;\n range.endOffset = endOffset;\n range.document = dom.getDocument(startContainer);\n updateCollapsedAndCommonAncestor(range);\n }\n\n function Range(doc) {\n updateBoundaries(this, doc, 0, doc, 0);\n }\n\n createPrototypeRange(Range, updateBoundaries);\n\n util.extend(Range, {\n rangeProperties: rangeProperties,\n RangeIterator: RangeIterator,\n copyComparisonConstants: copyComparisonConstants,\n createPrototypeRange: createPrototypeRange,\n inspect: inspect,\n toHtml: rangeToHtml,\n getRangeDocument: getRangeDocument,\n rangesEqual: function(r1, r2) {\n return r1.startContainer === r2.startContainer &&\n r1.startOffset === r2.startOffset &&\n r1.endContainer === r2.endContainer &&\n r1.endOffset === r2.endOffset;\n }\n });\n\n api.DomRange = Range;\n });\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Wrappers for the browser's native DOM Range and/or TextRange implementation\n api.createCoreModule(\"WrappedRange\", [\"DomRange\"], function(api, module) {\n var WrappedRange, WrappedTextRange;\n var dom = api.dom;\n var util = api.util;\n var DomPosition = dom.DomPosition;\n var DomRange = api.DomRange;\n var getBody = dom.getBody;\n var getContentDocument = dom.getContentDocument;\n var isCharacterDataNode = dom.isCharacterDataNode;\n\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n if (api.features.implementsDomRange) {\n // This is a wrapper around the browser's native DOM Range. It has two aims:\n // - Provide workarounds for specific browser bugs\n // - provide convenient extensions, which are inherited from Rangy's DomRange\n\n (function() {\n var rangeProto;\n var rangeProperties = DomRange.rangeProperties;\n\n function updateRangeProperties(range) {\n var i = rangeProperties.length, prop;\n while (i--) {\n prop = rangeProperties[i];\n range[prop] = range.nativeRange[prop];\n }\n // Fix for broken collapsed property in IE 9.\n range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset);\n }\n\n function updateNativeRange(range, startContainer, startOffset, endContainer, endOffset) {\n var startMoved = (range.startContainer !== startContainer || range.startOffset != startOffset);\n var endMoved = (range.endContainer !== endContainer || range.endOffset != endOffset);\n var nativeRangeDifferent = !range.equals(range.nativeRange);\n\n // Always set both boundaries for the benefit of IE9 (see issue 35)\n if (startMoved || endMoved || nativeRangeDifferent) {\n range.setEnd(endContainer, endOffset);\n range.setStart(startContainer, startOffset);\n }\n }\n\n var createBeforeAfterNodeSetter;\n\n WrappedRange = function(range) {\n if (!range) {\n throw module.createError(\"WrappedRange: Range must be specified\");\n }\n this.nativeRange = range;\n updateRangeProperties(this);\n };\n\n DomRange.createPrototypeRange(WrappedRange, updateNativeRange);\n\n rangeProto = WrappedRange.prototype;\n\n rangeProto.selectNode = function(node) {\n this.nativeRange.selectNode(node);\n updateRangeProperties(this);\n };\n\n rangeProto.cloneContents = function() {\n return this.nativeRange.cloneContents();\n };\n\n // Due to a long-standing Firefox bug that I have not been able to find a reliable way to detect,\n // insertNode() is never delegated to the native range.\n\n rangeProto.surroundContents = function(node) {\n this.nativeRange.surroundContents(node);\n updateRangeProperties(this);\n };\n\n rangeProto.collapse = function(isStart) {\n this.nativeRange.collapse(isStart);\n updateRangeProperties(this);\n };\n\n rangeProto.cloneRange = function() {\n return new WrappedRange(this.nativeRange.cloneRange());\n };\n\n rangeProto.refresh = function() {\n updateRangeProperties(this);\n };\n\n rangeProto.toString = function() {\n return this.nativeRange.toString();\n };\n\n // Create test range and node for feature detection\n\n var testTextNode = document.createTextNode(\"test\");\n getBody(document).appendChild(testTextNode);\n var range = document.createRange();\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Test for Firefox 2 bug that prevents moving the start of a Range to a point after its current end and\n // correct for it\n\n range.setStart(testTextNode, 0);\n range.setEnd(testTextNode, 0);\n\n try {\n range.setStart(testTextNode, 1);\n\n rangeProto.setStart = function(node, offset) {\n this.nativeRange.setStart(node, offset);\n updateRangeProperties(this);\n };\n\n rangeProto.setEnd = function(node, offset) {\n this.nativeRange.setEnd(node, offset);\n updateRangeProperties(this);\n };\n\n createBeforeAfterNodeSetter = function(name) {\n return function(node) {\n this.nativeRange[name](node);\n updateRangeProperties(this);\n };\n };\n\n } catch(ex) {\n\n rangeProto.setStart = function(node, offset) {\n try {\n this.nativeRange.setStart(node, offset);\n } catch (ex) {\n this.nativeRange.setEnd(node, offset);\n this.nativeRange.setStart(node, offset);\n }\n updateRangeProperties(this);\n };\n\n rangeProto.setEnd = function(node, offset) {\n try {\n this.nativeRange.setEnd(node, offset);\n } catch (ex) {\n this.nativeRange.setStart(node, offset);\n this.nativeRange.setEnd(node, offset);\n }\n updateRangeProperties(this);\n };\n\n createBeforeAfterNodeSetter = function(name, oppositeName) {\n return function(node) {\n try {\n this.nativeRange[name](node);\n } catch (ex) {\n this.nativeRange[oppositeName](node);\n this.nativeRange[name](node);\n }\n updateRangeProperties(this);\n };\n };\n }\n\n rangeProto.setStartBefore = createBeforeAfterNodeSetter(\"setStartBefore\", \"setEndBefore\");\n rangeProto.setStartAfter = createBeforeAfterNodeSetter(\"setStartAfter\", \"setEndAfter\");\n rangeProto.setEndBefore = createBeforeAfterNodeSetter(\"setEndBefore\", \"setStartBefore\");\n rangeProto.setEndAfter = createBeforeAfterNodeSetter(\"setEndAfter\", \"setStartAfter\");\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Always use DOM4-compliant selectNodeContents implementation: it's simpler and less code than testing\n // whether the native implementation can be trusted\n rangeProto.selectNodeContents = function(node) {\n this.setStartAndEnd(node, 0, dom.getNodeLength(node));\n };\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Test for and correct WebKit bug that has the behaviour of compareBoundaryPoints round the wrong way for\n // constants START_TO_END and END_TO_START: https://bugs.webkit.org/show_bug.cgi?id=20738\n\n range.selectNodeContents(testTextNode);\n range.setEnd(testTextNode, 3);\n\n var range2 = document.createRange();\n range2.selectNodeContents(testTextNode);\n range2.setEnd(testTextNode, 4);\n range2.setStart(testTextNode, 2);\n\n if (range.compareBoundaryPoints(range.START_TO_END, range2) == -1 &&\n range.compareBoundaryPoints(range.END_TO_START, range2) == 1) {\n // This is the wrong way round, so correct for it\n\n rangeProto.compareBoundaryPoints = function(type, range) {\n range = range.nativeRange || range;\n if (type == range.START_TO_END) {\n type = range.END_TO_START;\n } else if (type == range.END_TO_START) {\n type = range.START_TO_END;\n }\n return this.nativeRange.compareBoundaryPoints(type, range);\n };\n } else {\n rangeProto.compareBoundaryPoints = function(type, range) {\n return this.nativeRange.compareBoundaryPoints(type, range.nativeRange || range);\n };\n }\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Test for IE deleteContents() and extractContents() bug and correct it. See issue 107.\n\n var el = document.createElement(\"div\");\n el.innerHTML = \"123\";\n var textNode = el.firstChild;\n var body = getBody(document);\n body.appendChild(el);\n\n range.setStart(textNode, 1);\n range.setEnd(textNode, 2);\n range.deleteContents();\n\n if (textNode.data == \"13\") {\n // Behaviour is correct per DOM4 Range so wrap the browser's implementation of deleteContents() and\n // extractContents()\n rangeProto.deleteContents = function() {\n this.nativeRange.deleteContents();\n updateRangeProperties(this);\n };\n\n rangeProto.extractContents = function() {\n var frag = this.nativeRange.extractContents();\n updateRangeProperties(this);\n return frag;\n };\n } else {\n }\n\n body.removeChild(el);\n body = null;\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Test for existence of createContextualFragment and delegate to it if it exists\n if (util.isHostMethod(range, \"createContextualFragment\")) {\n rangeProto.createContextualFragment = function(fragmentStr) {\n return this.nativeRange.createContextualFragment(fragmentStr);\n };\n }\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Clean up\n getBody(document).removeChild(testTextNode);\n\n rangeProto.getName = function() {\n return \"WrappedRange\";\n };\n\n api.WrappedRange = WrappedRange;\n\n api.createNativeRange = function(doc) {\n doc = getContentDocument(doc, module, \"createNativeRange\");\n return doc.createRange();\n };\n })();\n }\n\n if (api.features.implementsTextRange) {\n /*\n This is a workaround for a bug where IE returns the wrong container element from the TextRange's parentElement()\n method. For example, in the following (where pipes denote the selection boundaries):\n\n
  • | a
  • b |
\n\n var range = document.selection.createRange();\n alert(range.parentElement().id); // Should alert \"ul\" but alerts \"b\"\n\n This method returns the common ancestor node of the following:\n - the parentElement() of the textRange\n - the parentElement() of the textRange after calling collapse(true)\n - the parentElement() of the textRange after calling collapse(false)\n */\n var getTextRangeContainerElement = function(textRange) {\n var parentEl = textRange.parentElement();\n var range = textRange.duplicate();\n range.collapse(true);\n var startEl = range.parentElement();\n range = textRange.duplicate();\n range.collapse(false);\n var endEl = range.parentElement();\n var startEndContainer = (startEl == endEl) ? startEl : dom.getCommonAncestor(startEl, endEl);\n\n return startEndContainer == parentEl ? startEndContainer : dom.getCommonAncestor(parentEl, startEndContainer);\n };\n\n var textRangeIsCollapsed = function(textRange) {\n return textRange.compareEndPoints(\"StartToEnd\", textRange) == 0;\n };\n\n // Gets the boundary of a TextRange expressed as a node and an offset within that node. This function started\n // out as an improved version of code found in Tim Cameron Ryan's IERange (http://code.google.com/p/ierange/)\n // but has grown, fixing problems with line breaks in preformatted text, adding workaround for IE TextRange\n // bugs, handling for inputs and images, plus optimizations.\n var getTextRangeBoundaryPosition = function(textRange, wholeRangeContainerElement, isStart, isCollapsed, startInfo) {\n var workingRange = textRange.duplicate();\n workingRange.collapse(isStart);\n var containerElement = workingRange.parentElement();\n\n // Sometimes collapsing a TextRange that's at the start of a text node can move it into the previous node, so\n // check for that\n if (!dom.isOrIsAncestorOf(wholeRangeContainerElement, containerElement)) {\n containerElement = wholeRangeContainerElement;\n }\n\n\n // Deal with nodes that cannot \"contain rich HTML markup\". In practice, this means form inputs, images and\n // similar. See http://msdn.microsoft.com/en-us/library/aa703950%28VS.85%29.aspx\n if (!containerElement.canHaveHTML) {\n var pos = new DomPosition(containerElement.parentNode, dom.getNodeIndex(containerElement));\n return {\n boundaryPosition: pos,\n nodeInfo: {\n nodeIndex: pos.offset,\n containerElement: pos.node\n }\n };\n }\n\n var workingNode = dom.getDocument(containerElement).createElement(\"span\");\n\n // Workaround for HTML5 Shiv's insane violation of document.createElement(). See Rangy issue 104 and HTML5\n // Shiv issue 64: https://github.com/aFarkas/html5shiv/issues/64\n if (workingNode.parentNode) {\n dom.removeNode(workingNode);\n }\n\n var comparison, workingComparisonType = isStart ? \"StartToStart\" : \"StartToEnd\";\n var previousNode, nextNode, boundaryPosition, boundaryNode;\n var start = (startInfo && startInfo.containerElement == containerElement) ? startInfo.nodeIndex : 0;\n var childNodeCount = containerElement.childNodes.length;\n var end = childNodeCount;\n\n // Check end first. Code within the loop assumes that the endth child node of the container is definitely\n // after the range boundary.\n var nodeIndex = end;\n\n while (true) {\n if (nodeIndex == childNodeCount) {\n containerElement.appendChild(workingNode);\n } else {\n containerElement.insertBefore(workingNode, containerElement.childNodes[nodeIndex]);\n }\n workingRange.moveToElementText(workingNode);\n comparison = workingRange.compareEndPoints(workingComparisonType, textRange);\n if (comparison == 0 || start == end) {\n break;\n } else if (comparison == -1) {\n if (end == start + 1) {\n // We know the endth child node is after the range boundary, so we must be done.\n break;\n } else {\n start = nodeIndex;\n }\n } else {\n end = (end == start + 1) ? start : nodeIndex;\n }\n nodeIndex = Math.floor((start + end) / 2);\n containerElement.removeChild(workingNode);\n }\n\n\n // We've now reached or gone past the boundary of the text range we're interested in\n // so have identified the node we want\n boundaryNode = workingNode.nextSibling;\n\n if (comparison == -1 && boundaryNode && isCharacterDataNode(boundaryNode)) {\n // This is a character data node (text, comment, cdata). The working range is collapsed at the start of\n // the node containing the text range's boundary, so we move the end of the working range to the\n // boundary point and measure the length of its text to get the boundary's offset within the node.\n workingRange.setEndPoint(isStart ? \"EndToStart\" : \"EndToEnd\", textRange);\n\n var offset;\n\n if (/[\\r\\n]/.test(boundaryNode.data)) {\n /*\n For the particular case of a boundary within a text node containing rendered line breaks (within a\n
 element, for example), we need a slightly complicated approach to get the boundary's offset in\n                        IE. The facts:\n\n                        - Each line break is represented as \\r in the text node's data/nodeValue properties\n                        - Each line break is represented as \\r\\n in the TextRange's 'text' property\n                        - The 'text' property of the TextRange does not contain trailing line breaks\n\n                        To get round the problem presented by the final fact above, we can use the fact that TextRange's\n                        moveStart() and moveEnd() methods return the actual number of characters moved, which is not\n                        necessarily the same as the number of characters it was instructed to move. The simplest approach is\n                        to use this to store the characters moved when moving both the start and end of the range to the\n                        start of the document body and subtracting the start offset from the end offset (the\n                        \"move-negative-gazillion\" method). However, this is extremely slow when the document is large and\n                        the range is near the end of it. Clearly doing the mirror image (i.e. moving the range boundaries to\n                        the end of the document) has the same problem.\n\n                        Another approach that works is to use moveStart() to move the start boundary of the range up to the\n                        end boundary one character at a time and incrementing a counter with the value returned by the\n                        moveStart() call. However, the check for whether the start boundary has reached the end boundary is\n                        expensive, so this method is slow (although unlike \"move-negative-gazillion\" is largely unaffected\n                        by the location of the range within the document).\n\n                        The approach used below is a hybrid of the two methods above. It uses the fact that a string\n                        containing the TextRange's 'text' property with each \\r\\n converted to a single \\r character cannot\n                        be longer than the text of the TextRange, so the start of the range is moved that length initially\n                        and then a character at a time to make up for any trailing line breaks not contained in the 'text'\n                        property. This has good performance in most situations compared to the previous two methods.\n                        */\n                        var tempRange = workingRange.duplicate();\n                        var rangeLength = tempRange.text.replace(/\\r\\n/g, \"\\r\").length;\n\n                        offset = tempRange.moveStart(\"character\", rangeLength);\n                        while ( (comparison = tempRange.compareEndPoints(\"StartToEnd\", tempRange)) == -1) {\n                            offset++;\n                            tempRange.moveStart(\"character\", 1);\n                        }\n                    } else {\n                        offset = workingRange.text.length;\n                    }\n                    boundaryPosition = new DomPosition(boundaryNode, offset);\n                } else {\n\n                    // If the boundary immediately follows a character data node and this is the end boundary, we should favour\n                    // a position within that, and likewise for a start boundary preceding a character data node\n                    previousNode = (isCollapsed || !isStart) && workingNode.previousSibling;\n                    nextNode = (isCollapsed || isStart) && workingNode.nextSibling;\n                    if (nextNode && isCharacterDataNode(nextNode)) {\n                        boundaryPosition = new DomPosition(nextNode, 0);\n                    } else if (previousNode && isCharacterDataNode(previousNode)) {\n                        boundaryPosition = new DomPosition(previousNode, previousNode.data.length);\n                    } else {\n                        boundaryPosition = new DomPosition(containerElement, dom.getNodeIndex(workingNode));\n                    }\n                }\n\n                // Clean up\n                dom.removeNode(workingNode);\n\n                return {\n                    boundaryPosition: boundaryPosition,\n                    nodeInfo: {\n                        nodeIndex: nodeIndex,\n                        containerElement: containerElement\n                    }\n                };\n            };\n\n            // Returns a TextRange representing the boundary of a TextRange expressed as a node and an offset within that\n            // node. This function started out as an optimized version of code found in Tim Cameron Ryan's IERange\n            // (http://code.google.com/p/ierange/)\n            var createBoundaryTextRange = function(boundaryPosition, isStart) {\n                var boundaryNode, boundaryParent, boundaryOffset = boundaryPosition.offset;\n                var doc = dom.getDocument(boundaryPosition.node);\n                var workingNode, childNodes, workingRange = getBody(doc).createTextRange();\n                var nodeIsDataNode = isCharacterDataNode(boundaryPosition.node);\n\n                if (nodeIsDataNode) {\n                    boundaryNode = boundaryPosition.node;\n                    boundaryParent = boundaryNode.parentNode;\n                } else {\n                    childNodes = boundaryPosition.node.childNodes;\n                    boundaryNode = (boundaryOffset < childNodes.length) ? childNodes[boundaryOffset] : null;\n                    boundaryParent = boundaryPosition.node;\n                }\n\n                // Position the range immediately before the node containing the boundary\n                workingNode = doc.createElement(\"span\");\n\n                // Making the working element non-empty element persuades IE to consider the TextRange boundary to be within\n                // the element rather than immediately before or after it\n                workingNode.innerHTML = \"&#feff;\";\n\n                // insertBefore is supposed to work like appendChild if the second parameter is null. However, a bug report\n                // for IERange suggests that it can crash the browser: http://code.google.com/p/ierange/issues/detail?id=12\n                if (boundaryNode) {\n                    boundaryParent.insertBefore(workingNode, boundaryNode);\n                } else {\n                    boundaryParent.appendChild(workingNode);\n                }\n\n                workingRange.moveToElementText(workingNode);\n                workingRange.collapse(!isStart);\n\n                // Clean up\n                boundaryParent.removeChild(workingNode);\n\n                // Move the working range to the text offset, if required\n                if (nodeIsDataNode) {\n                    workingRange[isStart ? \"moveStart\" : \"moveEnd\"](\"character\", boundaryOffset);\n                }\n\n                return workingRange;\n            };\n\n            /*------------------------------------------------------------------------------------------------------------*/\n\n            // This is a wrapper around a TextRange, providing full DOM Range functionality using rangy's DomRange as a\n            // prototype\n\n            WrappedTextRange = function(textRange) {\n                this.textRange = textRange;\n                this.refresh();\n            };\n\n            WrappedTextRange.prototype = new DomRange(document);\n\n            WrappedTextRange.prototype.refresh = function() {\n                var start, end, startBoundary;\n\n                // TextRange's parentElement() method cannot be trusted. getTextRangeContainerElement() works around that.\n                var rangeContainerElement = getTextRangeContainerElement(this.textRange);\n\n                if (textRangeIsCollapsed(this.textRange)) {\n                    end = start = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, true,\n                        true).boundaryPosition;\n                } else {\n                    startBoundary = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, true, false);\n                    start = startBoundary.boundaryPosition;\n\n                    // An optimization used here is that if the start and end boundaries have the same parent element, the\n                    // search scope for the end boundary can be limited to exclude the portion of the element that precedes\n                    // the start boundary\n                    end = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, false, false,\n                        startBoundary.nodeInfo).boundaryPosition;\n                }\n\n                this.setStart(start.node, start.offset);\n                this.setEnd(end.node, end.offset);\n            };\n\n            WrappedTextRange.prototype.getName = function() {\n                return \"WrappedTextRange\";\n            };\n\n            DomRange.copyComparisonConstants(WrappedTextRange);\n\n            var rangeToTextRange = function(range) {\n                if (range.collapsed) {\n                    return createBoundaryTextRange(new DomPosition(range.startContainer, range.startOffset), true);\n                } else {\n                    var startRange = createBoundaryTextRange(new DomPosition(range.startContainer, range.startOffset), true);\n                    var endRange = createBoundaryTextRange(new DomPosition(range.endContainer, range.endOffset), false);\n                    var textRange = getBody( DomRange.getRangeDocument(range) ).createTextRange();\n                    textRange.setEndPoint(\"StartToStart\", startRange);\n                    textRange.setEndPoint(\"EndToEnd\", endRange);\n                    return textRange;\n                }\n            };\n\n            WrappedTextRange.rangeToTextRange = rangeToTextRange;\n\n            WrappedTextRange.prototype.toTextRange = function() {\n                return rangeToTextRange(this);\n            };\n\n            api.WrappedTextRange = WrappedTextRange;\n\n            // IE 9 and above have both implementations and Rangy makes both available. The next few lines sets which\n            // implementation to use by default.\n            if (!api.features.implementsDomRange || api.config.preferTextRange) {\n                // Add WrappedTextRange as the Range property of the global object to allow expression like Range.END_TO_END to work\n                var globalObj = (function(f) { return f(\"return this;\")(); })(Function);\n                if (typeof globalObj.Range == \"undefined\") {\n                    globalObj.Range = WrappedTextRange;\n                }\n\n                api.createNativeRange = function(doc) {\n                    doc = getContentDocument(doc, module, \"createNativeRange\");\n                    return getBody(doc).createTextRange();\n                };\n\n                api.WrappedRange = WrappedTextRange;\n            }\n        }\n\n        api.createRange = function(doc) {\n            doc = getContentDocument(doc, module, \"createRange\");\n            return new api.WrappedRange(api.createNativeRange(doc));\n        };\n\n        api.createRangyRange = function(doc) {\n            doc = getContentDocument(doc, module, \"createRangyRange\");\n            return new DomRange(doc);\n        };\n\n        util.createAliasForDeprecatedMethod(api, \"createIframeRange\", \"createRange\");\n        util.createAliasForDeprecatedMethod(api, \"createIframeRangyRange\", \"createRangyRange\");\n\n        api.addShimListener(function(win) {\n            var doc = win.document;\n            if (typeof doc.createRange == \"undefined\") {\n                doc.createRange = function() {\n                    return api.createRange(doc);\n                };\n            }\n            doc = win = null;\n        });\n    });\n\n    /*----------------------------------------------------------------------------------------------------------------*/\n\n    // This module creates a selection object wrapper that conforms as closely as possible to the Selection specification\n    // in the W3C Selection API spec (https://www.w3.org/TR/selection-api)\n    api.createCoreModule(\"WrappedSelection\", [\"DomRange\", \"WrappedRange\"], function(api, module) {\n        api.config.checkSelectionRanges = true;\n\n        var BOOLEAN = \"boolean\";\n        var NUMBER = \"number\";\n        var dom = api.dom;\n        var util = api.util;\n        var isHostMethod = util.isHostMethod;\n        var DomRange = api.DomRange;\n        var WrappedRange = api.WrappedRange;\n        var DOMException = api.DOMException;\n        var DomPosition = dom.DomPosition;\n        var getNativeSelection;\n        var selectionIsCollapsed;\n        var features = api.features;\n        var CONTROL = \"Control\";\n        var getDocument = dom.getDocument;\n        var getBody = dom.getBody;\n        var rangesEqual = DomRange.rangesEqual;\n\n\n        // Utility function to support direction parameters in the API that may be a string (\"backward\", \"backwards\",\n        // \"forward\" or \"forwards\") or a Boolean (true for backwards).\n        function isDirectionBackward(dir) {\n            return (typeof dir == \"string\") ? /^backward(s)?$/i.test(dir) : !!dir;\n        }\n\n        function getWindow(win, methodName) {\n            if (!win) {\n                return window;\n            } else if (dom.isWindow(win)) {\n                return win;\n            } else if (win instanceof WrappedSelection) {\n                return win.win;\n            } else {\n                var doc = dom.getContentDocument(win, module, methodName);\n                return dom.getWindow(doc);\n            }\n        }\n\n        function getWinSelection(winParam) {\n            return getWindow(winParam, \"getWinSelection\").getSelection();\n        }\n\n        function getDocSelection(winParam) {\n            return getWindow(winParam, \"getDocSelection\").document.selection;\n        }\n\n        function winSelectionIsBackward(sel) {\n            var backward = false;\n            if (sel.anchorNode) {\n                backward = (dom.comparePoints(sel.anchorNode, sel.anchorOffset, sel.focusNode, sel.focusOffset) == 1);\n            }\n            return backward;\n        }\n\n        // Test for the Range/TextRange and Selection features required\n        // Test for ability to retrieve selection\n        var implementsWinGetSelection = isHostMethod(window, \"getSelection\"),\n            implementsDocSelection = util.isHostObject(document, \"selection\");\n\n        features.implementsWinGetSelection = implementsWinGetSelection;\n        features.implementsDocSelection = implementsDocSelection;\n\n        var useDocumentSelection = implementsDocSelection && (!implementsWinGetSelection || api.config.preferTextRange);\n\n        if (useDocumentSelection) {\n            getNativeSelection = getDocSelection;\n            api.isSelectionValid = function(winParam) {\n                var doc = getWindow(winParam, \"isSelectionValid\").document, nativeSel = doc.selection;\n\n                // Check whether the selection TextRange is actually contained within the correct document\n                return (nativeSel.type != \"None\" || getDocument(nativeSel.createRange().parentElement()) == doc);\n            };\n        } else if (implementsWinGetSelection) {\n            getNativeSelection = getWinSelection;\n            api.isSelectionValid = function() {\n                return true;\n            };\n        } else {\n            module.fail(\"Neither document.selection or window.getSelection() detected.\");\n            return false;\n        }\n\n        api.getNativeSelection = getNativeSelection;\n\n        var testSelection = getNativeSelection();\n\n        // In Firefox, the selection is null in an iframe with display: none. See issue #138.\n        if (!testSelection) {\n            module.fail(\"Native selection was null (possibly issue 138?)\");\n            return false;\n        }\n\n        var testRange = api.createNativeRange(document);\n        var body = getBody(document);\n\n        // Obtaining a range from a selection\n        var selectionHasAnchorAndFocus = util.areHostProperties(testSelection,\n            [\"anchorNode\", \"focusNode\", \"anchorOffset\", \"focusOffset\"]);\n\n        features.selectionHasAnchorAndFocus = selectionHasAnchorAndFocus;\n\n        // Test for existence of native selection extend() method\n        var selectionHasExtend = isHostMethod(testSelection, \"extend\");\n        features.selectionHasExtend = selectionHasExtend;\n\n        // Test for existence of native selection setBaseAndExtent() method\n        var selectionHasSetBaseAndExtent = isHostMethod(testSelection, \"setBaseAndExtent\");\n        features.selectionHasSetBaseAndExtent = selectionHasSetBaseAndExtent;\n\n        // Test if rangeCount exists\n        var selectionHasRangeCount = (typeof testSelection.rangeCount == NUMBER);\n        features.selectionHasRangeCount = selectionHasRangeCount;\n\n        var selectionSupportsMultipleRanges = false;\n        var collapsedNonEditableSelectionsSupported = true;\n\n        var addRangeBackwardToNative = selectionHasExtend ?\n            function(nativeSelection, range) {\n                var doc = DomRange.getRangeDocument(range);\n                var endRange = api.createRange(doc);\n                endRange.collapseToPoint(range.endContainer, range.endOffset);\n                nativeSelection.addRange(getNativeRange(endRange));\n                nativeSelection.extend(range.startContainer, range.startOffset);\n            } : null;\n\n        if (util.areHostMethods(testSelection, [\"addRange\", \"getRangeAt\", \"removeAllRanges\"]) &&\n                typeof testSelection.rangeCount == NUMBER && features.implementsDomRange) {\n\n            (function() {\n                // Previously an iframe was used but this caused problems in some circumstances in IE, so tests are\n                // performed on the current document's selection. See issue 109.\n\n                // Note also that if a selection previously existed, it is wiped and later restored by these tests. This\n                // will result in the selection direction being reversed if the original selection was backwards and the\n                // browser does not support setting backwards selections (Internet Explorer, I'm looking at you).\n                var sel = window.getSelection();\n                if (sel) {\n                    // Store the current selection\n                    var originalSelectionRangeCount = sel.rangeCount;\n                    var selectionHasMultipleRanges = (originalSelectionRangeCount > 1);\n                    var originalSelectionRanges = [];\n                    var originalSelectionBackward = winSelectionIsBackward(sel);\n                    for (var i = 0; i < originalSelectionRangeCount; ++i) {\n                        originalSelectionRanges[i] = sel.getRangeAt(i);\n                    }\n\n                    // Create some test elements\n                    var testEl = dom.createTestElement(document, \"\", false);\n                    var textNode = testEl.appendChild( document.createTextNode(\"\\u00a0\\u00a0\\u00a0\") );\n\n                    // Test whether the native selection will allow a collapsed selection within a non-editable element\n                    var r1 = document.createRange();\n\n                    r1.setStart(textNode, 1);\n                    r1.collapse(true);\n                    sel.removeAllRanges();\n                    sel.addRange(r1);\n                    collapsedNonEditableSelectionsSupported = (sel.rangeCount == 1);\n                    sel.removeAllRanges();\n\n                    // Test whether the native selection is capable of supporting multiple ranges.\n                    if (!selectionHasMultipleRanges) {\n                        // Doing the original feature test here in Chrome 36 (and presumably later versions) prints a\n                        // console error of \"Discontiguous selection is not supported.\" that cannot be suppressed. There's\n                        // nothing we can do about this while retaining the feature test so we have to resort to a browser\n                        // sniff. I'm not happy about it. See\n                        // https://code.google.com/p/chromium/issues/detail?id=399791\n                        var chromeMatch = window.navigator.appVersion.match(/Chrome\\/(.*?) /);\n                        if (chromeMatch && parseInt(chromeMatch[1]) >= 36) {\n                            selectionSupportsMultipleRanges = false;\n                        } else {\n                            var r2 = r1.cloneRange();\n                            r1.setStart(textNode, 0);\n                            r2.setEnd(textNode, 3);\n                            r2.setStart(textNode, 2);\n                            sel.addRange(r1);\n                            sel.addRange(r2);\n                            selectionSupportsMultipleRanges = (sel.rangeCount == 2);\n                        }\n                    }\n\n                    // Clean up\n                    dom.removeNode(testEl);\n                    sel.removeAllRanges();\n\n                    for (i = 0; i < originalSelectionRangeCount; ++i) {\n                        if (i == 0 && originalSelectionBackward) {\n                            if (addRangeBackwardToNative) {\n                                addRangeBackwardToNative(sel, originalSelectionRanges[i]);\n                            } else {\n                                api.warn(\"Rangy initialization: original selection was backwards but selection has been restored forwards because the browser does not support Selection.extend\");\n                                sel.addRange(originalSelectionRanges[i]);\n                            }\n                        } else {\n                            sel.addRange(originalSelectionRanges[i]);\n                        }\n                    }\n                }\n            })();\n        }\n\n        features.selectionSupportsMultipleRanges = selectionSupportsMultipleRanges;\n        features.collapsedNonEditableSelectionsSupported = collapsedNonEditableSelectionsSupported;\n\n        // ControlRanges\n        var implementsControlRange = false, testControlRange;\n\n        if (body && isHostMethod(body, \"createControlRange\")) {\n            testControlRange = body.createControlRange();\n            if (util.areHostProperties(testControlRange, [\"item\", \"add\"])) {\n                implementsControlRange = true;\n            }\n        }\n        features.implementsControlRange = implementsControlRange;\n\n        // Selection collapsedness\n        if (selectionHasAnchorAndFocus) {\n            selectionIsCollapsed = function(sel) {\n                return sel.anchorNode === sel.focusNode && sel.anchorOffset === sel.focusOffset;\n            };\n        } else {\n            selectionIsCollapsed = function(sel) {\n                return sel.rangeCount ? sel.getRangeAt(sel.rangeCount - 1).collapsed : false;\n            };\n        }\n\n        function updateAnchorAndFocusFromRange(sel, range, backward) {\n            var anchorPrefix = backward ? \"end\" : \"start\", focusPrefix = backward ? \"start\" : \"end\";\n            sel.anchorNode = range[anchorPrefix + \"Container\"];\n            sel.anchorOffset = range[anchorPrefix + \"Offset\"];\n            sel.focusNode = range[focusPrefix + \"Container\"];\n            sel.focusOffset = range[focusPrefix + \"Offset\"];\n        }\n\n        function updateAnchorAndFocusFromNativeSelection(sel) {\n            var nativeSel = sel.nativeSelection;\n            sel.anchorNode = nativeSel.anchorNode;\n            sel.anchorOffset = nativeSel.anchorOffset;\n            sel.focusNode = nativeSel.focusNode;\n            sel.focusOffset = nativeSel.focusOffset;\n        }\n\n        function updateEmptySelection(sel) {\n            sel.anchorNode = sel.focusNode = null;\n            sel.anchorOffset = sel.focusOffset = 0;\n            sel.rangeCount = 0;\n            sel.isCollapsed = true;\n            sel._ranges.length = 0;\n            updateType(sel);\n        }\n\n        function updateType(sel) {\n            sel.type = (sel.rangeCount == 0) ? \"None\" : (selectionIsCollapsed(sel) ? \"Caret\" : \"Range\");\n        }\n\n        function getNativeRange(range) {\n            var nativeRange;\n            if (range instanceof DomRange) {\n                nativeRange = api.createNativeRange(range.getDocument());\n                nativeRange.setEnd(range.endContainer, range.endOffset);\n                nativeRange.setStart(range.startContainer, range.startOffset);\n            } else if (range instanceof WrappedRange) {\n                nativeRange = range.nativeRange;\n            } else if (features.implementsDomRange && (range instanceof dom.getWindow(range.startContainer).Range)) {\n                nativeRange = range;\n            }\n            return nativeRange;\n        }\n\n        function rangeContainsSingleElement(rangeNodes) {\n            if (!rangeNodes.length || rangeNodes[0].nodeType != 1) {\n                return false;\n            }\n            for (var i = 1, len = rangeNodes.length; i < len; ++i) {\n                if (!dom.isAncestorOf(rangeNodes[0], rangeNodes[i])) {\n                    return false;\n                }\n            }\n            return true;\n        }\n\n        function getSingleElementFromRange(range) {\n            var nodes = range.getNodes();\n            if (!rangeContainsSingleElement(nodes)) {\n                throw module.createError(\"getSingleElementFromRange: range \" + range.inspect() + \" did not consist of a single element\");\n            }\n            return nodes[0];\n        }\n\n        // Simple, quick test which only needs to distinguish between a TextRange and a ControlRange\n        function isTextRange(range) {\n            return !!range && typeof range.text != \"undefined\";\n        }\n\n        function updateFromTextRange(sel, range) {\n            // Create a Range from the selected TextRange\n            var wrappedRange = new WrappedRange(range);\n            sel._ranges = [wrappedRange];\n\n            updateAnchorAndFocusFromRange(sel, wrappedRange, false);\n            sel.rangeCount = 1;\n            sel.isCollapsed = wrappedRange.collapsed;\n            updateType(sel);\n        }\n\n        function updateControlSelection(sel) {\n            // Update the wrapped selection based on what's now in the native selection\n            sel._ranges.length = 0;\n            if (sel.docSelection.type == \"None\") {\n                updateEmptySelection(sel);\n            } else {\n                var controlRange = sel.docSelection.createRange();\n                if (isTextRange(controlRange)) {\n                    // This case (where the selection type is \"Control\" and calling createRange() on the selection returns\n                    // a TextRange) can happen in IE 9. It happens, for example, when all elements in the selected\n                    // ControlRange have been removed from the ControlRange and removed from the document.\n                    updateFromTextRange(sel, controlRange);\n                } else {\n                    sel.rangeCount = controlRange.length;\n                    var range, doc = getDocument(controlRange.item(0));\n                    for (var i = 0; i < sel.rangeCount; ++i) {\n                        range = api.createRange(doc);\n                        range.selectNode(controlRange.item(i));\n                        sel._ranges.push(range);\n                    }\n                    sel.isCollapsed = sel.rangeCount == 1 && sel._ranges[0].collapsed;\n                    updateAnchorAndFocusFromRange(sel, sel._ranges[sel.rangeCount - 1], false);\n                    updateType(sel);\n                }\n            }\n        }\n\n        function addRangeToControlSelection(sel, range) {\n            var controlRange = sel.docSelection.createRange();\n            var rangeElement = getSingleElementFromRange(range);\n\n            // Create a new ControlRange containing all the elements in the selected ControlRange plus the element\n            // contained by the supplied range\n            var doc = getDocument(controlRange.item(0));\n            var newControlRange = getBody(doc).createControlRange();\n            for (var i = 0, len = controlRange.length; i < len; ++i) {\n                newControlRange.add(controlRange.item(i));\n            }\n            try {\n                newControlRange.add(rangeElement);\n            } catch (ex) {\n                throw module.createError(\"addRange(): Element within the specified Range could not be added to control selection (does it have layout?)\");\n            }\n            newControlRange.select();\n\n            // Update the wrapped selection based on what's now in the native selection\n            updateControlSelection(sel);\n        }\n\n        var getSelectionRangeAt;\n\n        if (isHostMethod(testSelection, \"getRangeAt\")) {\n            // try/catch is present because getRangeAt() must have thrown an error in some browser and some situation.\n            // Unfortunately, I didn't write a comment about the specifics and am now scared to take it out. Let that be a\n            // lesson to us all, especially me.\n            getSelectionRangeAt = function(sel, index) {\n                try {\n                    return sel.getRangeAt(index);\n                } catch (ex) {\n                    return null;\n                }\n            };\n        } else if (selectionHasAnchorAndFocus) {\n            getSelectionRangeAt = function(sel) {\n                var doc = getDocument(sel.anchorNode);\n                var range = api.createRange(doc);\n                range.setStartAndEnd(sel.anchorNode, sel.anchorOffset, sel.focusNode, sel.focusOffset);\n\n                // Handle the case when the selection was selected backwards (from the end to the start in the\n                // document)\n                if (range.collapsed !== this.isCollapsed) {\n                    range.setStartAndEnd(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset);\n                }\n\n                return range;\n            };\n        }\n\n        function WrappedSelection(selection, docSelection, win) {\n            this.nativeSelection = selection;\n            this.docSelection = docSelection;\n            this._ranges = [];\n            this.win = win;\n            this.refresh();\n        }\n\n        WrappedSelection.prototype = api.selectionPrototype;\n\n        function deleteProperties(sel) {\n            sel.win = sel.anchorNode = sel.focusNode = sel._ranges = null;\n            sel.rangeCount = sel.anchorOffset = sel.focusOffset = 0;\n            sel.detached = true;\n            updateType(sel);\n        }\n\n        var cachedRangySelections = [];\n\n        function actOnCachedSelection(win, action) {\n            var i = cachedRangySelections.length, cached, sel;\n            while (i--) {\n                cached = cachedRangySelections[i];\n                sel = cached.selection;\n                if (action == \"deleteAll\") {\n                    deleteProperties(sel);\n                } else if (cached.win == win) {\n                    if (action == \"delete\") {\n                        cachedRangySelections.splice(i, 1);\n                        return true;\n                    } else {\n                        return sel;\n                    }\n                }\n            }\n            if (action == \"deleteAll\") {\n                cachedRangySelections.length = 0;\n            }\n            return null;\n        }\n\n        var getSelection = function(win) {\n            // Check if the parameter is a Rangy Selection object\n            if (win && win instanceof WrappedSelection) {\n                win.refresh();\n                return win;\n            }\n\n            win = getWindow(win, \"getNativeSelection\");\n\n            var sel = actOnCachedSelection(win);\n            var nativeSel = getNativeSelection(win), docSel = implementsDocSelection ? getDocSelection(win) : null;\n            if (sel) {\n                sel.nativeSelection = nativeSel;\n                sel.docSelection = docSel;\n                sel.refresh();\n            } else {\n                sel = new WrappedSelection(nativeSel, docSel, win);\n                cachedRangySelections.push( { win: win, selection: sel } );\n            }\n            return sel;\n        };\n\n        api.getSelection = getSelection;\n\n        util.createAliasForDeprecatedMethod(api, \"getIframeSelection\", \"getSelection\");\n\n        var selProto = WrappedSelection.prototype;\n\n        function createControlSelection(sel, ranges) {\n            // Ensure that the selection becomes of type \"Control\"\n            var doc = getDocument(ranges[0].startContainer);\n            var controlRange = getBody(doc).createControlRange();\n            for (var i = 0, el, len = ranges.length; i < len; ++i) {\n                el = getSingleElementFromRange(ranges[i]);\n                try {\n                    controlRange.add(el);\n                } catch (ex) {\n                    throw module.createError(\"setRanges(): Element within one of the specified Ranges could not be added to control selection (does it have layout?)\");\n                }\n            }\n            controlRange.select();\n\n            // Update the wrapped selection based on what's now in the native selection\n            updateControlSelection(sel);\n        }\n\n        // Selecting a range\n        if (!useDocumentSelection && selectionHasAnchorAndFocus && util.areHostMethods(testSelection, [\"removeAllRanges\", \"addRange\"])) {\n            selProto.removeAllRanges = function() {\n                this.nativeSelection.removeAllRanges();\n                updateEmptySelection(this);\n            };\n\n            var addRangeBackward = function(sel, range) {\n                addRangeBackwardToNative(sel.nativeSelection, range);\n                sel.refresh();\n            };\n\n            if (selectionHasRangeCount) {\n                selProto.addRange = function(range, direction) {\n                    if (implementsControlRange && implementsDocSelection && this.docSelection.type == CONTROL) {\n                        addRangeToControlSelection(this, range);\n                    } else {\n                        if (isDirectionBackward(direction) && selectionHasExtend) {\n                            addRangeBackward(this, range);\n                        } else {\n                            var previousRangeCount;\n                            if (selectionSupportsMultipleRanges) {\n                                previousRangeCount = this.rangeCount;\n                            } else {\n                                this.removeAllRanges();\n                                previousRangeCount = 0;\n                            }\n                            // Clone the native range so that changing the selected range does not affect the selection.\n                            // This is contrary to the spec but is the only way to achieve consistency between browsers. See\n                            // issue 80.\n                            var clonedNativeRange = getNativeRange(range).cloneRange();\n                            try {\n                                this.nativeSelection.addRange(clonedNativeRange);\n                            } catch (ex) {\n                            }\n\n                            // Check whether adding the range was successful\n                            this.rangeCount = this.nativeSelection.rangeCount;\n\n                            if (this.rangeCount == previousRangeCount + 1) {\n                                // The range was added successfully\n\n                                // Check whether the range that we added to the selection is reflected in the last range extracted from\n                                // the selection\n                                if (api.config.checkSelectionRanges) {\n                                    var nativeRange = getSelectionRangeAt(this.nativeSelection, this.rangeCount - 1);\n                                    if (nativeRange && !rangesEqual(nativeRange, range)) {\n                                        // Happens in WebKit with, for example, a selection placed at the start of a text node\n                                        range = new WrappedRange(nativeRange);\n                                    }\n                                }\n                                this._ranges[this.rangeCount - 1] = range;\n                                updateAnchorAndFocusFromRange(this, range, selectionIsBackward(this.nativeSelection));\n                                this.isCollapsed = selectionIsCollapsed(this);\n                                updateType(this);\n                            } else {\n                                // The range was not added successfully. The simplest thing is to refresh\n                                this.refresh();\n                            }\n                        }\n                    }\n                };\n            } else {\n                selProto.addRange = function(range, direction) {\n                    if (isDirectionBackward(direction) && selectionHasExtend) {\n                        addRangeBackward(this, range);\n                    } else {\n                        this.nativeSelection.addRange(getNativeRange(range));\n                        this.refresh();\n                    }\n                };\n            }\n\n            selProto.setRanges = function(ranges) {\n                if (implementsControlRange && implementsDocSelection && ranges.length > 1) {\n                    createControlSelection(this, ranges);\n                } else {\n                    this.removeAllRanges();\n                    for (var i = 0, len = ranges.length; i < len; ++i) {\n                        this.addRange(ranges[i]);\n                    }\n                }\n            };\n        } else if (isHostMethod(testSelection, \"empty\") && isHostMethod(testRange, \"select\") &&\n                   implementsControlRange && useDocumentSelection) {\n\n            selProto.removeAllRanges = function() {\n                // Added try/catch as fix for issue #21\n                try {\n                    this.docSelection.empty();\n\n                    // Check for empty() not working (issue #24)\n                    if (this.docSelection.type != \"None\") {\n                        // Work around failure to empty a control selection by instead selecting a TextRange and then\n                        // calling empty()\n                        var doc;\n                        if (this.anchorNode) {\n                            doc = getDocument(this.anchorNode);\n                        } else if (this.docSelection.type == CONTROL) {\n                            var controlRange = this.docSelection.createRange();\n                            if (controlRange.length) {\n                                doc = getDocument( controlRange.item(0) );\n                            }\n                        }\n                        if (doc) {\n                            var textRange = getBody(doc).createTextRange();\n                            textRange.select();\n                            this.docSelection.empty();\n                        }\n                    }\n                } catch(ex) {}\n                updateEmptySelection(this);\n            };\n\n            selProto.addRange = function(range) {\n                if (this.docSelection.type == CONTROL) {\n                    addRangeToControlSelection(this, range);\n                } else {\n                    api.WrappedTextRange.rangeToTextRange(range).select();\n                    this._ranges[0] = range;\n                    this.rangeCount = 1;\n                    this.isCollapsed = this._ranges[0].collapsed;\n                    updateAnchorAndFocusFromRange(this, range, false);\n                    updateType(this);\n                }\n            };\n\n            selProto.setRanges = function(ranges) {\n                this.removeAllRanges();\n                var rangeCount = ranges.length;\n                if (rangeCount > 1) {\n                    createControlSelection(this, ranges);\n                } else if (rangeCount) {\n                    this.addRange(ranges[0]);\n                }\n            };\n        } else {\n            module.fail(\"No means of selecting a Range or TextRange was found\");\n            return false;\n        }\n\n        selProto.getRangeAt = function(index) {\n            if (index < 0 || index >= this.rangeCount) {\n                throw new DOMException(\"INDEX_SIZE_ERR\");\n            } else {\n                // Clone the range to preserve selection-range independence. See issue 80.\n                return this._ranges[index].cloneRange();\n            }\n        };\n\n        var refreshSelection;\n\n        if (useDocumentSelection) {\n            refreshSelection = function(sel) {\n                var range;\n                if (api.isSelectionValid(sel.win)) {\n                    range = sel.docSelection.createRange();\n                } else {\n                    range = getBody(sel.win.document).createTextRange();\n                    range.collapse(true);\n                }\n\n                if (sel.docSelection.type == CONTROL) {\n                    updateControlSelection(sel);\n                } else if (isTextRange(range)) {\n                    updateFromTextRange(sel, range);\n                } else {\n                    updateEmptySelection(sel);\n                }\n            };\n        } else if (isHostMethod(testSelection, \"getRangeAt\") && typeof testSelection.rangeCount == NUMBER) {\n            refreshSelection = function(sel) {\n                if (implementsControlRange && implementsDocSelection && sel.docSelection.type == CONTROL) {\n                    updateControlSelection(sel);\n                } else {\n                    sel._ranges.length = sel.rangeCount = sel.nativeSelection.rangeCount;\n                    if (sel.rangeCount) {\n                        for (var i = 0, len = sel.rangeCount; i < len; ++i) {\n                            sel._ranges[i] = new api.WrappedRange(sel.nativeSelection.getRangeAt(i));\n                        }\n                        updateAnchorAndFocusFromRange(sel, sel._ranges[sel.rangeCount - 1], selectionIsBackward(sel.nativeSelection));\n                        sel.isCollapsed = selectionIsCollapsed(sel);\n                        updateType(sel);\n                    } else {\n                        updateEmptySelection(sel);\n                    }\n                }\n            };\n        } else if (selectionHasAnchorAndFocus && typeof testSelection.isCollapsed == BOOLEAN && typeof testRange.collapsed == BOOLEAN && features.implementsDomRange) {\n            refreshSelection = function(sel) {\n                var range, nativeSel = sel.nativeSelection;\n                if (nativeSel.anchorNode) {\n                    range = getSelectionRangeAt(nativeSel, 0);\n                    sel._ranges = [range];\n                    sel.rangeCount = 1;\n                    updateAnchorAndFocusFromNativeSelection(sel);\n                    sel.isCollapsed = selectionIsCollapsed(sel);\n                    updateType(sel);\n                } else {\n                    updateEmptySelection(sel);\n                }\n            };\n        } else {\n            module.fail(\"No means of obtaining a Range or TextRange from the user's selection was found\");\n            return false;\n        }\n\n        selProto.refresh = function(checkForChanges) {\n            var oldRanges = checkForChanges ? this._ranges.slice(0) : null;\n            var oldAnchorNode = this.anchorNode, oldAnchorOffset = this.anchorOffset;\n\n            refreshSelection(this);\n            if (checkForChanges) {\n                // Check the range count first\n                var i = oldRanges.length;\n                if (i != this._ranges.length) {\n                    return true;\n                }\n\n                // Now check the direction. Checking the anchor position is the same is enough since we're checking all the\n                // ranges after this\n                if (this.anchorNode != oldAnchorNode || this.anchorOffset != oldAnchorOffset) {\n                    return true;\n                }\n\n                // Finally, compare each range in turn\n                while (i--) {\n                    if (!rangesEqual(oldRanges[i], this._ranges[i])) {\n                        return true;\n                    }\n                }\n                return false;\n            }\n        };\n\n        // Removal of a single range\n        var removeRangeManually = function(sel, range) {\n            var ranges = sel.getAllRanges();\n            sel.removeAllRanges();\n            for (var i = 0, len = ranges.length; i < len; ++i) {\n                if (!rangesEqual(range, ranges[i])) {\n                    sel.addRange(ranges[i]);\n                }\n            }\n            if (!sel.rangeCount) {\n                updateEmptySelection(sel);\n            }\n        };\n\n        if (implementsControlRange && implementsDocSelection) {\n            selProto.removeRange = function(range) {\n                if (this.docSelection.type == CONTROL) {\n                    var controlRange = this.docSelection.createRange();\n                    var rangeElement = getSingleElementFromRange(range);\n\n                    // Create a new ControlRange containing all the elements in the selected ControlRange minus the\n                    // element contained by the supplied range\n                    var doc = getDocument(controlRange.item(0));\n                    var newControlRange = getBody(doc).createControlRange();\n                    var el, removed = false;\n                    for (var i = 0, len = controlRange.length; i < len; ++i) {\n                        el = controlRange.item(i);\n                        if (el !== rangeElement || removed) {\n                            newControlRange.add(controlRange.item(i));\n                        } else {\n                            removed = true;\n                        }\n                    }\n                    newControlRange.select();\n\n                    // Update the wrapped selection based on what's now in the native selection\n                    updateControlSelection(this);\n                } else {\n                    removeRangeManually(this, range);\n                }\n            };\n        } else {\n            selProto.removeRange = function(range) {\n                removeRangeManually(this, range);\n            };\n        }\n\n        // Detecting if a selection is backward\n        var selectionIsBackward;\n        if (!useDocumentSelection && selectionHasAnchorAndFocus && features.implementsDomRange) {\n            selectionIsBackward = winSelectionIsBackward;\n\n            selProto.isBackward = function() {\n                return selectionIsBackward(this);\n            };\n        } else {\n            selectionIsBackward = selProto.isBackward = function() {\n                return false;\n            };\n        }\n\n        // Create an alias for backwards compatibility. From 1.3, everything is \"backward\" rather than \"backwards\"\n        selProto.isBackwards = selProto.isBackward;\n\n        // Selection stringifier\n        // This is conformant to the old HTML5 selections draft spec but differs from WebKit and Mozilla's implementation.\n        // The current spec does not yet define this method.\n        selProto.toString = function() {\n            var rangeTexts = [];\n            for (var i = 0, len = this.rangeCount; i < len; ++i) {\n                rangeTexts[i] = \"\" + this._ranges[i];\n            }\n            return rangeTexts.join(\"\");\n        };\n\n        function assertNodeInSameDocument(sel, node) {\n            if (sel.win.document != getDocument(node)) {\n                throw new DOMException(\"WRONG_DOCUMENT_ERR\");\n            }\n        }\n\n        function assertValidOffset(node, offset) {\n            if (offset < 0 || offset > (dom.isCharacterDataNode(node) ? node.length : node.childNodes.length)) {\n                throw new DOMException(\"INDEX_SIZE_ERR\");\n            }\n        }\n\n        // No current browser conforms fully to the spec for this method, so Rangy's own method is always used\n        selProto.collapse = function(node, offset) {\n            assertNodeInSameDocument(this, node);\n            var range = api.createRange(node);\n            range.collapseToPoint(node, offset);\n            this.setSingleRange(range);\n            this.isCollapsed = true;\n        };\n\n        selProto.collapseToStart = function() {\n            if (this.rangeCount) {\n                var range = this._ranges[0];\n                this.collapse(range.startContainer, range.startOffset);\n            } else {\n                throw new DOMException(\"INVALID_STATE_ERR\");\n            }\n        };\n\n        selProto.collapseToEnd = function() {\n            if (this.rangeCount) {\n                var range = this._ranges[this.rangeCount - 1];\n                this.collapse(range.endContainer, range.endOffset);\n            } else {\n                throw new DOMException(\"INVALID_STATE_ERR\");\n            }\n        };\n\n        // The spec is very specific on how selectAllChildren should be implemented and not all browsers implement it as\n        // specified so the native implementation is never used by Rangy.\n        selProto.selectAllChildren = function(node) {\n            assertNodeInSameDocument(this, node);\n            var range = api.createRange(node);\n            range.selectNodeContents(node);\n            this.setSingleRange(range);\n        };\n\n        if (selectionHasSetBaseAndExtent) {\n            selProto.setBaseAndExtent = function(anchorNode, anchorOffset, focusNode, focusOffset) {\n                this.nativeSelection.setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset);\n                this.refresh();\n            };\n        } else if (selectionHasExtend) {\n            selProto.setBaseAndExtent = function(anchorNode, anchorOffset, focusNode, focusOffset) {\n                assertValidOffset(anchorNode, anchorOffset);\n                assertValidOffset(focusNode, focusOffset);\n                assertNodeInSameDocument(this, anchorNode);\n                assertNodeInSameDocument(this, focusNode);\n                var range = api.createRange(node);\n                var isBackwards = (dom.comparePoints(anchorNode, anchorOffset, focusNode, focusOffset) == -1);\n                if (isBackwards) {\n                    range.setStartAndEnd(focusNode, focusOffset, anchorNode, anchorOffset);\n                } else {\n                    range.setStartAndEnd(anchorNode, anchorOffset, focusNode, focusOffset);\n                }\n                this.setSingleRange(range, isBackwards);\n            };\n        }\n\n        selProto.deleteFromDocument = function() {\n            // Sepcial behaviour required for IE's control selections\n            if (implementsControlRange && implementsDocSelection && this.docSelection.type == CONTROL) {\n                var controlRange = this.docSelection.createRange();\n                var element;\n                while (controlRange.length) {\n                    element = controlRange.item(0);\n                    controlRange.remove(element);\n                    dom.removeNode(element);\n                }\n                this.refresh();\n            } else if (this.rangeCount) {\n                var ranges = this.getAllRanges();\n                if (ranges.length) {\n                    this.removeAllRanges();\n                    for (var i = 0, len = ranges.length; i < len; ++i) {\n                        ranges[i].deleteContents();\n                    }\n                    // The spec says nothing about what the selection should contain after calling deleteContents on each\n                    // range. Firefox moves the selection to where the final selected range was, so we emulate that\n                    this.addRange(ranges[len - 1]);\n                }\n            }\n        };\n\n        // The following are non-standard extensions\n        selProto.eachRange = function(func, returnValue) {\n            for (var i = 0, len = this._ranges.length; i < len; ++i) {\n                if ( func( this.getRangeAt(i) ) ) {\n                    return returnValue;\n                }\n            }\n        };\n\n        selProto.getAllRanges = function() {\n            var ranges = [];\n            this.eachRange(function(range) {\n                ranges.push(range);\n            });\n            return ranges;\n        };\n\n        selProto.setSingleRange = function(range, direction) {\n            this.removeAllRanges();\n            this.addRange(range, direction);\n        };\n\n        selProto.callMethodOnEachRange = function(methodName, params) {\n            var results = [];\n            this.eachRange( function(range) {\n                results.push( range[methodName].apply(range, params || []) );\n            } );\n            return results;\n        };\n\n        function createStartOrEndSetter(isStart) {\n            return function(node, offset) {\n                var range;\n                if (this.rangeCount) {\n                    range = this.getRangeAt(0);\n                    range[\"set\" + (isStart ? \"Start\" : \"End\")](node, offset);\n                } else {\n                    range = api.createRange(this.win.document);\n                    range.setStartAndEnd(node, offset);\n                }\n                this.setSingleRange(range, this.isBackward());\n            };\n        }\n\n        selProto.setStart = createStartOrEndSetter(true);\n        selProto.setEnd = createStartOrEndSetter(false);\n\n        // Add select() method to Range prototype. Any existing selection will be removed.\n        api.rangePrototype.select = function(direction) {\n            getSelection( this.getDocument() ).setSingleRange(this, direction);\n        };\n\n        selProto.changeEachRange = function(func) {\n            var ranges = [];\n            var backward = this.isBackward();\n\n            this.eachRange(function(range) {\n                func(range);\n                ranges.push(range);\n            });\n\n            this.removeAllRanges();\n            if (backward && ranges.length == 1) {\n                this.addRange(ranges[0], \"backward\");\n            } else {\n                this.setRanges(ranges);\n            }\n        };\n\n        selProto.containsNode = function(node, allowPartial) {\n            return this.eachRange( function(range) {\n                return range.containsNode(node, allowPartial);\n            }, true ) || false;\n        };\n\n        selProto.getBookmark = function(containerNode) {\n            return {\n                backward: this.isBackward(),\n                rangeBookmarks: this.callMethodOnEachRange(\"getBookmark\", [containerNode])\n            };\n        };\n\n        selProto.moveToBookmark = function(bookmark) {\n            var selRanges = [];\n            for (var i = 0, rangeBookmark, range; rangeBookmark = bookmark.rangeBookmarks[i++]; ) {\n                range = api.createRange(this.win);\n                range.moveToBookmark(rangeBookmark);\n                selRanges.push(range);\n            }\n            if (bookmark.backward) {\n                this.setSingleRange(selRanges[0], \"backward\");\n            } else {\n                this.setRanges(selRanges);\n            }\n        };\n\n        selProto.saveRanges = function() {\n            return {\n                backward: this.isBackward(),\n                ranges: this.callMethodOnEachRange(\"cloneRange\")\n            };\n        };\n\n        selProto.restoreRanges = function(selRanges) {\n            this.removeAllRanges();\n            for (var i = 0, range; range = selRanges.ranges[i]; ++i) {\n                this.addRange(range, (selRanges.backward && i == 0));\n            }\n        };\n\n        selProto.toHtml = function() {\n            var rangeHtmls = [];\n            this.eachRange(function(range) {\n                rangeHtmls.push( DomRange.toHtml(range) );\n            });\n            return rangeHtmls.join(\"\");\n        };\n\n        if (features.implementsTextRange) {\n            selProto.getNativeTextRange = function() {\n                var sel, textRange;\n                if ( (sel = this.docSelection) ) {\n                    var range = sel.createRange();\n                    if (isTextRange(range)) {\n                        return range;\n                    } else {\n                        throw module.createError(\"getNativeTextRange: selection is a control selection\");\n                    }\n                } else if (this.rangeCount > 0) {\n                    return api.WrappedTextRange.rangeToTextRange( this.getRangeAt(0) );\n                } else {\n                    throw module.createError(\"getNativeTextRange: selection contains no range\");\n                }\n            };\n        }\n\n        function inspect(sel) {\n            var rangeInspects = [];\n            var anchor = new DomPosition(sel.anchorNode, sel.anchorOffset);\n            var focus = new DomPosition(sel.focusNode, sel.focusOffset);\n            var name = (typeof sel.getName == \"function\") ? sel.getName() : \"Selection\";\n\n            if (typeof sel.rangeCount != \"undefined\") {\n                for (var i = 0, len = sel.rangeCount; i < len; ++i) {\n                    rangeInspects[i] = DomRange.inspect(sel.getRangeAt(i));\n                }\n            }\n            return \"[\" + name + \"(Ranges: \" + rangeInspects.join(\", \") +\n                    \")(anchor: \" + anchor.inspect() + \", focus: \" + focus.inspect() + \"]\";\n        }\n\n        selProto.getName = function() {\n            return \"WrappedSelection\";\n        };\n\n        selProto.inspect = function() {\n            return inspect(this);\n        };\n\n        selProto.detach = function() {\n            actOnCachedSelection(this.win, \"delete\");\n            deleteProperties(this);\n        };\n\n        WrappedSelection.detachAll = function() {\n            actOnCachedSelection(null, \"deleteAll\");\n        };\n\n        WrappedSelection.inspect = inspect;\n        WrappedSelection.isDirectionBackward = isDirectionBackward;\n\n        api.Selection = WrappedSelection;\n\n        api.selectionPrototype = selProto;\n\n        api.addShimListener(function(win) {\n            if (typeof win.getSelection == \"undefined\") {\n                win.getSelection = function() {\n                    return getSelection(win);\n                };\n            }\n            win = null;\n        });\n    });\n    \n\n    /*----------------------------------------------------------------------------------------------------------------*/\n\n    // Wait for document to load before initializing\n    var docReady = false;\n\n    var loadHandler = function(e) {\n        if (!docReady) {\n            docReady = true;\n            if (!api.initialized && api.config.autoInitialize) {\n                init();\n            }\n        }\n    };\n\n    if (isBrowser) {\n        // Test whether the document has already been loaded and initialize immediately if so\n        if (document.readyState == \"complete\") {\n            loadHandler();\n        } else {\n            if (isHostMethod(document, \"addEventListener\")) {\n                document.addEventListener(\"DOMContentLoaded\", loadHandler, false);\n            }\n\n            // Add a fallback in case the DOMContentLoaded event isn't supported\n            addListener(window, \"load\", loadHandler);\n        }\n    }\n\n    return api;\n}, this);","/**\n * Class Applier module for Rangy.\n * Adds, removes and toggles classes on Ranges and Selections\n *\n * Part of Rangy, a cross-browser JavaScript range and selection library\n * https://github.com/timdown/rangy\n *\n * Depends on Rangy core.\n *\n * Copyright 2024, Tim Down\n * Licensed under the MIT license.\n * Version: 1.3.2\n * Build date: 2 November 2024\n */\n(function(factory, root) {\n    if (typeof define == \"function\" && define.amd) {\n        // AMD. Register as an anonymous module with a dependency on Rangy.\n        define([\"./rangy-core\"], factory);\n    } else if (typeof module != \"undefined\" && typeof exports == \"object\") {\n        // Node/CommonJS style\n        module.exports = factory( require(\"rangy\") );\n    } else {\n        // No AMD or CommonJS support so we use the rangy property of root (probably the global variable)\n        factory(root.rangy);\n    }\n})(function(rangy) {\n    rangy.createModule(\"ClassApplier\", [\"WrappedSelection\"], function(api, module) {\n        var dom = api.dom;\n        var DomPosition = dom.DomPosition;\n        var contains = dom.arrayContains;\n        var util = api.util;\n        var forEach = util.forEach;\n\n\n        var defaultTagName = \"span\";\n        var createElementNSSupported = util.isHostMethod(document, \"createElementNS\");\n\n        function each(obj, func) {\n            for (var i in obj) {\n                if (obj.hasOwnProperty(i)) {\n                    if (func(i, obj[i]) === false) {\n                        return false;\n                    }\n                }\n            }\n            return true;\n        }\n\n        function trim(str) {\n            return str.replace(/^\\s\\s*/, \"\").replace(/\\s\\s*$/, \"\");\n        }\n\n        function classNameContainsClass(fullClassName, className) {\n            return !!fullClassName && new RegExp(\"(?:^|\\\\s)\" + className + \"(?:\\\\s|$)\").test(fullClassName);\n        }\n\n        // Inefficient, inelegant nonsense for IE's svg element, which has no classList and non-HTML className implementation\n        function hasClass(el, className) {\n            if (typeof el.classList == \"object\") {\n                return el.classList.contains(className);\n            } else {\n                var classNameSupported = (typeof el.className == \"string\");\n                var elClass = classNameSupported ? el.className : el.getAttribute(\"class\");\n                return classNameContainsClass(elClass, className);\n            }\n        }\n\n        function addClass(el, className) {\n            if (typeof el.classList == \"object\") {\n                el.classList.add(className);\n            } else {\n                var classNameSupported = (typeof el.className == \"string\");\n                var elClass = classNameSupported ? el.className : el.getAttribute(\"class\");\n                if (elClass) {\n                    if (!classNameContainsClass(elClass, className)) {\n                        elClass += \" \" + className;\n                    }\n                } else {\n                    elClass = className;\n                }\n                if (classNameSupported) {\n                    el.className = elClass;\n                } else {\n                    el.setAttribute(\"class\", elClass);\n                }\n            }\n        }\n\n        var removeClass = (function() {\n            function replacer(matched, whiteSpaceBefore, whiteSpaceAfter) {\n                return (whiteSpaceBefore && whiteSpaceAfter) ? \" \" : \"\";\n            }\n\n            return function(el, className) {\n                if (typeof el.classList == \"object\") {\n                    el.classList.remove(className);\n                } else {\n                    var classNameSupported = (typeof el.className == \"string\");\n                    var elClass = classNameSupported ? el.className : el.getAttribute(\"class\");\n                    elClass = elClass.replace(new RegExp(\"(^|\\\\s)\" + className + \"(\\\\s|$)\"), replacer);\n                    if (classNameSupported) {\n                        el.className = elClass;\n                    } else {\n                        el.setAttribute(\"class\", elClass);\n                    }\n                }\n            };\n        })();\n\n        function getClass(el) {\n            var classNameSupported = (typeof el.className == \"string\");\n            return classNameSupported ? el.className : el.getAttribute(\"class\");\n        }\n\n        function sortClassName(className) {\n            return className && className.split(/\\s+/).sort().join(\" \");\n        }\n\n        function getSortedClassName(el) {\n            return sortClassName( getClass(el) );\n        }\n\n        function haveSameClasses(el1, el2) {\n            return getSortedClassName(el1) == getSortedClassName(el2);\n        }\n\n        function hasAllClasses(el, className) {\n            var classes = className.split(/\\s+/);\n            for (var i = 0, len = classes.length; i < len; ++i) {\n                if (!hasClass(el, trim(classes[i]))) {\n                    return false;\n                }\n            }\n            return true;\n        }\n\n        function canTextBeStyled(textNode) {\n            var parent = textNode.parentNode;\n            return (parent && parent.nodeType == 1 && !/^(textarea|style|script|select|iframe)$/i.test(parent.nodeName));\n        }\n\n        function movePosition(position, oldParent, oldIndex, newParent, newIndex) {\n            var posNode = position.node, posOffset = position.offset;\n            var newNode = posNode, newOffset = posOffset;\n\n            if (posNode == newParent && posOffset > newIndex) {\n                ++newOffset;\n            }\n\n            if (posNode == oldParent && (posOffset == oldIndex  || posOffset == oldIndex + 1)) {\n                newNode = newParent;\n                newOffset += newIndex - oldIndex;\n            }\n\n            if (posNode == oldParent && posOffset > oldIndex + 1) {\n                --newOffset;\n            }\n\n            position.node = newNode;\n            position.offset = newOffset;\n        }\n\n        function movePositionWhenRemovingNode(position, parentNode, index) {\n            if (position.node == parentNode && position.offset > index) {\n                --position.offset;\n            }\n        }\n\n        function movePreservingPositions(node, newParent, newIndex, positionsToPreserve) {\n            // For convenience, allow newIndex to be -1 to mean \"insert at the end\".\n            if (newIndex == -1) {\n                newIndex = newParent.childNodes.length;\n            }\n\n            var oldParent = node.parentNode;\n            var oldIndex = dom.getNodeIndex(node);\n\n            forEach(positionsToPreserve, function(position) {\n                movePosition(position, oldParent, oldIndex, newParent, newIndex);\n            });\n\n            // Now actually move the node.\n            if (newParent.childNodes.length == newIndex) {\n                newParent.appendChild(node);\n            } else {\n                newParent.insertBefore(node, newParent.childNodes[newIndex]);\n            }\n        }\n\n        function removePreservingPositions(node, positionsToPreserve) {\n\n            var oldParent = node.parentNode;\n            var oldIndex = dom.getNodeIndex(node);\n\n            forEach(positionsToPreserve, function(position) {\n                movePositionWhenRemovingNode(position, oldParent, oldIndex);\n            });\n\n            dom.removeNode(node);\n        }\n\n        function moveChildrenPreservingPositions(node, newParent, newIndex, removeNode, positionsToPreserve) {\n            var child, children = [];\n            while ( (child = node.firstChild) ) {\n                movePreservingPositions(child, newParent, newIndex++, positionsToPreserve);\n                children.push(child);\n            }\n            if (removeNode) {\n                removePreservingPositions(node, positionsToPreserve);\n            }\n            return children;\n        }\n\n        function replaceWithOwnChildrenPreservingPositions(element, positionsToPreserve) {\n            return moveChildrenPreservingPositions(element, element.parentNode, dom.getNodeIndex(element), true, positionsToPreserve);\n        }\n\n        function rangeSelectsAnyText(range, textNode) {\n            var textNodeRange = range.cloneRange();\n            textNodeRange.selectNodeContents(textNode);\n\n            var intersectionRange = textNodeRange.intersection(range);\n            var text = intersectionRange ? intersectionRange.toString() : \"\";\n\n            return text != \"\";\n        }\n\n        function getEffectiveTextNodes(range) {\n            var nodes = range.getNodes([3]);\n\n            // Optimization as per issue 145\n\n            // Remove non-intersecting text nodes from the start of the range\n            var start = 0, node;\n            while ( (node = nodes[start]) && !rangeSelectsAnyText(range, node) ) {\n                ++start;\n            }\n\n            // Remove non-intersecting text nodes from the start of the range\n            var end = nodes.length - 1;\n            while ( (node = nodes[end]) && !rangeSelectsAnyText(range, node) ) {\n                --end;\n            }\n\n            return nodes.slice(start, end + 1);\n        }\n\n        function elementsHaveSameNonClassAttributes(el1, el2) {\n            if (el1.attributes.length != el2.attributes.length) return false;\n            for (var i = 0, len = el1.attributes.length, attr1, attr2, name; i < len; ++i) {\n                attr1 = el1.attributes[i];\n                name = attr1.name;\n                if (name != \"class\") {\n                    attr2 = el2.attributes.getNamedItem(name);\n                    if ( (attr1 === null) != (attr2 === null) ) return false;\n                    if (attr1.specified != attr2.specified) return false;\n                    if (attr1.specified && attr1.nodeValue !== attr2.nodeValue) return false;\n                }\n            }\n            return true;\n        }\n\n        function elementHasNonClassAttributes(el, exceptions) {\n            for (var i = 0, len = el.attributes.length, attrName; i < len; ++i) {\n                attrName = el.attributes[i].name;\n                if ( !(exceptions && contains(exceptions, attrName)) && el.attributes[i].specified && attrName != \"class\") {\n                    return true;\n                }\n            }\n            return false;\n        }\n\n        var getComputedStyleProperty = dom.getComputedStyleProperty;\n        var isEditableElement = (function() {\n            var testEl = document.createElement(\"div\");\n            return typeof testEl.isContentEditable == \"boolean\" ?\n                function (node) {\n                    return node && node.nodeType == 1 && node.isContentEditable;\n                } :\n                function (node) {\n                    if (!node || node.nodeType != 1 || node.contentEditable == \"false\") {\n                        return false;\n                    }\n                    return node.contentEditable == \"true\" || isEditableElement(node.parentNode);\n                };\n        })();\n\n        function isEditingHost(node) {\n            var parent;\n            return node && node.nodeType == 1 &&\n                (( (parent = node.parentNode) && parent.nodeType == 9 && parent.designMode == \"on\") ||\n                (isEditableElement(node) && !isEditableElement(node.parentNode)));\n        }\n\n        function isEditable(node) {\n            return (isEditableElement(node) || (node.nodeType != 1 && isEditableElement(node.parentNode))) && !isEditingHost(node);\n        }\n\n        var inlineDisplayRegex = /^inline(-block|-table)?$/i;\n\n        function isNonInlineElement(node) {\n            return node && node.nodeType == 1 && !inlineDisplayRegex.test(getComputedStyleProperty(node, \"display\"));\n        }\n\n        // White space characters as defined by HTML 4 (http://www.w3.org/TR/html401/struct/text.html)\n        var htmlNonWhiteSpaceRegex = /[^\\r\\n\\t\\f \\u200B]/;\n\n        function isUnrenderedWhiteSpaceNode(node) {\n            if (node.data.length == 0) {\n                return true;\n            }\n            if (htmlNonWhiteSpaceRegex.test(node.data)) {\n                return false;\n            }\n            var cssWhiteSpace = getComputedStyleProperty(node.parentNode, \"whiteSpace\");\n            switch (cssWhiteSpace) {\n                case \"pre\":\n                case \"pre-wrap\":\n                case \"-moz-pre-wrap\":\n                    return false;\n                case \"pre-line\":\n                    if (/[\\r\\n]/.test(node.data)) {\n                        return false;\n                    }\n            }\n\n            // We now have a whitespace-only text node that may be rendered depending on its context. If it is adjacent to a\n            // non-inline element, it will not be rendered. This seems to be a good enough definition.\n            return isNonInlineElement(node.previousSibling) || isNonInlineElement(node.nextSibling);\n        }\n\n        function getRangeBoundaries(ranges) {\n            var positions = [], i, range;\n            for (i = 0; range = ranges[i++]; ) {\n                positions.push(\n                    new DomPosition(range.startContainer, range.startOffset),\n                    new DomPosition(range.endContainer, range.endOffset)\n                );\n            }\n            return positions;\n        }\n\n        function updateRangesFromBoundaries(ranges, positions) {\n            for (var i = 0, range, start, end, len = ranges.length; i < len; ++i) {\n                range = ranges[i];\n                start = positions[i * 2];\n                end = positions[i * 2 + 1];\n                range.setStartAndEnd(start.node, start.offset, end.node, end.offset);\n            }\n        }\n\n        function isSplitPoint(node, offset) {\n            if (dom.isCharacterDataNode(node)) {\n                if (offset == 0) {\n                    return !!node.previousSibling;\n                } else if (offset == node.length) {\n                    return !!node.nextSibling;\n                } else {\n                    return true;\n                }\n            }\n\n            return offset > 0 && offset < node.childNodes.length;\n        }\n\n        function splitNodeAt(node, descendantNode, descendantOffset, positionsToPreserve) {\n            var newNode, parentNode;\n            var splitAtStart = (descendantOffset == 0);\n\n            if (dom.isAncestorOf(descendantNode, node)) {\n                return node;\n            }\n\n            if (dom.isCharacterDataNode(descendantNode)) {\n                var descendantIndex = dom.getNodeIndex(descendantNode);\n                if (descendantOffset == 0) {\n                    descendantOffset = descendantIndex;\n                } else if (descendantOffset == descendantNode.length) {\n                    descendantOffset = descendantIndex + 1;\n                } else {\n                    throw module.createError(\"splitNodeAt() should not be called with offset in the middle of a data node (\" +\n                        descendantOffset + \" in \" + descendantNode.data);\n                }\n                descendantNode = descendantNode.parentNode;\n            }\n\n            if (isSplitPoint(descendantNode, descendantOffset)) {\n                // descendantNode is now guaranteed not to be a text or other character node\n                newNode = descendantNode.cloneNode(false);\n                parentNode = descendantNode.parentNode;\n                if (newNode.id) {\n                    newNode.removeAttribute(\"id\");\n                }\n                var child, newChildIndex = 0;\n\n                while ( (child = descendantNode.childNodes[descendantOffset]) ) {\n                    movePreservingPositions(child, newNode, newChildIndex++, positionsToPreserve);\n                }\n                movePreservingPositions(newNode, parentNode, dom.getNodeIndex(descendantNode) + 1, positionsToPreserve);\n                return (descendantNode == node) ? newNode : splitNodeAt(node, parentNode, dom.getNodeIndex(newNode), positionsToPreserve);\n            } else if (node != descendantNode) {\n                newNode = descendantNode.parentNode;\n\n                // Work out a new split point in the parent node\n                var newNodeIndex = dom.getNodeIndex(descendantNode);\n\n                if (!splitAtStart) {\n                    newNodeIndex++;\n                }\n                return splitNodeAt(node, newNode, newNodeIndex, positionsToPreserve);\n            }\n            return node;\n        }\n\n        function areElementsMergeable(el1, el2) {\n            return el1.namespaceURI == el2.namespaceURI &&\n                el1.tagName.toLowerCase() == el2.tagName.toLowerCase() &&\n                haveSameClasses(el1, el2) &&\n                elementsHaveSameNonClassAttributes(el1, el2) &&\n                getComputedStyleProperty(el1, \"display\") == \"inline\" &&\n                getComputedStyleProperty(el2, \"display\") == \"inline\";\n        }\n\n        function createAdjacentMergeableTextNodeGetter(forward) {\n            var siblingPropName = forward ? \"nextSibling\" : \"previousSibling\";\n\n            return function(textNode, checkParentElement) {\n                var el = textNode.parentNode;\n                var adjacentNode = textNode[siblingPropName];\n                if (adjacentNode) {\n                    // Can merge if the node's previous/next sibling is a text node\n                    if (adjacentNode && adjacentNode.nodeType == 3) {\n                        return adjacentNode;\n                    }\n                } else if (checkParentElement) {\n                    // Compare text node parent element with its sibling\n                    adjacentNode = el[siblingPropName];\n                    if (adjacentNode && adjacentNode.nodeType == 1 && areElementsMergeable(el, adjacentNode)) {\n                        var adjacentNodeChild = adjacentNode[forward ? \"firstChild\" : \"lastChild\"];\n                        if (adjacentNodeChild && adjacentNodeChild.nodeType == 3) {\n                            return adjacentNodeChild;\n                        }\n                    }\n                }\n                return null;\n            };\n        }\n\n        var getPreviousMergeableTextNode = createAdjacentMergeableTextNodeGetter(false),\n            getNextMergeableTextNode = createAdjacentMergeableTextNodeGetter(true);\n\n    \n        function Merge(firstNode) {\n            this.isElementMerge = (firstNode.nodeType == 1);\n            this.textNodes = [];\n            var firstTextNode = this.isElementMerge ? firstNode.lastChild : firstNode;\n            if (firstTextNode) {\n                this.textNodes[0] = firstTextNode;\n            }\n        }\n\n        Merge.prototype = {\n            doMerge: function(positionsToPreserve) {\n                var textNodes = this.textNodes;\n                var firstTextNode = textNodes[0];\n                if (textNodes.length > 1) {\n                    var firstTextNodeIndex = dom.getNodeIndex(firstTextNode);\n                    var textParts = [], combinedTextLength = 0, textNode, parent;\n                    forEach(textNodes, function(textNode, i) {\n                        parent = textNode.parentNode;\n                        if (i > 0) {\n                            parent.removeChild(textNode);\n                            if (!parent.hasChildNodes()) {\n                                dom.removeNode(parent);\n                            }\n                            if (positionsToPreserve) {\n                                forEach(positionsToPreserve, function(position) {\n                                    // Handle case where position is inside the text node being merged into a preceding node\n                                    if (position.node == textNode) {\n                                        position.node = firstTextNode;\n                                        position.offset += combinedTextLength;\n                                    }\n                                    // Handle case where both text nodes precede the position within the same parent node\n                                    if (position.node == parent && position.offset > firstTextNodeIndex) {\n                                        --position.offset;\n                                        if (position.offset == firstTextNodeIndex + 1 && i < textNodes.length - 1) {\n                                            position.node = firstTextNode;\n                                            position.offset = combinedTextLength;\n                                        }\n                                    }\n                                });\n                            }\n                        }\n                        textParts[i] = textNode.data;\n                        combinedTextLength += textNode.data.length;\n                    });\n                    firstTextNode.data = textParts.join(\"\");\n                }\n                return firstTextNode.data;\n            },\n\n            getLength: function() {\n                var i = this.textNodes.length, len = 0;\n                while (i--) {\n                    len += this.textNodes[i].length;\n                }\n                return len;\n            },\n\n            toString: function() {\n                var textParts = [];\n                forEach(this.textNodes, function(textNode, i) {\n                    textParts[i] = \"'\" + textNode.data + \"'\";\n                });\n                return \"[Merge(\" + textParts.join(\",\") + \")]\";\n            }\n        };\n\n        var optionProperties = [\"elementTagName\", \"ignoreWhiteSpace\", \"applyToEditableOnly\", \"useExistingElements\",\n            \"removeEmptyElements\", \"onElementCreate\"];\n\n        // TODO: Populate this with every attribute name that corresponds to a property with a different name. Really??\n        var attrNamesForProperties = {};\n\n        function ClassApplier(className, options, tagNames) {\n            var normalize, i, len, propName, applier = this;\n            applier.cssClass = applier.className = className; // cssClass property is for backward compatibility\n\n            var elementPropertiesFromOptions = null, elementAttributes = {};\n\n            // Initialize from options object\n            if (typeof options == \"object\" && options !== null) {\n                if (typeof options.elementTagName !== \"undefined\") {\n                    options.elementTagName = options.elementTagName.toLowerCase();\n                }\n                tagNames = options.tagNames;\n                elementPropertiesFromOptions = options.elementProperties;\n                elementAttributes = options.elementAttributes;\n\n                for (i = 0; propName = optionProperties[i++]; ) {\n                    if (options.hasOwnProperty(propName)) {\n                        applier[propName] = options[propName];\n                    }\n                }\n                normalize = options.normalize;\n            } else {\n                normalize = options;\n            }\n\n            // Backward compatibility: the second parameter can also be a Boolean indicating to normalize after unapplying\n            applier.normalize = (typeof normalize == \"undefined\") ? true : normalize;\n\n            // Initialize element properties and attribute exceptions\n            applier.attrExceptions = [];\n            var el = document.createElement(applier.elementTagName);\n            applier.elementProperties = applier.copyPropertiesToElement(elementPropertiesFromOptions, el, true);\n            each(elementAttributes, function(attrName, attrValue) {\n                applier.attrExceptions.push(attrName);\n                // Ensure each attribute value is a string\n                elementAttributes[attrName] = \"\" + attrValue;\n            });\n            applier.elementAttributes = elementAttributes;\n\n            applier.elementSortedClassName = applier.elementProperties.hasOwnProperty(\"className\") ?\n                sortClassName(applier.elementProperties.className + \" \" + className) : className;\n\n            // Initialize tag names\n            applier.applyToAnyTagName = false;\n            var type = typeof tagNames;\n            if (type == \"string\") {\n                if (tagNames == \"*\") {\n                    applier.applyToAnyTagName = true;\n                } else {\n                    applier.tagNames = trim(tagNames.toLowerCase()).split(/\\s*,\\s*/);\n                }\n            } else if (type == \"object\" && typeof tagNames.length == \"number\") {\n                applier.tagNames = [];\n                for (i = 0, len = tagNames.length; i < len; ++i) {\n                    if (tagNames[i] == \"*\") {\n                        applier.applyToAnyTagName = true;\n                    } else {\n                        applier.tagNames.push(tagNames[i].toLowerCase());\n                    }\n                }\n            } else {\n                applier.tagNames = [applier.elementTagName];\n            }\n        }\n\n        ClassApplier.prototype = {\n            elementTagName: defaultTagName,\n            elementProperties: {},\n            elementAttributes: {},\n            ignoreWhiteSpace: true,\n            applyToEditableOnly: false,\n            useExistingElements: true,\n            removeEmptyElements: true,\n            onElementCreate: null,\n\n            copyPropertiesToElement: function(props, el, createCopy) {\n                var s, elStyle, elProps = {}, elPropsStyle, propValue, elPropValue, attrName;\n\n                for (var p in props) {\n                    if (props.hasOwnProperty(p)) {\n                        propValue = props[p];\n                        elPropValue = el[p];\n\n                        // Special case for class. The copied properties object has the applier's class as well as its own\n                        // to simplify checks when removing styling elements\n                        if (p == \"className\") {\n                            addClass(el, propValue);\n                            addClass(el, this.className);\n                            el[p] = sortClassName(el[p]);\n                            if (createCopy) {\n                                elProps[p] = propValue;\n                            }\n                        }\n\n                        // Special case for style\n                        else if (p == \"style\") {\n                            elStyle = elPropValue;\n                            if (createCopy) {\n                                elProps[p] = elPropsStyle = {};\n                            }\n                            for (s in props[p]) {\n                                if (props[p].hasOwnProperty(s)) {\n                                    elStyle[s] = propValue[s];\n                                    if (createCopy) {\n                                        elPropsStyle[s] = elStyle[s];\n                                    }\n                                }\n                            }\n                            this.attrExceptions.push(p);\n                        } else {\n                            el[p] = propValue;\n                            // Copy the property back from the dummy element so that later comparisons to check whether\n                            // elements may be removed are checking against the right value. For example, the href property\n                            // of an element returns a fully qualified URL even if it was previously assigned a relative\n                            // URL.\n                            if (createCopy) {\n                                elProps[p] = el[p];\n\n                                // Not all properties map to identically-named attributes\n                                attrName = attrNamesForProperties.hasOwnProperty(p) ? attrNamesForProperties[p] : p;\n                                this.attrExceptions.push(attrName);\n                            }\n                        }\n                    }\n                }\n\n                return createCopy ? elProps : \"\";\n            },\n\n            copyAttributesToElement: function(attrs, el) {\n                for (var attrName in attrs) {\n                    if (attrs.hasOwnProperty(attrName) && !/^class(?:Name)?$/i.test(attrName)) {\n                        el.setAttribute(attrName, attrs[attrName]);\n                    }\n                }\n            },\n\n            appliesToElement: function(el) {\n                return contains(this.tagNames, el.tagName.toLowerCase());\n            },\n\n            getEmptyElements: function(range) {\n                var applier = this;\n                return range.getNodes([1], function(el) {\n                    return applier.appliesToElement(el) && !el.hasChildNodes();\n                });\n            },\n\n            hasClass: function(node) {\n                return node.nodeType == 1 &&\n                    (this.applyToAnyTagName || this.appliesToElement(node)) &&\n                    hasClass(node, this.className);\n            },\n\n            getSelfOrAncestorWithClass: function(node) {\n                while (node) {\n                    if (this.hasClass(node)) {\n                        return node;\n                    }\n                    node = node.parentNode;\n                }\n                return null;\n            },\n\n            isModifiable: function(node) {\n                return !this.applyToEditableOnly || isEditable(node);\n            },\n\n            // White space adjacent to an unwrappable node can be ignored for wrapping\n            isIgnorableWhiteSpaceNode: function(node) {\n                return this.ignoreWhiteSpace && node && node.nodeType == 3 && isUnrenderedWhiteSpaceNode(node);\n            },\n\n            // Normalizes nodes after applying a class to a Range.\n            postApply: function(textNodes, range, positionsToPreserve, isUndo) {\n                var firstNode = textNodes[0], lastNode = textNodes[textNodes.length - 1];\n                var merges = [], currentMerge;\n                var rangeStartNode = firstNode, rangeEndNode = lastNode;\n                var rangeStartOffset = 0, rangeEndOffset = lastNode.length;\n                var precedingTextNode;\n\n                // Check for every required merge and create a Merge object for each\n                forEach(textNodes, function(textNode) {\n                    precedingTextNode = getPreviousMergeableTextNode(textNode, !isUndo);\n                    if (precedingTextNode) {\n                        if (!currentMerge) {\n                            currentMerge = new Merge(precedingTextNode);\n                            merges.push(currentMerge);\n                        }\n                        currentMerge.textNodes.push(textNode);\n                        if (textNode === firstNode) {\n                            rangeStartNode = currentMerge.textNodes[0];\n                            rangeStartOffset = rangeStartNode.length;\n                        }\n                        if (textNode === lastNode) {\n                            rangeEndNode = currentMerge.textNodes[0];\n                            rangeEndOffset = currentMerge.getLength();\n                        }\n                    } else {\n                        currentMerge = null;\n                    }\n                });\n\n                // Test whether the first node after the range needs merging\n                var nextTextNode = getNextMergeableTextNode(lastNode, !isUndo);\n\n                if (nextTextNode) {\n                    if (!currentMerge) {\n                        currentMerge = new Merge(lastNode);\n                        merges.push(currentMerge);\n                    }\n                    currentMerge.textNodes.push(nextTextNode);\n                }\n\n                // Apply the merges\n                if (merges.length) {\n                    for (var i = 0, len = merges.length; i < len; ++i) {\n                        merges[i].doMerge(positionsToPreserve);\n                    }\n\n                    // Set the range boundaries\n                    range.setStartAndEnd(rangeStartNode, rangeStartOffset, rangeEndNode, rangeEndOffset);\n                }\n            },\n\n            createContainer: function(parentNode) {\n                var doc = dom.getDocument(parentNode);\n                var namespace;\n                var el = createElementNSSupported && !dom.isHtmlNamespace(parentNode) && (namespace = parentNode.namespaceURI) ?\n                    doc.createElementNS(parentNode.namespaceURI, this.elementTagName) :\n                    doc.createElement(this.elementTagName);\n\n                this.copyPropertiesToElement(this.elementProperties, el, false);\n                this.copyAttributesToElement(this.elementAttributes, el);\n                addClass(el, this.className);\n                if (this.onElementCreate) {\n                    this.onElementCreate(el, this);\n                }\n                return el;\n            },\n\n            elementHasProperties: function(el, props) {\n                var applier = this;\n                return each(props, function(p, propValue) {\n                    if (p == \"className\") {\n                        // For checking whether we should reuse an existing element, we just want to check that the element\n                        // has all the classes specified in the className property. When deciding whether the element is\n                        // removable when unapplying a class, there is separate special handling to check whether the\n                        // element has extra classes so the same simple check will do.\n                        return hasAllClasses(el, propValue);\n                    } else if (typeof propValue == \"object\") {\n                        if (!applier.elementHasProperties(el[p], propValue)) {\n                            return false;\n                        }\n                    } else if (el[p] !== propValue) {\n                        return false;\n                    }\n                });\n            },\n\n            elementHasAttributes: function(el, attrs) {\n                return each(attrs, function(name, value) {\n                    if (el.getAttribute(name) !== value) {\n                        return false;\n                    }\n                });\n            },\n\n            applyToTextNode: function(textNode, positionsToPreserve) {\n\n                // Check whether the text node can be styled. Text within a