diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 332d4da..25a4920 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,8 +2,13 @@ name: Reader CI on: push: + branches: [development, master] pull_request: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: test: runs-on: ubuntu-latest @@ -68,6 +73,6 @@ jobs: - run: >- xcodebuild -workspace macos/Runner.xcworkspace -scheme Runner -configuration Release -derivedDataPath build/macos -sdk macosx - ARCHS=$(uname -m) ONLY_ACTIVE_ARCH=YES CODE_SIGNING_ALLOWED=NO build + ARCHS="$(uname -m)" ONLY_ACTIVE_ARCH=YES CODE_SIGNING_ALLOWED=NO build if: matrix.target == 'macos' working-directory: example diff --git a/AGENTS.md b/AGENTS.md index a7a8ec2..a99c975 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,9 +4,10 @@ This is an independent Flutter package and Git repository. The owning workspace is one level up; use its `tools/flutter` and `tools/dart` SDK wrappers when present. Read `docs/architecture.md` before changing architecture or expanding formats. -- Domain types are host-facing and serializable. Keep version-1 locators readable. +- Domain types are host-facing and serializable. Implement the current locator contract + without compatibility shims for older app versions. EPUB content offsets are chapter-local normalized UTF-16 offsets, never page - numbers. Legacy CFI strings are compatibility data, not conformant anchors. + numbers. Standardized EPUB CFI interoperability is not implemented. - The host owns bytes, persistence, routing and account/profile isolation. Package engines own transient resources and must release them on cancellation. - EPUB document processing is pure Dart in `lib/src/engine/epub/worker`. Native @@ -18,8 +19,10 @@ Read `docs/architecture.md` before changing architecture or expanding formats. This package commits `pubspec.lock` and pins its CI SDK so the browser worker and third-party notices are reproducible. - UI text measurement belongs in Flutter. Preserve semantic runs, Unicode, - illustrations and content offsets when reflowing. Layout must use the space - left after panels, system insets and text scaling, not device width alone. + illustrations and content offsets when reflowing. Layout must use actual viewport + constraints, system insets and text scaling. + Temporary shell panels overlay the viewport without changing pagination or + the reading position; opening them must not trigger a reflow. - Keep custom engines/renderers/builders usable. Don't silently expose settings that the active engine cannot apply. - Use in-process transport in widget tests with fake clocks; exercise native and diff --git a/README.md b/README.md index 6caec2b..dce6134 100644 --- a/README.md +++ b/README.md @@ -46,12 +46,18 @@ provided `ReaderController` remains host-owned. With an external controller, omitted initial preferences remain controller-owned; an explicit value overrides them for the document load. -Use **Hide controls** in the toolbar for distraction-free reading. Both bars -collapse, expanding the page area without reopening the document. Page-turn -keys, EPUB swipes and PDF scrolling remain available. The small **Show controls** -button in the top corner or **Escape** restores the bars. This is temporary UI -state; opening another document restores the controls. Custom toolbar builders -can expose `ReaderToolbarContext.toggleControls`. +Tap the reading surface or press **Escape** to hide or restore controls. The +viewport stays the same size, so this does not repaginate or move the book. +Page-turn keys, EPUB swipes and PDF scrolling remain available. Custom toolbar +builders can expose `ReaderToolbarContext.toggleControls`. + +Hosts can supply `ReaderUiBuilders.compactPanelRoute` to put Contents and Reading +settings inside their own sheet shell. The factory receives the panel title, kind, +and a live `buildContent(context, scrollController)` builder without reader headers +or framing. Return an unpushed `Route`; the reader handles presentation, +activity tracking and cleanup. Connect the builder's scroll controller to your +sheet's scrolling coordinator. Omit this hook to use the standalone defaults. +See [Architecture](docs/architecture.md) for the presentation contract. ## Example diff --git a/assets/epub_worker.js b/assets/epub_worker.js index 56dbb10..89b8aa5 100644 --- a/assets/epub_worker.js +++ b/assets/epub_worker.js @@ -22,7 +22,7 @@ a[c]=function(){if(a[b]===s){a[b]=d()}a[c]=function(){return this[b]} return a[b]}}function lazyFinal(a,b,c,d){var s=a a[b]=s a[c]=function(){if(a[b]===s){var r=d() -if(a[b]!==s){A.zD(b)}a[b]=r}var q=a[b] +if(a[b]!==s){A.zK(b)}a[b]=r}var q=a[b] a[c]=function(){return q} return q}}function makeConstList(a,b){if(b!=null)A.i(a,b) a.$flags=7 @@ -30,10 +30,10 @@ return a}function convertToFastObject(a){function t(){}t.prototype=a new t() return a}function convertAllToFastObject(a){for(var s=0;s4294967295)throw A.f(A.af(a,0,4294967295,"length",null)) -return J.vY(new Array(a),b)}, -vX(a,b){if(a<0)throw A.f(A.W("Length must be a non-negative integer: "+a,null)) +mO(a,b){if(a<0||a>4294967295)throw A.f(A.af(a,0,4294967295,"length",null)) +return J.w7(new Array(a),b)}, +w6(a,b){if(a<0)throw A.f(A.W("Length must be a non-negative integer: "+a,null)) return A.i(new Array(a),b.h("y<0>"))}, -rv(a,b){if(a<0)throw A.f(A.W("Length must be a non-negative integer: "+a,null)) +rF(a,b){if(a<0)throw A.f(A.W("Length must be a non-negative integer: "+a,null)) return A.i(new Array(a),b.h("y<0>"))}, -vY(a,b){var s=A.i(a,b.h("y<0>")) +w7(a,b){var s=A.i(a,b.h("y<0>")) s.$flags=1 return s}, -vZ(a,b){var s=t.bP -return J.r8(s.a(a),s.a(b))}, -rx(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0 +w8(a,b){var s=t.bP +return J.rj(s.a(a),s.a(b))}, +rH(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0 default:return!1}switch(a){case 5760:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0 default:return!1}}, -ry(a,b){var s,r +rI(a,b){var s,r for(s=a.length;b0;b=r){r=b-1 if(!(r").u(c).h("hb<1,2>")) -return new A.de(a,b.h("@<0>").u(c).h("de<1,2>"))}, -rA(a){return new A.e8("Field '"+a+"' has been assigned during initialization.")}, -q6(a){return new A.e8("Field '"+a+"' has not been initialized.")}, -w0(a){return new A.e8("Field '"+a+"' has already been initialized.")}, -pE(a){var s,r=a^48 +cv:function cv(){}},A={qf:function qf(){}, +eM(a,b,c){if(t.gt.b(a))return new A.hd(a,b.h("@<0>").u(c).h("hd<1,2>")) +return new A.df(a,b.h("@<0>").u(c).h("df<1,2>"))}, +rK(a){return new A.e8("Field '"+a+"' has been assigned during initialization.")}, +qh(a){return new A.e8("Field '"+a+"' has not been initialized.")}, +wa(a){return new A.e8("Field '"+a+"' has already been initialized.")}, +pM(a){var s,r=a^48 if(r<=9)return r s=a|32 if(97<=s&&s<=102)return s-87 return-1}, -cz(a,b){a=a+b&536870911 +cB(a,b){a=a+b&536870911 a=a+((a&524287)<<10)&536870911 return a^a>>>6}, -nN(a){a=a+((a&67108863)<<3)&536870911 +nT(a){a=a+((a&67108863)<<3)&536870911 a^=a>>>11 return a+((a&16383)<<15)&536870911}, dP(a,b,c){return a}, -qX(a){var s,r -for(s=$.bF.length,r=0;rc)A.P(A.af(b,0,c,"start",null))}return new A.cy(a,b,c,d.h("cy<0>"))}, -rE(a,b,c,d){if(t.gt.b(a))return new A.eU(a,b,c.h("@<0>").u(d).h("eU<1,2>")) -return new A.ba(a,b,c.h("@<0>").u(d).h("ba<1,2>"))}, -rZ(a,b,c){var s="takeCount" -A.hR(b,s,t.S) -A.aF(b,s) -if(t.gt.b(a))return new A.eV(a,b,c.h("eV<0>")) +c_(a,b,c,d){A.aH(b,"start") +if(c!=null){A.aH(c,"end") +if(b>c)A.M(A.af(b,0,c,"start",null))}return new A.cA(a,b,c,d.h("cA<0>"))}, +rO(a,b,c,d){if(t.gt.b(a))return new A.eW(a,b,c.h("@<0>").u(d).h("eW<1,2>")) +return new A.aM(a,b,c.h("@<0>").u(d).h("aM<1,2>"))}, +t8(a,b,c){var s="takeCount" +A.hT(b,s,t.S) +A.aH(b,s) +if(t.gt.b(a))return new A.eX(a,b,c.h("eX<0>")) return new A.dE(a,b,c.h("dE<0>"))}, -rX(a,b,c){var s="count" -if(t.gt.b(a)){A.hR(b,s,t.S) -A.aF(b,s) -return new A.dZ(a,b,c.h("dZ<0>"))}A.hR(b,s,t.S) -A.aF(b,s) -return new A.cx(a,b,c.h("cx<0>"))}, -bi(){return new A.dD("No element")}, -ru(){return new A.dD("Too many elements")}, -rt(){return new A.dD("Too few elements")}, -jM(a,b,c,d,e){if(c-b<=32)A.wN(a,b,c,d,e) -else A.wM(a,b,c,d,e)}, -wN(a,b,c,d,e){var s,r,q,p,o,n -for(s=b+1,r=J.ad(a);s<=c;++s){q=r.m(a,s) +t6(a,b,c){var s="count" +if(t.gt.b(a)){A.hT(b,s,t.S) +A.aH(b,s) +return new A.dZ(a,b,c.h("dZ<0>"))}A.hT(b,s,t.S) +A.aH(b,s) +return new A.cz(a,b,c.h("cz<0>"))}, +ba(){return new A.dD("No element")}, +qc(){return new A.dD("Too many elements")}, +rE(){return new A.dD("Too few elements")}, +jM(a,b,c,d,e){if(c-b<=32)A.wX(a,b,c,d,e) +else A.wW(a,b,c,d,e)}, +wX(a,b,c,d,e){var s,r,q,p,o,n +for(s=b+1,r=J.ae(a);s<=c;++s){q=r.m(a,s) p=s for(;;){if(p>b){o=d.$2(r.m(a,p-1),q) if(typeof o!=="number")return o.b1() @@ -239,7 +239,7 @@ if(!o)break n=p-1 r.k(a,p,r.m(a,n)) p=n}r.k(a,p,q)}}, -wM(a3,a4,a5,a6,a7){var s,r,q,p,o,n,m,l,k,j=B.f.av(a5-a4+1,6),i=a4+j,h=a5-j,g=B.f.av(a4+a5,2),f=g-j,e=g+j,d=J.ad(a3),c=d.m(a3,i),b=d.m(a3,f),a=d.m(a3,g),a0=d.m(a3,e),a1=d.m(a3,h),a2=a6.$2(c,b) +wW(a3,a4,a5,a6,a7){var s,r,q,p,o,n,m,l,k,j=B.f.aw(a5-a4+1,6),i=a4+j,h=a5-j,g=B.f.aw(a4+a5,2),f=g-j,e=g+j,d=J.ae(a3),c=d.m(a3,i),b=d.m(a3,f),a=d.m(a3,g),a0=d.m(a3,e),a1=d.m(a3,h),a2=a6.$2(c,b) if(typeof a2!=="number")return a2.b1() if(a2>0){s=b b=c @@ -282,7 +282,7 @@ d.k(a3,f,d.m(a3,a4)) d.k(a3,e,d.m(a3,a5)) r=a4+1 q=a5-1 -p=J.N(a6.$2(b,a0),0) +p=J.O(a6.$2(b,a0),0) if(p)for(o=r;o<=q;++o){n=d.m(a3,o) m=a6.$2(n,b) if(m===0)continue @@ -319,8 +319,8 @@ d.k(a3,a2,a0) A.jM(a3,a4,r-2,a6,a7) A.jM(a3,q+2,a5,a6,a7) if(p)return -if(rh){while(J.N(a6.$2(d.m(a3,r),b),0))++r -while(J.N(a6.$2(d.m(a3,q),a0),0))--q +if(rh){while(J.O(a6.$2(d.m(a3,r),b),0))++r +while(J.O(a6.$2(d.m(a3,q),a0),0))--q for(o=r;o<=q;++o){n=d.m(a3,o) if(a6.$2(n,b)===0){if(o!==r){d.k(a3,o,d.m(a3,r)) d.k(a3,r,n)}++r}else if(a6.$2(n,a0)===0)for(;;)if(a6.$2(d.m(a3,q),a0)===0){--q @@ -336,35 +336,35 @@ break}}A.jM(a3,r,q,a6,a7)}else A.jM(a3,r,q,a6,a7)}, eu:function eu(){}, eN:function eN(a,b){this.a=a this.$ti=b}, -de:function de(a,b){this.a=a +df:function df(a,b){this.a=a this.$ti=b}, -hb:function hb(a,b){this.a=a +hd:function hd(a,b){this.a=a this.$ti=b}, -df:function df(a,b){this.a=a +dg:function dg(a,b){this.a=a this.$ti=b}, lK:function lK(a,b){this.a=a this.b=b}, e8:function e8(a){this.a=a}, jF:function jF(a){this.a=a}, ah:function ah(a){this.a=a}, -nK:function nK(){}, +nQ:function nQ(){}, z:function z(){}, G:function G(){}, -cy:function cy(a,b,c,d){var _=this +cA:function cA(a,b,c,d){var _=this _.a=a _.b=b _.c=c _.$ti=d}, -M:function M(a,b,c){var _=this +N:function N(a,b,c){var _=this _.a=a _.b=b _.c=0 _.d=null _.$ti=c}, -ba:function ba(a,b,c){this.a=a +aM:function aM(a,b,c){this.a=a this.b=b this.$ti=c}, -eU:function eU(a,b,c){this.a=a +eW:function eW(a,b,c){this.a=a this.b=b this.$ti=c}, du:function du(a,b,c){var _=this @@ -375,16 +375,16 @@ _.$ti=c}, Q:function Q(a,b,c){this.a=a this.b=b this.$ti=c}, -b_:function b_(a,b,c){this.a=a +aE:function aE(a,b,c){this.a=a this.b=b this.$ti=c}, -cF:function cF(a,b,c){this.a=a +cH:function cH(a,b,c){this.a=a this.b=b this.$ti=c}, -dn:function dn(a,b,c){this.a=a +dp:function dp(a,b,c){this.a=a this.b=b this.$ti=c}, -fd:function fd(a,b,c,d){var _=this +ff:function ff(a,b,c,d){var _=this _.a=a _.b=b _.c=c @@ -393,38 +393,38 @@ _.$ti=d}, dE:function dE(a,b,c){this.a=a this.b=b this.$ti=c}, -eV:function eV(a,b,c){this.a=a +eX:function eX(a,b,c){this.a=a this.b=b this.$ti=c}, -fT:function fT(a,b,c){this.a=a +fV:function fV(a,b,c){this.a=a this.b=b this.$ti=c}, -cx:function cx(a,b,c){this.a=a +cz:function cz(a,b,c){this.a=a this.b=b this.$ti=c}, dZ:function dZ(a,b,c){this.a=a this.b=b this.$ti=c}, -fO:function fO(a,b,c){this.a=a +fQ:function fQ(a,b,c){this.a=a this.b=b this.$ti=c}, -eW:function eW(a){this.$ti=a}, -eX:function eX(a){this.$ti=a}, -O:function O(a,b){this.a=a +eY:function eY(a){this.$ti=a}, +eZ:function eZ(a){this.$ti=a}, +P:function P(a,b){this.a=a this.$ti=b}, -bZ:function bZ(a,b){this.a=a +c1:function c1(a,b){this.a=a this.$ti=b}, ak:function ak(){}, -bL:function bL(){}, +bM:function bM(){}, em:function em(){}, -X:function X(a,b){this.a=a +Y:function Y(a,b){this.a=a this.$ti=b}, -cf:function cf(a){this.a=a}, -vF(){throw A.f(A.ac("Cannot modify unmodifiable Map"))}, -uN(a){var s=v.mangledGlobalNames[a] +ci:function ci(a){this.a=a}, +vQ(){throw A.f(A.a6("Cannot modify unmodifiable Map"))}, +uZ(a){var s=v.mangledGlobalNames[a] if(s!=null)return s return"minified:"+a}, -Aq(a,b){var s +Ay(a,b){var s if(b!=null){s=b.x if(s!=null)return s}return t.dX.b(a)}, k(a){var s @@ -432,11 +432,11 @@ if(typeof a=="string")return a if(typeof a=="number"){if(a!==0)return""+a}else if(!0===a)return"true" else if(!1===a)return"false" else if(a==null)return"null" -s=J.ay(a) +s=J.ao(a) return s}, -rw(a,b,c,d,e,f){return new A.fj(a,c,d,e,f)}, -dy(a){var s,r=$.rO -if(r==null)r=$.rO=Symbol("identityHashCode") +rG(a,b,c,d,e,f){return new A.fl(a,c,d,e,f)}, +dy(a){var s,r=$.rY +if(r==null)r=$.rY=Symbol("identityHashCode") s=a[r] if(s==null){s=Math.random()*0x3fffffff|0 a[r]=s}return s}, @@ -451,139 +451,139 @@ if(b===10&&s!=null)return parseInt(a,10) if(b<10||s==null){r=b<=10?47+b:86+b q=m[1] for(p=q.length,o=0;or)return n}return parseInt(a,b)}, -qf(a){var s,r +qq(a){var s,r if(!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(a))return null s=parseFloat(a) if(isNaN(s)){r=B.b.ba(a) if(r==="NaN"||r==="+NaN"||r==="-NaN")return s return null}return s}, jC(a){var s,r,q,p -if(a instanceof A.p)return A.be(A.b3(a),null) -s=J.ci(a) +if(a instanceof A.p)return A.bf(A.aW(a),null) +s=J.c6(a) if(s===B.iO||s===B.iQ||t.mK.b(a)){r=B.cM(a) if(r!=="Object"&&r!=="")return r q=a.constructor if(typeof q=="function"){p=q.name -if(typeof p=="string"&&p!=="Object"&&p!=="")return p}}return A.be(A.b3(a),null)}, -rP(a){var s,r,q -if(a==null||typeof a=="number"||A.qL(a))return J.ay(a) +if(typeof p=="string"&&p!=="Object"&&p!=="")return p}}return A.bf(A.aW(a),null)}, +rZ(a){var s,r,q +if(a==null||typeof a=="number"||A.qW(a))return J.ao(a) if(typeof a=="string")return JSON.stringify(a) -if(a instanceof A.b7)return a.j(0) -if(a instanceof A.bn)return a.hx(!0) -s=$.vd() -for(r=0;r<1;++r){q=s[r].oh(a) +if(a instanceof A.b9)return a.j(0) +if(a instanceof A.bn)return a.hy(!0) +s=$.vp() +for(r=0;r<1;++r){q=s[r].ol(a) if(q!=null)return q}return"Instance of '"+A.jC(a)+"'"}, -ww(){if(!!self.location)return self.location.href +wG(){if(!!self.location)return self.location.href return null}, -rN(a){var s,r,q,p,o=a.length +rX(a){var s,r,q,p,o=a.length if(o<=500)return String.fromCharCode.apply(null,a) for(s="",r=0;r65535)return A.wF(a)}return A.rN(a)}, -wG(a,b,c){var s,r,q,p +if(q>65535)return A.wP(a)}return A.rX(a)}, +wQ(a,b,c){var s,r,q,p if(c<=500&&b===0&&c===a.length)return String.fromCharCode.apply(null,a) for(s=b,r="";s>>0,s&1023|56320)}}throw A.f(A.af(a,0,1114111,null,null))}, bz(a){if(a.date===void 0)a.date=new Date(a.a) return a.date}, -wE(a){return a.c?A.bz(a).getUTCFullYear()+0:A.bz(a).getFullYear()+0}, -wC(a){return a.c?A.bz(a).getUTCMonth()+1:A.bz(a).getMonth()+1}, -wy(a){return a.c?A.bz(a).getUTCDate()+0:A.bz(a).getDate()+0}, -wz(a){return a.c?A.bz(a).getUTCHours()+0:A.bz(a).getHours()+0}, -wB(a){return a.c?A.bz(a).getUTCMinutes()+0:A.bz(a).getMinutes()+0}, -wD(a){return a.c?A.bz(a).getUTCSeconds()+0:A.bz(a).getSeconds()+0}, -wA(a){return a.c?A.bz(a).getUTCMilliseconds()+0:A.bz(a).getMilliseconds()+0}, -cZ(a,b,c){var s,r,q={} +wO(a){return a.c?A.bz(a).getUTCFullYear()+0:A.bz(a).getFullYear()+0}, +wM(a){return a.c?A.bz(a).getUTCMonth()+1:A.bz(a).getMonth()+1}, +wI(a){return a.c?A.bz(a).getUTCDate()+0:A.bz(a).getDate()+0}, +wJ(a){return a.c?A.bz(a).getUTCHours()+0:A.bz(a).getHours()+0}, +wL(a){return a.c?A.bz(a).getUTCMinutes()+0:A.bz(a).getMinutes()+0}, +wN(a){return a.c?A.bz(a).getUTCSeconds()+0:A.bz(a).getSeconds()+0}, +wK(a){return a.c?A.bz(a).getUTCMilliseconds()+0:A.bz(a).getMilliseconds()+0}, +d0(a,b,c){var s,r,q={} q.a=0 s=[] r=[] q.a=b.length B.a.a1(s,b) q.b="" -if(c!=null&&c.a!==0)c.T(0,new A.nt(q,r,s)) -return J.vo(a,new A.fj(B.Mv,0,s,r,0))}, -wv(a,b,c){var s,r=c==null||c.a===0 +if(c!=null&&c.a!==0)c.T(0,new A.nz(q,r,s)) +return J.vz(a,new A.fl(B.Mz,0,s,r,0))}, +wF(a,b,c){var s,r=c==null||c.a===0 if(r){if(!!a.$0)return a.$0() s=a[""+"$0"] -if(s!=null)return s.apply(a,b)}return A.wu(a,b,c)}, -wu(a,b,c){var s,r,q,p,o,n,m,l,k,j,i,h,g,f=a.$R -if(0n)return A.cZ(a,b,null) +if(0>n)return A.d0(a,b,null) if(0f)return A.cZ(a,b,c) -l=A.a7(b,t.z) +return o.apply(a,l)}else{if(0>f)return A.d0(a,b,c) +l=A.a8(b,t.z) k=Object.keys(q) -if(c==null)for(r=k.length,j=0;j=s)return A.iM(b,s,a,null,r) -return A.nu(b,r)}, -yZ(a,b,c){if(a<0||a>c)return A.af(a,0,c,"start",null) +return A.nA(b,r)}, +z7(a,b,c){if(a<0||a>c)return A.af(a,0,c,"start",null) if(b!=null)if(bc)return A.af(b,a,c,"end",null) -return new A.bR(!0,b,"end",null)}, -dO(a){return new A.bR(!0,a,null,null)}, -f(a){return A.ar(a,new Error())}, -ar(a,b){var s -if(a==null)a=new A.cC() +return new A.bS(!0,b,"end",null)}, +dO(a){return new A.bS(!0,a,null,null)}, +f(a){return A.au(a,new Error())}, +au(a,b){var s +if(a==null)a=new A.cE() b.dartException=a -s=A.zE +s=A.zL if("defineProperty" in Object){Object.defineProperty(b,"message",{get:s}) b.name=""}else b.toString=s return b}, -zE(){return J.ay(this.dartException)}, -P(a,b){throw A.ar(a,b==null?new Error():b)}, +zL(){return J.ao(this.dartException)}, +M(a,b){throw A.au(a,b==null?new Error():b)}, t(a,b,c){var s if(b==null)b=0 if(c==null)c=0 s=Error() -A.P(A.xY(a,b,c),s)}, -xY(a,b,c){var s,r,q,p,o,n,m,l,k +A.M(A.y7(a,b,c),s)}, +y7(a,b,c){var s,r,q,p,o,n,m,l,k if(typeof b=="string")s=b else{r="[]=;add;removeWhere;retainWhere;removeRange;setRange;setInt8;setInt16;setInt32;setUint8;setUint16;setUint32;setFloat32;setFloat64".split(";") q=r.length @@ -596,10 +596,10 @@ l="a " if((m&4)!==0)k="constant " else if((m&2)!==0){k="unmodifiable " l="an "}else k=(m&1)!==0?"fixed-length ":"" -return new A.fX("'"+s+"': Cannot "+o+" "+l+k+n)}, -a2(a){throw A.f(A.ai(a))}, -cD(a){var s,r,q,p,o,n -a=A.uI(a.replace(String({}),"$receiver$")) +return new A.fZ("'"+s+"': Cannot "+o+" "+l+k+n)}, +Z(a){throw A.f(A.ai(a))}, +cF(a){var s,r,q,p,o,n +a=A.uU(a.replace(String({}),"$receiver$")) s=a.match(/\\\$[a-zA-Z]+\\\$/g) if(s==null)s=A.i([],t.s) r=s.indexOf("\\$arguments\\$") @@ -607,81 +607,81 @@ q=s.indexOf("\\$argumentsExpr\\$") p=s.indexOf("\\$expr\\$") o=s.indexOf("\\$method\\$") n=s.indexOf("\\$receiver\\$") -return new A.nQ(a.replace(new RegExp("\\\\\\$arguments\\\\\\$","g"),"((?:x|[^x])*)").replace(new RegExp("\\\\\\$argumentsExpr\\\\\\$","g"),"((?:x|[^x])*)").replace(new RegExp("\\\\\\$expr\\\\\\$","g"),"((?:x|[^x])*)").replace(new RegExp("\\\\\\$method\\\\\\$","g"),"((?:x|[^x])*)").replace(new RegExp("\\\\\\$receiver\\\\\\$","g"),"((?:x|[^x])*)"),r,q,p,o,n)}, -nR(a){return function($expr$){var $argumentsExpr$="$arguments$" +return new A.nX(a.replace(new RegExp("\\\\\\$arguments\\\\\\$","g"),"((?:x|[^x])*)").replace(new RegExp("\\\\\\$argumentsExpr\\\\\\$","g"),"((?:x|[^x])*)").replace(new RegExp("\\\\\\$expr\\\\\\$","g"),"((?:x|[^x])*)").replace(new RegExp("\\\\\\$method\\\\\\$","g"),"((?:x|[^x])*)").replace(new RegExp("\\\\\\$receiver\\\\\\$","g"),"((?:x|[^x])*)"),r,q,p,o,n)}, +nY(a){return function($expr$){var $argumentsExpr$="$arguments$" try{$expr$.$method$($argumentsExpr$)}catch(s){return s.message}}(a)}, -t3(a){return function($expr$){try{$expr$.$method$}catch(s){return s.message}}(a)}, -q5(a,b){var s=b==null,r=s?null:b.method +td(a){return function($expr$){try{$expr$.$method$}catch(s){return s.message}}(a)}, +qg(a,b){var s=b==null,r=s?null:b.method return new A.iX(a,r,s?null:b.receiver)}, -bP(a){var s +bQ(a){var s if(a==null)return new A.jl(a) -if(a instanceof A.fc){s=a.a -return A.db(a,s==null?A.cg(s):s)}if(typeof a!=="object")return a -if("dartException" in a)return A.db(a,a.dartException) -return A.yE(a)}, -db(a,b){if(t.fz.b(b))if(b.$thrownJsError==null)b.$thrownJsError=a +if(a instanceof A.fe){s=a.a +return A.dc(a,s==null?A.cj(s):s)}if(typeof a!=="object")return a +if("dartException" in a)return A.dc(a,a.dartException) +return A.yO(a)}, +dc(a,b){if(t.fz.b(b))if(b.$thrownJsError==null)b.$thrownJsError=a return b}, -yE(a){var s,r,q,p,o,n,m,l,k,j,i,h,g +yO(a){var s,r,q,p,o,n,m,l,k,j,i,h,g if(!("message" in a))return a s=a.message if("number" in a&&typeof a.number=="number"){r=a.number q=r&65535 -if((B.f.b5(r,16)&8191)===10)switch(q){case 438:return A.db(a,A.q5(A.k(s)+" (Error "+q+")",null)) +if((B.f.b5(r,16)&8191)===10)switch(q){case 438:return A.dc(a,A.qg(A.k(s)+" (Error "+q+")",null)) case 445:case 5007:A.k(s) -return A.db(a,new A.fx())}}if(a instanceof TypeError){p=$.uU() -o=$.uV() -n=$.uW() -m=$.uX() -l=$.v_() -k=$.v0() -j=$.uZ() -$.uY() -i=$.v2() -h=$.v1() +return A.dc(a,new A.fz())}}if(a instanceof TypeError){p=$.v5() +o=$.v6() +n=$.v7() +m=$.v8() +l=$.vb() +k=$.vc() +j=$.va() +$.v9() +i=$.ve() +h=$.vd() g=p.bj(s) -if(g!=null)return A.db(a,A.q5(A.q(s),g)) +if(g!=null)return A.dc(a,A.qg(A.q(s),g)) else{g=o.bj(s) if(g!=null){g.method="call" -return A.db(a,A.q5(A.q(s),g))}else if(n.bj(s)!=null||m.bj(s)!=null||l.bj(s)!=null||k.bj(s)!=null||j.bj(s)!=null||m.bj(s)!=null||i.bj(s)!=null||h.bj(s)!=null){A.q(s) -return A.db(a,new A.fx())}}return A.db(a,new A.k0(typeof s=="string"?s:""))}if(a instanceof RangeError){if(typeof s=="string"&&s.indexOf("call stack")!==-1)return new A.fQ() +return A.dc(a,A.qg(A.q(s),g))}else if(n.bj(s)!=null||m.bj(s)!=null||l.bj(s)!=null||k.bj(s)!=null||j.bj(s)!=null||m.bj(s)!=null||i.bj(s)!=null||h.bj(s)!=null){A.q(s) +return A.dc(a,new A.fz())}}return A.dc(a,new A.k0(typeof s=="string"?s:""))}if(a instanceof RangeError){if(typeof s=="string"&&s.indexOf("call stack")!==-1)return new A.fS() s=function(b){try{return String(b)}catch(f){}return null}(a) -return A.db(a,new A.bR(!1,null,null,typeof s=="string"?s.replace(/^RangeError:\s*/,""):s))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof s=="string"&&s==="too much recursion")return new A.fQ() +return A.dc(a,new A.bS(!1,null,null,typeof s=="string"?s.replace(/^RangeError:\s*/,""):s))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof s=="string"&&s==="too much recursion")return new A.fS() return a}, eJ(a){var s -if(a instanceof A.fc)return a.b -if(a==null)return new A.hq(a) +if(a instanceof A.fe)return a.b +if(a==null)return new A.hs(a) s=a.$cachedTrace if(s!=null)return s -s=new A.hq(a) +s=new A.hs(a) if(typeof a==="object")a.$cachedTrace=s return s}, -lB(a){if(a==null)return J.B(a) +lB(a){if(a==null)return J.C(a) if(typeof a=="object")return A.dy(a) -return J.B(a)}, -yL(a){if(typeof a=="number")return B.cV.gq(a) +return J.C(a)}, +yU(a){if(typeof a=="number")return B.cV.gq(a) if(a instanceof A.kX)return A.dy(a) if(a instanceof A.bn)return a.gq(a) -if(a instanceof A.cf)return a.gq(0) +if(a instanceof A.ci)return a.gq(0) return A.lB(a)}, -us(a,b){var s,r,q,p=a.length +uD(a,b){var s,r,q,p=a.length for(s=0;s=0 -else if(b instanceof A.cV){s=B.b.ab(a,c) +else if(b instanceof A.cX){s=B.b.ab(a,c) return b.b.test(s)}else return!J.lE(b,B.b.ab(a,c)).gN(0)}, -qS(a){if(a.indexOf("$",0)>=0)return a.replace(/\$/g,"$$$$") +r2(a){if(a.indexOf("$",0)>=0)return a.replace(/\$/g,"$$$$") return a}, -zB(a,b,c,d){var s=b.h6(a,d) +zI(a,b,c,d){var s=b.h7(a,d) if(s==null)return a -return A.r2(a,s.b.index,s.gV(),c)}, -uI(a){if(/[[\]{}()*+?.\\^$|]/.test(a))return a.replace(/[[\]{}()*+?.\\^$|]/g,"\\$&") +return A.rd(a,s.b.index,s.gV(),c)}, +uU(a){if(/[[\]{}()*+?.\\^$|]/.test(a))return a.replace(/[[\]{}()*+?.\\^$|]/g,"\\$&") return a}, -cO(a,b,c){var s -if(typeof b=="string")return A.zA(a,b,c) -if(b instanceof A.cV){s=b.ghh() +cQ(a,b,c){var s +if(typeof b=="string")return A.zH(a,b,c) +if(b instanceof A.cX){s=b.ghi() s.lastIndex=0 -return a.replace(s,A.qS(c))}return A.zz(a,b,c)}, -zz(a,b,c){var s,r,q,p +return a.replace(s,A.r2(c))}return A.zG(a,b,c)}, +zG(a,b,c){var s,r,q,p for(s=J.lE(b,a),s=s.gF(s),r=0,q="";s.p();){p=s.gB() q=q+a.substring(r,p.gS())+c r=p.gV()}s=q+a.substring(r) return s.charCodeAt(0)==0?s:s}, -zA(a,b,c){var s,r,q +zH(a,b,c){var s,r,q if(b===""){if(a==="")return c s=a.length for(r=c,q=0;q=0)return a.split(b).join(c) -return a.replace(new RegExp(A.uI(b),"g"),A.qS(c))}, -ue(a){return a}, -pV(a,b,c,d){var s,r,q,p,o,n,m -for(s=b.dB(0,a),s=new A.et(s.a,s.b,s.c),r=t.lg,q=0,p="";s.p();){o=s.d +return a.replace(new RegExp(A.uU(b),"g"),A.r2(c))}, +uo(a){return a}, +q3(a,b,c,d){var s,r,q,p,o,n,m +for(s=b.dD(0,a),s=new A.et(s.a,s.b,s.c),r=t.lg,q=0,p="";s.p();){o=s.d if(o==null)o=r.a(o) n=o.b m=n.index -p=p+A.k(A.ue(B.b.t(a,q,m)))+A.k(c.$1(o)) -q=m+n[0].length}s=p+A.k(A.ue(B.b.ab(a,q))) +p=p+A.k(A.uo(B.b.t(a,q,m)))+A.k(c.$1(o)) +q=m+n[0].length}s=p+A.k(A.uo(B.b.ab(a,q))) return s.charCodeAt(0)==0?s:s}, -zC(a,b,c,d){var s,r,q,p +zJ(a,b,c,d){var s,r,q,p if(typeof b=="string"){s=a.indexOf(b,d) if(s<0)return a -return A.r2(a,s,s+b.length,c)}if(b instanceof A.cV)return d===0?a.replace(b.b,A.qS(c)):A.zB(a,b,c,d) -r=J.vh(b,a,d) +return A.rd(a,s,s+b.length,c)}if(b instanceof A.cX)return d===0?a.replace(b.b,A.r2(c)):A.zI(a,b,c,d) +r=J.vs(b,a,d) q=r.gF(r) if(!q.p())return a p=q.gB() -return B.b.bR(a,p.gS(),p.gV(),c)}, -r2(a,b,c,d){return a.substring(0,b)+d+a.substring(c)}, +return B.b.bS(a,p.gS(),p.gV(),c)}, +rd(a,b,c,d){return a.substring(0,b)+d+a.substring(c)}, l:function l(a,b){this.a=a this.b=b}, -hl:function hl(a,b,c){this.a=a +hn:function hn(a,b,c){this.a=a this.b=b this.c=c}, -hm:function hm(a){this.a=a}, -hn:function hn(a){this.a=a}, ho:function ho(a){this.a=a}, -eP:function eP(a,b){this.a=a +hp:function hp(a){this.a=a}, +hq:function hq(a){this.a=a}, +eQ:function eQ(a,b){this.a=a this.$ti=b}, dW:function dW(){}, r:function r(a,b,c){this.a=a this.b=b this.$ti=c}, -he:function he(a,b){this.a=a +hg:function hg(a,b){this.a=a this.$ti=b}, -cK:function cK(a,b,c){var _=this +cM:function cM(a,b,c){var _=this _.a=a _.b=b _.c=0 @@ -909,69 +909,69 @@ _.$ti=c}, a:function a(a,b){this.a=a this.$ti=b}, dX:function dX(){}, -b8:function b8(a,b,c){this.a=a +aX:function aX(a,b,c){this.a=a this.b=b this.$ti=c}, -aP:function aP(a,b){this.a=a +aS:function aS(a,b){this.a=a this.$ti=b}, iP:function iP(){}, e0:function e0(a,b){this.a=a this.$ti=b}, -fj:function fj(a,b,c,d,e){var _=this +fl:function fl(a,b,c,d,e){var _=this _.a=a _.c=b _.d=c _.e=d _.f=e}, -nt:function nt(a,b,c){this.a=a +nz:function nz(a,b,c){this.a=a this.b=b this.c=c}, -fF:function fF(){}, -nQ:function nQ(a,b,c,d,e,f){var _=this +fH:function fH(){}, +nX:function nX(a,b,c,d,e,f){var _=this _.a=a _.b=b _.c=c _.d=d _.e=e _.f=f}, -fx:function fx(){}, +fz:function fz(){}, iX:function iX(a,b,c){this.a=a this.b=b this.c=c}, k0:function k0(a){this.a=a}, jl:function jl(a){this.a=a}, -fc:function fc(a,b){this.a=a +fe:function fe(a,b){this.a=a this.b=b}, -hq:function hq(a){this.a=a +hs:function hs(a){this.a=a this.b=null}, -b7:function b7(){}, -i4:function i4(){}, -i5:function i5(){}, +b9:function b9(){}, +i6:function i6(){}, +i7:function i7(){}, jT:function jT(){}, jR:function jR(){}, dT:function dT(a,b){this.a=a this.b=b}, jK:function jK(a){this.a=a}, -oW:function oW(){}, +p3:function p3(){}, bx:function bx(a){var _=this _.a=0 _.f=_.e=_.d=_.c=_.b=null _.r=0 _.$ti=a}, -mK:function mK(a){this.a=a}, -mM:function mM(a,b){var _=this +mQ:function mQ(a){this.a=a}, +mS:function mS(a,b){var _=this _.a=a _.b=b _.d=_.c=null}, -aV:function aV(a,b){this.a=a +b_:function b_(a,b){this.a=a this.$ti=b}, -cv:function cv(a,b,c,d){var _=this +cx:function cx(a,b,c,d){var _=this _.a=a _.b=b _.c=c _.d=null _.$ti=d}, -fo:function fo(a,b){this.a=a +fq:function fq(a,b){this.a=a this.$ti=b}, dr:function dr(a,b,c,d){var _=this _.a=a @@ -979,31 +979,31 @@ _.b=b _.c=c _.d=null _.$ti=d}, -dq:function dq(a,b){this.a=a +bU:function bU(a,b){this.a=a this.$ti=b}, -fn:function fn(a,b,c,d){var _=this +fp:function fp(a,b,c,d){var _=this _.a=a _.b=b _.c=c _.d=null _.$ti=d}, -dp:function dp(a){var _=this +dq:function dq(a){var _=this _.a=0 _.f=_.e=_.d=_.c=_.b=null _.r=0 _.$ti=a}, -pF:function pF(a){this.a=a}, -pG:function pG(a){this.a=a}, -pH:function pH(a){this.a=a}, +pN:function pN(a){this.a=a}, +pO:function pO(a){this.a=a}, +pP:function pP(a){this.a=a}, bn:function bn(){}, ez:function ez(){}, eA:function eA(){}, -d7:function d7(){}, -cV:function cV(a,b){var _=this +d8:function d8(){}, +cX:function cX(a,b){var _=this _.a=a _.b=b _.e=_.d=_.c=null}, -hg:function hg(a){this.b=a}, +hi:function hi(a){this.b=a}, kw:function kw(a,b,c){this.a=a this.b=b this.c=c}, @@ -1012,7 +1012,7 @@ _.a=a _.b=b _.c=c _.d=null}, -fS:function fS(a,b){this.a=a +fU:function fU(a,b){this.a=a this.c=b}, kU:function kU(a,b,c){this.a=a this.b=b @@ -1022,46 +1022,46 @@ _.a=a _.b=b _.c=c _.d=null}, -zD(a){throw A.ar(A.rA(a),new Error())}, -o(){throw A.ar(A.q6(""),new Error())}, -c6(){throw A.ar(A.w0(""),new Error())}, -dc(){throw A.ar(A.rA(""),new Error())}, -tr(){var s=new A.kB("") +zK(a){throw A.au(A.rK(a),new Error())}, +o(){throw A.au(A.qh(""),new Error())}, +c9(){throw A.au(A.wa(""),new Error())}, +dd(){throw A.au(A.rK(""),new Error())}, +tB(){var s=new A.kB("") return s.b=s}, -oC(a){var s=new A.kB(a) +oJ(a){var s=new A.kB(a) return s.b=s}, kB:function kB(a){this.a=a this.b=null}, -pb(a,b,c){}, -hC(a){var s,r,q +pj(a,b,c){}, +hE(a){var s,r,q if(t.iy.b(a))return a -s=J.ad(a) -r=A.aE(s.gn(a),null,!1,t.z) +s=J.ae(a) +r=A.aB(s.gn(a),null,!1,t.z) for(q=0;q>>0!==a||a>=c)throw A.f(A.lz(b,a))}, -tY(a,b,c){var s +cO(a,b,c){if(a>>>0!==a||a>=c)throw A.f(A.lz(b,a))}, +u7(a,b,c){var s if(!(a>>>0!==a))if(b==null)s=a>c else s=b>>>0!==b||a>b||b>c else s=!0 -if(s)throw A.f(A.yZ(a,b,c)) +if(s)throw A.f(A.z7(a,b,c)) if(b==null)return c return b}, dv:function dv(){}, -fu:function fu(){}, -p0:function p0(a){this.a=a}, +fw:function fw(){}, +p8:function p8(a){this.a=a}, j7:function j7(){}, -aW:function aW(){}, -ft:function ft(){}, +b0:function b0(){}, +fv:function fv(){}, by:function by(){}, j8:function j8(){}, j9:function j9(){}, @@ -1069,24 +1069,24 @@ ja:function ja(){}, jb:function jb(){}, jc:function jc(){}, jd:function jd(){}, -fv:function fv(){}, -fw:function fw(){}, +fx:function fx(){}, +fy:function fy(){}, dw:function dw(){}, -hh:function hh(){}, -hi:function hi(){}, hj:function hj(){}, hk:function hk(){}, -qi(a,b){var s=b.c -return s==null?b.c=A.hs(a,"cr",[b.x]):s}, -rV(a){var s=a.w -if(s===6||s===7)return A.rV(a.x) +hl:function hl(){}, +hm:function hm(){}, +qt(a,b){var s=b.c +return s==null?b.c=A.hu(a,"ct",[b.x]):s}, +t4(a){var s=a.w +if(s===6||s===7)return A.t4(a.x) return s===11||s===12}, -wK(a){return a.as}, -r_(a,b){var s,r=b.length +wU(a){return a.as}, +ra(a,b){var s,r=b.length for(s=0;s=p)return A.c(q,0) -s=A.hu(v.typeUniverse,A.qP(q[0]),"@<0>") +s=A.hw(v.typeUniverse,A.r_(q[0]),"@<0>") for(r=1;r=0)p+=" "+r[q];++q}return p+"})"}, -u3(a3,a4,a5){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1=", ",a2=null +ud(a3,a4,a5){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1=", ",a2=null if(a5!=null){s=a5.length if(a4==null)a4=A.i([],t.s) else a2=a4.length @@ -1351,7 +1351,7 @@ if(!(l>=0))return A.c(a4,l) o=o+n+a4[l] k=a5[q] j=k.w -if(!(j===2||j===3||j===4||j===5||k===p))o+=" extends "+A.be(k,a4)}o+=">"}else o="" +if(!(j===2||j===3||j===4||j===5||k===p))o+=" extends "+A.bf(k,a4)}o+=">"}else o="" p=a3.x i=a3.y h=i.a @@ -1360,202 +1360,202 @@ f=i.b e=f.length d=i.c c=d.length -b=A.be(p,a4) -for(a="",a0="",q=0;q0){a+=a0+"[" -for(a0="",q=0;q0){a+=a0+"{" for(a0="",q=0;q "+b}, -be(a,b){var s,r,q,p,o,n,m,l=a.w +bf(a,b){var s,r,q,p,o,n,m,l=a.w if(l===5)return"erased" if(l===2)return"dynamic" if(l===3)return"void" if(l===1)return"Never" if(l===4)return"any" if(l===6){s=a.x -r=A.be(s,b) +r=A.bf(s,b) q=s.w -return(q===11||q===12?"("+r+")":r)+"?"}if(l===7)return"FutureOr<"+A.be(a.x,b)+">" -if(l===8){p=A.yD(a.x) +return(q===11||q===12?"("+r+")":r)+"?"}if(l===7)return"FutureOr<"+A.bf(a.x,b)+">" +if(l===8){p=A.yN(a.x) o=a.y -return o.length>0?p+("<"+A.ua(o,b)+">"):p}if(l===10)return A.yq(a,b) -if(l===11)return A.u3(a,b,null) -if(l===12)return A.u3(a.x,b,a.y) +return o.length>0?p+("<"+A.uk(o,b)+">"):p}if(l===10)return A.yA(a,b) +if(l===11)return A.ud(a,b,null) +if(l===12)return A.ud(a.x,b,a.y) if(l===13){n=a.x m=b.length n=m-1-n if(!(n>=0&&n0)p+="<"+A.hr(c)+">" +hu(a,b,c){var s,r,q,p=b +if(c.length>0)p+="<"+A.ht(c)+">" s=a.eC.get(p) if(s!=null)return s -r=new A.bU(null,null) +r=new A.bW(null,null) r.w=8 r.x=b r.y=c if(c.length>0)r.c=c[0] r.as=p -q=A.d8(a,r) +q=A.d9(a,r) a.eC.set(p,q) return q}, -qD(a,b,c){var s,r,q,p,o,n +qO(a,b,c){var s,r,q,p,o,n if(b.w===9){s=b.x r=b.y.concat(c)}else{r=c -s=b}q=s.as+(";<"+A.hr(r)+">") +s=b}q=s.as+(";<"+A.ht(r)+">") p=a.eC.get(q) if(p!=null)return p -o=new A.bU(null,null) +o=new A.bW(null,null) o.w=9 o.x=s o.y=r o.as=q -n=A.d8(a,o) +n=A.d9(a,o) a.eC.set(q,n) return n}, -tF(a,b,c){var s,r,q="+"+(b+"("+A.hr(c)+")"),p=a.eC.get(q) +tP(a,b,c){var s,r,q="+"+(b+"("+A.ht(c)+")"),p=a.eC.get(q) if(p!=null)return p -s=new A.bU(null,null) +s=new A.bW(null,null) s.w=10 s.x=b s.y=c s.as=q -r=A.d8(a,s) +r=A.d9(a,s) a.eC.set(q,r) return r}, -tC(a,b,c){var s,r,q,p,o,n=b.as,m=c.a,l=m.length,k=c.b,j=k.length,i=c.c,h=i.length,g="("+A.hr(m) +tM(a,b,c){var s,r,q,p,o,n=b.as,m=c.a,l=m.length,k=c.b,j=k.length,i=c.c,h=i.length,g="("+A.ht(m) if(j>0){s=l>0?",":"" -g+=s+"["+A.hr(k)+"]"}if(h>0){s=l>0?",":"" -g+=s+"{"+A.xs(i)+"}"}r=n+(g+")") +g+=s+"["+A.ht(k)+"]"}if(h>0){s=l>0?",":"" +g+=s+"{"+A.xC(i)+"}"}r=n+(g+")") q=a.eC.get(r) if(q!=null)return q -p=new A.bU(null,null) +p=new A.bW(null,null) p.w=11 p.x=b p.y=c p.as=r -o=A.d8(a,p) +o=A.d9(a,p) a.eC.set(r,o) return o}, -qE(a,b,c,d){var s,r=b.as+("<"+A.hr(c)+">"),q=a.eC.get(r) +qP(a,b,c,d){var s,r=b.as+("<"+A.ht(c)+">"),q=a.eC.get(r) if(q!=null)return q -s=A.xu(a,b,c,r,d) +s=A.xE(a,b,c,r,d) a.eC.set(r,s) return s}, -xu(a,b,c,d,e){var s,r,q,p,o,n,m,l +xE(a,b,c,d,e){var s,r,q,p,o,n,m,l if(e){s=c.length -r=A.p4(s) +r=A.pc(s) for(q=0,p=0;p0){n=A.da(a,b,r,0) +if(o.w===1){r[p]=o;++q}}if(q>0){n=A.db(a,b,r,0) m=A.eG(a,c,r,0) -return A.qE(a,n,m,c!==m)}}l=new A.bU(null,null) +return A.qP(a,n,m,c!==m)}}l=new A.bW(null,null) l.w=12 l.x=b l.y=c l.as=d -return A.d8(a,l)}, -tx(a,b,c,d){return{u:a,e:b,r:c,s:[],p:0,n:d}}, -tz(a){var s,r,q,p,o,n,m,l=a.r,k=a.s +return A.d9(a,l)}, +tH(a,b,c,d){return{u:a,e:b,r:c,s:[],p:0,n:d}}, +tJ(a){var s,r,q,p,o,n,m,l=a.r,k=a.s for(s=l.length,r=0;r=48&&q<=57)r=A.xk(r+1,q,l,k) -else if((((q|32)>>>0)-97&65535)<26||q===95||q===36||q===124)r=A.ty(a,r,l,k,!1) -else if(q===46)r=A.ty(a,r,l,k,!0) +if(q>=48&&q<=57)r=A.xu(r+1,q,l,k) +else if((((q|32)>>>0)-97&65535)<26||q===95||q===36||q===124)r=A.tI(a,r,l,k,!1) +else if(q===46)r=A.tI(a,r,l,k,!0) else{++r switch(q){case 44:break case 58:k.push(!1) @@ -1564,38 +1564,38 @@ case 33:k.push(!0) break case 59:k.push(A.dM(a.u,a.e,k.pop())) break -case 94:k.push(A.xw(a.u,k.pop())) +case 94:k.push(A.xG(a.u,k.pop())) break -case 35:k.push(A.ht(a.u,5,"#")) +case 35:k.push(A.hv(a.u,5,"#")) break -case 64:k.push(A.ht(a.u,2,"@")) +case 64:k.push(A.hv(a.u,2,"@")) break -case 126:k.push(A.ht(a.u,3,"~")) +case 126:k.push(A.hv(a.u,3,"~")) break case 60:k.push(a.p) a.p=k.length break -case 62:A.xm(a,k) +case 62:A.xw(a,k) break -case 38:A.xl(a,k) +case 38:A.xv(a,k) break case 63:p=a.u -k.push(A.tE(p,A.dM(p,a.e,k.pop()),a.n)) +k.push(A.tO(p,A.dM(p,a.e,k.pop()),a.n)) break case 47:p=a.u -k.push(A.tD(p,A.dM(p,a.e,k.pop()),a.n)) +k.push(A.tN(p,A.dM(p,a.e,k.pop()),a.n)) break case 40:k.push(-3) k.push(a.p) a.p=k.length break -case 41:A.xj(a,k) +case 41:A.xt(a,k) break case 91:k.push(a.p) a.p=k.length break case 93:o=k.splice(a.p) -A.tA(a.u,a.e,o) +A.tK(a.u,a.e,o) a.p=k.pop() k.push(o) k.push(-1) @@ -1604,7 +1604,7 @@ case 123:k.push(a.p) a.p=k.length break case 125:o=k.splice(a.p) -A.xo(a.u,a.e,o) +A.xy(a.u,a.e,o) a.p=k.pop() k.push(o) k.push(-2) @@ -1618,12 +1618,12 @@ r=n+1 break default:throw"Bad character "+q}}}m=k.pop() return A.dM(a.u,a.e,m)}, -xk(a,b,c,d){var s,r,q=b-48 +xu(a,b,c,d){var s,r,q=b-48 for(s=c.length;a=48&&r<=57))break q=q*10+(r-48)}d.push(q) return a}, -ty(a,b,c,d,e){var s,r,q,p,o,n,m=b+1 +tI(a,b,c,d,e){var s,r,q,p,o,n,m=b+1 for(s=c.length;m>>0)-97&65535)<26||r===95||r===36||r===124))q=r>=48&&r<=57 @@ -1632,25 +1632,25 @@ if(!q)break}}p=c.substring(b,m) if(e){s=a.u o=a.e if(o.w===9)o=o.x -n=A.xA(s,o.x)[p] -if(n==null)A.P('No "'+p+'" in "'+A.wK(o)+'"') -d.push(A.hu(s,o,n))}else d.push(p) +n=A.xK(s,o.x)[p] +if(n==null)A.M('No "'+p+'" in "'+A.wU(o)+'"') +d.push(A.hw(s,o,n))}else d.push(p) return m}, -xm(a,b){var s,r=a.u,q=A.tw(a,b),p=b.pop() -if(typeof p=="string")b.push(A.hs(r,p,q)) +xw(a,b){var s,r=a.u,q=A.tG(a,b),p=b.pop() +if(typeof p=="string")b.push(A.hu(r,p,q)) else{s=A.dM(r,a.e,p) -switch(s.w){case 11:b.push(A.qE(r,s,q,a.n)) +switch(s.w){case 11:b.push(A.qP(r,s,q,a.n)) break -default:b.push(A.qD(r,s,q)) +default:b.push(A.qO(r,s,q)) break}}}, -xj(a,b){var s,r,q,p=a.u,o=b.pop(),n=null,m=null +xt(a,b){var s,r,q,p=a.u,o=b.pop(),n=null,m=null if(typeof o=="number")switch(o){case-1:n=b.pop() break case-2:m=b.pop() break default:b.push(o) break}else b.push(o) -s=A.tw(a,b) +s=A.tG(a,b) o=b.pop() switch(o){case-3:o=b.pop() if(n==null)n=p.sEA @@ -1660,27 +1660,27 @@ q=new A.kO() q.a=s q.b=n q.c=m -b.push(A.tC(p,r,q)) +b.push(A.tM(p,r,q)) return -case-4:b.push(A.tF(p,b.pop(),s)) +case-4:b.push(A.tP(p,b.pop(),s)) return -default:throw A.f(A.hV("Unexpected state under `()`: "+A.k(o)))}}, -xl(a,b){var s=b.pop() -if(0===s){b.push(A.ht(a.u,1,"0&")) -return}if(1===s){b.push(A.ht(a.u,4,"1&")) -return}throw A.f(A.hV("Unexpected extended operation "+A.k(s)))}, -tw(a,b){var s=b.splice(a.p) -A.tA(a.u,a.e,s) +default:throw A.f(A.hX("Unexpected state under `()`: "+A.k(o)))}}, +xv(a,b){var s=b.pop() +if(0===s){b.push(A.hv(a.u,1,"0&")) +return}if(1===s){b.push(A.hv(a.u,4,"1&")) +return}throw A.f(A.hX("Unexpected extended operation "+A.k(s)))}, +tG(a,b){var s=b.splice(a.p) +A.tK(a.u,a.e,s) a.p=b.pop() return s}, -dM(a,b,c){if(typeof c=="string")return A.hs(a,c,a.sEA) +dM(a,b,c){if(typeof c=="string")return A.hu(a,c,a.sEA) else if(typeof c=="number"){b.toString -return A.xn(a,b,c)}else return c}, -tA(a,b,c){var s,r=c.length +return A.xx(a,b,c)}else return c}, +tK(a,b,c){var s,r=c.length for(s=0;s0?new Array(q):v.typeUniverse.sEA -for(o=0;o0?new Array(a):v.typeUniverse.sEA}, -bU:function bU(a,b){var _=this +pc(a){return a>0?new Array(a):v.typeUniverse.sEA}, +bW:function bW(a,b){var _=this _.a=a _.b=b _.r=_.f=_.d=_.c=null @@ -1806,77 +1806,77 @@ kO:function kO(){this.c=this.b=this.a=null}, kX:function kX(a){this.a=a}, kL:function kL(){}, eB:function eB(a){this.a=a}, -x3(){var s,r,q -if(self.scheduleImmediate!=null)return A.yF() +xd(){var s,r,q +if(self.scheduleImmediate!=null)return A.yP() if(self.MutationObserver!=null&&self.document!=null){s={} r=self.document.createElement("div") q=self.document.createElement("span") s.a=null -new self.MutationObserver(A.eI(new A.ov(s),1)).observe(r,{childList:true}) -return new A.ou(s,r,q)}else if(self.setImmediate!=null)return A.yG() -return A.yH()}, -x4(a){self.scheduleImmediate(A.eI(new A.ow(t.U.a(a)),0))}, -x5(a){self.setImmediate(A.eI(new A.ox(t.U.a(a)),0))}, -x6(a){t.U.a(a) -A.xq(0,a)}, -xq(a,b){var s=new A.oY() -s.jX(a,b) +new self.MutationObserver(A.eI(new A.oC(s),1)).observe(r,{childList:true}) +return new A.oB(s,r,q)}else if(self.setImmediate!=null)return A.yQ() +return A.yR()}, +xe(a){self.scheduleImmediate(A.eI(new A.oD(t.U.a(a)),0))}, +xf(a){self.setImmediate(A.eI(new A.oE(t.U.a(a)),0))}, +xg(a){t.U.a(a) +A.xA(0,a)}, +xA(a,b){var s=new A.p5() +s.jY(a,b) return s}, -br(a){return new A.kx(new A.aB($.an,a.h("aB<0>")),a.h("kx<0>"))}, +br(a){return new A.kx(new A.aF($.an,a.h("aF<0>")),a.h("kx<0>"))}, bq(a,b){a.$2(0,null) b.b=!0 return b.a}, -c3(a,b){A.xQ(a,b)}, -bp(a,b){b.eF(a)}, -bo(a,b){b.eG(A.bP(a),A.eJ(a))}, -xQ(a,b){var s,r,q=new A.p9(b),p=new A.pa(b) -if(a instanceof A.aB)a.hv(q,p,t.z) +bF(a,b){A.y_(a,b)}, +bp(a,b){b.eJ(a)}, +bo(a,b){b.eK(A.bQ(a),A.eJ(a))}, +y_(a,b){var s,r,q=new A.ph(b),p=new A.pi(b) +if(a instanceof A.aF)a.hw(q,p,t.z) else{s=t.z -if(a instanceof A.aB)a.fe(q,p,s) -else{r=new A.aB($.an,t.j_) +if(a instanceof A.aF)a.ff(q,p,s) +else{r=new A.aF($.an,t.j_) r.a=8 r.c=a -r.hv(q,p,s)}}}, +r.hw(q,p,s)}}}, bs(a){var s=function(b,c){return function(d,e){while(true){try{b(d,e) break}catch(r){e=r d=c}}}}(a,1) -return $.an.it(new A.ph(s),t.H,t.S,t.z)}, -q0(a){var s -if(t.fz.b(a)){s=a.gcf() +return $.an.iu(new A.pp(s),t.H,t.S,t.z)}, +qa(a){var s +if(t.fz.b(a)){s=a.gcg() if(s!=null)return s}return B.aV}, -y8(a,b){if($.an===B.a3)return null +yi(a,b){if($.an===B.a3)return null return null}, -y9(a,b){if($.an!==B.a3)A.y8(a,b) -if(b==null)if(t.fz.b(a)){b=a.gcf() -if(b==null){A.rR(a,B.aV) +yj(a,b){if($.an!==B.a3)A.yi(a,b) +if(b==null)if(t.fz.b(a)){b=a.gcg() +if(b==null){A.t0(a,B.aV) b=B.aV}}else b=B.aV -else if(t.fz.b(a))A.rR(a,b) -return new A.bG(a,b)}, -qz(a,b,c){var s,r,q,p,o={},n=o.a=a +else if(t.fz.b(a))A.t0(a,b) +return new A.bH(a,b)}, +qK(a,b,c){var s,r,q,p,o={},n=o.a=a for(s=t.j_;r=n.a,(r&4)!==0;n=a){a=s.a(n.c) -o.a=a}if(n===b){s=A.wO() -b.e9(new A.bG(new A.bR(!0,n,null,"Cannot complete a future with itself"),s)) +o.a=a}if(n===b){s=A.wY() +b.ed(new A.bH(new A.bS(!0,n,null,"Cannot complete a future with itself"),s)) return}q=b.a&1 s=n.a=r|q if((s&24)===0){p=t.np.a(b.c) b.a=b.a&1|4 b.c=n -n.hm(p) +n.hn(p) return}if(!c)if(b.c==null)n=(s&16)===0||q!==0 else n=!1 else n=!0 -if(n){p=b.dq() -b.dg(o.a) +if(n){p=b.dt() +b.dk(o.a) A.ex(b,p) return}b.a^=2 -A.ly(null,null,b.b,t.U.a(new A.oI(o,b)))}, +A.ly(null,null,b.b,t.U.a(new A.oQ(o,b)))}, ex(a,b){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d={},c=d.a=a for(s=t.B,r=t.np;;){q={} p=c.a o=(p&16)===0 n=!o if(b==null){if(n&&(p&1)===0){m=s.a(c.c) -A.qO(m.a,m.b)}return}q.a=b +A.qZ(m.a,m.b)}return}q.a=b l=b.a for(c=b;l!=null;c=l,l=k){c.a=null A.ex(d.a,c) @@ -1891,29 +1891,29 @@ if(i){h=c.b.b if(n){p=p.b===h p=!(p||p)}else p=!1 if(p){s.a(j) -A.qO(j.a,j.b) +A.qZ(j.a,j.b) return}g=$.an if(g!==h)$.an=h else g=null c=c.c -if((c&15)===8)new A.oM(q,d,n).$0() -else if(o){if((c&1)!==0)new A.oL(q,j).$0()}else if((c&2)!==0)new A.oK(d,q).$0() +if((c&15)===8)new A.oU(q,d,n).$0() +else if(o){if((c&1)!==0)new A.oT(q,j).$0()}else if((c&2)!==0)new A.oS(d,q).$0() if(g!=null)$.an=g c=q.c -if(c instanceof A.aB){p=q.a.$ti -p=p.h("cr<2>").b(c)||!p.y[1].b(c)}else p=!1 +if(c instanceof A.aF){p=q.a.$ti +p=p.h("ct<2>").b(c)||!p.y[1].b(c)}else p=!1 if(p){f=q.a.b if((c.a&24)!==0){e=r.a(f.c) f.c=null -b=f.dr(e) +b=f.du(e) f.a=c.a&30|f.a&1 f.c=c.c d.a=c -continue}else A.qz(c,f,!0) +continue}else A.qK(c,f,!0) return}}f=q.a.b e=r.a(f.c) f.c=null -b=f.dr(e) +b=f.du(e) c=q.b p=q.c if(!c){f.$ti.c.a(p) @@ -1922,77 +1922,77 @@ f.c=p}else{s.a(p) f.a=f.a&1|16 f.c=p}d.a=f c=f}}, -yr(a,b){var s -if(t.ng.b(a))return b.it(a,t.z,t.K,t.F) +yB(a,b){var s +if(t.ng.b(a))return b.iu(a,t.z,t.K,t.F) s=t.mq if(s.b(a))return s.a(a) -throw A.f(A.q_(a,"onError",u.w))}, -yp(){var s,r -for(s=$.eF;s!=null;s=$.eF){$.hE=null +throw A.f(A.q9(a,"onError",u.w))}, +yz(){var s,r +for(s=$.eF;s!=null;s=$.eF){$.hG=null r=s.b $.eF=r -if(r==null)$.hD=null +if(r==null)$.hF=null s.a.$0()}}, -yy(){$.qM=!0 -try{A.yp()}finally{$.hE=null -$.qM=!1 -if($.eF!=null)$.r5().$1(A.uh())}}, -uc(a){var s=new A.ky(a),r=$.hD -if(r==null){$.eF=$.hD=s -if(!$.qM)$.r5().$1(A.uh())}else $.hD=r.b=s}, -yu(a){var s,r,q,p=$.eF -if(p==null){A.uc(a) -$.hE=$.hD +yI(){$.qX=!0 +try{A.yz()}finally{$.hG=null +$.qX=!1 +if($.eF!=null)$.rg().$1(A.ur())}}, +um(a){var s=new A.ky(a),r=$.hF +if(r==null){$.eF=$.hF=s +if(!$.qX)$.rg().$1(A.ur())}else $.hF=r.b=s}, +yE(a){var s,r,q,p=$.eF +if(p==null){A.um(a) +$.hG=$.hF return}s=new A.ky(a) -r=$.hE +r=$.hG if(r==null){s.b=p -$.eF=$.hE=s}else{q=r.b +$.eF=$.hG=s}else{q=r.b s.b=q -$.hE=r.b=s -if(q==null)$.hD=s}}, -zQ(a,b){A.dP(a,"stream",t.K) +$.hG=r.b=s +if(q==null)$.hF=s}}, +zY(a,b){A.dP(a,"stream",t.K) return new A.kT(b.h("kT<0>"))}, -qO(a,b){A.yu(new A.pf(a,b))}, -u9(a,b,c,d,e){var s,r=$.an +qZ(a,b){A.yE(new A.pn(a,b))}, +uj(a,b,c,d,e){var s,r=$.an if(r===c)return d.$0() $.an=c s=r try{r=d.$0() return r}finally{$.an=s}}, -yt(a,b,c,d,e,f,g){var s,r=$.an +yD(a,b,c,d,e,f,g){var s,r=$.an if(r===c)return d.$1(e) $.an=c s=r try{r=d.$1(e) return r}finally{$.an=s}}, -ys(a,b,c,d,e,f,g,h,i){var s,r=$.an +yC(a,b,c,d,e,f,g,h,i){var s,r=$.an if(r===c)return d.$2(e,f) $.an=c s=r try{r=d.$2(e,f) return r}finally{$.an=s}}, ly(a,b,c,d){t.U.a(d) -if(B.a3!==c){d=c.lO(d) -d=d}A.uc(d)}, -ov:function ov(a){this.a=a}, -ou:function ou(a,b,c){this.a=a +if(B.a3!==c){d=c.lQ(d) +d=d}A.um(d)}, +oC:function oC(a){this.a=a}, +oB:function oB(a,b,c){this.a=a this.b=b this.c=c}, -ow:function ow(a){this.a=a}, -ox:function ox(a){this.a=a}, -oY:function oY(){}, -oZ:function oZ(a,b){this.a=a +oD:function oD(a){this.a=a}, +oE:function oE(a){this.a=a}, +p5:function p5(){}, +p6:function p6(a,b){this.a=a this.b=b}, kx:function kx(a,b){this.a=a this.b=!1 this.$ti=b}, -p9:function p9(a){this.a=a}, -pa:function pa(a){this.a=a}, ph:function ph(a){this.a=a}, -bG:function bG(a,b){this.a=a +pi:function pi(a){this.a=a}, +pp:function pp(a){this.a=a}, +bH:function bH(a,b){this.a=a this.b=b}, kC:function kC(){}, -h8:function h8(a,b){this.a=a +ha:function ha(a,b){this.a=a this.$ti=b}, dJ:function dJ(a,b,c,d,e){var _=this _.a=null @@ -2001,94 +2001,94 @@ _.c=b _.d=c _.e=d _.$ti=e}, -aB:function aB(a,b){var _=this +aF:function aF(a,b){var _=this _.a=0 _.b=a _.c=null _.$ti=b}, -oF:function oF(a,b){this.a=a +oN:function oN(a,b){this.a=a this.b=b}, -oJ:function oJ(a,b){this.a=a +oR:function oR(a,b){this.a=a this.b=b}, -oI:function oI(a,b){this.a=a +oQ:function oQ(a,b){this.a=a this.b=b}, -oH:function oH(a,b){this.a=a +oP:function oP(a,b){this.a=a this.b=b}, -oG:function oG(a,b){this.a=a +oO:function oO(a,b){this.a=a this.b=b}, -oM:function oM(a,b,c){this.a=a +oU:function oU(a,b,c){this.a=a this.b=b this.c=c}, -oN:function oN(a,b){this.a=a +oV:function oV(a,b){this.a=a this.b=b}, -oO:function oO(a){this.a=a}, -oL:function oL(a,b){this.a=a +oW:function oW(a){this.a=a}, +oT:function oT(a,b){this.a=a this.b=b}, -oK:function oK(a,b){this.a=a +oS:function oS(a,b){this.a=a this.b=b}, ky:function ky(a){this.a=a this.b=null}, kT:function kT(a){this.$ti=a}, -hz:function hz(){}, +hB:function hB(){}, kS:function kS(){}, -oX:function oX(a,b){this.a=a +p4:function p4(a,b){this.a=a this.b=b}, -pf:function pf(a,b){this.a=a +pn:function pn(a,b){this.a=a this.b=b}, -rr(a,b,c,d,e){if(c==null)if(b==null){if(a==null)return new A.cJ(d.h("@<0>").u(e).h("cJ<1,2>")) -b=A.ul()}else{if(A.yU()===b&&A.yT()===a)return new A.dK(d.h("@<0>").u(e).h("dK<1,2>")) -if(a==null)a=A.uk()}else{if(b==null)b=A.ul() -if(a==null)a=A.uk()}return A.xc(a,b,c,d,e)}, -tt(a,b){var s=a[b] +rC(a,b,c,d,e){if(c==null)if(b==null){if(a==null)return new A.cL(d.h("@<0>").u(e).h("cL<1,2>")) +b=A.uw()}else{if(A.z2()===b&&A.z1()===a)return new A.dK(d.h("@<0>").u(e).h("dK<1,2>")) +if(a==null)a=A.uv()}else{if(b==null)b=A.uw() +if(a==null)a=A.uv()}return A.xm(a,b,c,d,e)}, +tD(a,b){var s=a[b] return s===a?null:s}, -qB(a,b,c){if(c==null)a[b]=a +qM(a,b,c){if(c==null)a[b]=a else a[b]=c}, -qA(){var s=Object.create(null) -A.qB(s,"",s) +qL(){var s=Object.create(null) +A.qM(s,"",s) delete s[""] return s}, -xc(a,b,c,d,e){var s=c!=null?c:new A.oD(d) -return new A.ha(a,b,s,d.h("@<0>").u(e).h("ha<1,2>"))}, -ae(a,b){return new A.bx(a.h("@<0>").u(b).h("bx<1,2>"))}, -v(a,b,c){return b.h("@<0>").u(c).h("mL<1,2>").a(A.us(a,new A.bx(b.h("@<0>").u(c).h("bx<1,2>"))))}, -az(a,b){return new A.bx(a.h("@<0>").u(b).h("bx<1,2>"))}, -w2(a){return new A.cL(a.h("cL<0>"))}, -j3(a){return new A.cL(a.h("cL<0>"))}, -w3(a,b){return b.h("rB<0>").a(A.z5(a,new A.cL(b.h("cL<0>"))))}, -qC(){var s=Object.create(null) +xm(a,b,c,d,e){var s=c!=null?c:new A.oL(d) +return new A.hc(a,b,s,d.h("@<0>").u(e).h("hc<1,2>"))}, +aa(a,b){return new A.bx(a.h("@<0>").u(b).h("bx<1,2>"))}, +v(a,b,c){return b.h("@<0>").u(c).h("mR<1,2>").a(A.uD(a,new A.bx(b.h("@<0>").u(c).h("bx<1,2>"))))}, +aA(a,b){return new A.bx(a.h("@<0>").u(b).h("bx<1,2>"))}, +wc(a){return new A.cN(a.h("cN<0>"))}, +j3(a){return new A.cN(a.h("cN<0>"))}, +wd(a,b){return b.h("rL<0>").a(A.ze(a,new A.cN(b.h("cN<0>"))))}, +qN(){var s=Object.create(null) s[""]=s delete s[""] return s}, -tv(a,b,c){var s=new A.dL(a,b,c.h("dL<0>")) +tF(a,b,c){var s=new A.dL(a,b,c.h("dL<0>")) s.c=a.e return s}, -xV(a,b){return J.N(a,b)}, -xW(a){return J.B(a)}, -vV(a,b){var s,r=a.$ti,q=new A.du(J.at(a.a),a.b,r.h("du<1,2>")) +y4(a,b){return J.O(a,b)}, +y5(a){return J.C(a)}, +qd(a,b){var s,r=a.$ti,q=new A.du(J.aw(a.a),a.b,r.h("du<1,2>")) if(q.p()){s=q.a return s==null?r.y[1].a(s):s}return null}, -j2(a,b,c){var s=A.ae(b,c) -a.T(0,new A.mN(s,b,c)) +j2(a,b,c){var s=A.aa(b,c) +a.T(0,new A.mT(s,b,c)) return s}, -w1(a,b,c){var s=A.ae(b,c) +wb(a,b,c){var s=A.aa(b,c) s.a1(0,a) return s}, -w4(a,b){var s=t.bP -return J.r8(s.a(a),s.a(b))}, -q9(a){var s,r -if(A.qX(a))return"{...}" -s=new A.Y("") +we(a,b){var s=t.bP +return J.rj(s.a(a),s.a(b))}, +qk(a){var s,r +if(A.r7(a))return"{...}" +s=new A.X("") try{r={} -B.a.l($.bF,a) +B.a.l($.bG,a) s.a+="{" r.a=!0 -a.T(0,new A.mO(r,s)) -s.a+="}"}finally{if(0>=$.bF.length)return A.c($.bF,-1) -$.bF.pop()}r=s.a +a.T(0,new A.mU(r,s)) +s.a+="}"}finally{if(0>=$.bG.length)return A.c($.bG,-1) +$.bG.pop()}r=s.a return r.charCodeAt(0)==0?r:r}, -q7(a){return new A.fp(A.aE(A.w5(null),null,!1,a.h("0?")),a.h("fp<0>"))}, -w5(a){return 8}, -cJ:function cJ(a){var _=this +qi(a){return new A.fr(A.aB(A.wf(null),null,!1,a.h("0?")),a.h("fr<0>"))}, +wf(a){return 8}, +cL:function cL(a){var _=this _.a=0 _.e=_.d=_.c=_.b=null _.$ti=a}, @@ -2096,23 +2096,23 @@ dK:function dK(a){var _=this _.a=0 _.e=_.d=_.c=_.b=null _.$ti=a}, -ha:function ha(a,b,c,d){var _=this +hc:function hc(a,b,c,d){var _=this _.f=a _.r=b _.w=c _.a=0 _.e=_.d=_.c=_.b=null _.$ti=d}, -oD:function oD(a){this.a=a}, -hc:function hc(a,b){this.a=a +oL:function oL(a){this.a=a}, +he:function he(a,b){this.a=a this.$ti=b}, -hd:function hd(a,b,c){var _=this +hf:function hf(a,b,c){var _=this _.a=a _.b=b _.c=0 _.d=null _.$ti=c}, -cL:function cL(a){var _=this +cN:function cN(a){var _=this _.a=0 _.f=_.e=_.d=_.c=_.b=null _.r=0 @@ -2124,51 +2124,51 @@ _.a=a _.b=b _.d=_.c=null _.$ti=c}, -cE:function cE(a,b){this.a=a +cG:function cG(a,b){this.a=a this.$ti=b}, -mN:function mN(a,b,c){this.a=a +mT:function mT(a,b,c){this.a=a this.b=b this.c=c}, -C:function C(){}, -a9:function a9(){}, -mO:function mO(a,b){this.a=a +B:function B(){}, +ab:function ab(){}, +mU:function mU(a,b){this.a=a this.b=b}, -hv:function hv(){}, +hx:function hx(){}, ea:function ea(){}, dG:function dG(a,b){this.a=a this.$ti=b}, -fp:function fp(a,b){var _=this +fr:function fr(a,b){var _=this _.a=a _.d=_.c=_.b=0 _.$ti=b}, -hf:function hf(a,b,c,d,e){var _=this +hh:function hh(a,b,c,d,e){var _=this _.a=a _.b=b _.c=c _.d=d _.e=null _.$ti=e}, -aY:function aY(){}, -hp:function hp(){}, +b2:function b2(){}, +hr:function hr(){}, eC:function eC(){}, -xJ(a,b,c){var s,r,q,p,o=c-b -if(o<=4096)s=$.v9() +xT(a,b,c){var s,r,q,p,o=c-b +if(o<=4096)s=$.vl() else s=new Uint8Array(o) -for(r=J.ad(a),q=0;q>>2,h=3-(a0&3) -for(s=J.ad(b),r=a.length,q=f.$flags|0,p=c,o=0;p>>2,h=3-(a0&3) +for(s=J.ae(b),r=a.length,q=f.$flags|0,p=c,o=0;p>>0 i=(i<<8|n)&16777215;--h if(h===0){m=g+1 @@ -2227,15 +2227,15 @@ if(!(j>>0}for(p=c;p255)break;++p}throw A.f(A.q_(b,"Not a byte value at index "+p+": 0x"+B.f.d6(s.m(b,p),16),null))}, -rz(a,b,c){return new A.fl(a,b)}, -xX(a){return a.oD()}, -xh(a,b){return new A.oR(a,[],A.yR())}, -xi(a,b,c){var s,r=new A.Y(""),q=A.xh(r,b) -q.dY(a) +if(n<0||n>255)break;++p}throw A.f(A.q9(b,"Not a byte value at index "+p+": 0x"+B.f.d9(s.m(b,p),16),null))}, +rJ(a,b,c){return new A.fn(a,b)}, +y6(a){return a.oG()}, +xr(a,b){return new A.oZ(a,[],A.z_())}, +xs(a,b,c){var s,r=new A.X(""),q=A.xr(r,b) +q.e1(a) s=r.a return s.charCodeAt(0)==0?s:s}, -xK(a){switch(a){case 65:return"Missing extension byte" +xU(a){switch(a){case 65:return"Missing extension byte" case 67:return"Unexpected extension byte" case 69:return"Invalid UTF-8 byte" case 71:return"Overlong encoding" @@ -2243,29 +2243,29 @@ case 73:return"Out of unicode range" case 75:return"Encoded surrogate" case 77:return"Unfinished UTF-8 octet sequence" default:return""}}, -p3:function p3(){}, -p2:function p2(){}, -hS:function hS(){}, +pb:function pb(){}, +pa:function pa(){}, +hU:function hU(){}, kY:function kY(){}, -hT:function hT(a,b){this.a=a +hV:function hV(a,b){this.a=a this.b=b}, eL:function eL(){}, -hX:function hX(){}, -oy:function oy(a){this.a=0 +hZ:function hZ(){}, +oF:function oF(a){this.a=0 this.b=a}, bt:function bt(){}, -cl:function cl(){}, +cn:function cn(){}, ic:function ic(){}, -fl:function fl(a,b){this.a=a +fn:function fn(a,b){this.a=a this.b=b}, iZ:function iZ(a,b){this.a=a this.b=b}, iY:function iY(){}, j_:function j_(a){this.b=a}, -oS:function oS(){}, -oT:function oT(a,b){this.a=a +p_:function p_(){}, +p0:function p0(a,b){this.a=a this.b=b}, -oR:function oR(a,b,c){this.c=a +oZ:function oZ(a,b,c){this.c=a this.a=b this.b=c}, k4:function k4(){}, @@ -2273,49 +2273,49 @@ k5:function k5(a){this.a=a}, kZ:function kZ(a){this.a=a this.b=16 this.c=0}, -b1(a,b){var s,r=b.length +b4(a,b){var s,r=b.length for(;;){if(a>0){s=a-1 if(!(s=0&&q>>0)+(s[6]>>>4)-1075 @@ -2324,11 +2324,11 @@ o[0]=(s[1]<<8>>>0)+s[0] o[1]=(s[3]<<8>>>0)+s[2] o[2]=(s[5]<<8>>>0)+s[4] o[3]=s[6]&15|16 -n=new A.aq(!1,o,4) -if(p<0)m=n.e5(0,-p) +n=new A.as(!1,o,4) +if(p<0)m=n.e9(0,-p) else m=p>0?n.aW(0,p):n return m}, -qw(a,b,c,d){var s,r,q,p,o +qH(a,b,c,d){var s,r,q,p,o if(b===0)return 0 if(c===0&&d===a)return b for(s=b-1,r=a.length,q=d.$flags|0;s>=0;--s){p=s+c @@ -2339,30 +2339,30 @@ if(!(p>=0&&p=0;--s){q&2&&A.t(d) if(!(s=0;--s){if(!(s=0&&n>>0 p=B.f.aW(o&i,k)}q&2&&A.t(d) if(!(l>=0&&l=0;){r&2&&A.t(d) if(!(q=0&&r=0&&m>>0 -s=B.f.cI(n,l)}q&2&&A.t(d) +s=B.f.cK(n,l)}q&2&&A.t(d) if(!(r>=0&&r=0;--s){if(!(s=0;e=l,c=o){o=c+1 if(!(c=0&&e=0&&e=0&&c=0&&r>>0,a) +q=B.f.fM((s<<16|b[r])>>>0,a) if(q>65535)return 65535 return q}, -zb(a){return A.lB(a)}, +zk(a){return A.lB(a)}, lA(a,b){var s=A.jD(a,b) if(s!=null)return s -throw A.f(A.aD(a,null,null))}, -z_(a){var s=A.qf(a) +throw A.f(A.aq(a,null,null))}, +z8(a){var s=A.qq(a) if(s!=null)return s -throw A.f(A.aD("Invalid double",a,null))}, -vK(a,b){a=A.ar(a,new Error()) -if(a==null)a=A.cg(a) +throw A.f(A.aq("Invalid double",a,null))}, +vV(a,b){a=A.au(a,new Error()) +if(a==null)a=A.cj(a) a.stack=b.j(0) throw a}, -aE(a,b,c,d){var s,r=c?J.vX(a,d):J.q2(a,d) +aB(a,b,c,d){var s,r=c?J.w6(a,d):J.mO(a,d) if(a!==0&&b!=null)for(s=0;s")) -for(s=J.at(a);s.p();)B.a.l(r,c.a(s.gB())) +qj(a,b,c){var s,r=A.i([],c.h("y<0>")) +for(s=J.aw(a);s.p();)B.a.l(r,c.a(s.gB())) if(b)return r r.$flags=1 return r}, -a7(a,b){var s,r +a8(a,b){var s,r if(Array.isArray(a))return A.i(a.slice(0),b.h("y<0>")) s=A.i([],b.h("y<0>")) -for(r=J.at(a);r.p();)B.a.l(s,r.gB()) +for(r=J.aw(a);r.p();)B.a.l(s,r.gB()) return s}, -rC(a,b){var s=A.q8(a,!1,b) +rM(a,b){var s=A.qj(a,!1,b) s.$flags=3 return s}, -aA(a,b,c){var s,r,q,p,o -A.aF(b,"start") +aD(a,b,c){var s,r,q,p,o +A.aH(b,"start") s=c==null r=!s if(r){q=c-b @@ -2471,90 +2471,90 @@ if(q<0)throw A.f(A.af(c,b,null,"end",null)) if(q===0)return""}if(Array.isArray(a)){p=a o=p.length if(s)c=o -return A.rQ(b>0||c0||c0)a=J.lF(a,b) -s=A.a7(a,t.S) -return A.rQ(s)}, -wQ(a,b,c){var s=a.length +s=A.a8(a,t.S) +return A.t_(s)}, +x_(a,b,c){var s=a.length if(b>=s)return"" -return A.wG(a,b,c==null||c>s?s:c)}, -a5(a,b){return new A.cV(a,A.q3(a,!1,b,!1,!1,""))}, -za(a,b){return a==null?b==null:a===b}, -qj(a,b,c){var s=J.at(b) +return A.wQ(a,b,c==null||c>s?s:c)}, +a3(a,b){return new A.cX(a,A.qe(a,!1,b,!1,!1,""))}, +zj(a,b){return a==null?b==null:a===b}, +qu(a,b,c){var s=J.aw(b) if(!s.p())return a if(c.length===0){do a+=A.k(s.gB()) while(s.p())}else{a+=A.k(s.gB()) while(s.p())a=a+c+A.k(s.gB())}return a}, -n6(a,b){return new A.jh(a,b.gnt(),b.gnJ(),b.gnz())}, -qp(){var s,r,q=A.ww() -if(q==null)throw A.f(A.ac("'Uri.base' is not supported")) -s=$.t7 -if(s!=null&&q===$.t6)return s -r=A.nT(q,0,null) -$.t7=r -$.t6=q +nc(a,b){return new A.jh(a,b.gnv(),b.gnL(),b.gnB())}, +qA(){var s,r,q=A.wG() +if(q==null)throw A.f(A.a6("'Uri.base' is not supported")) +s=$.th +if(s!=null&&q===$.tg)return s +r=A.o_(q,0,null) +$.th=r +$.tg=q return r}, -wO(){return A.eJ(new Error())}, -vH(a){var s=Math.abs(a),r=a<0?"-":"" +wY(){return A.eJ(new Error())}, +vS(a){var s=Math.abs(a),r=a<0?"-":"" if(s>=1000)return""+a if(s>=100)return r+"0"+s if(s>=10)return r+"00"+s return r+"000"+s}, -rn(a){if(a>=100)return""+a +ry(a){if(a>=100)return""+a if(a>=10)return"0"+a return"00"+a}, -i8(a){if(a>=10)return""+a +i9(a){if(a>=10)return""+a return"0"+a}, -dm(a){if(typeof a=="number"||A.qL(a)||a==null)return J.ay(a) +dn(a){if(typeof a=="number"||A.qW(a)||a==null)return J.ao(a) if(typeof a=="string")return JSON.stringify(a) -return A.rP(a)}, -vL(a,b){A.dP(a,"error",t.K) +return A.rZ(a)}, +vW(a,b){A.dP(a,"error",t.K) A.dP(b,"stackTrace",t.F) -A.vK(a,b)}, -hV(a){return new A.hU(a)}, -W(a,b){return new A.bR(!1,null,b,a)}, -q_(a,b,c){return new A.bR(!0,a,b,c)}, -hR(a,b,c){return a}, -aQ(a){var s=null +A.vV(a,b)}, +hX(a){return new A.hW(a)}, +W(a,b){return new A.bS(!1,null,b,a)}, +q9(a,b,c){return new A.bS(!0,a,b,c)}, +hT(a,b,c){return a}, +aT(a){var s=null return new A.ef(s,s,!1,s,s,a)}, -nu(a,b){return new A.ef(null,null,!0,a,b,"Value not in range")}, +nA(a,b){return new A.ef(null,null,!0,a,b,"Value not in range")}, af(a,b,c,d,e){return new A.ef(b,c,!0,a,d,"Invalid value")}, -rS(a,b,c,d){if(ac)throw A.f(A.af(a,b,c,d,null)) +t1(a,b,c,d){if(ac)throw A.f(A.af(a,b,c,d,null)) return a}, -cw(a,b,c){if(0>a||a>c)throw A.f(A.af(a,0,c,"start",null)) +cy(a,b,c){if(0>a||a>c)throw A.f(A.af(a,0,c,"start",null)) if(b!=null){if(a>b||b>c)throw A.f(A.af(b,a,c,"end",null)) return b}return c}, -aF(a,b){if(a<0)throw A.f(A.af(a,0,null,b,null)) +aH(a,b){if(a<0)throw A.f(A.af(a,0,null,b,null)) return a}, -vR(a,b,c,d,e){var s=e==null?b.gn(b):e -return new A.fh(s,!0,a,c,"Index out of range")}, -iM(a,b,c,d,e){return new A.fh(b,!0,a,e,"Index out of range")}, -vS(a,b,c,d,e){if(0>a||a>=b)throw A.f(A.iM(a,b,c,d,"index")) +w1(a,b,c,d,e){var s=e==null?b.gn(b):e +return new A.fj(s,!0,a,c,"Index out of range")}, +iM(a,b,c,d,e){return new A.fj(b,!0,a,e,"Index out of range")}, +w2(a,b,c,d,e){if(0>a||a>=b)throw A.f(A.iM(a,b,c,d,"index")) return a}, -ac(a){return new A.fX(a)}, -k_(a){return new A.fW(a)}, -ce(a){return new A.dD(a)}, -ai(a){return new A.i7(a)}, +a6(a){return new A.fZ(a)}, +k_(a){return new A.fY(a)}, +ch(a){return new A.dD(a)}, +ai(a){return new A.i8(a)}, S(a){return new A.kM(a)}, -aD(a,b,c){return new A.aC(a,b,c)}, -vW(a,b,c){var s,r -if(A.qX(a)){if(b==="("&&c===")")return"(...)" +aq(a,b,c){return new A.aG(a,b,c)}, +w5(a,b,c){var s,r +if(A.r7(a)){if(b==="("&&c===")")return"(...)" return b+"..."+c}s=A.i([],t.s) -B.a.l($.bF,a) -try{A.yn(a,s)}finally{if(0>=$.bF.length)return A.c($.bF,-1) -$.bF.pop()}r=A.qj(b,t.e7.a(s),", ")+c +B.a.l($.bG,a) +try{A.yx(a,s)}finally{if(0>=$.bG.length)return A.c($.bG,-1) +$.bG.pop()}r=A.qu(b,t.e7.a(s),", ")+c return r.charCodeAt(0)==0?r:r}, iT(a,b,c){var s,r -if(A.qX(a))return b+"..."+c -s=new A.Y(b) -B.a.l($.bF,a) +if(A.r7(a))return b+"..."+c +s=new A.X(b) +B.a.l($.bG,a) try{r=s -r.a=A.qj(r.a,a,", ")}finally{if(0>=$.bF.length)return A.c($.bF,-1) -$.bF.pop()}s.a+=c +r.a=A.qu(r.a,a,", ")}finally{if(0>=$.bG.length)return A.c($.bG,-1) +$.bG.pop()}s.a+=c r=s.a return r.charCodeAt(0)==0?r:r}, -yn(a,b){var s,r,q,p,o,n,m,l=a.gF(a),k=0,j=0 +yx(a,b){var s,r,q,p,o,n,m,l=a.gF(a),k=0,j=0 for(;;){if(!(k<80||j<3))break if(!l.p())return s=A.k(l.gB()) @@ -2584,24 +2584,24 @@ if(m==null){k+=5 m="..."}}if(m!=null)B.a.l(b,m) B.a.l(b,q) B.a.l(b,r)}, -rD(a,b,c,d,e){return new A.df(a,b.h("@<0>").u(c).u(d).u(e).h("df<1,2,3,4>"))}, -aX(a,b,c,d){var s -if(B.u===c){s=J.B(a) -b=J.B(b) -return A.nN(A.cz(A.cz($.lD(),s),b))}if(B.u===d){s=J.B(a) -b=J.B(b) -c=J.B(c) -return A.nN(A.cz(A.cz(A.cz($.lD(),s),b),c))}s=J.B(a) -b=J.B(b) -c=J.B(c) -d=J.B(d) -d=A.nN(A.cz(A.cz(A.cz(A.cz($.lD(),s),b),c),d)) +rN(a,b,c,d,e){return new A.dg(a,b.h("@<0>").u(c).u(d).u(e).h("dg<1,2,3,4>"))}, +b1(a,b,c,d){var s +if(B.u===c){s=J.C(a) +b=J.C(b) +return A.nT(A.cB(A.cB($.lD(),s),b))}if(B.u===d){s=J.C(a) +b=J.C(b) +c=J.C(c) +return A.nT(A.cB(A.cB(A.cB($.lD(),s),b),c))}s=J.C(a) +b=J.C(b) +c=J.C(c) +d=J.C(d) +d=A.nT(A.cB(A.cB(A.cB(A.cB($.lD(),s),b),c),d)) return d}, -wk(a){var s,r,q=$.lD() -for(s=a.length,r=0;r=s){r=a7+4 @@ -2614,8 +2614,8 @@ if(!(p>>0 -if(n===0)return A.t5(a7>0||a80||a8=14)B.a.k(m,7,a8) +if(A.ul(a6,a7,a8,0,m)>=14)B.a.k(m,7,a8) l=m[1] -if(l>=a7)if(A.ub(a6,a7,l,20,m)===20)m[7]=l +if(l>=a7)if(A.ul(a6,a7,l,20,m)===20)m[7]=l k=m[2]+1 j=m[3] i=m[4] @@ -2660,7 +2660,7 @@ k=7 j=7 i=7}else if(i===h){s=a7===0 s -if(s){a6=B.b.bR(a6,i,h,"/");++h;++g;++a8}else{a6=B.b.t(a6,a7,i)+"/"+B.b.t(a6,h,a8) +if(s){a6=B.b.bS(a6,i,h,"/");++h;++g;++a8}else{a6=B.b.t(a6,a7,i)+"/"+B.b.t(a6,h,a8) l-=a7 k-=a7 j-=a7 @@ -2671,7 +2671,7 @@ g+=s a8=a6.length a7=d}}e="file"}else if(B.b.aa(a6,"http",a7)){if(r&&j+3===i&&B.b.aa(a6,"80",j+1)){s=a7===0 s -if(s){a6=B.b.bR(a6,j,i,"") +if(s){a6=B.b.bS(a6,j,i,"") i-=3 h-=3 g-=3 @@ -2686,7 +2686,7 @@ g-=s a8=a6.length a7=d}}e="http"}}else if(l===s&&B.b.aa(a6,"https",a7)){if(r&&j+4===i&&B.b.aa(a6,"443",j+1)){s=a7===0 s -if(s){a6=B.b.bR(a6,j,i,"") +if(s){a6=B.b.bS(a6,j,i,"") i-=4 h-=4 g-=4 @@ -2705,26 +2705,26 @@ k-=a7 j-=a7 i-=a7 h-=a7 -g-=a7}return new A.bN(a6,l,k,j,i,h,g,e)}if(e==null)if(l>a7)e=A.qG(a6,a7,l) +g-=a7}return new A.bO(a6,l,k,j,i,h,g,e)}if(e==null)if(l>a7)e=A.qR(a6,a7,l) else{if(l===a7)A.eD(a6,a7,"Invalid empty scheme") e=""}b=a5 if(k>a7){a=l+3 -a0=a=c)n=0 else{if(!(q>=0&&q=0&&b=0&&r=97&&o<=102)continue -if(p===46){if(q-1===b)return new A.aC(n,a,q) +if(p===46){if(q-1===b)return new A.aG(n,a,q) r=q -break}return new A.aC("Unexpected character",a,q-1)}if(r-1===b)return new A.aC(n,a,r) -return new A.aC("Missing '.' in IPvFuture address",a,r)}if(r===c)return new A.aC("Missing address in IPvFuture address, host, cursor",null,null) +break}return new A.aG("Unexpected character",a,q-1)}if(r-1===b)return new A.aG(n,a,r) +return new A.aG("Missing '.' in IPvFuture address",a,r)}if(r===c)return new A.aG("Missing address in IPvFuture address, host, cursor",null,null) for(;;){if(!(r>=0&&r=97&&f<=102)g=f-87 else break A k=h}if(nm){if(j===46){if(k){if(p<=6){A.wU(a3,m,a5,s,p*2) +continue}a2.$2("an IPv6 part can contain a maximum of 4 hex digits",m)}if(n>m){if(j===46){if(k){if(p<=6){A.x3(a3,m,a5,s,p*2) p+=2 n=a5 break}a2.$2(a1,m)}break}o=p*2 @@ -2816,19 +2816,19 @@ b=p-c if(b>0){a=c*2 a0=16-b*2 B.k.bb(s,a0,16,s,a) -B.k.c5(s,a,a0,0)}}return s}, -hx(a,b,c,d,e,f,g){return new A.hw(a,b,c,d,e,f,g)}, -tH(a){if(a==="http")return 80 +B.k.c6(s,a,a0,0)}}return s}, +hz(a,b,c,d,e,f,g){return new A.hy(a,b,c,d,e,f,g)}, +tR(a){if(a==="http")return 80 if(a==="https")return 443 return 0}, -eD(a,b,c){throw A.f(A.aD(c,a,b))}, -xC(a,b){var s,r,q +eD(a,b,c){throw A.f(A.aq(c,a,b))}, +xM(a,b){var s,r,q for(s=a.length,r=0;r=b&&o=b&&s=0&&r=o){if(h==null)h=new A.Y("") +p=!0}else if(o<127&&(u.S.charCodeAt(o)&1)!==0){if(p&&65<=o&&90>=o){if(h==null)h=new A.X("") if(q=0&&r=n){if(p==null)p=new A.Y("") +o=!0}else if(n<127&&(g.charCodeAt(n)&32)!==0){if(o&&65<=n&&90>=n){if(p==null)p=new A.X("") if(q=k)return"%" s=b+1 if(!(s>=0&&s=0))return A.c(a,l) q=a.charCodeAt(l) -p=A.pE(r) -o=A.pE(q) +p=A.pM(r) +o=A.pM(q) if(p<0||o<0)return"%" n=p*16+o if(n<127){if(!(n>=0))return A.c(m,n) l=(m.charCodeAt(n)&1)!==0}else l=!1 -if(l)return A.a4(c&&65<=n&&90>=n?(n|32)>>>0:n) +if(l)return A.a5(c&&65<=n&&90>=n?(n|32)>>>0:n) if(r>=97||q>=97)return B.b.t(a,b,b+3).toUpperCase() return null}, -qF(a){var s,r,q,p,o,n,m,l,k="0123456789ABCDEF" +qQ(a){var s,r,q,p,o,n,m,l,k="0123456789ABCDEF" if(a<=127){s=new Uint8Array(3) s[0]=37 r=a>>>4 @@ -2977,7 +2977,7 @@ p=4}else{q=224 p=3}else{q=192 p=2}r=3*p s=new Uint8Array(r) -for(o=0;--p,p>=0;q=128){n=B.f.cI(a,6*p)&63|q +for(o=0;--p,p>=0;q=128){n=B.f.cK(a,6*p)&63|q if(!(o=0&&q=m)return A.c(s,-1) s.pop() if(s.length===0)B.a.l(s,"")}p=!0}else{p="."===n if(!p)B.a.l(s,n)}}if(p)B.a.l(s,"") -return B.a.aq(s,"/")}, -qI(a,b){var s,r,q,p,o,n -if(!A.tP(a))return!b?A.tI(a):a +return B.a.ar(s,"/")}, +qT(a,b){var s,r,q,p,o,n +if(!A.tZ(a))return!b?A.tS(a):a s=A.i([],t.s) for(r=a.split("/"),q=r.length,p=!1,o=0;o=s.length)return A.c(s,-1) @@ -3037,16 +3037,16 @@ p=!0}else{p="."===n if(!p)B.a.l(s,n.length===0&&s.length===0?"./":n)}}if(s.length===0)return"./" if(p)B.a.l(s,"") if(!b){if(0>=s.length)return A.c(s,0) -B.a.k(s,0,A.tI(s[0]))}return B.a.aq(s,"/")}, -tI(a){var s,r,q,p=u.S,o=a.length -if(o>=2&&A.tJ(a.charCodeAt(0)))for(s=1;s=2&&A.tT(a.charCodeAt(0)))for(s=1;s127)throw A.f(A.W("Illegal percent encoding in URI",null)) if(r===37){if(n+3>o)throw A.f(A.W("Truncated URI",null)) -B.a.l(p,A.xE(a,n+1)) +B.a.l(p,A.xO(a,n+1)) n+=2}else B.a.l(p,r)}}return d.b0(p)}, -tJ(a){var s=a|32 +tT(a){var s=a|32 return 97<=s&&s<=122}, -t5(a,b,c){var s,r,q,p,o,n,m,l,k="Invalid MIME type",j=A.i([b-1],t.Z) +tf(a,b,c){var s,r,q,p,o,n,m,l,k="Invalid MIME type",j=A.i([b-1],t.Z) for(s=a.length,r=b,q=-1,p=null;rb)throw A.f(A.aD(k,a,r)) +continue}throw A.f(A.aq(k,a,r))}}if(q<0&&r>b)throw A.f(A.aq(k,a,r)) while(p!==44){B.a.l(j,r);++r for(o=-1;r=0))return A.c(a,r) p=a.charCodeAt(r) if(p===61){if(o<0)o=r}else if(p===59||p===44)break}if(o>=0)B.a.l(j,o) else{n=B.a.gA(j) -if(p!==44||r!==n+7||!B.b.aa(a,"base64",n+1))throw A.f(A.aD("Expecting '='",a,r)) +if(p!==44||r!==n+7||!B.b.aa(a,"base64",n+1))throw A.f(A.aq("Expecting '='",a,r)) break}}B.a.l(j,r) m=r+1 -if((j.length&1)===1)a=B.cJ.nA(a,m,s) -else{l=A.tQ(a,m,s,256,!0,!1) -if(l!=null)a=B.b.bR(a,m,s,l)}return new A.nS(a,j,c)}, -ub(a,b,c,d,e){var s,r,q,p,o,n='\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe1\xe1\x01\xe1\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe3\xe1\xe1\x01\xe1\x01\xe1\xcd\x01\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x0e\x03\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"\x01\xe1\x01\xe1\xac\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe1\xe1\x01\xe1\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xea\xe1\xe1\x01\xe1\x01\xe1\xcd\x01\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\n\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"\x01\xe1\x01\xe1\xac\xeb\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\xeb\xeb\xeb\x8b\xeb\xeb\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\xeb\x83\xeb\xeb\x8b\xeb\x8b\xeb\xcd\x8b\xeb\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x92\x83\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\xeb\x8b\xeb\x8b\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xebD\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\x12D\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xe5\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\xe5\xe5\xe5\x05\xe5D\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe8\x8a\xe5\xe5\x05\xe5\x05\xe5\xcd\x05\xe5\x05\x05\x05\x05\x05\x05\x05\x05\x05\x8a\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05f\x05\xe5\x05\xe5\xac\xe5\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\xe5\xe5\xe5\x05\xe5D\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\x8a\xe5\xe5\x05\xe5\x05\xe5\xcd\x05\xe5\x05\x05\x05\x05\x05\x05\x05\x05\x05\x8a\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05f\x05\xe5\x05\xe5\xac\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7D\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x8a\xe7\xe7\xe7\xe7\xe7\xe7\xcd\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x8a\xe7\x07\x07\x07\x07\x07\x07\x07\x07\x07\xe7\xe7\xe7\xe7\xe7\xac\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7D\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x8a\xe7\xe7\xe7\xe7\xe7\xe7\xcd\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x8a\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\xe7\xe7\xe7\xe7\xe7\xac\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\x05\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\x10\xea\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\x12\n\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\v\n\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xec\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\xec\xec\xec\f\xec\xec\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\xec\xec\xec\xec\f\xec\f\xec\xcd\f\xec\f\f\f\f\f\f\f\f\f\xec\f\f\f\f\f\f\f\f\f\f\xec\f\xec\f\xec\f\xed\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\xed\xed\xed\r\xed\xed\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\xed\xed\xed\xed\r\xed\r\xed\xed\r\xed\r\r\r\r\r\r\r\r\r\xed\r\r\r\r\r\r\r\r\r\r\xed\r\xed\r\xed\r\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe1\xe1\x01\xe1\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xea\xe1\xe1\x01\xe1\x01\xe1\xcd\x01\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x0f\xea\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"\x01\xe1\x01\xe1\xac\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe1\xe1\x01\xe1\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe9\xe1\xe1\x01\xe1\x01\xe1\xcd\x01\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\t\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"\x01\xe1\x01\xe1\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\x11\xea\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xe9\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\v\t\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\x13\xea\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\v\xea\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xf5\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\x15\xf5\x15\x15\xf5\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xf5\xf5\xf5\xf5\xf5\xf5' +if((j.length&1)===1)a=B.cJ.nC(a,m,s) +else{l=A.u_(a,m,s,256,!0,!1) +if(l!=null)a=B.b.bS(a,m,s,l)}return new A.nZ(a,j,c)}, +ul(a,b,c,d,e){var s,r,q,p,o,n='\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe1\xe1\x01\xe1\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe3\xe1\xe1\x01\xe1\x01\xe1\xcd\x01\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x0e\x03\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"\x01\xe1\x01\xe1\xac\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe1\xe1\x01\xe1\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xea\xe1\xe1\x01\xe1\x01\xe1\xcd\x01\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\n\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"\x01\xe1\x01\xe1\xac\xeb\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\xeb\xeb\xeb\x8b\xeb\xeb\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\xeb\x83\xeb\xeb\x8b\xeb\x8b\xeb\xcd\x8b\xeb\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x92\x83\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\xeb\x8b\xeb\x8b\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xebD\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\x12D\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xe5\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\xe5\xe5\xe5\x05\xe5D\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe8\x8a\xe5\xe5\x05\xe5\x05\xe5\xcd\x05\xe5\x05\x05\x05\x05\x05\x05\x05\x05\x05\x8a\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05f\x05\xe5\x05\xe5\xac\xe5\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\xe5\xe5\xe5\x05\xe5D\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\x8a\xe5\xe5\x05\xe5\x05\xe5\xcd\x05\xe5\x05\x05\x05\x05\x05\x05\x05\x05\x05\x8a\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05f\x05\xe5\x05\xe5\xac\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7D\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x8a\xe7\xe7\xe7\xe7\xe7\xe7\xcd\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x8a\xe7\x07\x07\x07\x07\x07\x07\x07\x07\x07\xe7\xe7\xe7\xe7\xe7\xac\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7D\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x8a\xe7\xe7\xe7\xe7\xe7\xe7\xcd\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\xe7\x8a\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\xe7\xe7\xe7\xe7\xe7\xac\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\x05\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\x10\xea\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\x12\n\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\v\n\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xec\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\xec\xec\xec\f\xec\xec\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\xec\xec\xec\xec\f\xec\f\xec\xcd\f\xec\f\f\f\f\f\f\f\f\f\xec\f\f\f\f\f\f\f\f\f\f\xec\f\xec\f\xec\f\xed\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\xed\xed\xed\r\xed\xed\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\xed\xed\xed\xed\r\xed\r\xed\xed\r\xed\r\r\r\r\r\r\r\r\r\xed\r\r\r\r\r\r\r\r\r\r\xed\r\xed\r\xed\r\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe1\xe1\x01\xe1\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xea\xe1\xe1\x01\xe1\x01\xe1\xcd\x01\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x0f\xea\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"\x01\xe1\x01\xe1\xac\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe1\xe1\x01\xe1\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe1\xe9\xe1\xe1\x01\xe1\x01\xe1\xcd\x01\xe1\x01\x01\x01\x01\x01\x01\x01\x01\x01\t\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01"\x01\xe1\x01\xe1\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\x11\xea\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xe9\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\v\t\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\x13\xea\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xeb\xeb\v\xeb\xeb\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\xeb\xea\xeb\xeb\v\xeb\v\xeb\xcd\v\xeb\v\v\v\v\v\v\v\v\v\xea\v\v\v\v\v\v\v\v\v\v\xeb\v\xeb\v\xeb\xac\xf5\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\x15\xf5\x15\x15\xf5\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xf5\xf5\xf5\xf5\xf5\xf5' for(s=a.length,r=b;r95)q=31 @@ -3097,15 +3097,15 @@ if(!(p<2112))return A.c(n,p) o=n.charCodeAt(p) d=o&31 B.a.k(e,o>>>5,r)}return d}, -tB(a){if(a.b===7&&B.b.U(a.a,"package")&&a.c<=0)return A.ud(a.a,a.e,a.f) +tL(a){if(a.b===7&&B.b.U(a.a,"package")&&a.c<=0)return A.un(a.a,a.e,a.f) return-1}, -ud(a,b,c){var s,r,q,p +un(a,b,c){var s,r,q,p for(s=a.length,r=b,q=0;r=0&&r=1)return a.$1(b) +y0(a,b,c){t.gY.a(a) +if(A.at(c)>=1)return a.$1(b) return a.$0()}, -zq(a,b){var s=new A.aB($.an,b.h("aB<0>")),r=new A.h8(s,b.h("h8<0>")) -a.then(A.eI(new A.pS(r,b),1),A.eI(new A.pT(r),1)) +zy(a,b){var s=new A.aF($.an,b.h("aF<0>")),r=new A.ha(s,b.h("ha<0>")) +a.then(A.eI(new A.q0(r,b),1),A.eI(new A.q1(r),1)) return s}, -u7(a){return a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string"||a instanceof Int8Array||a instanceof Uint8Array||a instanceof Uint8ClampedArray||a instanceof Int16Array||a instanceof Uint16Array||a instanceof Int32Array||a instanceof Uint32Array||a instanceof Float32Array||a instanceof Float64Array||a instanceof ArrayBuffer||a instanceof DataView}, -up(a){if(A.u7(a))return a -return new A.px(new A.dK(t.mp)).$1(a)}, -pS:function pS(a,b){this.a=a +uh(a){return a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string"||a instanceof Int8Array||a instanceof Uint8Array||a instanceof Uint8ClampedArray||a instanceof Int16Array||a instanceof Uint16Array||a instanceof Int32Array||a instanceof Uint32Array||a instanceof Float32Array||a instanceof Float64Array||a instanceof ArrayBuffer||a instanceof DataView}, +uA(a){if(A.uh(a))return a +return new A.pF(new A.dK(t.mp)).$1(a)}, +q0:function q0(a,b){this.a=a this.b=b}, -pT:function pT(a){this.a=a}, -px:function px(a){this.a=a}, +q1:function q1(a){this.a=a}, +pF:function pF(a){this.a=a}, ie:function ie(){}, -hQ:function hQ(a,b){this.a=a +hS:function hS(a,b){this.a=a this.b=b}, -rd(a,b,c){var s=new A.bQ(a,B.f.av(Date.now(),1000)) +ro(a,b,c){var s=new A.bR(a,B.f.aw(Date.now(),1000)) s.Q=c return s}, -bQ:function bQ(a,b){var _=this +bR:function bR(a,b){var _=this _.a=a _.b=420 _.e=b @@ -3235,7 +3235,7 @@ dV:function dV(a,b){this.a=a this.b=b}, lJ:function lJ(a){this.a=a this.c=this.b=0}, -vu(){return new A.lH()}, +vF(){return new A.lH()}, lH:function lH(){var _=this _.ax=_.at=_.as=_.Q=_.z=_.y=_.x=_.w=_.r=_.f=_.e=_.d=_.c=_.b=_.a=$ _.ay=0 @@ -3243,25 +3243,25 @@ _.ch=-1 _.cx=_.CW=0 _.fr=_.dy=_.dx=_.db=_.cy=$ _.fx=0}, -ot:function ot(a){var _=this +oA:function oA(a){var _=this _.a=-1 _.r=_.f=0 _.x=a}, -x1(a,b,c){var s,r,q,p,o +xb(a,b,c){var s,r,q,p,o if(a.gN(a))return new Uint8Array(0) -s=new Uint8Array(A.hC(a.goC(a))) +s=new Uint8Array(A.hE(a.goF(a))) r=c*2+2 -q=A.rJ(A.rM(),64) -p=new A.nn(q) +q=A.rT(A.rW(),64) +p=new A.nt(q) q=q.b q===$&&A.o() p.c=new Uint8Array(q) -p.a=new A.no(b,1000,r) +p.a=new A.nu(b,1000,r) o=new Uint8Array(r) -return B.k.am(o,0,p.mm(s,0,o,0))}, -or:function or(a,b){this.c=a +return B.k.am(o,0,p.mo(s,0,o,0))}, +oy:function oy(a,b){this.c=a this.d=b}, -h7:function h7(a,b){this.a=a +h9:function h9(a,b){this.a=a this.b=b}, ku:function ku(a,b,c,d){var _=this _.b=0 @@ -3278,26 +3278,26 @@ kv:function kv(){var _=this _.as=_.Q=_.y=_.x=_.w=_.a=0 _.at="" _.ch=_.ax=null}, -os:function os(){this.a=$}, -ix(a){var s=new A.mD() -s.jU(a) +oz:function oz(){this.a=$}, +ix(a){var s=new A.mI() +s.jV(a) return s}, -mD:function mD(){this.a=$ +mI:function mI(){this.a=$ this.b=0 this.c=2147483647}, -oq:function oq(){}, -p6:function p6(){}, -mH:function mH(a,b){var _=this +ox:function ox(){}, +pe:function pe(){}, +mM:function mM(a,b){var _=this _.a=a _.b=null _.c=b _.e=_.d=0}, -t4(a,b){var s,r,q,p=a.length,o=b.length +te(a,b){var s,r,q,p=a.length,o=b.length if(p!==o)return!1 for(s=0,r=0;r>>8&255 @@ -3313,14 +3313,14 @@ _.c=b _.d=c _.r=null _.x=_.w=$}, -i0:function i0(a,b){this.a=a +i2:function i2(a,b){this.a=a this.b=b}, -r0(a,b){b&=31 -return(a&$.aM[b])<>>0}, -as(a,b){b&=31 -return(a>>>b|A.r0(a,32-b))>>>0}, -rL(a){var s,r=new A.fA() -if(A.lx(a))r.fv(a,null) +rb(a,b){b&=31 +return(a&$.aP[b])<>>0}, +av(a,b){b&=31 +return(a>>>b|A.rb(a,32-b))>>>0}, +rV(a){var s,r=new A.fC() +if(A.lx(a))r.fw(a,null) else{t.dl.a(a) s=a.a s===$&&A.o() @@ -3328,27 +3328,27 @@ r.a=s s=a.b s===$&&A.o() r.b=s}return r}, -rM(){var s=A.rL(0),r=new Uint8Array(4),q=t.S -q=new A.jy(s,r,B.cL,5,A.aE(5,0,!1,q),A.aE(80,0,!1,q)) -q.aL() +rW(){var s=A.rV(0),r=new Uint8Array(4),q=t.S +q=new A.jy(s,r,B.cL,5,A.aB(5,0,!1,q),A.aB(80,0,!1,q)) +q.aM() return q}, -rJ(a,b){var s=new A.jw(a,b) +rT(a,b){var s=new A.jw(a,b) s.b=20 s.d=new Uint8Array(b) s.e=new Uint8Array(b+20) return s}, -nm:function nm(){}, -no:function no(a,b,c){this.a=a +ns:function ns(){}, +nu:function nu(a,b,c){this.a=a this.b=b this.c=c}, -nl:function nl(){}, -fz:function fz(a){this.a=a}, -nn:function nn(a){this.a=$ +nr:function nr(){}, +fB:function fB(a){this.a=a}, +nt:function nt(a){this.a=$ this.b=a this.c=$}, jv:function jv(){}, ju:function ju(){}, -fA:function fA(){this.b=this.a=$}, +fC:function fC(){this.b=this.a=$}, jx:function jx(){}, jy:function jy(a,b,c,d,e,f){var _=this _.a=a @@ -3364,20 +3364,20 @@ _.a=a _.b=$ _.c=b _.e=_.d=$}, -nk:function nk(){}, -nj:function nj(a){var _=this +nq:function nq(){}, +np:function np(a){var _=this _.a=0 _.b=$ _.c=!1 _.d=a}, -fe:function fe(){}, +fg:function fg(){}, it:function it(a){this.a=a}, bv(a,b,c,d){var s,r,q=new A.e_(b) if(d==null)d=0 -if(c==null)c=J.b6(a)-d -s=J.ad(a) +if(c==null)c=J.b8(a)-d +s=J.ae(a) if(d+c>s.gn(a))c=s.gn(a)-d -r=t.ev.b(a)?a:new Uint8Array(A.hC(a)) +r=t.ev.b(a)?a:new Uint8Array(A.hE(a)) s=J.dS(B.k.ga9(r),r.byteOffset+d,c) q.b=s q.d=s.length @@ -3388,13 +3388,13 @@ _.c=0 _.d=$ _.a=a}, iO:function iO(){}, -mI:function mI(a){this.a=a}, -qc(a){var s=a==null?32768:a -return new A.fy(new Uint8Array(s))}, -fy:function fy(a){this.b=0 +mN:function mN(a){this.a=a}, +qn(a){var s=a==null?32768:a +return new A.fA(new Uint8Array(s))}, +fA:function fA(a){this.b=0 this.c=a}, jq:function jq(){}, -y4(a,b,c,d){var s,r,q,p=b.length +ye(a,b,c,d){var s,r,q,p=b.length if(p===0)return c s=d-p if(s=0}else q=!1 if(!q)break if(r>s)return-1 -if(A.qW(a,c,d,r)&&A.qW(a,c,d,r+p))return r -c=r+1}return-1}return A.y_(a,b,c,d)}, -y_(a,b,c,d){var s,r,q,p=new A.cP(a,d,c,260) -for(s=b.length;r=p.cX(),r>=0;){q=r+s +if(A.r6(a,c,d,r)&&A.r6(a,c,d,r+p))return r +c=r+1}return-1}return A.y9(a,b,c,d)}, +y9(a,b,c,d){var s,r,q,p=new A.cR(a,d,c,260) +for(s=b.length;r=p.cZ(),r>=0;){q=r+s if(q>d)break -if(B.b.aa(a,b,r)&&A.qW(a,c,d,q))return r}return-1}, -d3:function d3(a){this.a=a}, -fR:function fR(a,b,c){var _=this +if(B.b.aa(a,b,r)&&A.r6(a,c,d,q))return r}return-1}, +d4:function d4(a){this.a=a}, +fT:function fT(a,b,c){var _=this _.a=a _.b=b _.c=c _.d=null}, -qW(a,b,c,d){var s,r,q,p -if(b=65&&h<=90&&h+32===j l=g}else l=!0 else l=!1 -if(!l)break}if(l)return A.ax(p.m(0,b))}}return-1}, -wS(a){var s,r +if(!l)break}if(l)return A.at(p.m(0,b))}}return-1}, +x1(a){var s,r if(a===24)return"%" else for(s=0;s<28;++s){r=B.d1[s] -if(A.ax(r.m(0,"unit"))===a)return A.hB(r.m(0,"value"))}return""}, -t0(a){var s +if(A.at(r.m(0,"unit"))===a)return A.hD(r.m(0,"value"))}return""}, +ta(a){var s A:{if(0===a){s="ERROR" break A}if(1===a){s="end of file" break A}if(2===a){s="(" @@ -3528,8 +3528,8 @@ break A}if(32===a){s="<" break A}if(33===a){s="!" break A}if(34===a){s="-" break A}if(35===a){s="\\" -break A}s=A.P(A.ce("Unknown TOKEN"))}return s}, -t_(a){switch(a){case 641:case 642:case 643:case 644:case 645:case 646:case 647:case 648:case 649:case 650:case 651:case 652:case 653:case 654:case 655:case 656:case 600:case 601:case 602:case 603:case 604:case 605:case 606:case 607:case 608:case 609:case 610:case 612:case 613:case 614:case 615:case 617:case 627:case 628:return!0 +break A}s=A.M(A.ch("Unknown TOKEN"))}return s}, +t9(a){switch(a){case 641:case 642:case 643:case 644:case 645:case 646:case 647:case 648:case 649:case 650:case 651:case 652:case 653:case 654:case 655:case 656:case 600:case 601:case 602:case 603:case 604:case 605:case 606:case 607:case 608:case 609:case 610:case 612:case 613:case 614:case 615:case 617:case 627:case 628:return!0 default:return!1}}, jY(a){var s if(!(a>=97&&a<=122))s=a>=65&&a<=90||a===95||a>=160||a===92 @@ -3555,7 +3555,7 @@ _.c=h _.e=_.d=!1 _.f=i _.r=0}, -nO:function nO(){}, +nU:function nU(){}, ec:function ec(a,b){this.a=a this.b=b}, eb:function eb(a,b,c,d){var _=this @@ -3566,40 +3566,40 @@ _.d=d}, j5:function j5(a,b,c){this.a=a this.b=b this.c=c}, -ns:function ns(a){this.w=a}, -cs:function cs(a,b){this.b=a +ny:function ny(a){this.w=a}, +cu:function cu(a,b){this.b=a this.a=b}, -d4:function d4(a){this.a=a}, +d5:function d5(a){this.a=a}, jV:function jV(a){this.a=a}, je:function je(a){this.a=a}, jL:function jL(a,b){this.b=a this.a=b}, -d_:function d_(a,b){this.b=a +d1:function d1(a,b){this.b=a this.a=b}, -fL:function fL(a,b,c){this.b=a +fN:function fN(a,b,c){this.b=a this.c=b this.a=c}, -bc:function bc(){}, -di:function di(a,b){this.b=a +bd:function bd(){}, +dj:function dj(a,b){this.b=a this.a=b}, j6:function j6(a,b,c){this.d=a this.b=b this.a=c}, -hW:function hW(a,b,c,d){var _=this +hY:function hY(a,b,c,d){var _=this _.d=a _.e=b _.b=c _.a=d}, iy:function iy(a,b){this.b=a this.a=b}, -i3:function i3(a,b){this.b=a +i5:function i5(a,b){this.b=a this.a=b}, ed:function ed(a,b){this.b=a this.a=b}, ee:function ee(a,b,c){this.d=a this.b=b this.a=c}, -fD:function fD(a,b,c){this.f=a +fF:function fF(a,b,c){this.f=a this.b=b this.a=c}, jE:function jE(a,b,c){this.d=a @@ -3633,7 +3633,7 @@ this.a=c}, is:function is(a,b,c){this.c=a this.d=b this.a=c}, -hN:function hN(a,b,c,d){var _=this +hP:function hP(a,b,c,d){var _=this _.f=a _.c=b _.d=c @@ -3656,7 +3656,7 @@ _.f=a _.c=b _.d=c _.a=d}, -i1:function i1(a,b,c,d){var _=this +i3:function i3(a,b,c,d){var _=this _.f=a _.c=b _.d=c @@ -3677,9 +3677,9 @@ _.c=b _.d=c _.a=d}, R:function R(){}, -ao:function ao(){}, +ap:function ap(){}, k7:function k7(){}, -vJ(a){var s,r=a.toLowerCase() +vU(a){var s,r=a.toLowerCase() A:{if("application/xhtml+xml"===r||"text/html"===r){s=B.it break A}if("application/x-dtbook+xml"===r){s=B.iu break A}if("application/x-dtbncx+xml"===r){s=B.iA @@ -3696,37 +3696,37 @@ break A}if("font/truetype"===r){s=B.ix break A}if("font/opentype"===r||"application/vnd.ms-opentype"===r){s=B.iy break A}s=B.iz break A}return s}, -aT:function aT(a,b){this.a=a +aY:function aY(a,b){this.a=a this.b=b}, ip:function ip(a,b,c){this.a=a this.b=b this.c=c}, -m9(a){var s=0,r=A.br(t.gw),q,p,o,n,m,l,k,j,i -var $async$m9=A.bs(function(b,c){if(b===1)return A.bo(c,r) -for(;;)switch(s){case 0:l=new A.os().ml(A.bv(t.L.a(a),B.F,null,null),null,null,!1) +me(a){var s=0,r=A.br(t.gw),q,p,o,n,m,l,k,j,i +var $async$me=A.bs(function(b,c){if(b===1)return A.bo(c,r) +for(;;)switch(s){case 0:l=new A.oz().mn(A.bv(t.L.a(a),B.F,null,null),null,null,!1) s=3 -return A.c3(A.fG(l),$async$m9) +return A.bF(A.fI(l),$async$me) case 3:k=c j=k.a.b -i=B.a.cq(j.a,new A.ma(),new A.mb()) +i=B.a.cs(j.a,new A.mf(),new A.mg()) j=j.b p=A.w(j) o=t.lS -n=A.a7(new A.O(new A.Q(j,p.h("e?(1)").a(new A.mc()),p.h("Q<1,e?>")),o),o.h("h.E")) -m=B.a.aq(n,", ") -q=new A.eY(l,i,m,n,k,A.vG(new A.eY(l,i,m,n,k,null))) +n=A.a8(new A.P(new A.Q(j,p.h("e?(1)").a(new A.mh()),p.h("Q<1,e?>")),o),o.h("h.E")) +m=B.a.ar(n,", ") +q=new A.f_(l,i,m,n,k,A.vR(new A.f_(l,i,m,n,k,null))) s=1 break case 1:return A.bp(q,r)}}) -return A.bq($async$m9,r)}, -ma:function ma(){}, -mb:function mb(){}, -mc:function mc(){}, -vz(a){return A.vy(a)}, -vy(a){var s,r,q=A.az(t.N,t.S),p=a.e.a,o=p.d.b,n=p.c.a -for(p=t.A,s=0;s=0)c.k(0,a,l)}for(a0=k.length,m=0;m=0)c.k(0,a,l)}for(a0=k.length,m=0;m=0)b.k(0,a,l)}for(i=0;i]*>(.*?)",!1),A.a5("]*>(.*?)

",!1),A.a5("]*>(.*?)",!1),A.a5("]*>(.*?)",!1)],t.im) -for(k=q,j=k.length,i=t.lg,h=0;h]*>(.*?)",!1),A.a3("]*>(.*?)

",!1),A.a3("]*>(.*?)",!1),A.a3("]*>(.*?)",!1)],t.im) +for(k=q,j=k.length,i=t.lg,h=0;h=e.length)return A.c(e,1) e=e[1] if(e==null)d=null -else{c=A.a5("<[^>]*>",!0) -d=B.b.ba(A.cO(e,c,""))}m=d -if(m!=null&&m.length!==0){l=B.b.d9(m,A.a5("\\s+",!0)) -if(J.b6(l)<=10)return m +else{c=A.a3("<[^>]*>",!0) +d=B.b.ba(A.cQ(e,c,""))}m=d +if(m!=null&&m.length!==0){l=B.b.de(m,A.a3("\\s+",!0)) +if(J.b8(l)<=10)return m else{k=l j=A.w(k) -i=new A.cy(k,0,10,j.h("cy<1>")) -i.fO(k,0,10,j.c) -i=i.aq(0," ") -return i+"..."}}}}}catch(b){}k=A.a5("\\.[^.]+$",!0) -return A.cO(a0,k,"")}, +i=new A.cA(k,0,10,j.h("cA<1>")) +i.fP(k,0,10,j.c) +i=i.ar(0," ") +return i+"..."}}}}}catch(b){}k=A.a3("\\.[^.]+$",!0) +return A.cQ(a0,k,"")}, lM:function lM(a,b){this.a=a this.b=b}, lL:function lL(a,b){this.a=a this.b=b}, -qa(a7,a8,a9){var s=0,r=A.br(t.kZ),q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2,a3,a4,a5,a6 -var $async$qa=A.bs(function(b0,b1){if(b0===1)return A.bo(b1,r) +ql(a7,a8,a9){var s=0,r=A.br(t.kZ),q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2,a3,a4,a5,a6 +var $async$ql=A.bs(function(b0,b1){if(b0===1)return A.bo(b1,r) for(;;)switch(s){case 0:if(a9.a===B.bG){p=a9.d.a if(p==null||p.length===0)throw A.f(A.S("EPUB parsing error: TOC ID is empty.")) -o=A.bI(a9.c.a,new A.n0(p),t.A) +o=A.bJ(a9.c.a,new A.n6(p),t.A) if(o==null)throw A.f(A.S("EPUB parsing error: TOC item "+p+" not found in EPUB manifest.")) -$.cY=A.qr(a8,o.b) -n=A.bI(new A.cE(a7.a,t.bW),new A.n1(),t.u) -if(n==null)throw A.f(A.S("EPUB parsing error: TOC file "+A.k($.cY)+" not found in archive.")) -m=n.bQ() -l=B.E.b0(m==null?$.dd():m) +$.d_=A.qC(a8,o.b) +n=A.bJ(new A.cG(a7.a,t.bW),new A.n7(),t.u) +if(n==null)throw A.f(A.S("EPUB parsing error: TOC file "+A.k($.d_)+" not found in archive.")) +m=n.bR() +l=B.E.b0(m==null?$.de():m) m=t.P -k=A.e3(A.b2(new A.c1(A.o_(l)),"ncx","http://www.daisy.org/z3986/2005/ncx/"),m) +k=A.e3(A.b5(new A.c4(A.o6(l)),"ncx","http://www.daisy.org/z3986/2005/ncx/"),m) if(k==null)throw A.f(A.S("EPUB parsing error: TOC file does not contain ncx element.")) -j=A.e3(A.b2(new A.c1(k),"head","http://www.daisy.org/z3986/2005/ncx/"),m) +j=A.e3(A.b5(new A.c4(k),"head","http://www.daisy.org/z3986/2005/ncx/"),m) if(j==null)throw A.f(A.S(u.C)) -i=A.wd(j) +i=A.wn(j) h=k.w$ -g=A.e3(A.b2(h,"docTitle","http://www.daisy.org/z3986/2005/ncx/"),m) +g=A.e3(A.b5(h,"docTitle","http://www.daisy.org/z3986/2005/ncx/"),m) if(g==null)throw A.f(A.S("EPUB parsing error: TOC file does not contain docTitle element.")) -f=A.wc(g) -e=A.b2(h,"docAuthor","http://www.daisy.org/z3986/2005/ncx/") +f=A.wm(g) +e=A.b5(h,"docAuthor","http://www.daisy.org/z3986/2005/ncx/") d=e.$ti -c=d.h("ba<1,cm>") -b=A.a7(new A.ba(e,d.h("cm(1)").a(new A.n2()),c),c.h("h.E")) -a=A.e3(A.b2(h,"navMap","http://www.daisy.org/z3986/2005/ncx/"),m) +c=d.h("aM<1,co>") +b=A.a8(new A.aM(e,d.h("co(1)").a(new A.n8()),c),c.h("h.E")) +a=A.e3(A.b5(h,"navMap","http://www.daisy.org/z3986/2005/ncx/"),m) if(a==null)throw A.f(A.S("EPUB parsing error: TOC file does not contain navMap element.")) -a0=A.wf(a) -a1=A.e3(A.b2(h,"pageList","http://www.daisy.org/z3986/2005/ncx/"),m) -A:{if(a1 instanceof A.aG){m=A.wg(a1) +a0=A.wp(a) +a1=A.e3(A.b5(h,"pageList","http://www.daisy.org/z3986/2005/ncx/"),m) +A:{if(a1 instanceof A.aI){m=A.wq(a1) break A}if(a1==null){m=null -break A}throw A.f(new A.jF("None of the patterns in the switch expression the matched input value. See https://github.com/dart-lang/language/issues/3488 for details."))}h=A.b2(h,"navList","http://www.daisy.org/z3986/2005/ncx/") +break A}throw A.f(new A.jF("None of the patterns in the switch expression the matched input value. See https://github.com/dart-lang/language/issues/3488 for details."))}h=A.b5(h,"navList","http://www.daisy.org/z3986/2005/ncx/") e=h.$ti -d=e.h("ba<1,cn>") -a2=A.a7(new A.ba(h,e.h("cn(1)").a(new A.n3()),d),d.h("h.E")) -q=new A.f2(i,f,b,a0,m,a2) +d=e.h("aM<1,cp>") +a2=A.a8(new A.aM(h,e.h("cp(1)").a(new A.n9()),d),d.h("h.E")) +q=new A.f4(i,f,b,a0,m,a2) s=1 -break}else{o=A.bI(a9.c.a,new A.n4(),t.A) +break}else{o=A.bJ(a9.c.a,new A.na(),t.A) if(o==null)throw A.f(A.S("EPUB parsing error: TOC item, not found in EPUB manifest.")) -$.cY=A.qr(a8,o.b) -n=A.bI(new A.cE(a7.a,t.bW),new A.n5(),t.u) -if(n==null)throw A.f(A.S("EPUB parsing error: TOC file "+A.k($.cY)+" not found in archive.")) -a3=A.i($.cY.split("/"),t.s) +$.d_=A.qC(a8,o.b) +n=A.bJ(new A.cG(a7.a,t.bW),new A.nb(),t.u) +if(n==null)throw A.f(A.S("EPUB parsing error: TOC file "+A.k($.d_)+" not found in archive.")) +a3=A.i($.d_.split("/"),t.s) m=a3.length if(m!==0){if(0>=m){q=A.c(a3,-1) s=1 -break}a3.pop()}if(a3.length!==0)B.a.d2(a3,0) -$.cY=a3.length===0?"":B.a.aq(a3,"/")+"/" -m=n.bQ() -a4=B.E.b0(m==null?$.dd():m) -a5=A.o_(a4) +break}a3.pop()}if(a3.length!==0)B.a.d5(a3,0) +$.d_=a3.length===0?"":B.a.ar(a3,"/")+"/" +m=n.bR() +a4=B.E.b0(m==null?$.de():m) +a5=A.o6(a4) m=t.P -if(A.e3(A.b2(new A.c1(a5),"head",null),m)==null)throw A.f(A.S(u.C)) -a6=A.e3(A.b2(new A.c1(a5),"nav",null),m) +if(A.e3(A.b5(new A.c4(a5),"head",null),m)==null)throw A.f(A.S(u.C)) +a6=A.e3(A.b5(new A.c4(a5),"nav",null),m) if(a6==null)throw A.f(A.S(u.C)) -q=new A.f2(null,new A.f4(a9.b.a),B.j7,A.rG(A.b2(a6.w$,"ol",null).gbU(0)),null,B.j8) +q=new A.f4(null,new A.f6(a9.b.a),B.j7,A.rQ(A.b5(a6.w$,"ol",null).gbn(0)),null,B.j8) s=1 break}case 1:return A.bp(q,r)}}) -return A.bq($async$qa,r)}, -qb(a){var s,r,q,p,o,n +return A.bq($async$ql,r)}, +qm(a){var s,r,q,p,o,n for(s=a.y$.a,r=A.w(s),s=new J.J(s,s.length,r.h("J<1>")),r=r.c,q=null,p=null;s.p();){o=s.d if(o==null)o=r.a(o) n=o.b @@ -3871,29 +3871,29 @@ switch(o.a.ga_().toLowerCase()){case"id":q=n break case"src":p=n break}}if(p==null||p.length===0)throw A.f(A.S("Incorrect EPUB navigation content: content source is missing.")) -return new A.f3(q,p)}, -wa(a){var s,r,q,p,o,n +return new A.f5(q,p)}, +wk(a){var s,r,q,p,o,n for(s=a.y$.a,r=A.w(s),s=new J.J(s,s.length,r.h("J<1>")),r=r.c,q=null,p=null;s.p();){o=s.d if(o==null)o=r.a(o) n=o.b switch(o.a.ga_().toLowerCase()){case"id":q=n break -case"href":o=$.cY -p=o.length<2||B.b.U(n,o)?n:$.pZ().dP(o+n) -break}}return new A.f3(q,p)}, -wb(a){var s=A.i([],t.s) -new A.O(a.w$.a,t.C).T(0,new A.mQ(s)) -return new A.cm(s)}, -wc(a){var s=A.i([],t.s) -new A.O(a.w$.a,t.C).T(0,new A.mR(s)) -return new A.f4(s)}, -wd(a){var s=A.i([],t.hJ) -new A.O(a.w$.a,t.C).T(0,new A.mS(s)) +case"href":o=$.d_ +p=o.length<2||B.b.U(n,o)?n:$.q7().dR(o+n) +break}}return new A.f5(q,p)}, +wl(a){var s=A.i([],t.s) +new A.P(a.w$.a,t.C).T(0,new A.mW(s)) +return new A.co(s)}, +wm(a){var s=A.i([],t.s) +new A.P(a.w$.a,t.C).T(0,new A.mX(s)) +return new A.f6(s)}, +wn(a){var s=A.i([],t.hJ) +new A.P(a.w$.a,t.C).T(0,new A.mY(s)) return new A.il(s)}, -mT(a){var s=A.bI(A.b2(a.w$,"text",a.b.gcV()),new A.mU(),t.P) +mZ(a){var s=A.bJ(A.b5(a.w$,"text",a.b.gcX()),new A.n_(),t.P) if(s==null)throw A.f(A.S("Incorrect EPUB navigation label: label text element is missing.")) -return new A.cS(A.cH(s))}, -we(a){var s,r,q,p,o,n,m,l,k +return new A.cU(A.cJ(s))}, +wo(a){var s,r,q,p,o,n,m,l,k for(s=a.y$.a,r=A.w(s),s=new J.J(s,s.length,r.h("J<1>")),r=r.c,q=null,p=null;s.p();){o=s.d if(o==null)o=r.a(o) n=o.b @@ -3902,21 +3902,21 @@ break case"class":p=n break}}m=A.i([],t.lu) l=A.i([],t.cJ) -for(s=B.a.gF(a.w$.a),r=new A.bZ(s,t.k7),o=t.P;r.p();){k=o.a(s.gB()) -switch(k.b.ga_().toLowerCase()){case"navlabel":B.a.l(m,A.mT(k)) +for(s=B.a.gF(a.w$.a),r=new A.c1(s,t.k7),o=t.P;r.p();){k=o.a(s.gB()) +switch(k.b.ga_().toLowerCase()){case"navlabel":B.a.l(m,A.mZ(k)) break -case"navtarget":B.a.l(l,A.wj(k)) -break}}return new A.cn(q,p,m,l)}, -wf(a){var s=A.i([],t.nS) -new A.O(a.w$.a,t.C).T(0,new A.mW(s)) -return new A.f6(s)}, -rG(a){var s=A.i([],t.nS) -new A.O(a.w$.a,t.C).T(0,new A.mV(s)) -return new A.f6(s)}, -wg(a){var s,r,q,p,o=A.i([],t.mt) -for(s=B.a.gF(a.w$.a),r=new A.bZ(s,t.k7),q=t.P;r.p();){p=q.a(s.gB()) -if(p.b.ga_().toLowerCase()==="pagetarget")B.a.l(o,A.wh(p))}return new A.im(o)}, -wh(a){var s,r,q,p,o,n,m,l,k,j,i=null +case"navtarget":B.a.l(l,A.wt(k)) +break}}return new A.cp(q,p,m,l)}, +wp(a){var s=A.i([],t.nS) +new A.P(a.w$.a,t.C).T(0,new A.n1(s)) +return new A.f8(s)}, +rQ(a){var s=A.i([],t.nS) +new A.P(a.w$.a,t.C).T(0,new A.n0(s)) +return new A.f8(s)}, +wq(a){var s,r,q,p,o=A.i([],t.mt) +for(s=B.a.gF(a.w$.a),r=new A.c1(s,t.k7),q=t.P;r.p();){p=q.a(s.gB()) +if(p.b.ga_().toLowerCase()==="pagetarget")B.a.l(o,A.wr(p))}return new A.im(o)}, +wr(a){var s,r,q,p,o,n,m,l,k,j,i=null for(s=a.y$.a,r=A.w(s),s=new J.J(s,s.length,r.h("J<1>")),r=r.c,q=t.m9,p=i,o=p,n=o,m=n;s.p();){l=s.d if(l==null)l=r.a(l) k=l.b @@ -3924,16 +3924,16 @@ switch(l.a.ga_().toLowerCase()){case"id":m=k break case"value":n=k break -case"type":new A.ig(B.jb,q).iO(k) +case"type":new A.ig(B.jb,q).iP(k) break case"class":o=k break case"playorder":p=k break}}j=A.i([],t.lu) -new A.O(a.w$.a,t.C).T(0,new A.mX(j)) +new A.P(a.w$.a,t.C).T(0,new A.n2(j)) if(j.length===0)throw A.f(A.S("Incorrect EPUB navigation page target: at least one navLabel element is required.")) -return new A.f7(m,n,i,o,p,j,i)}, -rH(a){var s,r,q,p,o,n,m,l,k,j="EPUB parsing error: navigation point ",i={} +return new A.f9(m,n,i,o,p,j,i)}, +rR(a){var s,r,q,p,o,n,m,l,k,j="EPUB parsing error: navigation point ",i={} for(s=a.y$.a,r=A.w(s),s=new J.J(s,s.length,r.h("J<1>")),r=r.c,q=null,p=null,o=null;s.p();){n=s.d if(n==null)n=r.a(n) m=n.b @@ -3946,21 +3946,21 @@ break}}if(q==null||q.length===0)throw A.f(A.S("Incorrect EPUB navigation point: i.a=null l=A.i([],t.lu) k=A.i([],t.nS) -new A.O(a.w$.a,t.C).T(0,new A.mZ(i,l,k)) +new A.P(a.w$.a,t.C).T(0,new A.n4(i,l,k)) if(l.length===0)throw A.f(A.S(j+q+" should contain at least one navigation label.")) s=i.a if(s==null)throw A.f(A.S(j+q+" should contain content.")) -return new A.co(q,p,o,l,s,k)}, -wi(a){var s,r,q={} +return new A.cq(q,p,o,l,s,k)}, +ws(a){var s,r,q={} q.a=null s=A.i([],t.lu) r=A.i([],t.nS) -new A.O(a.w$.a,t.C).T(0,new A.mY(q,s,r)) +new A.P(a.w$.a,t.C).T(0,new A.n3(q,s,r)) if(s.length===0)throw A.f(A.S("EPUB parsing error: navigation point null should contain at least one navigation label.")) q=q.a if(q==null)throw A.f(A.S("EPUB parsing error: navigation point null should contain content.")) -return new A.co(null,null,null,s,q,r)}, -wj(a){var s,r,q,p,o,n,m,l,k,j=null,i={} +return new A.cq(null,null,null,s,q,r)}, +wt(a){var s,r,q,p,o,n,m,l,k,j=null,i={} for(s=a.y$.a,r=A.w(s),s=new J.J(s,s.length,r.h("J<1>")),r=r.c,q=j,p=q,o=p,n=o;s.p();){m=s.d if(m==null)m=r.a(m) l=m.b @@ -3974,37 +3974,37 @@ case"playorder":q=l break}}if(n==null||n.length===0)throw A.f(A.S("Incorrect EPUB navigation target: navigation target ID is missing.")) k=A.i([],t.lu) i.a=null -new A.O(a.w$.a,t.C).T(0,new A.n_(i,k)) +new A.P(a.w$.a,t.C).T(0,new A.n5(i,k)) if(k.length===0)throw A.f(A.S("Incorrect EPUB navigation target: at least one navLabel element is required.")) -return new A.f8(n,o,p,q,k,i.a)}, -n0:function n0(a){this.a=a}, -n1:function n1(){}, -n2:function n2(){}, -n3:function n3(){}, -n4:function n4(){}, -n5:function n5(){}, -mQ:function mQ(a){this.a=a}, -mR:function mR(a){this.a=a}, -mS:function mS(a){this.a=a}, -mU:function mU(){}, +return new A.fa(n,o,p,q,k,i.a)}, +n6:function n6(a){this.a=a}, +n7:function n7(){}, +n8:function n8(){}, +n9:function n9(){}, +na:function na(){}, +nb:function nb(){}, mW:function mW(a){this.a=a}, -mV:function mV(a){this.a=a}, mX:function mX(a){this.a=a}, -mZ:function mZ(a,b,c){this.a=a +mY:function mY(a){this.a=a}, +n_:function n_(){}, +n1:function n1(a){this.a=a}, +n0:function n0(a){this.a=a}, +n2:function n2(a){this.a=a}, +n4:function n4(a,b,c){this.a=a this.b=b this.c=c}, -mY:function mY(a,b,c){this.a=a +n3:function n3(a,b,c){this.a=a this.b=b this.c=c}, -n_:function n_(a,b){this.a=a +n5:function n5(a,b){this.a=a this.b=b}, -wl(a){var s=A.i([],t.mE) -new A.O(a.w$.a,t.C).T(0,new A.n8(s)) +wv(a){var s=A.i([],t.mE) +new A.P(a.w$.a,t.C).T(0,new A.ne(s)) return new A.ii(s)}, -wm(a){var s=A.i([],t.bz) -new A.O(a.w$.a,t.C).T(0,new A.n9(s)) +ww(a){var s=A.i([],t.bz) +new A.P(a.w$.a,t.C).T(0,new A.nf(s)) return new A.ij(s)}, -wn(a,b){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c={} +wx(a,b){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c={} c.a=null s=t.s r=A.i([],s) @@ -4022,41 +4022,41 @@ g=A.i([],s) f=A.i([],s) e=A.i([],s) d=A.i([],t.ik) -new A.O(a.w$.a,t.C).T(0,new A.na(c,r,q,p,o,n,m,l,k,j,i,h,g,f,e,b,d)) +new A.P(a.w$.a,t.C).T(0,new A.ng(c,r,q,p,o,n,m,l,k,j,i,h,g,f,e,b,d)) return new A.ik(r,q,p,c.a,o,n,m,l,k,j,i,h,g,f,e,d)}, -wo(a){var s,r,q,p,o,n +wy(a){var s,r,q,p,o,n for(s=a.y$.a,r=A.w(s),s=new J.J(s,s.length,r.h("J<1>")),r=r.c,q=null,p=null;s.p();){o=s.d if(o==null)o=r.a(o) n=o.b switch(o.a.ga_().toLowerCase()){case"role":q=n break case"file-as":p=n -break}}return new A.f_(A.cH(a),p,q)}, -wp(a){var s,r,q,p,o,n +break}}return new A.f1(A.cJ(a),p,q)}, +wz(a){var s,r,q,p,o,n for(s=a.y$.a,r=A.w(s),s=new J.J(s,s.length,r.h("J<1>")),r=r.c,q=null,p=null;s.p();){o=s.d if(o==null)o=r.a(o) n=o.b switch(o.a.ga_().toLowerCase()){case"role":q=n break case"file-as":p=n -break}}return new A.dl(A.cH(a),p,q)}, -wq(a){var s,r,q,p,o,n +break}}return new A.dm(A.cJ(a),p,q)}, +wA(a){var s,r,q,p,o,n for(s=a.y$.a,r=A.w(s),s=new J.J(s,s.length,r.h("J<1>")),r=r.c,q=null,p=null;s.p();){o=s.d if(o==null)o=r.a(o) n=o.b switch(o.a.ga_().toLowerCase()){case"id":q=n break case"scheme":p=n -break}}return new A.f1(q,p,A.cH(a))}, -wr(a){var s,r,q,p,o,n,m=null +break}}return new A.f3(q,p,A.cJ(a))}, +wB(a){var s,r,q,p,o,n,m=null for(s=a.y$.a,r=A.w(s),s=new J.J(s,s.length,r.h("J<1>")),r=r.c,q=m,p=q;s.p();){o=s.d if(o==null)o=r.a(o) n=o.b switch(o.a.ga_().toLowerCase()){case"name":p=n break case"content":q=n -break}}return new A.cR(p,q,m,m,m,m,B.Ac)}, -ws(a){var s,r,q,p,o,n,m,l,k=null,j=t.N,i=A.az(j,j) +break}}return new A.cT(p,q,m,m,m,m,B.Ac)}, +wC(a){var s,r,q,p,o,n,m,l,k=null,j=t.N,i=A.aA(j,j) for(j=a.y$.a,s=A.w(j),j=new J.J(j,j.length,s.h("J<1>")),s=s.c,r=k,q=r,p=q,o=p;j.p();){n=j.d if(n==null)n=s.a(n) m=n.b @@ -4069,43 +4069,43 @@ break case"property":q=m break case"scheme":r=m -break}}return new A.cR(k,A.cH(a),o,p,q,r,i)}, -qd(a,a0){var s=0,r=A.br(t.hl),q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b -var $async$qd=A.bs(function(a1,a2){if(a1===1)return A.bo(a2,r) -for(;;)switch(s){case 0:b=A.bI(new A.cE(a.a,t.bW),new A.nb(a0),t.u) +break}}return new A.cT(k,A.cJ(a),o,p,q,r,i)}, +qo(a,a0){var s=0,r=A.br(t.hl),q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b +var $async$qo=A.bs(function(a1,a2){if(a1===1)return A.bo(a2,r) +for(;;)switch(s){case 0:b=A.bJ(new A.cG(a.a,t.bW),new A.nh(a0),t.u) if(b==null)throw A.f(A.S("EPUB parsing error: root file not found in archive.")) -p=b.bQ() -o=B.E.b0(p==null?$.dd():p) -n=A.b2(A.o_(o).w$,"package","http://www.idpf.org/2007/opf").cp(0,new A.nc()) -m=n.cd("version") +p=b.bR() +o=B.E.b0(p==null?$.de():p) +n=A.b5(A.o6(o).w$,"package","http://www.idpf.org/2007/opf").cr(0,new A.ni()) +m=n.ce("version") if(m==="2.0")l=B.bG else{if(m!=="3.0")throw A.f(A.S("Unsupported EPUB version: "+A.k(m)+".")) l=B.cT}p=n.w$ -k=A.b2(p,"metadata","http://www.idpf.org/2007/opf") +k=A.b5(p,"metadata","http://www.idpf.org/2007/opf") j=t.q -i=A.eM(k,k.$ti.h("h.E"),j).cp(0,new A.nd()) +i=A.eM(k,k.$ti.h("h.E"),j).cr(0,new A.nj()) if(i==null)throw A.f(A.S("EPUB parsing error: metadata not found in the package.")) -h=A.wn(i,l) -k=A.b2(p,"manifest","http://www.idpf.org/2007/opf") -g=A.eM(k,k.$ti.h("h.E"),j).cp(0,new A.ne()) +h=A.wx(i,l) +k=A.b5(p,"manifest","http://www.idpf.org/2007/opf") +g=A.eM(k,k.$ti.h("h.E"),j).cr(0,new A.nk()) if(g==null)throw A.f(A.S("EPUB parsing error: manifest not found in the package.")) -f=A.wm(g) -k=A.b2(p,"spine","http://www.idpf.org/2007/opf") -e=A.eM(k,k.$ti.h("h.E"),j).cp(0,new A.nf()) +f=A.ww(g) +k=A.b5(p,"spine","http://www.idpf.org/2007/opf") +e=A.eM(k,k.$ti.h("h.E"),j).cr(0,new A.nl()) if(e==null)throw A.f(A.S("EPUB parsing error: spine not found in the package.")) -d=A.wt(e) -c=A.bI(A.b2(p,"guide","http://www.idpf.org/2007/opf"),new A.ng(),t.P) -q=new A.io(l,h,f,d,c!=null?A.wl(c):null) +d=A.wD(e) +c=A.bJ(A.b5(p,"guide","http://www.idpf.org/2007/opf"),new A.nm(),t.P) +q=new A.io(l,h,f,d,c!=null?A.wv(c):null) s=1 break case 1:return A.bp(q,r)}}) -return A.bq($async$qd,r)}, -wt(a){var s=A.i([],t.jA),r=a.cd("toc"),q=a.cd("page-progression-direction"),p=q==null||q.toLowerCase()==="ltr" -new A.O(a.w$.a,t.C).T(0,new A.nh(s)) +return A.bq($async$qo,r)}, +wD(a){var s=A.i([],t.jA),r=a.ce("toc"),q=a.ce("page-progression-direction"),p=q==null||q.toLowerCase()==="ltr" +new A.P(a.w$.a,t.C).T(0,new A.nn(s)) return new A.iq(r,s,p)}, -n8:function n8(a){this.a=a}, -n9:function n9(a){this.a=a}, -na:function na(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){var _=this +ne:function ne(a){this.a=a}, +nf:function nf(a){this.a=a}, +ng:function ng(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){var _=this _.a=a _.b=b _.c=c @@ -4123,38 +4123,38 @@ _.at=n _.ax=o _.ay=p _.ch=q}, -nb:function nb(a){this.a=a}, -nc:function nc(){}, -nd:function nd(){}, -ne:function ne(){}, -nf:function nf(){}, -ng:function ng(){}, nh:function nh(a){this.a=a}, -qh(a){var s=0,r=A.br(t.jv),q,p,o,n,m -var $async$qh=A.bs(function(b,c){if(b===1)return A.bo(c,r) -for(;;)switch(s){case 0:m=A.bI(new A.cE(a.a,t.bW),new A.nD(),t.u) +ni:function ni(){}, +nj:function nj(){}, +nk:function nk(){}, +nl:function nl(){}, +nm:function nm(){}, +nn:function nn(a){this.a=a}, +qs(a){var s=0,r=A.br(t.jv),q,p,o,n,m +var $async$qs=A.bs(function(b,c){if(b===1)return A.bo(c,r) +for(;;)switch(s){case 0:m=A.bJ(new A.cG(a.a,t.bW),new A.nJ(),t.u) if(m==null)throw A.f(A.S("EPUB parsing error: META-INF/container.xml file not found in archive.")) -p=m.bQ() -o=B.E.b0(p==null?$.dd():p) +p=m.bR() +o=B.E.b0(p==null?$.de():p) p=t.P -n=A.bI(A.b2(new A.c1(A.o_(o)),"container","urn:oasis:names:tc:opendocument:xmlns:container"),new A.nE(),p) +n=A.bJ(A.b5(new A.c4(A.o6(o)),"container","urn:oasis:names:tc:opendocument:xmlns:container"),new A.nK(),p) if(n==null)throw A.f(A.S("EPUB parsing error: Invalid epub container")) -q=p.a(A.bI(new A.c1(n),new A.nF(),t.I)).cd("full-path") +q=p.a(A.bJ(new A.c4(n),new A.nL(),t.I)).ce("full-path") s=1 break case 1:return A.bp(q,r)}}) -return A.bq($async$qh,r)}, -nD:function nD(){}, -nE:function nE(){}, -nF:function nF(){}, -eY:function eY(a,b,c,d,e,f){var _=this +return A.bq($async$qs,r)}, +nJ:function nJ(){}, +nK:function nK(){}, +nL:function nL(){}, +f_:function f_(a,b,c,d,e,f){var _=this _.a=a _.b=b _.c=c _.d=d _.e=e _.f=f}, -bg:function bg(a,b,c,d){var _=this +bh:function bh(a,b,c,d){var _=this _.a=a _.b=b _.c=c @@ -4165,7 +4165,7 @@ _.b=b _.c=c _.d=d _.e=e}, -dj:function dj(){}, +dk:function dk(){}, lU:function lU(a){this.a=a}, ih:function ih(a,b,c,d,e){var _=this _.a=a @@ -4173,35 +4173,35 @@ _.b=b _.c=c _.d=d _.e=e}, -fb:function fb(a,b,c,d){var _=this +fd:function fd(a,b,c,d){var _=this _.a=a _.b=b _.c=c _.d=d}, -f3:function f3(a,b){this.a=a +f5:function f5(a,b){this.a=a this.b=b}, -f2:function f2(a,b,c,d,e,f){var _=this +f4:function f4(a,b,c,d,e,f){var _=this _.a=a _.b=b _.c=c _.d=d _.e=e _.f=f}, -cm:function cm(a){this.a=a}, -f4:function f4(a){this.a=a}, +co:function co(a){this.a=a}, +f6:function f6(a){this.a=a}, il:function il(a){this.a=a}, -f5:function f5(a,b,c){this.a=a +f7:function f7(a,b,c){this.a=a this.b=b this.c=c}, -cS:function cS(a){this.a=a}, -cn:function cn(a,b,c,d){var _=this +cU:function cU(a){this.a=a}, +cp:function cp(a,b,c,d){var _=this _.a=a _.b=b _.c=c _.d=d}, -f6:function f6(a){this.a=a}, +f8:function f8(a){this.a=a}, im:function im(a){this.a=a}, -f7:function f7(a,b,c,d,e,f,g){var _=this +f9:function f9(a,b,c,d,e,f,g){var _=this _.a=a _.b=b _.c=c @@ -4209,16 +4209,16 @@ _.d=d _.e=e _.f=f _.r=g}, -cT:function cT(a,b){this.a=a +cV:function cV(a,b){this.a=a this.b=b}, -co:function co(a,b,c,d,e,f){var _=this +cq:function cq(a,b,c,d,e,f){var _=this _.a=a _.b=b _.c=c _.d=d _.e=e _.f=f}, -f8:function f8(a,b,c,d,e,f){var _=this +fa:function fa(a,b,c,d,e,f){var _=this _.a=a _.b=b _.c=c @@ -4226,11 +4226,11 @@ _.d=d _.e=e _.f=f}, ii:function ii(a){this.a=a}, -eZ:function eZ(a,b,c){this.a=a +f0:function f0(a,b,c){this.a=a this.b=b this.c=c}, ij:function ij(a){this.a=a}, -dk:function dk(a,b,c,d,e,f,g,h,i){var _=this +dl:function dl(a,b,c,d,e,f,g,h,i){var _=this _.a=a _.b=b _.c=c @@ -4257,18 +4257,18 @@ _.as=m _.at=n _.ax=o _.ay=p}, -f_:function f_(a,b,c){this.a=a +f1:function f1(a,b,c){this.a=a this.b=b this.c=c}, -dl:function dl(a,b,c){this.a=a +dm:function dm(a,b,c){this.a=a this.b=b this.c=c}, -f0:function f0(a,b){this.a=a +f2:function f2(a,b){this.a=a this.b=b}, -f1:function f1(a,b,c){this.a=a +f3:function f3(a,b,c){this.a=a this.b=b this.c=c}, -cR:function cR(a,b,c,d,e,f,g){var _=this +cT:function cT(a,b,c,d,e,f,g){var _=this _.a=a _.b=b _.c=c @@ -4285,7 +4285,7 @@ _.e=e}, iq:function iq(a,b,c){this.a=a this.b=b this.c=c}, -fa:function fa(a,b){this.a=a +fc:function fc(a,b){this.a=a this.b=b}, ir:function ir(a,b){this.a=a this.b=b}, @@ -4293,28 +4293,28 @@ ig:function ig(a,b){this.a=a this.$ti=b}, lT:function lT(a,b){this.a=a this.b=b}, -ro(){return new A.eT(A.ae(t.K,t.N))}, -rp(a,b,c){return new A.i9(a,b,c,A.ae(t.K,t.N))}, -qk(a){return new A.bY(a,A.ae(t.K,t.N))}, -q1(a,b){return new A.K(b,a,A.ae(t.K,t.N))}, -vI(a){var s +rz(){return new A.eU(A.aa(t.K,t.N))}, +rA(a,b,c){return new A.eV(a,b,c,A.aa(t.K,t.N))}, +qv(a){return new A.c0(a,A.aa(t.K,t.N))}, +qb(a,b){return new A.K(b,a,A.aa(t.K,t.N))}, +vT(a){var s if(a==null||a==="http://www.w3.org/1999/xhtml"||a==="http://www.w3.org/1998/Math/MathML"||a==="http://www.w3.org/2000/svg")return"" -s=A.rF(a) +s=A.rP(a) return s==null?"":s+":"}, -rm(a){return new A.i6(a,A.ae(t.K,t.N))}, -aO:function aO(a,b,c){this.a=a +rx(a){return new A.eP(a,A.aa(t.K,t.N))}, +aR:function aR(a,b,c){this.a=a this.b=b this.c=c}, kQ:function kQ(){}, -oU:function oU(){}, +p1:function p1(){}, kI:function kI(){}, am:function am(){}, -eT:function eT(a){var _=this +eU:function eU(a){var _=this _.a=null _.b=a _.d=_.c=$ _.e=null}, -i9:function i9(a,b,c,d){var _=this +eV:function eV(a,b,c,d){var _=this _.w=a _.x=b _.y=c @@ -4322,7 +4322,7 @@ _.a=null _.b=d _.d=_.c=$ _.e=null}, -bY:function bY(a,b){var _=this +c0:function c0(a,b){var _=this _.w=a _.a=null _.b=b @@ -4336,7 +4336,7 @@ _.b=c _.d=_.c=$ _.e=null}, lR:function lR(a){this.a=a}, -i6:function i6(a,b){var _=this +eP:function eP(a,b){var _=this _.w=a _.a=null _.b=b @@ -4345,31 +4345,43 @@ _.e=null}, ji:function ji(a,b){this.b=a this.a=b}, iu:function iu(a){this.a=a}, -md:function md(){}, +mi:function mi(){}, +oK:function oK(a){this.a=a}, kF:function kF(){}, kG:function kG(){}, kH:function kH(){}, kJ:function kJ(){}, kK:function kK(){}, kN:function kN(){}, -uE(a){var s,r,q=A.i([],t.bD),p=A.i([],t.il),o=A.i([],t.lB) -p=new A.nP("http://www.w3.org/1999/xhtml",p,new A.hH(o)) -p.aL() -o=A.q7(t.N) +zr(a){switch(a){case"area":case"base":case"br":case"col":case"command":case"embed":case"hr":case"img":case"input":case"keygen":case"link":case"meta":case"param":case"source":case"track":case"wbr":return!0}return!1}, +zM(a,b){var s,r,q=b.a +if(q instanceof A.K){s=q.x +if(B.Mq.C(0,s)||s==="plaintext"){r=J.ao(b.w) +b.w=r +a.a+=r +return}}r=J.ao(b.w) +b.w=r +r=A.uH(r,!1) +a.a+=r}, +nW:function nW(){}, +uP(a){var s,r,q=A.i([],t.bD),p=A.i([],t.il),o=A.i([],t.lB) +p=new A.nV("http://www.w3.org/1999/xhtml",p,new A.hJ(o)) +p.aM() +o=A.qi(t.N) s=A.i([],t.Z) -s=new A.mA(A.yI(null),!1,null,o,s) +s=new A.mF(A.yS(null),!1,null,o,s) s.f=new A.ah(a) s.a="utf-8" -s.aL() -o=new A.ff(s,!0,!0,!1,A.q7(t.nU),new A.Y(""),new A.Y(""),new A.Y("")) -o.aL() -r=new A.mB(!1,o,p,q) +s.aM() +o=new A.fh(s,!0,!0,!1,A.qi(t.nU),new A.X(""),new A.X(""),new A.X("")) +o.aM() +r=new A.mG(!1,o,p,q) o.f=r -r.kE() +r.kF() p=p.b p===$&&A.o() return p}, -mB:function mB(a,b,c,d){var _=this +mG:function mG(a,b,c,d){var _=this _.b=a _.c=b _.d=c @@ -4381,34 +4393,34 @@ _.x=$ _.y=null _.z=!0 _.ok=_.k4=_.k3=_.k2=_.k1=_.id=_.go=_.fy=_.fx=_.fr=_.dy=_.dx=_.db=_.cy=_.cx=_.CW=_.ch=_.ay=_.ax=_.at=_.as=_.Q=$}, -aa:function aa(){}, -nq:function nq(a){this.a=a}, -np:function np(a){this.a=a}, +ac:function ac(){}, +nw:function nw(a){this.a=a}, +nv:function nv(a){this.a=a}, iN:function iN(a,b){this.a=a this.b=b}, -hZ:function hZ(a,b){this.a=a +i0:function i0(a,b){this.a=a this.b=b}, -hY:function hY(a,b){this.a=a +i_:function i_(a,b){this.a=a this.b=b}, iG:function iG(a,b){this.a=a this.b=b}, -hM:function hM(a,b){this.a=a +hO:function hO(a,b){this.a=a this.b=b}, iA:function iA(a,b){this.c=!1 this.a=a this.b=b}, -mF:function mF(a){this.a=a}, -mE:function mE(a){this.a=a}, +mK:function mK(a){this.a=a}, +mJ:function mJ(a){this.a=a}, jU:function jU(a,b){this.a=a this.b=b}, iL:function iL(a,b){this.a=a this.b=b}, -fg:function fg(a,b,c){var _=this +fi:function fi(a,b,c){var _=this _.c=null _.d=a _.a=b _.b=c}, -mG:function mG(){}, +mL:function mL(){}, iB:function iB(a,b){this.a=a this.b=b}, iD:function iD(a,b){this.a=a @@ -4425,20 +4437,20 @@ iI:function iI(a,b){this.a=a this.b=b}, iE:function iE(a,b){this.a=a this.b=b}, -hK:function hK(a,b){this.a=a +hM:function hM(a,b){this.a=a this.b=b}, iF:function iF(a,b){this.a=a this.b=b}, -hL:function hL(a,b){this.a=a +hN:function hN(a,b){this.a=a this.b=b}, -hI:function hI(a,b){this.a=a +hK:function hK(a,b){this.a=a this.b=b}, -hJ:function hJ(a,b){this.a=a +hL:function hL(a,b){this.a=a this.b=b}, -bb:function bb(a,b,c){this.a=a +bc:function bc(a,b,c){this.a=a this.b=b this.c=c}, -rF(a){var s +rP(a){var s A:{if("http://www.w3.org/1999/xhtml"===a){s="html" break A}if("http://www.w3.org/1998/Math/MathML"===a){s="math" break A}if("http://www.w3.org/2000/svg"===a){s="svg" @@ -4447,56 +4459,56 @@ break A}if("http://www.w3.org/XML/1998/namespace"===a){s="xml" break A}if("http://www.w3.org/2000/xmlns/"===a){s="xmlns" break A}s=null break A}return s}, -a8(a){A.hB(a) +a9(a){A.hD(a) if(a==null)return!1 if(0>=a.length)return A.c(a,0) -return A.qY(a.charCodeAt(0))}, -qY(a){switch(a){case 9:case 10:case 12:case 13:case 32:return!0}return!1}, -b4(a){var s,r +return A.r8(a.charCodeAt(0))}, +r8(a){switch(a){case 9:case 10:case 12:case 13:case 32:return!0}return!1}, +b6(a){var s,r if(a==null)return!1 if(0>=a.length)return A.c(a,0) s=a.charCodeAt(0) if(!(s>=97&&s<=122))r=s>=65&&s<=90 else r=!0 return r}, -pJ(a){var s +pR(a){var s if(a==null)return!1 if(0>=a.length)return A.c(a,0) s=a.charCodeAt(0) return s>=48&&s<58}, -uy(a){if(a==null)return!1 +uJ(a){if(a==null)return!1 if(0>=a.length)return A.c(a,0) switch(a.charCodeAt(0)){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 65:case 66:case 67:case 68:case 69:case 70:case 97:case 98:case 99:case 100:case 101:case 102:return!0}return!1}, -c9(a){var s=new A.ah(a) -if(s.aH(s,A.yN())){s=t.gS -return A.aA(new A.Q(new A.ah(a),s.h("b(C.E)").a(A.yM()),s.h("Q")),0,null)}return a}, -vt(a){A.ax(a) +cc(a){var s=new A.ah(a) +if(s.aC(s,A.yW())){s=t.gS +return A.aD(new A.Q(new A.ah(a),s.h("b(B.E)").a(A.yV()),s.h("Q")),0,null)}return a}, +vE(a){A.at(a) return a>=65&&a<=90}, -vs(a){A.ax(a) +vD(a){A.at(a) return a>=65&&a<=90?a+97-65:a}, -nB:function nB(){}, +nH:function nH(){}, ia:function ia(a){this.a=a}, kD:function kD(){}, -qx(a){return new A.ew()}, +qI(a){return new A.ew()}, lS:function lS(a){this.a=a this.b=-1}, lN:function lN(a){this.a=a}, ew:function ew(){}, -yb(a){if(32<=a&&a<=126)return!1 +yl(a){if(32<=a&&a<=126)return!1 if(1<=a&&a<=8)return!0 if(14<=a&&a<=31)return!0 if(127<=a&&a<=159)return!0 if(55296<=a&&a<=57343)return!0 if(64976<=a&&a<=65007)return!0 switch(a){case 11:case 65534:case 65535:case 131070:case 131071:case 196606:case 196607:case 262142:case 262143:case 327678:case 327679:case 393214:case 393215:case 458750:case 458751:case 524286:case 524287:case 589822:case 589823:case 655358:case 655359:case 720894:case 720895:case 786430:case 786431:case 851966:case 851967:case 917502:case 917503:case 983038:case 983039:case 1048574:case 1048575:case 1114110:case 1114111:return!0}return!1}, -yI(a){var s=A.a5("[\t-\r -/:-@[-`{-~]",!0) +yS(a){var s=A.a3("[\t-\r -/:-@[-`{-~]",!0) if(a==null)return null -return B.vX.m(0,A.cO(a,s,"").toLowerCase())}, -xU(a,b){var s +return B.vX.m(0,A.cQ(a,s,"").toLowerCase())}, +y3(a,b){var s A:{if("ascii"===a){s=new A.ah(B.id.b0(b)) break A}if("utf-8"===a){s=new A.ah(B.E.b0(b)) -break A}s=A.P(A.W("Encoding "+a+" not supported",null))}return s}, -mA:function mA(a,b,c,d,e){var _=this +break A}s=A.M(A.W("Encoding "+a+" not supported",null))}return s}, +mF:function mF(a,b,c,d,e){var _=this _.a=a _.b=!0 _.c=b @@ -4506,41 +4518,41 @@ _.r=d _.w=null _.x=e _.y=0}, -b9:function b9(){}, -zr(a,b){var s=A.i([],t.il) -new A.d0().f9(a,A.qN(b),s) +bb:function bb(){}, +uT(a,b){var s=A.i([],t.il) +new A.bY().d2(a,A.qY(b),s) return s}, -qN(a){var s,r,q,p=null,o=t.kU,n=A.i([],o),m=t.m3.a(B.a.ghF(n)) +qY(a){var s,r,q,p=null,o=t.kU,n=A.i([],o),m=t.m3.a(B.a.ghG(n)) o=A.i([],o) $.eE.b=new A.j5(m,B.hx,o) o=new A.ah(a) m=A.i([0],t.Z) s=o.gn(0) r=new A.jN(p,m,new Uint32Array(s)) -r.fN(o,p) +r.fO(o,p) o=new A.jX(85,117,43,63,new A.ah("CDATA"),r,a,!0,0) m=new A.kR(o) -m.d=o.c9() +m.d=o.ca() o=o.e=!0 -q=m.ip() -if(q!=null?n.length!==0:o)throw A.f(A.aD("'"+a+"' is not a valid selector: "+A.k(n),p,p)) +q=m.iq() +if(q!=null?n.length!==0:o)throw A.f(A.aq("'"+a+"' is not a valid selector: "+A.k(n),p,p)) return q}, -rW(a){switch(a){case"before":case"after":case"first-line":case"first-letter":return!0 +t5(a){switch(a){case"before":case"after":case"first-line":case"first-letter":return!0 default:return!1}}, -wL(a){var s,r +wV(a){var s,r while(a!=null){s=a.b.m(0,"lang") if(s!=null)return s r=a.a a=r instanceof A.K?r:null}return null}, -d0:function d0(){this.a=null}, -nI:function nI(){}, -nJ:function nJ(){}, -nH:function nH(){}, -nG:function nG(a){this.a=a}, -aZ(a,b,c,d){return new A.d2(b==null?A.ae(t.K,t.N):b,c,a,d)}, +bY:function bY(){this.a=null}, +nO:function nO(){}, +nP:function nP(){}, +nN:function nN(){}, +nM:function nM(a){this.a=a}, +b3(a,b,c,d){return new A.d3(b==null?A.aa(t.K,t.N):b,c,a,d)}, bl:function bl(){}, -cA:function cA(){}, -d2:function d2(a,b,c,d){var _=this +cC:function cC(){}, +d3:function d3(a,b,c,d){var _=this _.e=a _.r=!1 _.w=b @@ -4550,7 +4562,7 @@ _.a=null}, H:function H(a,b){this.b=a this.c=b this.a=null}, -bK:function bK(){}, +bL:function bL(){}, j:function j(a,b,c){var _=this _.e=a _.b=b @@ -4565,14 +4577,14 @@ this.a=null}, dU:function dU(a,b){this.b=a this.c=b this.a=null}, -eS:function eS(a){var _=this +eT:function eT(a){var _=this _.c=_.b=null _.d="" _.e=a _.a=null}, jS:function jS(){this.a=null this.b=$}, -ff:function ff(a,b,c,d,e,f,g,h){var _=this +fh:function fh(a,b,c,d,e,f,g,h){var _=this _.a=a _.b=b _.c=c @@ -4586,86 +4598,86 @@ _.z=$ _.at=_.as=_.Q=null _.ax=g _.ay=h}, -mC:function mC(a){this.a=a}, -yo(a,b){var s,r,q=a.a +mH:function mH(a){this.a=a}, +yy(a,b){var s,r,q=a.a if(q!==b.a)return!1 if(q===0)return!0 -for(q=new A.cv(a,a.r,a.e,A.x(a).h("cv<1>"));q.p();){s=q.d +for(q=new A.cx(a,a.r,a.e,A.x(a).h("cx<1>"));q.p();){s=q.d r=b.m(0,s) if(r==null&&!b.a7(s))return!1 if(a.m(0,s)!=r)return!1}return!0}, -t2(a,b,c,d){var s,r,q,p,o=a.gL() -if(d==null)if(!o.gN(o)&&o.gA(o) instanceof A.bY){s=t.oI.a(o.gA(o)) -s.hM(b) +tc(a,b,c,d){var s,r,q,p,o=a.gJ() +if(d==null)if(!o.gN(o)&&o.gA(o) instanceof A.c0){s=t.oI.a(o.gA(o)) +s.hN(b) if(c!=null){r=c.a q=s.e -s.e=r.K(A.cU(q.a,q.b).b,A.cU(r,c.c).b)}}else{r=A.qk(b) +s.e=r.M(A.cW(q.a,q.b).b,A.cW(r,c.c).b)}}else{r=A.qv(b) r.e=c -o.l(0,r)}else{p=o.al(o,d) +o.l(0,r)}else{p=o.aj(o,d) if(p>0){r=p-1 q=o.a if(!(r=0&&rs?s:c)}, -qQ(a){var s,r -for(s=a.length,r=0;r")),q=q.c;j.p();){l=j.d +n=new A.pr(k,o,s) +m=new A.py(k,new A.px(k,o),n,p,o,new A.pv(A.aA(t.Q,q)),s) +if(i!=null)for(j=i.gJ().a,q=A.w(j),j=new J.J(j,j.length,q.h("J<1>")),q=q.c;j.p();){l=j.d m.$2(l==null?q.a(l):l,B.bi)}n.$0() return A.v(["blocks",s,"anchors",p,"length",k.a],r,t.X)}, -pn:function pn(a){this.a=a}, -po:function po(){}, -pj:function pj(a,b,c){this.a=a +pv:function pv(a){this.a=a}, +pw:function pw(){}, +pr:function pr(a,b,c){this.a=a this.b=b this.c=c}, -pk:function pk(){}, -pl:function pl(){}, -pm:function pm(){}, -pp:function pp(a,b){this.a=a +ps:function ps(){}, +pt:function pt(){}, +pu:function pu(){}, +px:function px(a,b){this.a=a this.b=b}, -pq:function pq(a,b,c,d,e,f,g){var _=this +py:function py(a,b,c,d,e,f,g){var _=this _.a=a _.b=b _.c=c @@ -4673,15 +4685,15 @@ _.d=d _.e=e _.f=f _.r=g}, -pr:function pr(){}, -pR(a,b){return A.zp(a,b)}, -zp(a,b){var s=0,r=A.br(t.f),q,p=2,o=[],n,m,l,k,j,i -var $async$pR=A.bs(function(c,d){if(c===1){o.push(d) +pz:function pz(){}, +q_(a,b){return A.zx(a,b)}, +zx(a,b){var s=0,r=A.br(t.f),q,p=2,o=[],n,m,l,k,j,i +var $async$q_=A.bs(function(c,d){if(c===1){o.push(d) s=p}for(;;)switch(s){case 0:p=4 j=A i=b.m(0,"id") s=7 -return A.c3(a.eJ(A.q(b.m(0,"command")),b.m(0,"argument")),$async$pR) +return A.bF(a.eN(A.q(b.m(0,"command")),b.m(0,"argument")),$async$q_) case 7:m=j.v(["id",i,"result",d],t.N,t.X) q=m s=1 @@ -4691,8 +4703,8 @@ s=6 break case 4:p=3 k=o.pop() -m=A.bP(k) -if(m instanceof A.f9){n=m +m=A.bQ(k) +if(m instanceof A.fb){n=m m=b.m(0,"id") n.toString n.toString @@ -4707,7 +4719,7 @@ case 3:s=2 break case 6:case 1:return A.bp(q,r) case 2:return A.bo(o.at(-1),r)}}) -return A.bq($async$pR,r)}, +return A.bq($async$q_,r)}, lV:function lV(a,b){this.a=null this.b=a this.c=b}, @@ -4722,75 +4734,80 @@ m_:function m_(){}, m0:function m0(){}, m1:function m1(){}, lW:function lW(){}, -m7:function m7(a,b){this.a=a -this.b=b}, +m7:function m7(){}, m8:function m8(){}, +m9:function m9(){}, +ma:function ma(){}, +mb:function mb(){}, +mc:function mc(a,b){this.a=a +this.b=b}, +md:function md(){}, m5:function m5(){}, m6:function m6(){}, -f9:function f9(){}, -u8(a){return a}, -uf(a,b){var s,r,q,p,o,n,m,l +fb:function fb(){}, +ui(a){return a}, +up(a,b){var s,r,q,p,o,n,m,l for(s=b.length,r=1;r=1;s=q){q=s-1 -if(b[q]!=null)break}p=new A.Y("") +if(b[q]!=null)break}p=new A.X("") o=a+"(" p.a=o n=A.w(b) -m=n.h("cy<1>") -l=new A.cy(b,0,s,m) -l.fO(b,0,s,n.c) -m=o+new A.Q(l,m.h("e(G.E)").a(new A.pg()),m.h("Q")).aq(0,", ") +m=n.h("cA<1>") +l=new A.cA(b,0,s,m) +l.fP(b,0,s,n.c) +m=o+new A.Q(l,m.h("e(G.E)").a(new A.po()),m.h("Q")).ar(0,", ") p.a=m p.a=m+("): part "+(r-1)+" was null, but part "+r+" was not.") throw A.f(A.W(p.j(0),null))}}, lO:function lO(a){this.a=a}, lP:function lP(){}, lQ:function lQ(){}, -pg:function pg(){}, +po:function po(){}, e1:function e1(){}, -jr(a,b){var s,r,q,p,o,n,m=b.iQ(a) -b.bO(a) +jr(a,b){var s,r,q,p,o,n,m=b.iR(a) +b.bP(a) if(m!=null)a=B.b.ab(a,m.length) s=t.s r=A.i([],s) q=A.i([],s) s=a.length if(s!==0){if(0>=s)return A.c(a,0) -p=b.by(a.charCodeAt(0))}else p=!1 +p=b.bz(a.charCodeAt(0))}else p=!1 if(p){if(0>=s)return A.c(a,0) B.a.l(q,a[0]) o=1}else{B.a.l(q,"") -o=0}for(n=o;n").u(e).h("fq<1,2>"))}, -fq:function fq(a,b,c,d){var _=this +dt(a,b,c,d,e){return new A.fs(b,!1,a,d.h("@<0>").u(e).h("fs<1,2>"))}, +fs:function fs(a,b,c,d){var _=this _.b=a _.c=b _.a=c _.$ti=d}, -fU:function fU(a,b){this.a=a +fW:function fW(a,b){this.a=a this.$ti=b}, -uG(a,b,c,d){var s,r,q=B.b.U(a,"^"),p=q?B.b.ab(a,1):a,o=t.s,n=b?A.i([p.toLowerCase(),p.toUpperCase()],o):A.i([p],o),m=d?$.vc():$.vb() +uR(a,b,c,d){var s,r,q=B.b.U(a,"^"),p=q?B.b.ab(a,1):a,o=t.s,n=b?A.i([p.toLowerCase(),p.toUpperCase()],o):A.i([p],o),m=d?$.vo():$.vn() o=A.w(n) -s=A.uC(new A.dn(n,o.h("h(1)").a(new A.pQ(m)),o.h("dn<1,ab>")),d) -if(q)s=s instanceof A.ck?new A.ck(!s.a):new A.jj(s) -o=A.uM(a,d) +s=A.uN(new A.dp(n,o.h("h(1)").a(new A.pZ(m)),o.h("dp<1,ad>")),d) +if(q)s=s instanceof A.cm?new A.cm(!s.a):new A.jj(s) +o=A.uY(a,d) r=b?" (case-insensitive)":"" c="["+o+"]"+r+" expected" -return A.bH(s,c,d)}, -tZ(a){var s=A.bH(B.W,"input expected",a),r=t.N,q=t.eN,p=A.dt(s,new A.pc(a),!1,r,q) -return A.rY(A.nr(A.cj(A.i([A.dz(new A.dB(s,A.ui("-",!1,null,!1),s,t.bT),new A.pd(a),r,r,r,q),p],t.fa),null,q),0,9007199254740991,q),new A.id("end of input expected"),null,t.aI)}, -pQ:function pQ(a){this.a=a}, -pc:function pc(a){this.a=a}, -pd:function pd(a){this.a=a}, -ca:function ca(){}, -fM:function fM(a){this.a=a}, -ck:function ck(a){this.a=a}, +return A.bI(s,c,d)}, +u8(a){var s=A.bI(B.W,"input expected",a),r=t.N,q=t.eN,p=A.dt(s,new A.pk(a),!1,r,q) +return A.t7(A.nx(A.cl(A.i([A.dz(new A.dB(s,A.us("-",!1,null,!1),s,t.bT),new A.pl(a),r,r,r,q),p],t.fa),null,q),0,9007199254740991,q),new A.id("end of input expected"),null,t.aI)}, +pZ:function pZ(a){this.a=a}, +pk:function pk(a){this.a=a}, +pl:function pl(a){this.a=a}, +cd:function cd(){}, +fO:function fO(a){this.a=a}, +cm:function cm(a){this.a=a}, j4:function j4(a,b,c){this.a=a this.b=b this.c=c}, jj:function jj(a){this.a=a}, -ab:function ab(a,b){this.a=a +ad:function ad(a,b){this.a=a this.b=b}, k8:function k8(){}, -uM(a,b){var s=b?new A.bV(a):new A.ah(a) -return s.c8(s,new A.pY(),t.N).aQ(0)}, -pY:function pY(){}, -zn(a,b,c){var s=new A.ah(b?a.toLowerCase()+a.toUpperCase():a) -return A.uC(s.c8(s,new A.pP(),t.eN),!1)}, -uC(a,b){var s,r,q,p,o,n,m,l,k=A.a7(a,t.eN) +uY(a,b){var s=b?new A.bX(a):new A.ah(a) +return s.c9(s,new A.q6(),t.N).aR(0)}, +q6:function q6(){}, +zw(a,b,c){var s=new A.ah(b?a.toLowerCase()+a.toUpperCase():a) +return A.uN(s.c9(s,new A.pX(),t.eN),!1)}, +uN(a,b){var s,r,q,p,o,n,m,l,k=A.a8(a,t.eN) k.$flags=1 s=k -B.a.bV(s,new A.pN()) +B.a.bW(s,new A.pV()) r=A.i([],t.lU) -for(k=s.length,q=0;q=p.a)B.a.k(r,r.length-1,new A.ab(o.a,p.b)) -else B.a.l(r,p)}}n=B.a.cQ(r,0,new A.pO(),t.S) +if(o.b+1>=p.a)B.a.k(r,r.length-1,new A.ad(o.a,p.b)) +else B.a.l(r,p)}}n=B.a.cS(r,0,new A.pW(),t.S) if(n===0)return B.is else{if(!(b&&n-1===1114111))k=!b&&n-1===65535 else k=!0 @@ -4903,70 +4920,70 @@ else{k=r.length if(k===1){if(0>=k)return A.c(r,0) k=r[0] m=k.a -return m===k.b?new A.fM(m):k}else{k=B.a.gbv(r) +return m===k.b?new A.fO(m):k}else{k=B.a.gbw(r) m=B.a.gA(r) -l=B.f.b5(B.a.gA(r).b-B.a.gbv(r).a+31+1,5) +l=B.f.b5(B.a.gA(r).b-B.a.gbw(r).a+31+1,5) k=new A.j4(k.a,m.b,new Uint32Array(l)) -k.jV(r) +k.jW(r) return k}}}}, -pP:function pP(){}, -pN:function pN(){}, -pO:function pO(){}, -cj(a,b,c){var s=b==null?A.z4():b,r=A.a7(a,c.h("n<0>")) +pX:function pX(){}, +pV:function pV(){}, +pW:function pW(){}, +cl(a,b,c){var s=b==null?A.zd():b,r=A.a8(a,c.h("n<0>")) r.$flags=1 return new A.eO(s,r,c.h("eO<0>"))}, eO:function eO(a,b,c){this.b=a this.a=b this.$ti=c}, -au:function au(){}, -uK(a,b,c,d){return new A.fH(a,b,c.h("@<0>").u(d).h("fH<1,2>"))}, -wI(a,b,c,d,e){return A.dt(a,new A.nv(b,c,d,e),!1,c.h("@<0>").u(d).h("+(1,2)"),e)}, -fH:function fH(a,b,c){this.a=a +ax:function ax(){}, +uW(a,b,c,d){return new A.fJ(a,b,c.h("@<0>").u(d).h("fJ<1,2>"))}, +wS(a,b,c,d,e){return A.dt(a,new A.nB(b,c,d,e),!1,c.h("@<0>").u(d).h("+(1,2)"),e)}, +fJ:function fJ(a,b,c){this.a=a this.b=b this.$ti=c}, -nv:function nv(a,b,c,d){var _=this +nB:function nB(a,b,c,d){var _=this _.a=a _.b=b _.c=c _.d=d}, -c5(a,b,c,d,e,f){return new A.dB(a,b,c,d.h("@<0>").u(e).u(f).h("dB<1,2,3>"))}, -dz(a,b,c,d,e,f){return A.dt(a,new A.nw(b,c,d,e,f),!1,c.h("@<0>").u(d).u(e).h("+(1,2,3)"),f)}, +c8(a,b,c,d,e,f){return new A.dB(a,b,c,d.h("@<0>").u(e).u(f).h("dB<1,2,3>"))}, +dz(a,b,c,d,e,f){return A.dt(a,new A.nC(b,c,d,e,f),!1,c.h("@<0>").u(d).u(e).h("+(1,2,3)"),f)}, dB:function dB(a,b,c,d){var _=this _.a=a _.b=b _.c=c _.$ti=d}, -nw:function nw(a,b,c,d,e){var _=this +nC:function nC(a,b,c,d,e){var _=this _.a=a _.b=b _.c=c _.d=d _.e=e}, -pU(a,b,c,d,e,f,g,h){return new A.fI(a,b,c,d,e.h("@<0>").u(f).u(g).u(h).h("fI<1,2,3,4>"))}, -nx(a,b,c,d,e,f,g){return A.dt(a,new A.ny(b,c,d,e,f,g),!1,c.h("@<0>").u(d).u(e).u(f).h("+(1,2,3,4)"),g)}, -fI:function fI(a,b,c,d,e){var _=this +q2(a,b,c,d,e,f,g,h){return new A.fK(a,b,c,d,e.h("@<0>").u(f).u(g).u(h).h("fK<1,2,3,4>"))}, +nD(a,b,c,d,e,f,g){return A.dt(a,new A.nE(b,c,d,e,f,g),!1,c.h("@<0>").u(d).u(e).u(f).h("+(1,2,3,4)"),g)}, +fK:function fK(a,b,c,d,e){var _=this _.a=a _.b=b _.c=c _.d=d _.$ti=e}, -ny:function ny(a,b,c,d,e,f){var _=this +nE:function nE(a,b,c,d,e,f){var _=this _.a=a _.b=b _.c=c _.d=d _.e=e _.f=f}, -uL(a,b,c,d,e,f,g,h,i,j){return new A.fJ(a,b,c,d,e,f.h("@<0>").u(g).u(h).u(i).u(j).h("fJ<1,2,3,4,5>"))}, -rT(a,b,c,d,e,f,g,h){return A.dt(a,new A.nz(b,c,d,e,f,g,h),!1,c.h("@<0>").u(d).u(e).u(f).u(g).h("+(1,2,3,4,5)"),h)}, -fJ:function fJ(a,b,c,d,e,f){var _=this +uX(a,b,c,d,e,f,g,h,i,j){return new A.fL(a,b,c,d,e,f.h("@<0>").u(g).u(h).u(i).u(j).h("fL<1,2,3,4,5>"))}, +t2(a,b,c,d,e,f,g,h){return A.dt(a,new A.nF(b,c,d,e,f,g,h),!1,c.h("@<0>").u(d).u(e).u(f).u(g).h("+(1,2,3,4,5)"),h)}, +fL:function fL(a,b,c,d,e,f){var _=this _.a=a _.b=b _.c=c _.d=d _.e=e _.$ti=f}, -nz:function nz(a,b,c,d,e,f,g){var _=this +nF:function nF(a,b,c,d,e,f,g){var _=this _.a=a _.b=b _.c=c @@ -4974,8 +4991,8 @@ _.d=d _.e=e _.f=f _.r=g}, -wJ(a,b,c,d,e,f,g,h,i,j,k){return A.dt(a,new A.nA(b,c,d,e,f,g,h,i,j,k),!1,c.h("@<0>").u(d).u(e).u(f).u(g).u(h).u(i).u(j).h("+(1,2,3,4,5,6,7,8)"),k)}, -fK:function fK(a,b,c,d,e,f,g,h,i){var _=this +wT(a,b,c,d,e,f,g,h,i,j,k){return A.dt(a,new A.nG(b,c,d,e,f,g,h,i,j,k),!1,c.h("@<0>").u(d).u(e).u(f).u(g).u(h).u(i).u(j).h("+(1,2,3,4,5,6,7,8)"),k)}, +fM:function fM(a,b,c,d,e,f,g,h,i){var _=this _.a=a _.b=b _.c=c @@ -4985,7 +5002,7 @@ _.f=f _.r=g _.w=h _.$ti=i}, -nA:function nA(a,b,c,d,e,f,g,h,i,j){var _=this +nG:function nG(a,b,c,d,e,f,g,h,i,j){var _=this _.a=a _.b=b _.c=c @@ -4997,46 +5014,46 @@ _.w=h _.x=i _.y=j}, ds:function ds(){}, -bT:function bT(a,b,c){this.b=a +bV:function bV(a,b,c){this.b=a this.a=b this.$ti=c}, -rY(a,b,c,d){var s=c==null?new A.cQ(null,t.cC):c,r=b==null?new A.cQ(null,t.cC):b -return new A.fP(s,r,a,d.h("fP<0>"))}, -fP:function fP(a,b,c,d){var _=this +t7(a,b,c,d){var s=c==null?new A.cS(null,t.cC):c,r=b==null?new A.cS(null,t.cC):b +return new A.fR(s,r,a,d.h("fR<0>"))}, +fR:function fR(a,b,c,d){var _=this _.b=a _.c=b _.a=c _.$ti=d}, id:function id(a){this.a=a}, -cQ:function cQ(a,b){this.a=a +cS:function cS(a,b){this.a=a this.$ti=b}, jg:function jg(a){this.a=a}, -bH(a,b,c){var s -switch(c){case!1:s=a instanceof A.ck&&a.a?new A.hO(a,b):new A.ej(a,b) +bI(a,b,c){var s +switch(c){case!1:s=a instanceof A.cm&&a.a?new A.hQ(a,b):new A.ej(a,b) break -case!0:s=a instanceof A.ck&&a.a?new A.hP(a,b):new A.fV(a,b) +case!0:s=a instanceof A.cm&&a.a?new A.hR(a,b):new A.fX(a,b) break default:s=null}return s}, -i2:function i2(){}, -fC:function fC(a,b,c){this.a=a +i4:function i4(){}, +fE:function fE(a,b,c){this.a=a this.b=b this.c=c}, ej:function ej(a,b){this.a=a this.b=b}, -hO:function hO(a,b){this.a=a +hQ:function hQ(a,b){this.a=a this.b=b}, -zx(a,b,c){var s=a.length -if(b)s=new A.fC(s,new A.pW(a),'"'+a+'" (case-insensitive) expected') -else s=new A.fC(s,new A.pX(a),'"'+a+'" expected') +zE(a,b,c){var s=a.length +if(b)s=new A.fE(s,new A.q4(a),'"'+a+'" (case-insensitive) expected') +else s=new A.fE(s,new A.q5(a),'"'+a+'" expected') return s}, -pW:function pW(a){this.a=a}, -pX:function pX(a){this.a=a}, -fV:function fV(a,b){this.a=a +q4:function q4(a){this.a=a}, +q5:function q5(a){this.a=a}, +fX:function fX(a,b){this.a=a this.b=b}, -hP:function hP(a,b){this.a=a +hR:function hR(a,b){this.a=a this.b=b}, -rU(a,b,c,d){if(a instanceof A.ej)return new A.jH(a.a,d,b,c) -else return new A.cp(d,A.nr(a,b,c,t.N))}, +t3(a,b,c,d){if(a instanceof A.ej)return new A.jH(a.a,d,b,c) +else return new A.cr(d,A.nx(a,b,c,t.N))}, jH:function jH(a,b,c,d){var _=this _.a=a _.b=b @@ -5048,90 +5065,90 @@ _.b=b _.c=c _.a=d _.$ti=e}, -fm:function fm(){}, -nr(a,b,c,d){return new A.fB(b,c,a,d.h("fB<0>"))}, -fB:function fB(a,b,c,d){var _=this +fo:function fo(){}, +nx(a,b,c,d){return new A.fD(b,c,a,d.h("fD<0>"))}, +fD:function fD(a,b,c,d){var _=this _.b=a _.c=b _.a=c _.$ti=d}, dA:function dA(){}, -cU(a,b){if(b<0)A.P(A.aQ("Offset may not be negative, was "+b+".")) -else if(b>a.c.length)A.P(A.aQ("Offset "+b+u.D+a.gn(0)+".")) -return new A.bh(a,b)}, -qy(a,b,c){if(ca.c.length)A.P(A.aQ("End "+c+u.D+a.gn(0)+".")) -else if(b<0)A.P(A.aQ("Start may not be negative, was "+b+".")) -return new A.aw(a,b,c)}, +cW(a,b){if(b<0)A.M(A.aT("Offset may not be negative, was "+b+".")) +else if(b>a.c.length)A.M(A.aT("Offset "+b+u.D+a.gn(0)+".")) +return new A.bi(a,b)}, +qJ(a,b,c){if(ca.c.length)A.M(A.aT("End "+c+u.D+a.gn(0)+".")) +else if(b<0)A.M(A.aT("Start may not be negative, was "+b+".")) +return new A.az(a,b,c)}, jN:function jN(a,b,c){var _=this _.a=a _.b=b _.c=c _.d=null}, -bh:function bh(a,b){this.a=a +bi:function bi(a,b){this.a=a this.b=b}, -aw:function aw(a,b,c){this.a=a +az:function az(a,b,c){this.a=a this.b=b this.c=c}, -vO(a,b){var s=A.vP(A.i([A.xd(a,!0)],t.g7)),r=new A.my(b).$0(),q=B.f.j(B.a.gA(s).b+1),p=A.vQ(s)?0:3,o=A.w(s) -return new A.me(s,r,null,1+Math.max(q.length,p),new A.Q(s,o.h("b(1)").a(new A.mg()),o.h("Q<1,b>")).o6(0,B.ic),!A.zh(new A.Q(s,o.h("p?(1)").a(new A.mh()),o.h("Q<1,p?>"))),new A.Y(""))}, -vQ(a){var s,r,q +vZ(a,b){var s=A.w_(A.i([A.xn(a,!0)],t.g7)),r=new A.mD(b).$0(),q=B.f.j(B.a.gA(s).b+1),p=A.w0(s)?0:3,o=A.w(s) +return new A.mj(s,r,null,1+Math.max(q.length,p),new A.Q(s,o.h("b(1)").a(new A.ml()),o.h("Q<1,b>")).o8(0,B.ic),!A.zq(new A.Q(s,o.h("p?(1)").a(new A.mm()),o.h("Q<1,p?>"))),new A.X(""))}, +w0(a){var s,r,q for(s=0;s"));r.p();)J.vp(r.d,new A.mk()) -s=s.h("dq<1,2>") -r=s.h("dn") -s=A.a7(new A.dn(new A.dq(q,s),s.h("h(h.E)").a(new A.ml()),r),r.h("h.E")) +if(r.b+1!==q.b&&J.O(r.c,q.c))return!1}return!0}, +w_(a){var s,r,q=A.zi(a,new A.mo(),t.D,t.K) +for(s=A.x(q),r=new A.dr(q,q.r,q.e,s.h("dr<2>"));r.p();)J.vA(r.d,new A.mp()) +s=s.h("bU<1,2>") +r=s.h("dp") +s=A.a8(new A.dp(new A.bU(q,s),s.h("h(h.E)").a(new A.mq()),r),r.h("h.E")) return s}, -xd(a,b){var s=new A.oP(a).$0() -return new A.aL(s,!0,null)}, -xf(a){var s,r,q,p,o,n,m=a.gZ() +xn(a,b){var s=new A.oX(a).$0() +return new A.aO(s,!0,null)}, +xp(a){var s,r,q,p,o,n,m=a.gZ() if(!B.b.C(m,"\r\n"))return a -s=a.gV().gaw() +s=a.gV().gaz() for(r=m.length-1,q=0;q=0))return A.c(a,s) -if(a.charCodeAt(s)===10)return r===1?0:r-B.b.dO(a,"\n",r-2)-1 -else return r-B.b.cU(a,"\n")-1}}, -me:function me(a,b,c,d,e,f,g){var _=this +if(a.charCodeAt(s)===10)return r===1?0:r-B.b.dQ(a,"\n",r-2)-1 +else return r-B.b.cW(a,"\n")-1}}, +mj:function mj(a,b,c,d,e,f,g){var _=this _.a=a _.b=b _.c=c @@ -5139,23 +5156,23 @@ _.d=d _.e=e _.f=f _.r=g}, -my:function my(a){this.a=a}, -mg:function mg(){}, -mf:function mf(){}, -mh:function mh(){}, -mj:function mj(){}, -mk:function mk(){}, +mD:function mD(a){this.a=a}, ml:function ml(){}, -mi:function mi(a){this.a=a}, -mz:function mz(){}, -mm:function mm(a){this.a=a}, -mt:function mt(a,b,c){this.a=a +mk:function mk(){}, +mm:function mm(){}, +mo:function mo(){}, +mp:function mp(){}, +mq:function mq(){}, +mn:function mn(a){this.a=a}, +mE:function mE(){}, +mr:function mr(a){this.a=a}, +my:function my(a,b,c){this.a=a this.b=b this.c=c}, -mu:function mu(a,b){this.a=a +mz:function mz(a,b){this.a=a this.b=b}, -mv:function mv(a){this.a=a}, -mw:function mw(a,b,c,d,e,f,g){var _=this +mA:function mA(a){this.a=a}, +mB:function mB(a,b,c,d,e,f,g){var _=this _.a=a _.b=b _.c=c @@ -5163,43 +5180,43 @@ _.d=d _.e=e _.f=f _.r=g}, -mr:function mr(a,b){this.a=a +mw:function mw(a,b){this.a=a this.b=b}, -ms:function ms(a,b){this.a=a +mx:function mx(a,b){this.a=a this.b=b}, -mn:function mn(a,b,c,d){var _=this +ms:function ms(a,b,c,d){var _=this _.a=a _.b=b _.c=c _.d=d}, -mo:function mo(a,b,c){this.a=a +mt:function mt(a,b,c){this.a=a this.b=b this.c=c}, -mp:function mp(a,b,c){this.a=a +mu:function mu(a,b,c){this.a=a this.b=b this.c=c}, -mq:function mq(a,b,c,d){var _=this +mv:function mv(a,b,c,d){var _=this _.a=a _.b=b _.c=c _.d=d}, -mx:function mx(a,b,c){this.a=a +mC:function mC(a,b,c){this.a=a this.b=b this.c=c}, -aL:function aL(a,b,c){this.a=a +aO:function aO(a,b,c){this.a=a this.b=b this.c=c}, -oP:function oP(a){this.a=a}, +oX:function oX(a){this.a=a}, bD:function bD(a,b,c,d){var _=this _.a=a _.b=b _.c=c _.d=d}, -jO(a,b,c,d){if(a<0)A.P(A.aQ("Offset may not be negative, was "+a+".")) -else if(c<0)A.P(A.aQ("Line may not be negative, was "+c+".")) -else if(b<0)A.P(A.aQ("Column may not be negative, was "+b+".")) -return new A.bW(d,a,c,b)}, -bW:function bW(a,b,c,d){var _=this +jO(a,b,c,d){if(a<0)A.M(A.aT("Offset may not be negative, was "+a+".")) +else if(c<0)A.M(A.aT("Line may not be negative, was "+c+".")) +else if(b<0)A.M(A.aT("Column may not be negative, was "+b+".")) +return new A.bZ(d,a,c,b)}, +bZ:function bZ(a,b,c,d){var _=this _.a=a _.b=b _.c=c @@ -5207,44 +5224,44 @@ _.d=d}, jP:function jP(){}, jQ:function jQ(){}, ek:function ek(){}, -nL(a,b,c,d){var s=new A.cd(d,a,b,c) -s.jW(a,b,c) -if(!B.b.C(d,c))A.P(A.W('The context line "'+d+'" must contain "'+c+'".',null)) -if(A.pA(d,c,a.gao())==null)A.P(A.W('The span text "'+c+'" must start at column '+(a.gao()+1)+' in a line within "'+d+'".',null)) +nR(a,b,c,d){var s=new A.cg(d,a,b,c) +s.jX(a,b,c) +if(!B.b.C(d,c))A.M(A.W('The context line "'+d+'" must contain "'+c+'".',null)) +if(A.pI(d,c,a.gao())==null)A.M(A.W('The span text "'+c+'" must start at column '+(a.gao()+1)+' in a line within "'+d+'".',null)) return s}, -cd:function cd(a,b,c,d){var _=this +cg:function cg(a,b,c,d){var _=this _.d=a _.a=b _.b=c _.c=d}, -aJ:function aJ(a,b,c,d){var _=this +aL:function aL(a,b,c,d){var _=this _.a=a _.b=b _.c=c _.d=d}, -yB(a){var s=a.d8(0) +yL(a){var s=a.dd(0) s.toString switch(s){case"<":return"<" case"&":return"&" case"]]>":return"]]>" -default:return A.qJ(s)}}, -yw(a){var s=a.d8(0) +default:return A.qU(s)}}, +yG(a){var s=a.dd(0) s.toString switch(s){case"'":return"'" case"&":return"&" case"<":return"<" -default:return A.qJ(s)}}, -xZ(a){var s=a.d8(0) +default:return A.qU(s)}}, +y8(a){var s=a.dd(0) s.toString switch(s){case'"':return""" case"&":return"&" case"<":return"<" -default:return A.qJ(s)}}, -qJ(a){var s=t.mO -return A.rE(new A.bV(a),s.h("e(h.E)").a(new A.p8()),s.h("h.E"),t.N).aQ(0)}, +default:return A.qU(s)}}, +qU(a){var s=t.mO +return A.rO(new A.bX(a),s.h("e(h.E)").a(new A.pg()),s.h("h.E"),t.N).aR(0)}, kd:function kd(){}, -p8:function p8(){}, -d5:function d5(){}, +pg:function pg(){}, +d6:function d6(){}, ag:function ag(a,b,c){this.c=a this.a=b this.b=c}, @@ -5252,8 +5269,8 @@ bm:function bm(a,b){this.a=a this.b=b}, kk:function kk(){}, kl:function kl(){}, -tg(a,b,c){return new A.ko(a)}, -kp(a){if(a.gca()!=null)throw A.f(A.tg(u.d,a,a.gca()))}, +tq(a,b,c){return new A.ko(a)}, +kp(a){if(a.gcb()!=null)throw A.f(A.tq(u.d,a,a.gcb()))}, ko:function ko(a){this.a=a}, er(a,b,c){return new A.kq(b,c,$,$,$,a)}, kq:function kq(a,b,c,d,e,f){var _=this @@ -5264,10 +5281,10 @@ _.ay$=d _.ch$=e _.a=f}, lr:function lr(){}, -qq(a,b,c,d,e){return new A.kr(c,e,$,$,$,a)}, -th(a,b,c,d){return A.qq("Expected , but found ",b,c,a,d)}, -ti(a,b,c){return A.qq("Unexpected ",a,b,null,c)}, -x0(a,b,c){return A.qq("Missing ",null,b,a,c)}, +qB(a,b,c,d,e){return new A.kr(c,e,$,$,$,a)}, +tr(a,b,c,d){return A.qB("Expected , but found ",b,c,a,d)}, +ts(a,b,c){return A.qB("Unexpected ",a,b,null,c)}, +xa(a,b,c){return A.qB("Missing ",null,b,a,c)}, kr:function kr(a,b,c,d,e,f){var _=this _.d=a _.e=b @@ -5276,32 +5293,32 @@ _.ay$=d _.ch$=e _.a=f}, lt:function lt(){}, -wZ(a,b,c){return new A.h2(a)}, -tf(a,b){if(!b.C(0,a.gaS()))throw A.f(new A.h2("Got "+a.gaS().j(0)+", but expected one of "+b.aq(0,", ")))}, -h2:function h2(a){this.a=a}, -c1:function c1(a){this.a=a}, +x8(a,b,c){return new A.h4(a)}, +tp(a,b){if(!b.C(0,a.gaq()))throw A.f(new A.h4("Got "+a.gaq().j(0)+", but expected one of "+b.ar(0,", ")))}, +h4:function h4(a){this.a=a}, +c4:function c4(a){this.a=a}, ke:function ke(a){this.a=a this.b=$}, -cH(a){var s=t.n8 -return new A.ba(new A.b_(new A.c1(a),s.h("A(h.E)").a(new A.on()),s.h("b_")),s.h("e?(h.E)").a(new A.oo()),s.h("ba")).aQ(0)}, -on:function on(){}, -oo:function oo(){}, -nX:function nX(){}, +cJ(a){var s=t.n8 +return new A.aM(new A.aE(new A.c4(a),s.h("A(h.E)").a(new A.ou()),s.h("aE")),s.h("e?(h.E)").a(new A.ov()),s.h("aM")).aR(0)}, +ou:function ou(){}, +ov:function ov(){}, +o3:function o3(){}, ep:function ep(){}, -nY:function nY(){}, -d6:function d6(){}, -cG:function cG(){}, -aS:function aS(){}, -Z:function Z(){}, -op:function op(){}, -aH:function aH(){}, +o4:function o4(){}, +d7:function d7(){}, +cI:function cI(){}, +aV:function aV(){}, +a_:function a_(){}, +ow:function ow(){}, +aJ:function aJ(){}, kn:function kn(){}, -nW(a,b,c){var s=new A.aR(a,b,c,null) -A.x(a).h("Z.T").a(s) +o2(a,b,c){var s=new A.aU(a,b,c,null) +A.x(a).h("a_.T").a(s) A.kp(a) a.x$=s return s}, -aR:function aR(a,b,c,d){var _=this +aU:function aU(a,b,c,d){var _=this _.a=a _.b=b _.c=c @@ -5310,87 +5327,87 @@ l_:function l_(){}, l0:function l0(){}, en:function en(a,b){this.a=a this.x$=b}, -fY:function fY(a,b){this.a=a +h_:function h_(a,b){this.a=a this.x$=b}, kb:function kb(){}, l1:function l1(){}, -tb(a){var s=A.h1(t.G),r=new A.kc(s,null) +tl(a){var s=A.h3(t.G),r=new A.kc(s,null) t.i2.a(B.aB) -s.b!==$&&A.c6() +s.b!==$&&A.c9() s.b=r -s.c!==$&&A.c6() +s.c!==$&&A.c9() s.c=B.aB s.a1(0,a) return r}, kc:function kc(a,b){this.y$=a this.x$=b}, -nZ:function nZ(){}, +o5:function o5(){}, l2:function l2(){}, l3:function l3(){}, -fZ:function fZ(a,b,c,d){var _=this +h0:function h0(a,b,c,d){var _=this _.a=a _.b=b _.c=c _.x$=d}, l4:function l4(){}, -o_(a){var s=t.bO.a(new A.kh(a,B.bF,!0,!0,!1,!1,!1)),r=A.i([],t.eB) -s.T(0,new A.lk(new A.dg(t.f0.a(B.a.glc(r)),t.k0)).giE()) -return A.tc(r)}, -tc(a){var s=A.h1(t.I),r=new A.kf(s) -t.i2.a(B.hO) -s.b!==$&&A.c6() +o6(a){var s=t.bO.a(new A.kh(a,B.bF,!0,!0,!1,!1,!1)),r=A.i([],t.eB) +s.T(0,new A.lk(new A.dh(t.f0.a(B.a.gle(r)),t.k0)).giF()) +return A.tm(r)}, +tm(a){var s=A.h3(t.I),r=new A.kf(s) +t.i2.a(B.hP) +s.b!==$&&A.c9() s.b=r -s.c!==$&&A.c6() -s.c=B.hO +s.c!==$&&A.c9() +s.c=B.hP s.a1(0,a) return r}, kf:function kf(a){this.w$=a}, -o0:function o0(){}, +o7:function o7(){}, l5:function l5(){}, -wY(a,b,c,d){var s,r=A.h1(t.I),q=A.h1(t.G),p=new A.aG(d,a,r,q,null) -A.x(a).h("Z.T").a(p) +x7(a,b,c,d){var s,r=A.h3(t.I),q=A.h3(t.G),p=new A.aI(d,a,r,q,null) +A.x(a).h("a_.T").a(p) A.kp(a) a.x$=p s=t.i2 s.a(B.aB) -q.b!==$&&A.c6() +q.b!==$&&A.c9() q.b=p -q.c!==$&&A.c6() +q.c!==$&&A.c9() q.c=B.aB q.a1(0,b) s.a(B.bz) -r.b!==$&&A.c6() +r.b!==$&&A.c9() r.b=p -r.c!==$&&A.c6() +r.c!==$&&A.c9() r.c=B.bz r.a1(0,c) return p}, -td(a,b,c,d){var s=A.te(a),r=A.h1(t.I),q=A.h1(t.G),p=new A.aG(d,s,r,q,null) -A.x(s).h("Z.T").a(p) +tn(a,b,c,d){var s=A.to(a),r=A.h3(t.I),q=A.h3(t.G),p=new A.aI(d,s,r,q,null) +A.x(s).h("a_.T").a(p) A.kp(s) s.x$=p s=t.i2 s.a(B.aB) -q.b!==$&&A.c6() +q.b!==$&&A.c9() q.b=p -q.c!==$&&A.c6() +q.c!==$&&A.c9() q.c=B.aB q.a1(0,b) s.a(B.bz) -r.b!==$&&A.c6() +r.b!==$&&A.c9() r.b=p -r.c!==$&&A.c6() +r.c!==$&&A.c9() r.c=B.bz r.a1(0,c) return p}, -aG:function aG(a,b,c,d,e){var _=this +aI:function aI(a,b,c,d,e){var _=this _.a=a _.b=b _.w$=c _.y$=d _.x$=e}, -o1:function o1(){}, -o2:function o2(){}, +o8:function o8(){}, +o9:function o9(){}, l6:function l6(){}, l7:function l7(){}, l8:function l8(){}, @@ -5402,7 +5419,7 @@ ln:function ln(){}, lo:function lo(){}, lp:function lp(){}, lq:function lq(){}, -h4:function h4(a,b,c){this.c=a +h6:function h6(a,b,c){this.c=a this.a=b this.x$=c}, es:function es(a,b){this.a=a @@ -5414,42 +5431,42 @@ _.c=c _.$ti=d}, eo:function eo(a,b){this.a=a this.b=b}, -te(a){var s=B.b.al(a,":") -if(s>0)return new A.h3(B.b.t(a,0,s),B.b.ab(a,s+1),a,null) -else return new A.h5(a,null)}, +to(a){var s=B.b.aj(a,":") +if(s>0)return new A.h5(B.b.t(a,0,s),B.b.ab(a,s+1),a,null) +else return new A.h7(a,null)}, eq:function eq(){}, lh:function lh(){}, li:function li(){}, lj:function lj(){}, -un(a,b){if(a==="*")if(b==null||b==="*")return new A.ps() -else return new A.pt(b) -else if(b==null)return new A.pu(a) -else if(b==="*")return new A.pv(a) -else return new A.pw(a,b)}, -ps:function ps(){}, -pt:function pt(a){this.a=a}, -pu:function pu(a){this.a=a}, -pv:function pv(a){this.a=a}, -pw:function pw(a,b){this.a=a +uy(a,b){if(a==="*")if(b==null||b==="*")return new A.pA() +else return new A.pB(b) +else if(b==null)return new A.pC(a) +else if(b==="*")return new A.pD(a) +else return new A.pE(a,b)}, +pA:function pA(){}, +pB:function pB(a){this.a=a}, +pC:function pC(a){this.a=a}, +pD:function pD(a){this.a=a}, +pE:function pE(a,b){this.a=a this.b=b}, -h1(a){return new A.h0(A.i([],a.h("y<0>")),a.h("h0<0>"))}, -h0:function h0(a,b){var _=this +h3(a){return new A.h2(A.i([],a.h("y<0>")),a.h("h2<0>"))}, +h2:function h2(a,b){var _=this _.c=_.b=$ _.a=a _.$ti=b}, -om:function om(a){this.a=a}, -h3:function h3(a,b,c,d){var _=this +ot:function ot(a){this.a=a}, +h5:function h5(a,b,c,d){var _=this _.b=a _.c=b _.d=c _.x$=d}, -h5:function h5(a,b){this.b=a +h7:function h7(a,b){this.b=a this.x$=b}, ks:function ks(){}, kt:function kt(a,b){this.a=a this.b=b}, lu:function lu(){}, -nV:function nV(a,b,c,d,e,f,g){var _=this +o1:function o1(a,b,c,d,e,f,g){var _=this _.a=a _.b=b _.c=c @@ -5457,8 +5474,8 @@ _.d=d _.e=e _.f=f _.r=g}, -ok:function ok(){}, -ol:function ol(){}, +or:function or(){}, +os:function os(){}, km:function km(){}, kg:function kg(a){this.a=a}, ld:function ld(a,b){this.a=a @@ -5466,19 +5483,19 @@ this.b=b}, lv:function lv(){}, lk:function lk(a){this.a=a this.b=null}, -p5:function p5(){}, +pd:function pd(){}, lw:function lw(){}, -a1:function a1(){}, +a2:function a2(){}, le:function le(){}, lf:function lf(){}, lg:function lg(){}, -c_:function c_(a,b,c,d,e){var _=this +c2:function c2(a,b,c,d,e){var _=this _.e=a _.at$=b _.Q$=c _.as$=d _.z$=e}, -c0:function c0(a,b,c,d,e){var _=this +c3:function c3(a,b,c,d,e){var _=this _.e=a _.at$=b _.Q$=c @@ -5498,21 +5515,21 @@ _.at$=d _.Q$=e _.as$=f _.z$=g}, -bM:function bM(a,b,c,d,e){var _=this +bN:function bN(a,b,c,d,e){var _=this _.e=a _.at$=b _.Q$=c _.as$=d _.z$=e}, la:function la(){}, -c2:function c2(a,b,c,d,e,f){var _=this +c5:function c5(a,b,c,d,e,f){var _=this _.e=a _.f=b _.at$=c _.Q$=d _.as$=e _.z$=f}, -bd:function bd(a,b,c,d,e,f,g){var _=this +be:function be(a,b,c,d,e,f,g){var _=this _.e=a _.f=b _.r=c @@ -5543,52 +5560,52 @@ _.b=b _.c=c _.d=null}, kj:function kj(a){this.a=a}, -o9:function o9(a){this.a=a}, -oj:function oj(){}, -o7:function o7(a){this.a=a}, -o3:function o3(){}, -o4:function o4(){}, -o6:function o6(){}, -o5:function o5(){}, -og:function og(){}, +og:function og(a){this.a=a}, +oq:function oq(){}, +oe:function oe(a){this.a=a}, oa:function oa(){}, -o8:function o8(){}, ob:function ob(){}, -oh:function oh(){}, -oi:function oi(){}, -of:function of(){}, od:function od(){}, oc:function oc(){}, -oe:function oe(){}, -pz:function pz(){}, -dg:function dg(a,b){this.a=a +on:function on(){}, +oh:function oh(){}, +of:function of(){}, +oi:function oi(){}, +oo:function oo(){}, +op:function op(){}, +om:function om(){}, +ok:function ok(){}, +oj:function oj(){}, +ol:function ol(){}, +pH:function pH(){}, +dh:function dh(a,b){this.a=a this.$ti=b}, -av:function av(a,b,c,d){var _=this +ay:function ay(a,b,c,d){var _=this _.a=a _.b=b _.c=c _.z$=d}, lb:function lb(){}, lc:function lc(){}, -h_:function h_(){}, +h1:function h1(){}, dH:function dH(){}, -zk(){var s,r,q={},p=new A.aB($.an,t.cU) -p.e8(null) +zt(){var s,r,q={},p=new A.aF($.an,t.cU) +p.ec(null) q.a=p -s=A.p7(v.G.self) -q=new A.pL(q,new A.lV(B.bI,A.az(t.S,t.f))) -if(typeof q=="function")A.P(A.W("Attempting to rewrap a JS function.",null)) -r=function(a,b){return function(c){return a(b,c,arguments.length)}}(A.xR,q) -r[$.r3()]=q +s=A.pf(v.G.self) +q=new A.pT(q,new A.lV(B.bI,A.aA(t.S,t.f))) +if(typeof q=="function")A.M(A.W("Attempting to rewrap a JS function.",null)) +r=function(a,b){return function(c){return a(b,c,arguments.length)}}(A.y0,q) +r[$.re()]=q s.onmessage=r}, -pL:function pL(a,b){this.a=a +pT:function pT(a,b){this.a=a this.b=b}, -pK:function pK(a,b){this.a=a +pS:function pS(a,b){this.a=a this.b=b}, -uB(a,b,c){A.uj(c,t.cZ,"T","max") +uM(a,b,c){A.ut(c,t.cZ,"T","max") return Math.max(c.a(a),c.a(b))}, -uu(a,b){return(B.jc[(a^b)&255]^B.f.b5(a,8))>>>0}, -z0(a,b){var s,r,q,p,o=a.length,n=b.length +uF(a,b){return(B.jc[(a^b)&255]^B.f.b5(a,8))>>>0}, +z9(a,b){var s,r,q,p,o=a.length,n=b.length if(o!==n)return!1 for(s=0;s")) +zi(a,b,c,d){var s,r,q,p,o,n=A.aA(d,c.h("m<0>")) for(s=c.h("y<0>"),r=0;r<1;++r){q=a[r] p=b.$1(q) o=n.m(0,p) if(o==null){o=A.i([],s) n.k(0,p,o) p=o}else p=o -J.vg(p,q)}return n}, -bI(a,b,c){var s,r -for(s=J.at(a);s.p();){r=s.gB() +J.q8(p,q)}return n}, +bJ(a,b,c){var s,r +for(s=J.aw(a);s.p();){r=s.gB() if(b.$1(r))return r}return null}, -e3(a,b){var s=J.at(a.a) -if(new A.cF(s,a.b,a.$ti.h("cF<1>")).p())return s.gB() +e3(a,b){var s=J.aw(a.a) +if(new A.cH(s,a.b,a.$ti.h("cH<1>")).p())return s.gB() return null}, -vG(a){var s,r,q,p,o,n,m,l,k,j,i,h=t.N,g=t.am,f=A.az(h,g),e=A.az(h,g) +vR(a){var s,r,q,p,o,n,m,l,k,j,i,h=t.N,g=t.am,f=A.aA(h,g),e=A.aA(h,g) g=t.ht -s=A.az(h,g) -r=A.az(h,g) -q=A.az(h,t.mg) -for(h=a.e.a.c.a,g=h.length,p=0;p":n=r?">":m break -default:n=m}if(n!=null){if(q==null)q=new A.Y(B.b.t(a,0,p)) +default:n=m}if(n!=null){if(q==null)q=new A.X(B.b.t(a,0,p)) q.a+=n}else if(q!=null)q.a+=o}if(q!=null){s=q.a s=s.charCodeAt(0)==0?s:s}else s=a return s}, -uo(){var s,r,q,p,o=null -try{o=A.qp()}catch(s){if(t.mA.b(A.bP(s))){r=$.pe +uz(){var s,r,q,p,o=null +try{o=A.qA()}catch(s){if(t.mA.b(A.bQ(s))){r=$.pm if(r!=null)return r -throw s}else throw s}if(J.N(o,$.u_)){r=$.pe +throw s}else throw s}if(J.O(o,$.u9)){r=$.pm r.toString -return r}$.u_=o -if($.r4()===$.hF())r=$.pe=o.iy(".").j(0) -else{q=o.ff() +return r}$.u9=o +if($.rf()===$.hH())r=$.pm=o.iz(".").j(0) +else{q=o.fg() p=q.length-1 -r=$.pe=p===0?q:B.b.t(q,0,p)}return r}, -ux(a){var s +r=$.pm=p===0?q:B.b.t(q,0,p)}return r}, +uI(a){var s if(!(a>=65&&a<=90))s=a>=97&&a<=122 else s=!0 return s}, -ur(a,b){var s,r,q=null,p=a.length,o=b+2 +uC(a,b){var s,r,q=null,p=a.length,o=b+2 if(p=0&&b=0&&s=q)return A.c(s,-1) p=s.pop() -for(q=p.gaN(),o=q.length,n=0;n")) +ua(a,b,c){var s,r,q,p=A.j3(c.h("nI<0>")) while(a instanceof A.u){if(b.a7(a))return c.h("n<0>").a(b.m(0,a)) -else if(!p.l(0,a))throw A.f(A.ce("Recursive references detected: "+p.j(0))) -a=a.$ti.h("n<1>").a(A.wv(a.a,a.b,null))}for(s=A.tv(p,p.r,p.$ti.c),r=s.$ti.c;s.p();){q=s.d +else if(!p.l(0,a))throw A.f(A.ch("Recursive references detected: "+p.j(0))) +a=a.$ti.h("n<1>").a(A.wF(a.a,a.b,null))}for(s=A.tF(p,p.r,p.$ti.c),r=s.$ti.c;s.p();){q=s.d b.k(0,q==null?r.a(q):q,a)}return a}, -ui(a,b,c,d){var s=new A.ah(a),r=s.gbU(s),q=b?A.zn(a,!0,!1):new A.fM(r),p=A.uM(a,!1),o=b?" (case-insensitive)":"" +us(a,b,c,d){var s=new A.ah(a),r=s.gbn(s),q=b?A.zw(a,!0,!1):new A.fO(r),p=A.uY(a,!1),o=b?" (case-insensitive)":"" c='"'+p+'"'+o+" expected" -return A.bH(q,c,!1)}, +return A.bI(q,c,!1)}, U(a){var s,r=a.length -A:{if(0===r){s=new A.cQ(a,t.pf) -break A}if(1===r){s=A.ui(a,!1,null,!1) -break A}s=A.zx(a,!1,null) +A:{if(0===r){s=new A.cS(a,t.pf) +break A}if(1===r){s=A.us(a,!1,null,!1) +break A}s=A.zE(a,!1,null) break A}return s}, -zv(a,b){var s=t.nq +zC(a,b){var s=t.nq s.a(a) s.a(b) return a}, -zw(a,b){var s=t.nq +zD(a,b){var s=t.nq s.a(a) return s.a(b)}, -zu(a,b){var s=t.nq +zB(a,b){var s=t.nq s.a(a) s.a(b) return a.b<=b.b?b:a}, -zh(a){var s,r,q,p +zq(a){var s,r,q,p if(a.gn(0)===0)return!0 -s=a.gbv(0) -for(r=A.bX(a,1,null,a.$ti.h("G.E")),q=r.$ti,r=new A.M(r,r.gn(0),q.h("M")),q=q.h("G.E");r.p();){p=r.d -if(!J.N(p==null?q.a(p):p,s))return!1}return!0}, -zs(a,b,c){var s=B.a.al(a,null) +s=a.gbw(0) +for(r=A.c_(a,1,null,a.$ti.h("G.E")),q=r.$ti,r=new A.N(r,r.gn(0),q.h("N")),q=q.h("G.E");r.p();){p=r.d +if(!J.O(p==null?q.a(p):p,s))return!1}return!0}, +zz(a,b,c){var s=B.a.aj(a,null) if(s<0)throw A.f(A.W(A.k(a)+" contains no null elements.",null)) B.a.k(a,s,b)}, -uJ(a,b,c){var s=B.a.al(a,b) +uV(a,b,c){var s=B.a.aj(a,b) if(s<0)throw A.f(A.W(A.k(a)+" contains no elements matching "+b.j(0)+".",null)) B.a.k(a,s,null)}, -yV(a,b){var s,r,q,p -for(s=new A.ah(a),r=t.gS,s=new A.M(s,s.gn(0),r.h("M")),r=r.h("C.E"),q=0;s.p();){p=s.d +z3(a,b){var s,r,q,p +for(s=new A.ah(a),r=t.gS,s=new A.N(s,s.gn(0),r.h("N")),r=r.h("B.E"),q=0;s.p();){p=s.d if((p==null?r.a(p):p)===b)++q}return q}, -pA(a,b,c){var s,r,q +pI(a,b,c){var s,r,q if(b.length===0)for(s=0;;){r=B.b.ap(a,"\n",s) if(r===-1)return a.length-s>=c?s:null if(r-s>=c)return s -s=r+1}r=B.b.al(a,b) -while(r!==-1){q=r===0?0:B.b.dO(a,"\n",r-1)+1 +s=r+1}r=B.b.aj(a,b) +while(r!==-1){q=r===0?0:B.b.dQ(a,"\n",r-1)+1 if(c===r-q)return q r=B.b.ap(a,b,r+1)}return null}, -b2(a,b,c){var s=A.un(b,c),r=a.iG(0,t.P),q=r.$ti -return new A.b_(r,q.h("A(h.E)").a(s),q.h("b_"))}, -x_(a){var s -for(s=a.x$;s!=null;s=s.gca())if(s instanceof A.aG)return s +b5(a,b,c){var s=A.uy(b,c),r=a.iH(0,t.P),q=r.$ti +return new A.aE(r,q.h("A(h.E)").a(s),q.h("aE"))}, +x9(a){var s +for(s=a.x$;s!=null;s=s.gcb())if(s instanceof A.aI)return s return null}, -uA(a,b,c){var s,r,q,p,o -for(s=a;s!=null;s=s.gca())for(r=J.at(s.gaZ()),q=r.$ti.c;r.p();){p=r.d +uL(a,b,c){var s,r,q,p,o +for(s=a;s!=null;s=s.gcb())for(r=J.aw(s.gaZ()),q=r.$ti.c;r.p();){p=r.d if(p==null)p=q.a(p) o=p.a -if(o.gik()==b&&o.ga_()===c)return p}return null}},B={} +if(o.gil()==b&&o.ga_()===c)return p}return null}},B={} var w=[A,J,B] var $={} -A.q4.prototype={} +A.qf.prototype={} J.iS.prototype={ v(a,b){return a===b}, gq(a){return A.dy(a)}, j(a){return"Instance of '"+A.jC(a)+"'"}, -ij(a,b){throw A.f(A.n6(a,t.bg.a(b)))}, -gaz(a){return A.ch(A.qK(this))}} +ik(a,b){throw A.f(A.nc(a,t.bg.a(b)))}, +gaA(a){return A.ck(A.qV(this))}} J.iV.prototype={ j(a){return String(a)}, gq(a){return a?519018:218159}, -gaz(a){return A.ch(t.k4)}, -$ia3:1, +gaA(a){return A.ck(t.k4)}, +$ia4:1, $iA:1} J.e4.prototype={ v(a,b){return null==b}, j(a){return"null"}, gq(a){return 0}, -$ia3:1, -$iaK:1} -J.fk.prototype={$iap:1} -J.cW.prototype={ +$ia4:1, +$iaN:1} +J.fm.prototype={$iar:1} +J.cY.prototype={ gq(a){return 0}, j(a){return String(a)}} J.jA.prototype={} J.dF.prototype={} -J.cu.prototype={ -j(a){var s=a[$.r3()] -if(s==null)return this.jI(a) -return"JavaScript function for "+J.ay(s)}, -$icq:1} +J.cw.prototype={ +j(a){var s=a[$.re()] +if(s==null)return this.jJ(a) +return"JavaScript function for "+J.ao(s)}, +$ics:1} J.e6.prototype={ gq(a){return 0}, j(a){return String(a)}} @@ -5821,31 +5828,31 @@ J.y.prototype={ l(a,b){A.w(a).c.a(b) a.$flags&1&&A.t(a,29) a.push(b)}, -d2(a,b){a.$flags&1&&A.t(a,"removeAt",1) -if(b<0||b>=a.length)throw A.f(A.nu(b,null)) +d5(a,b){a.$flags&1&&A.t(a,"removeAt",1) +if(b<0||b>=a.length)throw A.f(A.nA(b,null)) return a.splice(b,1)[0]}, -bx(a,b,c){A.w(a).c.a(c) +by(a,b,c){A.w(a).c.a(c) a.$flags&1&&A.t(a,"insert",2) -if(b<0||b>a.length)throw A.f(A.nu(b,null)) +if(b<0||b>a.length)throw A.f(A.nA(b,null)) a.splice(b,0,c)}, -eY(a,b,c){var s,r +f1(a,b,c){var s,r A.w(a).h("h<1>").a(c) a.$flags&1&&A.t(a,"insertAll",2) -A.rS(b,0,a.length,"index") -if(!t.gt.b(c))c=J.vq(c) -s=J.b6(c) +A.t1(b,0,a.length,"index") +if(!t.gt.b(c))c=J.vB(c) +s=J.b8(c) a.length=a.length+s r=b+s this.bb(a,r,a.length,a,b) -this.bD(a,b,r,c)}, -d3(a){a.$flags&1&&A.t(a,"removeLast",1) +this.bE(a,b,r,c)}, +d6(a){a.$flags&1&&A.t(a,"removeLast",1) if(a.length===0)throw A.f(A.lz(a,-1)) return a.pop()}, W(a,b){var s a.$flags&1&&A.t(a,"remove",1) -for(s=0;s").a(b) a.$flags&1&&A.t(a,"addAll",2) -if(Array.isArray(b)){this.k0(a,b) -return}for(s=J.at(b);s.p();)a.push(s.gB())}, -k0(a,b){var s,r +if(Array.isArray(b)){this.k5(a,b) +return}for(s=J.aw(b);s.p();)a.push(s.gB())}, +k5(a,b){var s,r t.dG.a(b) s=b.length if(s===0)return @@ -5873,74 +5880,78 @@ A.w(a).h("~(1)").a(b) s=a.length for(r=0;r").u(c).h("Q<1,2>"))}, -aq(a,b){var s,r=A.aE(a.length,"",!1,t.N) +ar(a,b){var s,r=A.aB(a.length,"",!1,t.N) for(s=0;s=0&&ba.length)throw A.f(A.af(b,0,a.length,"start",null)) if(ca.length)throw A.f(A.af(c,b,a.length,"end",null)) if(b===c)return A.i([],A.w(a)) return A.i(a.slice(b,c),A.w(a))}, -gbv(a){if(a.length>0)return a[0] -throw A.f(A.bi())}, +gbw(a){if(a.length>0)return a[0] +throw A.f(A.ba())}, gA(a){var s=a.length if(s>0)return a[s-1] -throw A.f(A.bi())}, -fc(a,b,c){a.$flags&1&&A.t(a,18) -A.cw(b,c,a.length) +throw A.f(A.ba())}, +gbn(a){var s=a.length +if(s===1){if(0>=s)return A.c(a,0) +return a[0]}if(s===0)throw A.f(A.ba()) +throw A.f(A.qc())}, +fd(a,b,c){a.$flags&1&&A.t(a,18) +A.cy(b,c,a.length) a.splice(b,c-b)}, bb(a,b,c,d,e){var s,r,q,p,o A.w(a).h("h<1>").a(d) a.$flags&2&&A.t(a,5) -A.cw(b,c,a.length) +A.cy(b,c,a.length) s=c-b if(s===0)return -A.aF(e,"skipCount") +A.aH(e,"skipCount") if(t.p.b(d)){r=d -q=e}else{r=J.lF(d,e).cz(0,!1) -q=0}p=J.ad(r) -if(q+s>p.gn(r))throw A.f(A.rt()) +q=e}else{r=J.lF(d,e).bT(0,!1) +q=0}p=J.ae(r) +if(q+s>p.gn(r))throw A.f(A.rE()) if(q=0;--o)a[b+o]=p.m(r,q+o) else for(o=0;o"))}, -bV(a,b){var s,r,q,p,o,n=A.w(a) +giA(a){return new A.Y(a,A.w(a).h("Y<1>"))}, +bW(a,b){var s,r,q,p,o,n=A.w(a) n.h("b(1,1)?").a(b) a.$flags&2&&A.t(a,"sort") s=a.length if(s<2)return -if(b==null)b=J.ya() +if(b==null)b=J.yk() if(s===2){r=a[0] q=a[1] n=b.$2(r,q) @@ -5948,24 +5959,24 @@ if(typeof n!=="number")return n.b1() if(n>0){a[0]=q a[1]=r}return}p=0 if(n.c.b(null))for(o=0;o0)this.kS(a,p)}, -kS(a,b){var s,r=a.length +if(p>0)this.kT(a,p)}, +kT(a,b){var s,r=a.length for(;s=r-1,r>0;r=s)if(a[s]===null){a[s]=void 0;--b if(b===0)break}}, ap(a,b,c){var s,r=a.length if(c>=r)return-1 for(s=c;s"))}, gq(a){return A.dy(a)}, gn(a){return a.length}, @@ -5979,18 +5990,18 @@ k(a,b,c){A.w(a).c.a(c) a.$flags&2&&A.t(a) if(!(b>=0&&b=a.length)return-1 for(s=c;s=p){r.d=null return!1}r.d=q[s] @@ -6013,24 +6024,24 @@ return!0}, $iL:1} J.e5.prototype={ ai(a,b){var s -A.tW(b) +A.u5(b) if(ab)return 1 -else if(a===b){if(a===0){s=this.gf_(b) -if(this.gf_(a)===s)return 0 -if(this.gf_(a))return-1 +else if(a===b){if(a===0){s=this.gf3(b) +if(this.gf3(a)===s)return 0 +if(this.gf3(a))return-1 return 1}return 0}else if(isNaN(a)){if(isNaN(b))return 0 return 1}else return-1}, -gf_(a){return a===0?1/a<0:a<0}, -cw(a){var s +gf3(a){return a===0?1/a<0:a<0}, +cA(a){var s if(a>=-2147483648&&a<=2147483647)return a|0 if(isFinite(a)){s=a<0?Math.ceil(a):Math.floor(a) -return s+0}throw A.f(A.ac(""+a+".toInt()"))}, -m0(a,b,c){if(B.f.ai(b,c)>0)throw A.f(A.dO(b)) +return s+0}throw A.f(A.a6(""+a+".toInt()"))}, +m2(a,b,c){if(B.f.ai(b,c)>0)throw A.f(A.dO(b)) if(this.ai(a,b)<0)return b if(this.ai(a,c)>0)return c return a}, -d6(a,b){var s,r,q,p,o +d9(a,b){var s,r,q,p,o if(b<2||b>36)throw A.f(A.af(b,2,36,"radix",null)) s=a.toString(b) r=s.length @@ -6038,7 +6049,7 @@ q=r-1 if(!(q>=0))return A.c(s,q) if(s.charCodeAt(q)!==41)return s p=/^([\da-z]+)(?:\.([\da-z]+))?\(e\+(\d+)\)$/.exec(s) -if(p==null)A.P(A.ac("Unexpected toString result: "+s)) +if(p==null)A.M(A.a6("Unexpected toString result: "+s)) r=p.length if(1>=r)return A.c(p,1) s=p[1] @@ -6056,70 +6067,70 @@ r=Math.log(s)/0.6931471805599453|0 q=Math.pow(2,r) p=s<1?s/q:q/s return((p*9007199254740992|0)+(p*3542243181176521|0))*599197+r*1259&536870911}, -cB(a,b){return a+b}, +cC(a,b){return a+b}, bl(a,b){var s=a%b if(s===0)return 0 if(s>0)return s return s+b}, -fL(a,b){if((a|0)===a)if(b>=1)return a/b|0 -return this.hs(a,b)}, -av(a,b){return(a|0)===a?a/b|0:this.hs(a,b)}, -hs(a,b){var s=a/b +fM(a,b){if((a|0)===a)if(b>=1)return a/b|0 +return this.ht(a,b)}, +aw(a,b){return(a|0)===a?a/b|0:this.ht(a,b)}, +ht(a,b){var s=a/b if(s>=-2147483648&&s<=2147483647)return s|0 if(s>0){if(s!==1/0)return Math.floor(s)}else if(s>-1/0)return Math.ceil(s) -throw A.f(A.ac("Result of truncating division is "+A.k(s)+": "+A.k(a)+" ~/ "+b))}, +throw A.f(A.a6("Result of truncating division is "+A.k(s)+": "+A.k(a)+" ~/ "+b))}, aW(a,b){if(b<0)throw A.f(A.dO(b)) return b>31?0:a<>>0}, -bp(a,b){return b>31?0:a<>>0}, +bq(a,b){return b>31?0:a<>>0}, b5(a,b){var s -if(a>0)s=this.dt(a,b) +if(a>0)s=this.dv(a,b) else{s=b>31?31:b s=a>>s>>>0}return s}, -cI(a,b){if(0>b)throw A.f(A.dO(b)) -return this.dt(a,b)}, -dt(a,b){return b>31?0:a>>>b}, +cK(a,b){if(0>b)throw A.f(A.dO(b)) +return this.dv(a,b)}, +dv(a,b){return b>31?0:a>>>b}, b1(a,b){return a>b}, -gaz(a){return A.ch(t.cZ)}, -$ia6:1, +gaA(a){return A.ck(t.cZ)}, +$ia7:1, $iV:1, -$ib5:1} -J.fi.prototype={ -ghR(a){var s,r=a<0?-a-1:a,q=r -for(s=32;q>=4294967296;){q=this.av(q,4294967296) +$ib7:1} +J.fk.prototype={ +ghS(a){var s,r=a<0?-a-1:a,q=r +for(s=32;q>=4294967296;){q=this.aw(q,4294967296) s+=32}return s-Math.clz32(q)}, -gaz(a){return A.ch(t.S)}, -$ia3:1, +gaA(a){return A.ck(t.S)}, +$ia4:1, $ib:1} J.iW.prototype={ -gaz(a){return A.ch(t.dx)}, -$ia3:1} -J.ct.prototype={ -dC(a,b,c){var s=b.length +gaA(a){return A.ck(t.dx)}, +$ia4:1} +J.cv.prototype={ +dE(a,b,c){var s=b.length if(c>s)throw A.f(A.af(c,0,s,null,null)) return new A.kU(b,a,c)}, -dB(a,b){return this.dC(a,b,0)}, -f0(a,b,c){var s,r,q,p,o=null +dD(a,b){return this.dE(a,b,0)}, +f4(a,b,c){var s,r,q,p,o=null if(c<0||c>b.length)throw A.f(A.af(c,0,b.length,o,o)) s=a.length r=b.length if(c+s>r)return o for(q=0;q=0&&pr)return!1 return b===this.ab(a,r-s)}, -d4(a,b,c){A.rS(0,0,a.length,"startIndex") -return A.zC(a,b,c,0)}, -d9(a,b){var s +d7(a,b,c){A.t1(0,0,a.length,"startIndex") +return A.zJ(a,b,c,0)}, +de(a,b){var s if(typeof b=="string")return A.i(a.split(b),t.s) -else{if(b instanceof A.cV){s=b.e -s=!(s==null?b.e=b.k9():s)}else s=!1 +else{if(b instanceof A.cX){s=b.e +s=!(s==null?b.e=b.ka():s)}else s=!1 if(s)return A.i(a.split(b.b),t.s) -else return this.kh(a,b)}}, -bR(a,b,c,d){var s=A.cw(b,c,a.length) -return A.r2(a,b,s,d)}, -kh(a,b){var s,r,q,p,o,n,m=A.i([],t.s) +else return this.ki(a,b)}}, +bS(a,b,c,d){var s=A.cy(b,c,a.length) +return A.rd(a,b,s,d)}, +ki(a,b){var s,r,q,p,o,n,m=A.i([],t.s) for(s=J.lE(b,a),s=s.gF(s),r=0,q=1;s.p();){p=s.gB() o=p.gS() n=p.gV() @@ -6133,25 +6144,25 @@ t.m4.a(b) if(c<0||c>a.length)throw A.f(A.af(c,0,a.length,null,null)) if(typeof b=="string"){s=c+b.length if(s>a.length)return!1 -return b===a.substring(c,s)}return J.vn(b,a,c)!=null}, +return b===a.substring(c,s)}return J.vy(b,a,c)!=null}, U(a,b){return this.aa(a,b,0)}, -t(a,b,c){return a.substring(b,A.cw(b,c,a.length))}, +t(a,b,c){return a.substring(b,A.cy(b,c,a.length))}, ab(a,b){return this.t(a,b,null)}, ba(a){var s,r,q,p=a.trim(),o=p.length if(o===0)return p if(0>=o)return A.c(p,0) -if(p.charCodeAt(0)===133){s=J.ry(p,1) +if(p.charCodeAt(0)===133){s=J.rI(p,1) if(s===o)return""}else s=0 r=o-1 if(!(r>=0))return A.c(p,r) -q=p.charCodeAt(r)===133?J.w_(p,r):o +q=p.charCodeAt(r)===133?J.w9(p,r):o if(s===0&&q===o)return p return p.substring(s,q)}, -og(a){var s=a.trimStart(),r=s.length +oj(a){var s=a.trimStart(),r=s.length if(r===0)return s if(0>=r)return A.c(s,0) if(s.charCodeAt(0)!==133)return s -return s.substring(J.ry(s,1))}, +return s.substring(J.rI(s,1))}, b2(a,b){var s,r if(0>=b)return"" if(b===1||a.length===0)return a @@ -6160,27 +6171,27 @@ for(s=a,r="";;){if((b&1)===1)r=s+r b=b>>>1 if(b===0)break s+=s}return r}, -nC(a,b,c){var s=b-a.length +nE(a,b,c){var s=b-a.length if(s<=0)return a return this.b2(c,s)+a}, -nD(a,b){var s=b-a.length +nF(a,b){var s=b-a.length if(s<=0)return a return a+this.b2(" ",s)}, ap(a,b,c){var s if(c<0||c>a.length)throw A.f(A.af(c,0,a.length,null,null)) s=a.indexOf(b,c) return s}, -al(a,b){return this.ap(a,b,0)}, -dO(a,b,c){var s,r,q +aj(a,b){return this.ap(a,b,0)}, +dQ(a,b,c){var s,r,q if(c==null)c=a.length else if(c<0||c>a.length)throw A.f(A.af(c,0,a.length,null,null)) if(typeof b=="string"){s=b.length r=a.length if(c+s>r)c=r-s -return a.lastIndexOf(b,c)}for(s=J.pC(b),q=c;q>=0;--q)if(s.f0(b,a,q)!=null)return q +return a.lastIndexOf(b,c)}for(s=J.pK(b),q=c;q>=0;--q)if(s.f4(b,a,q)!=null)return q return-1}, -cU(a,b){return this.dO(a,b,null)}, -C(a,b){return A.zy(a,b,0)}, +cW(a,b){return this.dQ(a,b,null)}, +C(a,b){return A.zF(a,b,0)}, ai(a,b){var s A.q(b) if(a===b)s=0 @@ -6193,34 +6204,34 @@ r=r+((r&524287)<<10)&536870911 r^=r>>6}r=r+((r&67108863)<<3)&536870911 r^=r>>11 return r+((r&16383)<<15)&536870911}, -gaz(a){return A.ch(t.N)}, +gaA(a){return A.ck(t.N)}, gn(a){return a.length}, -$iaU:1, -$ia3:1, -$ia6:1, +$iaZ:1, +$ia4:1, +$ia7:1, $idx:1, $ie:1} A.eu.prototype={ -gF(a){return new A.eN(J.at(this.gbq()),A.x(this).h("eN<1,2>"))}, -gn(a){return J.b6(this.gbq())}, -gN(a){return J.r9(this.gbq())}, -gaP(a){return J.vl(this.gbq())}, +gF(a){return new A.eN(J.aw(this.gbr()),A.x(this).h("eN<1,2>"))}, +gn(a){return J.b8(this.gbr())}, +gN(a){return J.rk(this.gbr())}, +gaQ(a){return J.vw(this.gbr())}, aX(a,b){var s=A.x(this) -return A.eM(J.lF(this.gbq(),b),s.c,s.y[1])}, +return A.eM(J.lF(this.gbr(),b),s.c,s.y[1])}, bk(a,b){var s=A.x(this) -return A.eM(J.rc(this.gbq(),b),s.c,s.y[1])}, -ag(a,b){return A.x(this).y[1].a(J.hG(this.gbq(),b))}, -C(a,b){return J.vj(this.gbq(),b)}, -j(a){return J.ay(this.gbq())}} +return A.eM(J.rn(this.gbr(),b),s.c,s.y[1])}, +ag(a,b){return A.x(this).y[1].a(J.hI(this.gbr(),b))}, +C(a,b){return J.vu(this.gbr(),b)}, +j(a){return J.ao(this.gbr())}} A.eN.prototype={ p(){return this.a.p()}, gB(){return this.$ti.y[1].a(this.a.gB())}, $iL:1} -A.de.prototype={ -gbq(){return this.a}} -A.hb.prototype={$iz:1} A.df.prototype={ -c3(a,b,c){return new A.df(this.a,this.$ti.h("@<1,2>").u(b).u(c).h("df<1,2,3,4>"))}, +gbr(){return this.a}} +A.hd.prototype={$iz:1} +A.dg.prototype={ +c4(a,b,c){return new A.dg(this.a,this.$ti.h("@<1,2>").u(b).u(c).h("dg<1,2,3,4>"))}, a7(a){return this.a.a7(a)}, m(a,b){return this.$ti.h("4?").a(this.a.m(0,b))}, k(a,b,c){var s=this.$ti @@ -6228,8 +6239,8 @@ s.y[2].a(b) s.y[3].a(c) this.a.k(0,s.c.a(b),s.y[1].a(c))}, T(a,b){this.a.T(0,new A.lK(this,this.$ti.h("~(3,4)").a(b)))}, -gaR(){var s=this.$ti -return A.eM(this.a.gaR(),s.c,s.y[2])}, +gaS(){var s=this.$ti +return A.eM(this.a.gaS(),s.c,s.y[2])}, gn(a){var s=this.a return s.gn(s)}, gN(a){var s=this.a @@ -6249,18 +6260,18 @@ gn(a){return this.a.length}, m(a,b){var s=this.a if(!(b>=0&&b"))}, +return new A.N(s,s.gn(s),A.x(s).h("N"))}, gN(a){return this.gn(this)===0}, -gbv(a){if(this.gn(this)===0)throw A.f(A.bi()) +gbw(a){if(this.gn(this)===0)throw A.f(A.ba()) return this.ag(0,0)}, C(a,b){var s,r=this,q=r.gn(r) -for(s=0;ss)throw A.f(A.af(r,0,s,"start",null))}}, -gkm(){var s=J.b6(this.a),r=this.c +gkn(){var s=J.b8(this.a),r=this.c if(r==null||r>s)return s return r}, -gl1(){var s=J.b6(this.a),r=this.b +gl3(){var s=J.b8(this.a),r=this.b if(r>s)return s return r}, -gn(a){var s,r=J.b6(this.a),q=this.b +gn(a){var s,r=J.b8(this.a),q=this.b if(q>=r)return 0 s=this.c if(s==null||s>=r)return r-q return s-q}, -ag(a,b){var s=this,r=s.gl1()+b -if(b<0||r>=s.gkm())throw A.f(A.iM(b,s.gn(0),s,null,"index")) -return J.hG(s.a,r)}, +ag(a,b){var s=this,r=s.gl3()+b +if(b<0||r>=s.gkn())throw A.f(A.iM(b,s.gn(0),s,null,"index")) +return J.hI(s.a,r)}, aX(a,b){var s,r,q=this -A.aF(b,"count") +A.aH(b,"count") s=q.b+b r=q.c -if(r!=null&&s>=r)return new A.eW(q.$ti.h("eW<1>")) -return A.bX(q.a,s,r,q.$ti.c)}, +if(r!=null&&s>=r)return new A.eY(q.$ti.h("eY<1>")) +return A.c_(q.a,s,r,q.$ti.c)}, bk(a,b){var s,r,q,p=this -A.aF(b,"count") +A.aH(b,"count") s=p.c r=p.b -if(s==null)return A.bX(p.a,r,B.f.cB(r,b),p.$ti.c) -else{q=B.f.cB(r,b) +if(s==null)return A.c_(p.a,r,B.f.cC(r,b),p.$ti.c) +else{q=B.f.cC(r,b) if(s=o){r.d=null return!1}r.d=p.ag(q,s);++r.c return!0}, $iL:1} -A.ba.prototype={ -gF(a){return new A.du(J.at(this.a),this.b,A.x(this).h("du<1,2>"))}, -gn(a){return J.b6(this.a)}, -gN(a){return J.r9(this.a)}, -ag(a,b){return this.b.$1(J.hG(this.a,b))}} -A.eU.prototype={$iz:1} +A.aM.prototype={ +gF(a){return new A.du(J.aw(this.a),this.b,A.x(this).h("du<1,2>"))}, +gn(a){return J.b8(this.a)}, +gN(a){return J.rk(this.a)}, +ag(a,b){return this.b.$1(J.hI(this.a,b))}} +A.eW.prototype={$iz:1} A.du.prototype={ p(){var s=this,r=s.b if(r.p()){s.a=s.c.$1(r.gB()) @@ -6351,106 +6362,106 @@ gB(){var s=this.a return s==null?this.$ti.y[1].a(s):s}, $iL:1} A.Q.prototype={ -gn(a){return J.b6(this.a)}, -ag(a,b){return this.b.$1(J.hG(this.a,b))}} -A.b_.prototype={ -gF(a){return new A.cF(J.at(this.a),this.b,this.$ti.h("cF<1>"))}} -A.cF.prototype={ +gn(a){return J.b8(this.a)}, +ag(a,b){return this.b.$1(J.hI(this.a,b))}} +A.aE.prototype={ +gF(a){return new A.cH(J.aw(this.a),this.b,this.$ti.h("cH<1>"))}} +A.cH.prototype={ p(){var s,r for(s=this.a,r=this.b;s.p();)if(r.$1(s.gB()))return!0 return!1}, gB(){return this.a.gB()}, $iL:1} -A.dn.prototype={ -gF(a){return new A.fd(J.at(this.a),this.b,B.cK,this.$ti.h("fd<1,2>"))}} -A.fd.prototype={ +A.dp.prototype={ +gF(a){return new A.ff(J.aw(this.a),this.b,B.cK,this.$ti.h("ff<1,2>"))}} +A.ff.prototype={ gB(){var s=this.d return s==null?this.$ti.y[1].a(s):s}, p(){var s,r,q=this,p=q.c if(p==null)return!1 for(s=q.a,r=q.b;!p.p();){q.d=null if(s.p()){q.c=null -p=J.at(r.$1(s.gB())) +p=J.aw(r.$1(s.gB())) q.c=p}else return!1}q.d=q.c.gB() return!0}, $iL:1} A.dE.prototype={ gF(a){var s=this.a -return new A.fT(s.gF(s),this.b,A.x(this).h("fT<1>"))}} -A.eV.prototype={ +return new A.fV(s.gF(s),this.b,A.x(this).h("fV<1>"))}} +A.eX.prototype={ gn(a){var s=this.a,r=s.gn(s) s=this.b if(B.f.b1(r,s))return s return r}, $iz:1} -A.fT.prototype={ +A.fV.prototype={ p(){if(--this.b>=0)return this.a.p() this.b=-1 return!1}, gB(){if(this.b<0){this.$ti.c.a(null) return null}return this.a.gB()}, $iL:1} -A.cx.prototype={ -aX(a,b){A.hR(b,"count",t.S) -A.aF(b,"count") -return new A.cx(this.a,this.b+b,A.x(this).h("cx<1>"))}, +A.cz.prototype={ +aX(a,b){A.hT(b,"count",t.S) +A.aH(b,"count") +return new A.cz(this.a,this.b+b,A.x(this).h("cz<1>"))}, gF(a){var s=this.a -return new A.fO(s.gF(s),this.b,A.x(this).h("fO<1>"))}} +return new A.fQ(s.gF(s),this.b,A.x(this).h("fQ<1>"))}} A.dZ.prototype={ gn(a){var s=this.a,r=s.gn(s)-this.b if(r>=0)return r return 0}, -aX(a,b){A.hR(b,"count",t.S) -A.aF(b,"count") +aX(a,b){A.hT(b,"count",t.S) +A.aH(b,"count") return new A.dZ(this.a,this.b+b,this.$ti)}, $iz:1} -A.fO.prototype={ +A.fQ.prototype={ p(){var s,r for(s=this.a,r=0;r"))}} -A.bZ.prototype={ +A.P.prototype={ +gF(a){return new A.c1(J.aw(this.a),this.$ti.h("c1<1>"))}} +A.c1.prototype={ p(){var s,r for(s=this.a,r=this.$ti.c;s.p();)if(r.b(s.gB()))return!0 return!1}, gB(){return this.$ti.c.a(this.a.gB())}, $iL:1} A.ak.prototype={ -sn(a,b){throw A.f(A.ac("Cannot change the length of a fixed-length list"))}, -l(a,b){A.b3(a).h("ak.E").a(b) -throw A.f(A.ac("Cannot add to a fixed-length list"))}} -A.bL.prototype={ -k(a,b,c){A.x(this).h("bL.E").a(c) -throw A.f(A.ac("Cannot modify an unmodifiable list"))}, -sn(a,b){throw A.f(A.ac("Cannot change the length of an unmodifiable list"))}, -l(a,b){A.x(this).h("bL.E").a(b) -throw A.f(A.ac("Cannot add to an unmodifiable list"))}, -bV(a,b){A.x(this).h("b(bL.E,bL.E)?").a(b) -throw A.f(A.ac("Cannot modify an unmodifiable list"))}} +sn(a,b){throw A.f(A.a6("Cannot change the length of a fixed-length list"))}, +l(a,b){A.aW(a).h("ak.E").a(b) +throw A.f(A.a6("Cannot add to a fixed-length list"))}} +A.bM.prototype={ +k(a,b,c){A.x(this).h("bM.E").a(c) +throw A.f(A.a6("Cannot modify an unmodifiable list"))}, +sn(a,b){throw A.f(A.a6("Cannot change the length of an unmodifiable list"))}, +l(a,b){A.x(this).h("bM.E").a(b) +throw A.f(A.a6("Cannot add to an unmodifiable list"))}, +bW(a,b){A.x(this).h("b(bM.E,bM.E)?").a(b) +throw A.f(A.a6("Cannot modify an unmodifiable list"))}} A.em.prototype={} -A.X.prototype={ -gn(a){return J.b6(this.a)}, -ag(a,b){var s=this.a,r=J.ad(s) +A.Y.prototype={ +gn(a){return J.b8(this.a)}, +ag(a,b){var s=this.a,r=J.ae(s) return r.ag(s,r.gn(s)-1-b)}} -A.cf.prototype={ +A.ci.prototype={ gq(a){var s=this._hashCode if(s!=null)return s s=664597*B.b.gq(this.a)&536870911 @@ -6458,27 +6469,27 @@ this._hashCode=s return s}, j(a){return'Symbol("'+this.a+'")'}, v(a,b){if(b==null)return!1 -return b instanceof A.cf&&this.a===b.a}, +return b instanceof A.ci&&this.a===b.a}, $iel:1} A.l.prototype={$r:"+(1,2)",$s:1} -A.hl.prototype={$r:"+(1,2,3)",$s:2} -A.hm.prototype={$r:"+(1,2,3,4)",$s:3} -A.hn.prototype={$r:"+(1,2,3,4,5)",$s:4} -A.ho.prototype={$r:"+(1,2,3,4,5,6,7,8)",$s:5} -A.eP.prototype={} +A.hn.prototype={$r:"+(1,2,3)",$s:2} +A.ho.prototype={$r:"+(1,2,3,4)",$s:3} +A.hp.prototype={$r:"+(1,2,3,4,5)",$s:4} +A.hq.prototype={$r:"+(1,2,3,4,5,6,7,8)",$s:5} +A.eQ.prototype={} A.dW.prototype={ -c3(a,b,c){var s=A.x(this) -return A.rD(this,s.c,s.y[1],b,c)}, +c4(a,b,c){var s=A.x(this) +return A.rN(this,s.c,s.y[1],b,c)}, gN(a){return this.gn(this)===0}, -j(a){return A.q9(this)}, +j(a){return A.qk(this)}, k(a,b,c){var s=A.x(this) s.c.a(b) s.y[1].a(c) -A.vF()}, +A.vQ()}, $id:1} A.r.prototype={ gn(a){return this.b.length}, -ghc(){var s=this.$keys +ghd(){var s=this.$keys if(s==null){s=Object.keys(this.a) this.$keys=s}return s}, a7(a){if(typeof a!="string")return!1 @@ -6488,17 +6499,17 @@ m(a,b){if(!this.a7(b))return null return this.b[this.a[b]]}, T(a,b){var s,r,q,p this.$ti.h("~(1,2)").a(b) -s=this.ghc() +s=this.ghd() r=this.b for(q=s.length,p=0;p"))}} -A.he.prototype={ +gaS(){return new A.hg(this.ghd(),this.$ti.h("hg<1>"))}} +A.hg.prototype={ gn(a){return this.a.length}, gN(a){return 0===this.a.length}, -gaP(a){return 0!==this.a.length}, +gaQ(a){return 0!==this.a.length}, gF(a){var s=this.a -return new A.cK(s,s.length,this.$ti.h("cK<1>"))}} -A.cK.prototype={ +return new A.cM(s,s.length,this.$ti.h("cM<1>"))}} +A.cM.prototype={ gB(){var s=this.d return s==null?this.$ti.c.a(s):s}, p(){var s=this,r=s.c @@ -6508,86 +6519,86 @@ s.c=r+1 return!0}, $iL:1} A.a.prototype={ -c_(){var s=this,r=s.$map -if(r==null){r=new A.dp(s.$ti.h("dp<1,2>")) -A.us(s.a,r) +c0(){var s=this,r=s.$map +if(r==null){r=new A.dq(s.$ti.h("dq<1,2>")) +A.uD(s.a,r) s.$map=r}return r}, -a7(a){return this.c_().a7(a)}, -m(a,b){return this.c_().m(0,b)}, +a7(a){return this.c0().a7(a)}, +m(a,b){return this.c0().m(0,b)}, T(a,b){this.$ti.h("~(1,2)").a(b) -this.c_().T(0,b)}, -gaR(){var s=this.c_() -return new A.aV(s,A.x(s).h("aV<1>"))}, -gn(a){return this.c_().a}} +this.c0().T(0,b)}, +gaS(){var s=this.c0() +return new A.b_(s,A.x(s).h("b_<1>"))}, +gn(a){return this.c0().a}} A.dX.prototype={} -A.b8.prototype={ +A.aX.prototype={ gn(a){return this.b}, gN(a){return this.b===0}, -gaP(a){return this.b!==0}, +gaQ(a){return this.b!==0}, gF(a){var s,r=this,q=r.$keys if(q==null){q=Object.keys(r.a) r.$keys=q}s=q -return new A.cK(s,s.length,r.$ti.h("cK<1>"))}, +return new A.cM(s,s.length,r.$ti.h("cM<1>"))}, C(a,b){if(typeof b!="string")return!1 if("__proto__"===b)return!1 return this.a.hasOwnProperty(b)}} -A.aP.prototype={ +A.aS.prototype={ gn(a){return this.a.length}, gN(a){return this.a.length===0}, -gaP(a){return this.a.length!==0}, +gaQ(a){return this.a.length!==0}, gF(a){var s=this.a -return new A.cK(s,s.length,this.$ti.h("cK<1>"))}, -c_(){var s,r,q,p,o=this,n=o.$map -if(n==null){n=new A.dp(o.$ti.h("dp<1,1>")) -for(s=o.a,r=s.length,q=0;q"))}, +c0(){var s,r,q,p,o=this,n=o.$map +if(n==null){n=new A.dq(o.$ti.h("dq<1,1>")) +for(s=o.a,r=s.length,q=0;q")}} A.e0.prototype={ $2(a,b){return this.a.$1$2(a,b,this.$ti.y[0])}, -$S(){return A.zg(A.pi(this.a),this.$ti)}} -A.fj.prototype={ -gnt(){var s=this.a -if(s instanceof A.cf)return s -return this.a=new A.cf(A.q(s))}, -gnJ(){var s,r,q,p,o,n=this +$S(){return A.zp(A.pq(this.a),this.$ti)}} +A.fl.prototype={ +gnv(){var s=this.a +if(s instanceof A.ci)return s +return this.a=new A.ci(A.q(s))}, +gnL(){var s,r,q,p,o,n=this if(n.c===1)return B.h s=n.d -r=J.ad(s) -q=r.gn(s)-J.b6(n.e)-n.f +r=J.ae(s) +q=r.gn(s)-J.b8(n.e)-n.f if(q===0)return B.h p=[] for(o=0;o>>0}, j(a){return"Closure '"+this.$_name+"' of "+("Instance of '"+A.jC(this.a)+"'")}} A.jK.prototype={ j(a){return"RuntimeError: "+this.a}} -A.oW.prototype={} +A.p3.prototype={} A.bx.prototype={ gn(a){return this.a}, gN(a){return this.a===0}, -gaR(){return new A.aV(this,A.x(this).h("aV<1>"))}, +gaS(){return new A.b_(this,A.x(this).h("b_<1>"))}, a7(a){var s,r if(typeof a=="string"){s=this.b if(s==null)return!1 return s[a]!=null}else if(typeof a=="number"&&(a&0x3fffffff)===a){r=this.c if(r==null)return!1 -return r[a]!=null}else return this.nd(a)}, -nd(a){var s=this.d +return r[a]!=null}else return this.nf(a)}, +nf(a){var s=this.d if(s==null)return!1 -return this.cT(s[this.cS(a)],a)>=0}, -a1(a,b){A.x(this).h("d<1,2>").a(b).T(0,new A.mK(this))}, +return this.cV(s[this.cU(a)],a)>=0}, +a1(a,b){A.x(this).h("d<1,2>").a(b).T(0,new A.mQ(this))}, m(a,b){var s,r,q,p,o=null if(typeof b=="string"){s=this.b if(s==null)return o @@ -6672,31 +6683,31 @@ return q}else if(typeof b=="number"&&(b&0x3fffffff)===b){p=this.c if(p==null)return o r=p[b] q=r==null?o:r.b -return q}else return this.ne(b)}, -ne(a){var s,r,q=this.d +return q}else return this.ng(b)}, +ng(a){var s,r,q=this.d if(q==null)return null -s=q[this.cS(a)] -r=this.cT(s,a) +s=q[this.cU(a)] +r=this.cV(s,a) if(r<0)return null return s[r].b}, k(a,b,c){var s,r,q=this,p=A.x(q) p.c.a(b) p.y[1].a(c) if(typeof b=="string"){s=q.b -q.fP(s==null?q.b=q.ep():s,b,c)}else if(typeof b=="number"&&(b&0x3fffffff)===b){r=q.c -q.fP(r==null?q.c=q.ep():r,b,c)}else q.ng(b,c)}, -ng(a,b){var s,r,q,p,o=this,n=A.x(o) +q.fQ(s==null?q.b=q.eu():s,b,c)}else if(typeof b=="number"&&(b&0x3fffffff)===b){r=q.c +q.fQ(r==null?q.c=q.eu():r,b,c)}else q.ni(b,c)}, +ni(a,b){var s,r,q,p,o=this,n=A.x(o) n.c.a(a) n.y[1].a(b) s=o.d -if(s==null)s=o.d=o.ep() -r=o.cS(a) +if(s==null)s=o.d=o.eu() +r=o.cU(a) q=s[r] -if(q==null)s[r]=[o.eq(a,b)] -else{p=o.cT(q,a) +if(q==null)s[r]=[o.ev(a,b)] +else{p=o.cV(q,a) if(p>=0)q[p].b=b -else q.push(o.eq(a,b))}}, -f7(a,b){var s,r,q=this,p=A.x(q) +else q.push(o.ev(a,b))}}, +fb(a,b){var s,r,q=this,p=A.x(q) p.c.a(a) p.h("2()").a(b) if(q.a7(a)){s=q.m(0,a) @@ -6704,23 +6715,23 @@ return s==null?p.y[1].a(s):s}r=b.$0() q.k(0,a,r) return r}, W(a,b){var s=this -if(typeof b=="string")return s.ho(s.b,b) -else if(typeof b=="number"&&(b&0x3fffffff)===b)return s.ho(s.c,b) -else return s.nf(b)}, -nf(a){var s,r,q,p,o=this,n=o.d +if(typeof b=="string")return s.hp(s.b,b) +else if(typeof b=="number"&&(b&0x3fffffff)===b)return s.hp(s.c,b) +else return s.nh(b)}, +nh(a){var s,r,q,p,o=this,n=o.d if(n==null)return null -s=o.cS(a) +s=o.cU(a) r=n[s] -q=o.cT(r,a) +q=o.cV(r,a) if(q<0)return null p=r.splice(q,1)[0] -o.hy(p) +o.hz(p) if(r.length===0)delete n[s] return p.b}, bc(a){var s=this if(s.a>0){s.b=s.c=s.d=s.e=s.f=null s.a=0 -s.eo()}}, +s.es()}}, T(a,b){var s,r,q=this A.x(q).h("~(1,2)").a(b) s=q.e @@ -6728,58 +6739,58 @@ r=q.r while(s!=null){b.$2(s.a,s.b) if(r!==q.r)throw A.f(A.ai(q)) s=s.c}}, -fP(a,b,c){var s,r=A.x(this) +fQ(a,b,c){var s,r=A.x(this) r.c.a(b) r.y[1].a(c) s=a[b] -if(s==null)a[b]=this.eq(b,c) +if(s==null)a[b]=this.ev(b,c) else s.b=c}, -ho(a,b){var s +hp(a,b){var s if(a==null)return null s=a[b] if(s==null)return null -this.hy(s) +this.hz(s) delete a[b] return s.b}, -eo(){this.r=this.r+1&1073741823}, -eq(a,b){var s=this,r=A.x(s),q=new A.mM(r.c.a(a),r.y[1].a(b)) +es(){this.r=this.r+1&1073741823}, +ev(a,b){var s=this,r=A.x(s),q=new A.mS(r.c.a(a),r.y[1].a(b)) if(s.e==null)s.e=s.f=q else{r=s.f r.toString q.d=r s.f=r.c=q}++s.a -s.eo() +s.es() return q}, -hy(a){var s=this,r=a.d,q=a.c +hz(a){var s=this,r=a.d,q=a.c if(r==null)s.e=q else r.c=q if(q==null)s.f=r else q.d=r;--s.a -s.eo()}, -cS(a){return J.B(a)&1073741823}, -cT(a,b){var s,r +s.es()}, +cU(a){return J.C(a)&1073741823}, +cV(a,b){var s,r if(a==null)return-1 s=a.length -for(r=0;r"]=s delete s[""] return s}, -$imL:1} -A.mK.prototype={ +$imR:1} +A.mQ.prototype={ $2(a,b){var s=this.a,r=A.x(s) s.k(0,r.c.a(a),r.y[1].a(b))}, $S(){return A.x(this.a).h("~(1,2)")}} -A.mM.prototype={} -A.aV.prototype={ +A.mS.prototype={} +A.b_.prototype={ gn(a){return this.a.a}, gN(a){return this.a.a===0}, gF(a){var s=this.a -return new A.cv(s,s.r,s.e,this.$ti.h("cv<1>"))}, +return new A.cx(s,s.r,s.e,this.$ti.h("cx<1>"))}, C(a,b){return this.a.a7(b)}} -A.cv.prototype={ +A.cx.prototype={ gB(){return this.d}, p(){var s,r=this,q=r.a if(r.b!==q.r)throw A.f(A.ai(q)) @@ -6789,7 +6800,7 @@ return!1}else{r.d=s.a r.c=s.c return!0}}, $iL:1} -A.fo.prototype={ +A.fq.prototype={ gn(a){return this.a.a}, gN(a){return this.a.a===0}, gF(a){var s=this.a @@ -6804,12 +6815,12 @@ return!1}else{r.d=s.b r.c=s.c return!0}}, $iL:1} -A.dq.prototype={ +A.bU.prototype={ gn(a){return this.a.a}, gN(a){return this.a.a===0}, gF(a){var s=this.a -return new A.fn(s,s.r,s.e,this.$ti.h("fn<1,2>"))}} -A.fn.prototype={ +return new A.fp(s,s.r,s.e,this.$ti.h("fp<1,2>"))}} +A.fp.prototype={ gB(){var s=this.d s.toString return s}, @@ -6817,107 +6828,107 @@ p(){var s,r=this,q=r.a if(r.b!==q.r)throw A.f(A.ai(q)) s=r.c if(s==null){r.d=null -return!1}else{r.d=new A.b0(s.a,s.b,r.$ti.h("b0<1,2>")) +return!1}else{r.d=new A.aC(s.a,s.b,r.$ti.h("aC<1,2>")) r.c=s.c return!0}}, $iL:1} -A.dp.prototype={ -cS(a){return A.yL(a)&1073741823}, -cT(a,b){var s,r +A.dq.prototype={ +cU(a){return A.yU(a)&1073741823}, +cV(a,b){var s,r if(a==null)return-1 s=a.length -for(r=0;r0;){--q;--s -B.a.k(j,q,r[s])}}return A.rC(j,k)}} +B.a.k(j,q,r[s])}}return A.rM(j,k)}} A.ez.prototype={ -di(){return[this.a,this.b]}, +dm(){return[this.a,this.b]}, v(a,b){if(b==null)return!1 -return b instanceof A.ez&&this.$s===b.$s&&J.N(this.a,b.a)&&J.N(this.b,b.b)}, -gq(a){return A.aX(this.$s,this.a,this.b,B.u)}} +return b instanceof A.ez&&this.$s===b.$s&&J.O(this.a,b.a)&&J.O(this.b,b.b)}, +gq(a){return A.b1(this.$s,this.a,this.b,B.u)}} A.eA.prototype={ -di(){return[this.a,this.b,this.c]}, +dm(){return[this.a,this.b,this.c]}, v(a,b){var s=this if(b==null)return!1 -return b instanceof A.eA&&s.$s===b.$s&&J.N(s.a,b.a)&&J.N(s.b,b.b)&&J.N(s.c,b.c)}, +return b instanceof A.eA&&s.$s===b.$s&&J.O(s.a,b.a)&&J.O(s.b,b.b)&&J.O(s.c,b.c)}, gq(a){var s=this -return A.aX(s.$s,s.a,s.b,s.c)}} -A.d7.prototype={ -di(){return this.a}, +return A.b1(s.$s,s.a,s.b,s.c)}} +A.d8.prototype={ +dm(){return this.a}, v(a,b){if(b==null)return!1 -return b instanceof A.d7&&this.$s===b.$s&&A.xp(this.a,b.a)}, -gq(a){return A.aX(this.$s,A.wk(this.a),B.u,B.u)}} -A.cV.prototype={ +return b instanceof A.d8&&this.$s===b.$s&&A.xz(this.a,b.a)}, +gq(a){return A.b1(this.$s,A.wu(this.a),B.u,B.u)}} +A.cX.prototype={ j(a){return"RegExp/"+this.a+"/"+this.b.flags}, -ghh(){var s=this,r=s.c +ghi(){var s=this,r=s.c if(r!=null)return r r=s.b -return s.c=A.q3(s.a,r.multiline,!r.ignoreCase,r.unicode,r.dotAll,"g")}, -gkB(){var s=this,r=s.d +return s.c=A.qe(s.a,r.multiline,!r.ignoreCase,r.unicode,r.dotAll,"g")}, +gkC(){var s=this,r=s.d if(r!=null)return r r=s.b -return s.d=A.q3(s.a,r.multiline,!r.ignoreCase,r.unicode,r.dotAll,"y")}, -k9(){var s,r=this.a +return s.d=A.qe(s.a,r.multiline,!r.ignoreCase,r.unicode,r.dotAll,"y")}, +ka(){var s,r=this.a if(!B.b.C(r,"("))return!1 s=this.b.unicode?"u":"" return new RegExp("(?:)|"+r,s).exec("").length>1}, -dC(a,b,c){var s=b.length +dE(a,b,c){var s=b.length if(c>s)throw A.f(A.af(c,0,s,null,null)) return new A.kw(this,b,c)}, -dB(a,b){return this.dC(0,b,0)}, -h6(a,b){var s,r=this.ghh() -if(r==null)r=A.cg(r) +dD(a,b){return this.dE(0,b,0)}, +h7(a,b){var s,r=this.ghi() +if(r==null)r=A.cj(r) r.lastIndex=b s=r.exec(a) if(s==null)return null -return new A.hg(s)}, -kn(a,b){var s,r=this.gkB() -if(r==null)r=A.cg(r) +return new A.hi(s)}, +ko(a,b){var s,r=this.gkC() +if(r==null)r=A.cj(r) r.lastIndex=b s=r.exec(a) if(s==null)return null -return new A.hg(s)}, -f0(a,b,c){if(c<0||c>b.length)throw A.f(A.af(c,0,b.length,null,null)) -return this.kn(b,c)}, +return new A.hi(s)}, +f4(a,b,c){if(c<0||c>b.length)throw A.f(A.af(c,0,b.length,null,null)) +return this.ko(b,c)}, $idx:1, -$iqg:1} -A.hg.prototype={ +$iqr:1} +A.hi.prototype={ gS(){return this.b.index}, gV(){var s=this.b return s.index+s[0].length}, -d8(a){var s=this.b +dd(a){var s=this.b if(!(a=56320&&s<=57343}}}o=(s?o+1:o)+1}m.c=o return!0}}m.b=m.d=null return!1}, $iL:1} -A.fS.prototype={ +A.fU.prototype={ gV(){return this.a+this.c.length}, -d8(a){if(a!==0)throw A.f(A.nu(a,null)) +dd(a){if(a!==0)throw A.f(A.nA(a,null)) return this.c}, -$icc:1, +$icf:1, gS(){return this.a}} A.kU.prototype={ gF(a){return new A.kV(this.a,this.b,this.c)}} @@ -6957,7 +6968,7 @@ return!1}s=m.indexOf(o,p) if(s<0){q.c=l+1 q.d=null return!1}r=s+n -q.d=new A.fS(s,o) +q.d=new A.fU(s,o) q.c=r===q.c?r+1:r return!0}, gB(){var s=this.d @@ -6966,230 +6977,230 @@ return s}, $iL:1} A.kB.prototype={ aY(){var s=this.b -if(s===this)throw A.f(A.q6(this.a)) +if(s===this)throw A.f(A.qh(this.a)) return s}} A.dv.prototype={ -gaz(a){return B.Mw}, -hO(a,b,c){var s -A.pb(a,b,c) +gaA(a){return B.MA}, +hP(a,b,c){var s +A.pj(a,b,c) s=new Uint8Array(a,b,c) return s}, -dD(a,b,c){A.pb(a,b,c) +dF(a,b,c){A.pj(a,b,c) return c==null?new DataView(a,b):new DataView(a,b,c)}, -hN(a){return this.dD(a,0,null)}, -$ia3:1, +hO(a){return this.dF(a,0,null)}, +$ia4:1, $idv:1} -A.fu.prototype={ -ga9(a){if(((a.$flags|0)&2)!==0)return new A.p0(a.buffer) +A.fw.prototype={ +ga9(a){if(((a.$flags|0)&2)!==0)return new A.p8(a.buffer) else return a.buffer}, -kw(a,b,c,d){var s=A.af(b,0,c,d,null) +kx(a,b,c,d){var s=A.af(b,0,c,d,null) throw A.f(s)}, -fW(a,b,c,d){if(b>>>0!==b||b>c)this.kw(a,b,c,d)}} -A.p0.prototype={ -hO(a,b,c){var s=A.w9(this.a,b,c) +fX(a,b,c,d){if(b>>>0!==b||b>c)this.kx(a,b,c,d)}} +A.p8.prototype={ +hP(a,b,c){var s=A.wj(this.a,b,c) s.$flags=3 return s}, -dD(a,b,c){var s=A.w6(this.a,b,c) +dF(a,b,c){var s=A.wg(this.a,b,c) s.$flags=3 return s}, -hN(a){return this.dD(0,0,null)}} +hO(a){return this.dF(0,0,null)}} A.j7.prototype={ -gaz(a){return B.Mx}, -$ia3:1} -A.aW.prototype={ +gaA(a){return B.MB}, +$ia4:1} +A.b0.prototype={ gn(a){return a.length}, -kW(a,b,c,d,e){var s,r,q=a.length -this.fW(a,b,q,"start") -this.fW(a,c,q,"end") +kY(a,b,c,d,e){var s,r,q=a.length +this.fX(a,b,q,"start") +this.fX(a,c,q,"end") if(b>c)throw A.f(A.af(b,0,c,null,null)) s=c-b if(e<0)throw A.f(A.W(e,null)) r=d.length -if(r-e").b(a))s.fV(a) -else s.fZ(a)}}, -eG(a,b){var s=this.a -if(this.b)s.ec(new A.bG(a,b)) -else s.e9(new A.bG(a,b))}} -A.p9.prototype={ +if(q.h("ct<1>").b(a))s.fW(a) +else s.h_(a)}}, +eK(a,b){var s=this.a +if(this.b)s.eg(new A.bH(a,b)) +else s.ed(new A.bH(a,b))}} +A.ph.prototype={ $1(a){return this.a.$2(0,a)}, $S:16} -A.pa.prototype={ -$2(a,b){this.a.$2(1,new A.fc(a,t.F.a(b)))}, -$S:46} -A.ph.prototype={ -$2(a,b){this.a(A.ax(a),b)}, -$S:54} -A.bG.prototype={ +A.pi.prototype={ +$2(a,b){this.a.$2(1,new A.fe(a,t.F.a(b)))}, +$S:120} +A.pp.prototype={ +$2(a,b){this.a(A.at(a),b)}, +$S:119} +A.bH.prototype={ j(a){return A.k(this.a)}, -$ia0:1, -gcf(){return this.b}} +$ia1:1, +gcg(){return this.b}} A.kC.prototype={ -eG(a,b){var s=this.a -if((s.a&30)!==0)throw A.f(A.ce("Future already completed")) -s.e9(A.y9(a,b))}, -i_(a){return this.eG(a,null)}} -A.h8.prototype={ -eF(a){var s,r=this.$ti +eK(a,b){var s=this.a +if((s.a&30)!==0)throw A.f(A.ch("Future already completed")) +s.ed(A.yj(a,b))}, +i0(a){return this.eK(a,null)}} +A.ha.prototype={ +eJ(a){var s,r=this.$ti r.h("1/?").a(a) s=this.a -if((s.a&30)!==0)throw A.f(A.ce("Future already completed")) -s.e8(r.h("1/").a(a))}} +if((s.a&30)!==0)throw A.f(A.ch("Future already completed")) +s.ec(r.h("1/").a(a))}} A.dJ.prototype={ -nr(a){if((this.c&15)!==6)return!0 -return this.b.b.fd(t.iW.a(this.d),a.a,t.k4,t.K)}, -n6(a){var s,r=this,q=r.e,p=null,o=t.z,n=t.K,m=a.a,l=r.b.b -if(t.ng.b(q))p=l.oa(q,m,a.b,o,n,t.F) -else p=l.fd(t.mq.a(q),m,o,n) +nt(a){if((this.c&15)!==6)return!0 +return this.b.b.fe(t.iW.a(this.d),a.a,t.k4,t.K)}, +n8(a){var s,r=this,q=r.e,p=null,o=t.z,n=t.K,m=a.a,l=r.b.b +if(t.ng.b(q))p=l.od(q,m,a.b,o,n,t.F) +else p=l.fe(t.mq.a(q),m,o,n) try{o=r.$ti.h("2/").a(p) -return o}catch(s){if(t.do.b(A.bP(s))){if((r.c&1)!==0)throw A.f(A.W("The error handler of Future.then must return a value of the returned future's type","onError")) +return o}catch(s){if(t.do.b(A.bQ(s))){if((r.c&1)!==0)throw A.f(A.W("The error handler of Future.then must return a value of the returned future's type","onError")) throw A.f(A.W("The error handler of Future.catchError must return a value of the future's type","onError"))}else throw s}}} -A.aB.prototype={ -fe(a,b,c){var s,r,q,p=this.$ti +A.aF.prototype={ +ff(a,b,c){var s,r,q,p=this.$ti p.u(c).h("1/(2)").a(a) s=$.an -if(s===B.a3){if(b!=null&&!t.ng.b(b)&&!t.mq.b(b))throw A.f(A.q_(b,"onError",u.w))}else{c.h("@<0/>").u(p.c).h("1(2)").a(a) -if(b!=null)b=A.yr(b,s)}r=new A.aB(s,c.h("aB<0>")) +if(s===B.a3){if(b!=null&&!t.ng.b(b)&&!t.mq.b(b))throw A.f(A.q9(b,"onError",u.w))}else{c.h("@<0/>").u(p.c).h("1(2)").a(a) +if(b!=null)b=A.yB(b,s)}r=new A.aF(s,c.h("aF<0>")) q=b==null?1:3 -this.e7(new A.dJ(r,q,a,b,p.h("@<1>").u(c).h("dJ<1,2>"))) +this.eb(new A.dJ(r,q,a,b,p.h("@<1>").u(c).h("dJ<1,2>"))) return r}, -of(a,b){return this.fe(a,null,b)}, -hv(a,b,c){var s,r=this.$ti +oi(a,b){return this.ff(a,null,b)}, +hw(a,b,c){var s,r=this.$ti r.u(c).h("1/(2)").a(a) -s=new A.aB($.an,c.h("aB<0>")) -this.e7(new A.dJ(s,19,a,b,r.h("@<1>").u(c).h("dJ<1,2>"))) +s=new A.aF($.an,c.h("aF<0>")) +this.eb(new A.dJ(s,19,a,b,r.h("@<1>").u(c).h("dJ<1,2>"))) return s}, -kV(a){this.a=this.a&1|16 +kX(a){this.a=this.a&1|16 this.c=a}, -dg(a){this.a=a.a&30|this.a&1 +dk(a){this.a=a.a&30|this.a&1 this.c=a.c}, -e7(a){var s,r=this,q=r.a +eb(a){var s,r=this,q=r.a if(q<=3){a.a=t.np.a(r.c) r.c=a}else{if((q&4)!==0){s=t.j_.a(r.c) -if((s.a&24)===0){s.e7(a) -return}r.dg(s)}A.ly(null,null,r.b,t.U.a(new A.oF(r,a)))}}, -hm(a){var s,r,q,p,o,n,m=this,l={} +if((s.a&24)===0){s.eb(a) +return}r.dk(s)}A.ly(null,null,r.b,t.U.a(new A.oN(r,a)))}}, +hn(a){var s,r,q,p,o,n,m=this,l={} l.a=a if(a==null)return s=m.a @@ -7198,202 +7209,202 @@ m.c=a if(r!=null){q=a.a for(p=a;q!=null;p=q,q=o)o=q.a p.a=r}}else{if((s&4)!==0){n=t.j_.a(m.c) -if((n.a&24)===0){n.hm(a) -return}m.dg(n)}l.a=m.dr(a) -A.ly(null,null,m.b,t.U.a(new A.oJ(l,m)))}}, -dq(){var s=t.np.a(this.c) +if((n.a&24)===0){n.hn(a) +return}m.dk(n)}l.a=m.du(a) +A.ly(null,null,m.b,t.U.a(new A.oR(l,m)))}}, +dt(){var s=t.np.a(this.c) this.c=null -return this.dr(s)}, -dr(a){var s,r,q +return this.du(s)}, +du(a){var s,r,q for(s=a,r=null;s!=null;r=s,s=q){q=s.a s.a=r}return r}, -fZ(a){var s,r=this +h_(a){var s,r=this r.$ti.c.a(a) -s=r.dq() +s=r.dt() r.a=8 r.c=a A.ex(r,s)}, -k7(a){var s,r,q=this +k8(a){var s,r,q=this if((a.a&16)!==0){s=q.b===a.b s=!(s||s)}else s=!1 if(s)return -r=q.dq() -q.dg(a) +r=q.dt() +q.dk(a) A.ex(q,r)}, -ec(a){var s=this.dq() -this.kV(a) +eg(a){var s=this.dt() +this.kX(a) A.ex(this,s)}, -e8(a){var s=this.$ti +ec(a){var s=this.$ti s.h("1/").a(a) -if(s.h("cr<1>").b(a)){this.fV(a) -return}this.k5(a)}, -k5(a){var s=this +if(s.h("ct<1>").b(a)){this.fW(a) +return}this.k6(a)}, +k6(a){var s=this s.$ti.c.a(a) s.a^=2 -A.ly(null,null,s.b,t.U.a(new A.oH(s,a)))}, -fV(a){A.qz(this.$ti.h("cr<1>").a(a),this,!1) +A.ly(null,null,s.b,t.U.a(new A.oP(s,a)))}, +fW(a){A.qK(this.$ti.h("ct<1>").a(a),this,!1) return}, -e9(a){this.a^=2 -A.ly(null,null,this.b,t.U.a(new A.oG(this,a)))}, -$icr:1} -A.oF.prototype={ +ed(a){this.a^=2 +A.ly(null,null,this.b,t.U.a(new A.oO(this,a)))}, +$ict:1} +A.oN.prototype={ $0(){A.ex(this.a,this.b)}, $S:1} -A.oJ.prototype={ +A.oR.prototype={ $0(){A.ex(this.b,this.a.a)}, $S:1} -A.oI.prototype={ -$0(){A.qz(this.a.a,this.b,!0)}, +A.oQ.prototype={ +$0(){A.qK(this.a.a,this.b,!0)}, $S:1} -A.oH.prototype={ -$0(){this.a.fZ(this.b)}, +A.oP.prototype={ +$0(){this.a.h_(this.b)}, $S:1} -A.oG.prototype={ -$0(){this.a.ec(this.b)}, +A.oO.prototype={ +$0(){this.a.eg(this.b)}, $S:1} -A.oM.prototype={ +A.oU.prototype={ $0(){var s,r,q,p,o,n,m,l,k=this,j=null try{q=k.a.a -j=q.b.b.o9(t.mY.a(q.d),t.z)}catch(p){s=A.bP(p) +j=q.b.b.oc(t.de.a(q.d),t.z)}catch(p){s=A.bQ(p) r=A.eJ(p) if(k.c&&t.B.a(k.b.a.c).a===s){q=k.a q.c=t.B.a(k.b.a.c)}else{q=s o=r -if(o==null)o=A.q0(q) +if(o==null)o=A.qa(q) n=k.a -n.c=new A.bG(q,o) +n.c=new A.bH(q,o) q=n}q.b=!0 -return}if(j instanceof A.aB&&(j.a&24)!==0){if((j.a&16)!==0){q=k.a +return}if(j instanceof A.aF&&(j.a&24)!==0){if((j.a&16)!==0){q=k.a q.c=t.B.a(j.c) -q.b=!0}return}if(j instanceof A.aB){m=k.b.a -l=new A.aB(m.b,m.$ti) -j.fe(new A.oN(l,m),new A.oO(l),t.H) +q.b=!0}return}if(j instanceof A.aF){m=k.b.a +l=new A.aF(m.b,m.$ti) +j.ff(new A.oV(l,m),new A.oW(l),t.H) q=k.a q.c=l q.b=!1}}, $S:1} -A.oN.prototype={ -$1(a){this.a.k7(this.b)}, -$S:28} -A.oO.prototype={ -$2(a,b){A.cg(a) +A.oV.prototype={ +$1(a){this.a.k8(this.b)}, +$S:34} +A.oW.prototype={ +$2(a,b){A.cj(a) t.F.a(b) -this.a.ec(new A.bG(a,b))}, -$S:59} -A.oL.prototype={ +this.a.eg(new A.bH(a,b))}, +$S:103} +A.oT.prototype={ $0(){var s,r,q,p,o,n,m,l try{q=this.a p=q.a o=p.$ti n=o.c m=n.a(this.b) -q.c=p.b.b.fd(o.h("2/(1)").a(p.d),m,o.h("2/"),n)}catch(l){s=A.bP(l) +q.c=p.b.b.fe(o.h("2/(1)").a(p.d),m,o.h("2/"),n)}catch(l){s=A.bQ(l) r=A.eJ(l) q=s p=r -if(p==null)p=A.q0(q) +if(p==null)p=A.qa(q) o=this.a -o.c=new A.bG(q,p) +o.c=new A.bH(q,p) o.b=!0}}, $S:1} -A.oK.prototype={ +A.oS.prototype={ $0(){var s,r,q,p,o,n,m,l=this try{s=t.B.a(l.a.a.c) p=l.b -if(p.a.nr(s)&&p.a.e!=null){p.c=p.a.n6(s) -p.b=!1}}catch(o){r=A.bP(o) +if(p.a.nt(s)&&p.a.e!=null){p.c=p.a.n8(s) +p.b=!1}}catch(o){r=A.bQ(o) q=A.eJ(o) p=t.B.a(l.a.a.c) if(p.a===r){n=l.b n.c=p p=n}else{p=r n=q -if(n==null)n=A.q0(p) +if(n==null)n=A.qa(p) m=l.b -m.c=new A.bG(p,n) +m.c=new A.bH(p,n) p=m}p.b=!0}}, $S:1} A.ky.prototype={} A.kT.prototype={} -A.hz.prototype={$itj:1} +A.hB.prototype={$itt:1} A.kS.prototype={ -ob(a){var s,r,q +oe(a){var s,r,q t.U.a(a) try{if(B.a3===$.an){a.$0() -return}A.u9(null,null,this,a,t.H)}catch(q){s=A.bP(q) +return}A.uj(null,null,this,a,t.H)}catch(q){s=A.bQ(q) r=A.eJ(q) -A.qO(A.cg(s),t.F.a(r))}}, -lO(a){return new A.oX(this,t.U.a(a))}, -o9(a,b){b.h("0()").a(a) +A.qZ(A.cj(s),t.F.a(r))}}, +lQ(a){return new A.p4(this,t.U.a(a))}, +oc(a,b){b.h("0()").a(a) if($.an===B.a3)return a.$0() -return A.u9(null,null,this,a,b)}, -fd(a,b,c,d){c.h("@<0>").u(d).h("1(2)").a(a) +return A.uj(null,null,this,a,b)}, +fe(a,b,c,d){c.h("@<0>").u(d).h("1(2)").a(a) d.a(b) if($.an===B.a3)return a.$1(b) -return A.yt(null,null,this,a,b,c,d)}, -oa(a,b,c,d,e,f){d.h("@<0>").u(e).u(f).h("1(2,3)").a(a) +return A.yD(null,null,this,a,b,c,d)}, +od(a,b,c,d,e,f){d.h("@<0>").u(e).u(f).h("1(2,3)").a(a) e.a(b) f.a(c) if($.an===B.a3)return a.$2(b,c) -return A.ys(null,null,this,a,b,c,d,e,f)}, -it(a,b,c,d){return b.h("@<0>").u(c).u(d).h("1(2,3)").a(a)}} -A.oX.prototype={ -$0(){return this.a.ob(this.b)}, +return A.yC(null,null,this,a,b,c,d,e,f)}, +iu(a,b,c,d){return b.h("@<0>").u(c).u(d).h("1(2,3)").a(a)}} +A.p4.prototype={ +$0(){return this.a.oe(this.b)}, $S:1} -A.pf.prototype={ -$0(){A.vL(this.a,this.b)}, +A.pn.prototype={ +$0(){A.vW(this.a,this.b)}, $S:1} -A.cJ.prototype={ +A.cL.prototype={ gn(a){return this.a}, gN(a){return this.a===0}, -gaR(){return new A.hc(this,A.x(this).h("hc<1>"))}, +gaS(){return new A.he(this,A.x(this).h("he<1>"))}, a7(a){var s,r if(typeof a=="string"&&a!=="__proto__"){s=this.b return s==null?!1:s[a]!=null}else if(typeof a=="number"&&(a&1073741823)===a){r=this.c -return r==null?!1:r[a]!=null}else return this.h0(a)}, -h0(a){var s=this.d +return r==null?!1:r[a]!=null}else return this.h1(a)}, +h1(a){var s=this.d if(s==null)return!1 -return this.bG(this.h9(s,a),a)>=0}, +return this.bH(this.ha(s,a),a)>=0}, m(a,b){var s,r,q if(typeof b=="string"&&b!=="__proto__"){s=this.b -r=s==null?null:A.tt(s,b) +r=s==null?null:A.tD(s,b) return r}else if(typeof b=="number"&&(b&1073741823)===b){q=this.c -r=q==null?null:A.tt(q,b) -return r}else return this.h8(b)}, -h8(a){var s,r,q=this.d +r=q==null?null:A.tD(q,b) +return r}else return this.h9(b)}, +h9(a){var s,r,q=this.d if(q==null)return null -s=this.h9(q,a) -r=this.bG(s,a) +s=this.ha(q,a) +r=this.bH(s,a) return r<0?null:s[r+1]}, k(a,b,c){var s,r,q=this,p=A.x(q) p.c.a(b) p.y[1].a(c) if(typeof b=="string"&&b!=="__proto__"){s=q.b -q.fY(s==null?q.b=A.qA():s,b,c)}else if(typeof b=="number"&&(b&1073741823)===b){r=q.c -q.fY(r==null?q.c=A.qA():r,b,c)}else q.hp(b,c)}, -hp(a,b){var s,r,q,p,o=this,n=A.x(o) +q.fZ(s==null?q.b=A.qL():s,b,c)}else if(typeof b=="number"&&(b&1073741823)===b){r=q.c +q.fZ(r==null?q.c=A.qL():r,b,c)}else q.hq(b,c)}, +hq(a,b){var s,r,q,p,o=this,n=A.x(o) n.c.a(a) n.y[1].a(b) s=o.d -if(s==null)s=o.d=A.qA() -r=o.bZ(a) +if(s==null)s=o.d=A.qL() +r=o.c_(a) q=s[r] -if(q==null){A.qB(s,r,[a,b]);++o.a -o.e=null}else{p=o.bG(q,a) +if(q==null){A.qM(s,r,[a,b]);++o.a +o.e=null}else{p=o.bH(q,a) if(p>=0)q[p+1]=b else{q.push(a,b);++o.a o.e=null}}}, T(a,b){var s,r,q,p,o,n,m=this,l=A.x(m) l.h("~(1,2)").a(b) -s=m.h_() +s=m.h0() for(r=s.length,q=l.c,l=l.y[1],p=0;p"))}, +return new A.hf(s,s.h0(),this.$ti.h("hf<1>"))}, C(a,b){return this.a.a7(b)}} -A.hd.prototype={ +A.hf.prototype={ gB(){var s=this.d return s==null?this.$ti.c.a(s):s}, p(){var s=this,r=s.b,q=s.c,p=s.a @@ -7459,52 +7470,52 @@ return!1}else{s.d=r[q] s.c=q+1 return!0}}, $iL:1} -A.cL.prototype={ +A.cN.prototype={ gF(a){var s=this,r=new A.dL(s,s.r,A.x(s).h("dL<1>")) r.c=s.e return r}, gn(a){return this.a}, gN(a){return this.a===0}, -gaP(a){return this.a!==0}, +gaQ(a){return this.a!==0}, C(a,b){var s,r if(typeof b=="string"&&b!=="__proto__"){s=this.b if(s==null)return!1 return t.nF.a(s[b])!=null}else if(typeof b=="number"&&(b&1073741823)===b){r=this.c if(r==null)return!1 -return t.nF.a(r[b])!=null}else return this.kb(b)}, -kb(a){var s=this.d +return t.nF.a(r[b])!=null}else return this.kc(b)}, +kc(a){var s=this.d if(s==null)return!1 -return this.bG(s[this.bZ(a)],a)>=0}, +return this.bH(s[this.c_(a)],a)>=0}, l(a,b){var s,r,q=this A.x(q).c.a(b) if(typeof b=="string"&&b!=="__proto__"){s=q.b -return q.fX(s==null?q.b=A.qC():s,b)}else if(typeof b=="number"&&(b&1073741823)===b){r=q.c -return q.fX(r==null?q.c=A.qC():r,b)}else return q.de(b)}, -de(a){var s,r,q,p=this +return q.fY(s==null?q.b=A.qN():s,b)}else if(typeof b=="number"&&(b&1073741823)===b){r=q.c +return q.fY(r==null?q.c=A.qN():r,b)}else return q.di(b)}, +di(a){var s,r,q,p=this A.x(p).c.a(a) s=p.d -if(s==null)s=p.d=A.qC() -r=p.bZ(a) +if(s==null)s=p.d=A.qN() +r=p.c_(a) q=s[r] -if(q==null)s[r]=[p.eb(a)] -else{if(p.bG(q,a)>=0)return!1 -q.push(p.eb(a))}return!0}, -fX(a,b){A.x(this).c.a(b) +if(q==null)s[r]=[p.ef(a)] +else{if(p.bH(q,a)>=0)return!1 +q.push(p.ef(a))}return!0}, +fY(a,b){A.x(this).c.a(b) if(t.nF.a(a[b])!=null)return!1 -a[b]=this.eb(b) +a[b]=this.ef(b) return!0}, -eb(a){var s=this,r=new A.kP(A.x(s).c.a(a)) +ef(a){var s=this,r=new A.kP(A.x(s).c.a(a)) if(s.e==null)s.e=s.f=r else s.f=s.f.b=r;++s.a s.r=s.r+1&1073741823 return r}, -bZ(a){return J.B(a)&1073741823}, -bG(a,b){var s,r +c_(a){return J.C(a)&1073741823}, +bH(a,b){var s,r if(a==null)return-1 s=a.length -for(r=0;r"))}, +$S:98} +A.B.prototype={ +gF(a){return new A.N(a,this.gn(a),A.aW(a).h("N"))}, ag(a,b){return this.m(a,b)}, T(a,b){var s,r -A.b3(a).h("~(C.E)").a(b) +A.aW(a).h("~(B.E)").a(b) s=this.gn(a) for(r=0;r1)throw A.f(A.ru()) +gbn(a){if(this.gn(a)===0)throw A.f(A.ba()) +if(this.gn(a)>1)throw A.f(A.qc()) return this.m(a,0)}, C(a,b){var s,r=this.gn(a) -for(s=0;s").u(c).h("Q<1,2>"))}, -aX(a,b){return A.bX(a,b,null,A.b3(a).h("C.E"))}, -bk(a,b){return A.bX(a,0,A.dP(b,"count",t.S),A.b3(a).h("C.E"))}, +c9(a,b,c){var s=A.aW(a) +return new A.Q(a,s.u(c).h("1(B.E)").a(b),s.h("@").u(c).h("Q<1,2>"))}, +aX(a,b){return A.c_(a,b,null,A.aW(a).h("B.E"))}, +bk(a,b){return A.c_(a,0,A.dP(b,"count",t.S),A.aW(a).h("B.E"))}, +bT(a,b){var s,r,q,p,o=this +if(o.gN(a)){s=J.mO(0,A.aW(a).h("B.E")) +return s}r=o.m(a,0) +q=A.aB(o.gn(a),r,!1,A.aW(a).h("B.E")) +for(p=1;p").a(d) -A.cw(b,c,this.gn(a)) +A.aW(a).h("h").a(d) +A.cy(b,c,this.gn(a)) s=c-b if(s===0)return -A.aF(e,"skipCount") +A.aH(e,"skipCount") if(t.p.b(d)){r=e -q=d}else{q=J.lF(d,e).cz(0,!1) -r=0}p=J.ad(q) -if(r+s>p.gn(q))throw A.f(A.rt()) +q=d}else{q=J.lF(d,e).bT(0,!1) +r=0}p=J.ae(q) +if(r+s>p.gn(q))throw A.f(A.rE()) if(r=0;--o)this.k(a,b+o,p.m(q,r+o)) else for(o=0;o").u(c).h("dG<1,2>"))}} -A.fp.prototype={ +c4(a,b,c){return new A.dG(this.a.c4(0,b,c),b.h("@<0>").u(c).h("dG<1,2>"))}} +A.fr.prototype={ gF(a){var s=this -return new A.hf(s,s.c,s.d,s.b,s.$ti.h("hf<1>"))}, +return new A.hh(s,s.c,s.d,s.b,s.$ti.h("hh<1>"))}, gN(a){return this.b===this.c}, gn(a){return(this.c-this.b&this.a.length-1)>>>0}, ag(a,b){var s,r,q,p=this -A.vS(b,p.gn(0),p,null,null) +A.w2(b,p.gn(0),p,null,null) s=p.a r=s.length q=(p.b+b&r-1)>>>0 @@ -7649,8 +7666,8 @@ bc(a){var s=this,r=s.b if(r!==s.c){for(;r!==s.c;r=(r+1&s.a.length-1)>>>0)B.a.k(s.a,r,null) s.b=s.c=0;++s.d}}, j(a){return A.iT(this,"{","}")}, -iu(){var s,r,q=this,p=q.b -if(p===q.c)throw A.f(A.bi());++q.d +iv(){var s,r,q=this,p=q.b +if(p===q.c)throw A.f(A.ba());++q.d s=q.a if(!(p>>0 return r}, -de(a){var s,r,q,p,o=this,n=o.$ti +di(a){var s,r,q,p,o=this,n=o.$ti n.c.a(a) B.a.k(o.a,o.c,a) s=o.c r=o.a.length s=(s+1&r-1)>>>0 o.c=s -if(o.b===s){q=A.aE(r*2,null,!1,n.h("1?")) +if(o.b===s){q=A.aB(r*2,null,!1,n.h("1?")) n=o.a s=o.b p=n.length-s @@ -7674,12 +7691,12 @@ B.a.bb(q,p,p+o.b,o.a,0) o.b=0 o.c=o.a.length o.a=q}++o.d}, -$iwH:1} -A.hf.prototype={ +$iwR:1} +A.hh.prototype={ gB(){var s=this.e return s==null?this.$ti.c.a(s):s}, p(){var s,r,q=this,p=q.a -if(q.c!==p.d)A.P(A.ai(p)) +if(q.c!==p.d)A.M(A.ai(p)) s=q.d if(s===q.b){q.e=null return!1}p=p.a @@ -7689,72 +7706,72 @@ q.e=p[s] q.d=(s+1&r-1)>>>0 return!0}, $iL:1} -A.aY.prototype={ +A.b2.prototype={ gN(a){return this.gn(this)===0}, -gaP(a){return this.gn(this)!==0}, +gaQ(a){return this.gn(this)!==0}, j(a){return A.iT(this,"{","}")}, -aq(a,b){var s,r,q=this.gF(this) +ar(a,b){var s,r,q=this.gF(this) if(!q.p())return"" -s=J.ay(q.gB()) +s=J.ao(q.gB()) if(!q.p())return s if(b.length===0){r=s do r+=A.k(q.gB()) while(q.p())}else{r=s do r=r+b+A.k(q.gB()) while(q.p())}return r.charCodeAt(0)==0?r:r}, -bk(a,b){return A.rZ(this,b,A.x(this).h("aY.E"))}, -aX(a,b){return A.rX(this,b,A.x(this).h("aY.E"))}, +bk(a,b){return A.t8(this,b,A.x(this).h("b2.E"))}, +aX(a,b){return A.t6(this,b,A.x(this).h("b2.E"))}, ag(a,b){var s,r -A.aF(b,"index") +A.aH(b,"index") s=this.gF(this) for(r=b;s.p();){if(r===0)return s.gB();--r}throw A.f(A.iM(b,b-r,this,null,"index"))}, $iz:1, $ih:1, $ibk:1} -A.hp.prototype={} +A.hr.prototype={} A.eC.prototype={} -A.p3.prototype={ +A.pb.prototype={ $0(){var s,r try{s=new TextDecoder("utf-8",{fatal:true}) return s}catch(r){}return null}, -$S:25} -A.p2.prototype={ +$S:36} +A.pa.prototype={ $0(){var s,r try{s=new TextDecoder("utf-8",{fatal:false}) return s}catch(r){}return null}, -$S:25} -A.hS.prototype={ +$S:36} +A.hU.prototype={ b0(a){var s t.L.a(a) -s=B.i_.bL(a) +s=B.i_.bM(a) return s}} A.kY.prototype={ -bL(a){var s,r,q,p,o +bM(a){var s,r,q,p,o t.L.a(a) -s=J.ad(a) -r=A.cw(0,null,s.gn(a)) +s=J.ae(a) +r=A.cy(0,null,s.gn(a)) for(q=~this.b,p=0;p>>0!==0){if(!this.a)throw A.f(A.aD("Invalid value in input: "+o,null,null)) -return this.kc(a,0,r)}}return A.aA(a,0,r)}, -kc(a,b,c){var s,r,q,p,o +if((o&q)>>>0!==0){if(!this.a)throw A.f(A.aq("Invalid value in input: "+o,null,null)) +return this.kd(a,0,r)}}return A.aD(a,0,r)}, +kd(a,b,c){var s,r,q,p,o t.L.a(a) -for(s=~this.b,r=J.ad(a),q=b,p="";q>>0!==0?65533:o)}return p.charCodeAt(0)==0?p:p}} -A.hT.prototype={} +for(s=~this.b,r=J.ae(a),q=b,p="";q>>0!==0?65533:o)}return p.charCodeAt(0)==0?p:p}} +A.hV.prototype={} A.eL.prototype={ -geO(){return B.ie}, -nA(a3,a4,a5){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0=u.A,a1="Invalid base64 encoding length ",a2=a3.length -a5=A.cw(a4,a5,a2) -s=$.v3() +geS(){return B.ie}, +nC(a3,a4,a5){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0=u.A,a1="Invalid base64 encoding length ",a2=a3.length +a5=A.cy(a4,a5,a2) +s=$.vf() for(r=s.length,q=a4,p=q,o=null,n=-1,m=-1,l=0;q=0)A.re(a3,m,a5,n,l,r) +if(n>=0)A.rp(a3,m,a5,n,l,r) else{b=B.f.bl(r-1,4)+1 -if(b===1)throw A.f(A.aD(a1,a3,a5)) +if(b===1)throw A.f(A.aq(a1,a3,a5)) while(b<4){a2+="=" o.a=a2;++b}}a2=o.a -return B.b.bR(a3,a4,a5,a2.charCodeAt(0)==0?a2:a2)}a=a5-a4 -if(n>=0)A.re(a3,m,a5,n,l,a) +return B.b.bS(a3,a4,a5,a2.charCodeAt(0)==0?a2:a2)}a=a5-a4 +if(n>=0)A.rp(a3,m,a5,n,l,a) else{b=B.f.bl(a,4) -if(b===1)throw A.f(A.aD(a1,a3,a5)) -if(b>1)a3=B.b.bR(a3,a5,a5,b===2?"==":"=")}return a3}} -A.hX.prototype={ -bL(a){var s +if(b===1)throw A.f(A.aq(a1,a3,a5)) +if(b>1)a3=B.b.bS(a3,a5,a5,b===2?"==":"=")}return a3}} +A.hZ.prototype={ +bM(a){var s t.L.a(a) -s=J.ad(a) +s=J.ae(a) if(s.gN(a))return"" -s=new A.oy(u.A).mS(a,0,s.gn(a),!0) +s=new A.oF(u.A).mU(a,0,s.gn(a),!0) s.toString -return A.aA(s,0,null)}} -A.oy.prototype={ -mS(a,b,c,d){var s,r,q,p,o +return A.aD(s,0,null)}} +A.oF.prototype={ +mU(a,b,c,d){var s,r,q,p,o t.L.a(a) s=this.a r=(s&3)+(c-b) -q=B.f.av(r,3) +q=B.f.aw(r,3) p=q*4 if(r-q*3>0)p+=4 o=new Uint8Array(p) -this.a=A.x7(this.b,a,b,c,!0,o,0,s) +this.a=A.xh(this.b,a,b,c,!0,o,0,s) if(p>0)return o return null}} A.bt.prototype={} -A.cl.prototype={} +A.cn.prototype={} A.ic.prototype={} -A.fl.prototype={ -j(a){var s=A.dm(this.a) +A.fn.prototype={ +j(a){var s=A.dn(this.a) return(this.b!=null?"Converting object to an encodable object failed:":"Converting object did not return an encodable object:")+" "+s}} A.iZ.prototype={ j(a){return"Cyclic error in JSON stringify"}} A.iY.prototype={ -mR(a,b){var s=A.xi(a,this.geO().b,null) +mT(a,b){var s=A.xs(a,this.geS().b,null) return s}, -geO(){return B.iR}} +geS(){return B.iR}} A.j_.prototype={} -A.oS.prototype={ -iM(a){var s,r,q,p,o,n,m=a.length +A.p_.prototype={ +iN(a){var s,r,q,p,o,n,m=a.length for(s=this.c,r=0,q=0;q92){if(p>=55296){o=p&64512 if(o===55296){n=q+1 @@ -7830,70 +7847,70 @@ o=!(o>=0&&(a.charCodeAt(o)&64512)===55296)}else o=!1 else o=!0 if(o){if(q>r)s.a+=B.b.t(a,r,q) r=q+1 -o=A.a4(92) +o=A.a5(92) s.a+=o -o=A.a4(117) +o=A.a5(117) s.a+=o -o=A.a4(100) +o=A.a5(100) s.a+=o o=p>>>8&15 -o=A.a4(o<10?48+o:87+o) +o=A.a5(o<10?48+o:87+o) s.a+=o o=p>>>4&15 -o=A.a4(o<10?48+o:87+o) +o=A.a5(o<10?48+o:87+o) s.a+=o o=p&15 -o=A.a4(o<10?48+o:87+o) +o=A.a5(o<10?48+o:87+o) s.a+=o}}continue}if(p<32){if(q>r)s.a+=B.b.t(a,r,q) r=q+1 -o=A.a4(92) +o=A.a5(92) s.a+=o -switch(p){case 8:o=A.a4(98) +switch(p){case 8:o=A.a5(98) s.a+=o break -case 9:o=A.a4(116) +case 9:o=A.a5(116) s.a+=o break -case 10:o=A.a4(110) +case 10:o=A.a5(110) s.a+=o break -case 12:o=A.a4(102) +case 12:o=A.a5(102) s.a+=o break -case 13:o=A.a4(114) +case 13:o=A.a5(114) s.a+=o break -default:o=A.a4(117) +default:o=A.a5(117) s.a+=o -o=A.a4(48) +o=A.a5(48) s.a=(s.a+=o)+o o=p>>>4&15 -o=A.a4(o<10?48+o:87+o) +o=A.a5(o<10?48+o:87+o) s.a+=o o=p&15 -o=A.a4(o<10?48+o:87+o) +o=A.a5(o<10?48+o:87+o) s.a+=o break}}else if(p===34||p===92){if(q>r)s.a+=B.b.t(a,r,q) r=q+1 -o=A.a4(92) +o=A.a5(92) s.a+=o -o=A.a4(p) +o=A.a5(p) s.a+=o}}if(r===0)s.a+=a else if(r=q.length)return A.c(q,-1) -q.pop()}catch(p){r=A.bP(p) -q=A.rz(a,r,o.ghk()) +q.pop()}catch(p){r=A.bQ(p) +q=A.rJ(a,r,o.ghl()) throw A.f(q)}}, -iL(a){var s,r,q=this +iM(a){var s,r,q=this if(typeof a=="number"){if(!isFinite(a))return!1 q.c.a+=B.cV.j(a) return!0}else if(a===!0){q.c.a+="true" @@ -7901,82 +7918,82 @@ return!0}else if(a===!1){q.c.a+="false" return!0}else if(a==null){q.c.a+="null" return!0}else if(typeof a=="string"){s=q.c s.a+='"' -q.iM(a) +q.iN(a) s.a+='"' -return!0}else if(t.p.b(a)){q.ea(a) -q.ow(a) +return!0}else if(t.p.b(a)){q.ee(a) +q.oz(a) s=q.a if(0>=s.length)return A.c(s,-1) s.pop() -return!0}else if(t.av.b(a)){q.ea(a) -r=q.ox(a) +return!0}else if(t.av.b(a)){q.ee(a) +r=q.oA(a) s=q.a if(0>=s.length)return A.c(s,-1) s.pop() return r}else return!1}, -ow(a){var s,r,q=this.c +oz(a){var s,r,q=this.c q.a+="[" -s=J.ad(a) -if(s.gaP(a)){this.dY(s.m(a,0)) +s=J.ae(a) +if(s.gaQ(a)){this.e1(s.m(a,0)) for(r=1;r=15){o=l.a -n=A.xI(o,q,b,s) +n=A.xS(o,q,b,s) if(n!=null){if(!o)return n -if(n.indexOf("\ufffd")<0)return n}}n=l.ee(q,b,s,!0) +if(n.indexOf("\ufffd")<0)return n}}n=l.ei(q,b,s,!0) o=l.b -if((o&1)!==0){m=A.xK(o) +if((o&1)!==0){m=A.xU(o) l.b=0 -throw A.f(A.aD(m,a,p+l.c))}return n}, -ee(a,b,c,d){var s,r,q=this -if(c-b>1000){s=B.f.av(b+c,2) -r=q.ee(a,b,s,!1) +throw A.f(A.aq(m,a,p+l.c))}return n}, +ei(a,b,c,d){var s,r,q=this +if(c-b>1000){s=B.f.aw(b+c,2) +r=q.ei(a,b,s,!1) if((q.b&1)!==0)return r -return r+q.ee(a,s,c,d)}return q.mj(a,b,c,d)}, -mj(a,b,a0,a1){var s,r,q,p,o,n,m,l,k=this,j="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFFFFFFFFFFFFFFFGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHHIHHHJEEBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBKCCCCCCCCCCCCDCLONNNMEEEEEEEEEEE",i=" \x000:XECCCCCN:lDb \x000:XECCCCCNvlDb \x000:XECCCCCN:lDb AAAAA\x00\x00\x00\x00\x00AAAAA00000AAAAA:::::AAAAAGG000AAAAA00KKKAAAAAG::::AAAAA:IIIIAAAAA000\x800AAAAA\x00\x00\x00\x00 AAAAA",h=65533,g=k.b,f=k.c,e=new A.Y(""),d=b+1,c=a.length +return r+q.ei(a,s,c,d)}return q.ml(a,b,c,d)}, +ml(a,b,a0,a1){var s,r,q,p,o,n,m,l,k=this,j="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFFFFFFFFFFFFFFFGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHHIHHHJEEBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBKCCCCCCCCCCCCDCLONNNMEEEEEEEEEEE",i=" \x000:XECCCCCN:lDb \x000:XECCCCCNvlDb \x000:XECCCCCN:lDb AAAAA\x00\x00\x00\x00\x00AAAAA00000AAAAA:::::AAAAAGG000AAAAA00KKKAAAAAG::::AAAAA:IIIIAAAAA000\x800AAAAA\x00\x00\x00\x00 AAAAA",h=65533,g=k.b,f=k.c,e=new A.X(""),d=b+1,c=a.length if(!(b>=0&&b=0&&s<256))return A.c(j,s) @@ -7985,16 +8002,16 @@ f=g<=32?s&61694>>>q:(s&63|f<<6)>>>0 p=g+q if(!(p>=0&&p<144))return A.c(i,p) g=i.charCodeAt(p) -if(g===0){p=A.a4(f) +if(g===0){p=A.a5(f) e.a+=p if(d===a0)break A -break}else if((g&1)!==0){if(r)switch(g){case 69:case 67:p=A.a4(h) +break}else if((g&1)!==0){if(r)switch(g){case 69:case 67:p=A.a5(h) e.a+=p break -case 65:p=A.a4(h) +case 65:p=A.a5(h) e.a+=p;--d break -default:p=A.a4(h) +default:p=A.a5(h) e.a=(e.a+=p)+p break}else{k.b=g k.c=d-1 @@ -8011,25 +8028,25 @@ s=a[o] if(s>=128){n=m-1 o=m break}o=m}if(n-d<20)for(l=d;l32)if(r){c=A.a4(h) +d=o}else d=o}if(a1&&g>32)if(r){c=A.a5(h) e.a+=c}else{k.b=77 k.c=a0 return""}k.b=g k.c=f c=e.a return c.charCodeAt(0)==0?c:c}} -A.aq.prototype={ -bT(a){var s,r,q=this,p=q.c +A.as.prototype={ +bV(a){var s,r,q=this,p=q.c if(p===0)return q s=!q.a r=q.b -p=A.b1(p,r) -return new A.aq(p===0?!1:s,r,p)}, -kj(a){var s,r,q,p,o,n,m,l=this.c -if(l===0)return $.c8() +p=A.b4(p,r) +return new A.as(p===0?!1:s,r,p)}, +kk(a){var s,r,q,p,o,n,m,l=this.c +if(l===0)return $.cb() s=l+a r=this.b q=new Uint16Array(s) @@ -8038,12 +8055,12 @@ if(!(p=0&&n=0&&o=0&&r=0&&qj?k:j,h=this.b,g=a.b,f=new Uint16Array(i) +k[q]=r}s=A.b4(n,k) +return new A.as(!1,k,s)}, +k0(a,b){var s,r,q,p,o,n,m,l,k=this.c,j=a.c,i=k>j?k:j,h=this.b,g=a.b,f=new Uint16Array(i) if(k=0&&o=0)return q.bY(b,r) -return b.bY(q,!r)}, -e6(a,b){var s,r,q=this,p=q.c -if(p===0)return b.bT(0) +if(r===b.a)return q.dh(b,r) +if(A.oG(q.b,p,b.b,s)>=0)return q.bZ(b,r) +return b.bZ(q,!r)}, +ea(a,b){var s,r,q=this,p=q.c +if(p===0)return b.bV(0) s=b.c if(s===0)return q r=q.a -if(r!==b.a)return q.dd(b,r) -if(A.oz(q.b,p,b.b,s)>=0)return q.bY(b,r) -return b.bY(q,!r)}, +if(r!==b.a)return q.dh(b,r) +if(A.oG(q.b,p,b.b,s)>=0)return q.bZ(b,r) +return b.bZ(q,!r)}, b2(a,b){var s,r,q,p,o,n,m,l=this.c,k=b.c -if(l===0||k===0)return $.c8() +if(l===0||k===0)return $.cb() s=l+k r=this.b q=b.b p=new Uint16Array(s) for(o=q.length,n=0;n0?p.bT(0):p}, -kQ(a){var s,r,q,p=this +A.tA(q[n],r,0,p,n,l);++n}o=this.a!==b.a +m=A.b4(s,p) +return new A.as(m===0?!1:o,p,m)}, +kj(a){var s,r,q,p +if(this.c0?p.bV(0):p}, +kR(a){var s,r,q,p=this if(p.c0)q=q.e5(0,$.qu.aY()) -return p.a&&q.c>0?q.bT(0):q}, -h5(a){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c=this,b=c.c -if(b===$.tm&&a.c===$.to&&c.b===$.tl&&a.b===$.tn)return +p.h6(a) +s=A.qG($.qD.aY(),0,$.hb.aY(),$.hb.aY()) +r=A.b4($.hb.aY(),s) +q=new A.as(!1,s,r) +if($.qF.aY()>0)q=q.e9(0,$.qF.aY()) +return p.a&&q.c>0?q.bV(0):q}, +h6(a){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c=this,b=c.c +if(b===$.tw&&a.c===$.ty&&c.b===$.tv&&a.b===$.tx)return s=a.b r=a.c q=r-1 if(!(q>=0&&q0){o=new Uint16Array(r+5) -n=A.tk(s,r,p,o) +n=A.tu(s,r,p,o) m=new Uint16Array(b+5) -l=A.tk(c.b,b,p,m)}else{m=A.qv(c.b,0,b,b+2) +l=A.tu(c.b,b,p,m)}else{m=A.qG(c.b,0,b,b+2) n=r o=s l=b}q=n-1 @@ -8215,10 +8232,10 @@ if(!(q>=0&&q=0){q&2&&A.t(m) +if(A.oG(m,l,i,h)>=0){q&2&&A.t(m) if(!(l>=0&&l=0&&n0;){d=A.xa(k,m,e);--j -A.tq(d,f,0,m,j,n) +for(q=m.length;j>0;){d=A.xk(k,m,e);--j +A.tA(d,f,0,m,j,n) if(!(e>=0&&e=0;--s){if(!(s=m.length)return A.c(m,0) return B.f.j(m[0])}s=A.i([],t.s) m=n.a -r=m?n.bT(0):n -while(r.c>1){q=$.v4() -if(q.c===0)A.P(B.ii) -p=r.kQ(q).j(0) +r=m?n.bV(0):n +while(r.c>1){q=$.vg() +if(q.c===0)A.M(B.ii) +p=r.kR(q).j(0) B.a.l(s,p) o=p.length if(o===1)B.a.l(s,"000") if(o===2)B.a.l(s,"00") if(o===3)B.a.l(s,"0") -r=r.ki(q)}q=r.b +r=r.kj(q)}q=r.b if(0>=q.length)return A.c(q,0) B.a.l(s,B.f.j(q[0])) if(m)B.a.l(s,"-") -return new A.X(s,t.hF).aQ(0)}, -$ii_:1, -$ia6:1} -A.oA.prototype={ +return new A.Y(s,t.hF).aR(0)}, +$ii1:1, +$ia7:1} +A.oH.prototype={ $2(a,b){a=a+b&536870911 a=a+((a&524287)<<10)&536870911 return a^a>>>6}, -$S:87} -A.oB.prototype={ +$S:96} +A.oI.prototype={ $1(a){a=a+((a&67108863)<<3)&536870911 a^=a>>>11 return a+((a&16383)<<15)&536870911}, -$S:26} -A.n7.prototype={ +$S:31} +A.nd.prototype={ $2(a,b){var s,r,q t.bR.a(a) s=this.b @@ -8294,92 +8311,92 @@ r=this.a q=(s.a+=r.a)+a.a s.a=q s.a=q+": " -q=A.dm(b) +q=A.dn(b) s.a+=q r.a=", "}, -$S:42} -A.dh.prototype={ +$S:62} +A.di.prototype={ v(a,b){if(b==null)return!1 -return b instanceof A.dh&&this.a===b.a&&this.b===b.b&&this.c===b.c}, -gq(a){return A.aX(this.a,this.b,B.u,B.u)}, +return b instanceof A.di&&this.a===b.a&&this.b===b.b&&this.c===b.c}, +gq(a){return A.b1(this.a,this.b,B.u,B.u)}, ai(a,b){var s t.cs.a(b) s=B.f.ai(this.a,b.a) if(s!==0)return s return B.f.ai(this.b,b.b)}, -j(a){var s=this,r=A.vH(A.wE(s)),q=A.i8(A.wC(s)),p=A.i8(A.wy(s)),o=A.i8(A.wz(s)),n=A.i8(A.wB(s)),m=A.i8(A.wD(s)),l=A.rn(A.wA(s)),k=s.b,j=k===0?"":A.rn(k) +j(a){var s=this,r=A.vS(A.wO(s)),q=A.i9(A.wM(s)),p=A.i9(A.wI(s)),o=A.i9(A.wJ(s)),n=A.i9(A.wL(s)),m=A.i9(A.wN(s)),l=A.ry(A.wK(s)),k=s.b,j=k===0?"":A.ry(k) k=r+"-"+q if(s.c)return k+"-"+p+" "+o+":"+n+":"+m+"."+l+j+"Z" else return k+"-"+p+" "+o+":"+n+":"+m+"."+l+j}, -$ia6:1} -A.oE.prototype={ -j(a){return this.bn()}} -A.a0.prototype={ -gcf(){return A.wx(this)}} -A.hU.prototype={ +$ia7:1} +A.oM.prototype={ +j(a){return this.bo()}} +A.a1.prototype={ +gcg(){return A.wH(this)}} +A.hW.prototype={ j(a){var s=this.a -if(s!=null)return"Assertion failed: "+A.dm(s) +if(s!=null)return"Assertion failed: "+A.dn(s) return"Assertion failed"}} -A.cC.prototype={} -A.bR.prototype={ -gei(){return"Invalid argument"+(!this.a?"(s)":"")}, -geh(){return""}, -j(a){var s=this,r=s.c,q=r==null?"":" ("+r+")",p=s.d,o=p==null?"":": "+A.k(p),n=s.gei()+q+o +A.cE.prototype={} +A.bS.prototype={ +gem(){return"Invalid argument"+(!this.a?"(s)":"")}, +gel(){return""}, +j(a){var s=this,r=s.c,q=r==null?"":" ("+r+")",p=s.d,o=p==null?"":": "+A.k(p),n=s.gem()+q+o if(!s.a)return n -return n+s.geh()+": "+A.dm(s.geZ())}, -geZ(){return this.b}} +return n+s.gel()+": "+A.dn(s.gf2())}, +gf2(){return this.b}} A.ef.prototype={ -geZ(){return A.tX(this.b)}, -gei(){return"RangeError"}, -geh(){var s,r=this.e,q=this.f +gf2(){return A.u6(this.b)}, +gem(){return"RangeError"}, +gel(){var s,r=this.e,q=this.f if(r==null)s=q!=null?": Not less than or equal to "+A.k(q):"" else if(q==null)s=": Not greater than or equal to "+A.k(r) else if(q>r)s=": Not in inclusive range "+A.k(r)+".."+A.k(q) else s=qe.length else s=!1 @@ -8406,85 +8423,85 @@ i=p k=""}return g+l+B.b.t(e,i,j)+k+"\n"+B.b.b2(" ",f-i+l.length)+"^\n"}else return f!=null?g+(" (at offset "+A.k(f)+")"):g}, $iaj:1} A.iR.prototype={ -gcf(){return null}, +gcg(){return null}, j(a){return"IntegerDivisionByZeroException"}, -$ia0:1, +$ia1:1, $iaj:1} A.h.prototype={ -c8(a,b,c){var s=A.x(this) -return A.rE(this,s.u(c).h("1(h.E)").a(b),s.h("h.E"),c)}, -os(a,b){var s=A.x(this) -return new A.b_(this,s.h("A(h.E)").a(b),s.h("b_"))}, -iG(a,b){return new A.O(this,b.h("O<0>"))}, +c9(a,b,c){var s=A.x(this) +return A.rO(this,s.u(c).h("1(h.E)").a(b),s.h("h.E"),c)}, +ov(a,b){var s=A.x(this) +return new A.aE(this,s.h("A(h.E)").a(b),s.h("aE"))}, +iH(a,b){return new A.P(this,b.h("P<0>"))}, C(a,b){var s -for(s=this.gF(this);s.p();)if(J.N(s.gB(),b))return!0 +for(s=this.gF(this);s.p();)if(J.O(s.gB(),b))return!0 return!1}, T(a,b){var s A.x(this).h("~(h.E)").a(b) for(s=this.gF(this);s.p();)b.$1(s.gB())}, -cQ(a,b,c,d){var s,r +cS(a,b,c,d){var s,r d.a(b) A.x(this).u(d).h("1(1,h.E)").a(c) for(s=this.gF(this),r=b;s.p();)r=c.$2(r,s.gB()) return r}, -aq(a,b){var s,r,q=this.gF(this) +ar(a,b){var s,r,q=this.gF(this) if(!q.p())return"" -s=J.ay(q.gB()) +s=J.ao(q.gB()) if(!q.p())return s if(b.length===0){r=s -do r+=J.ay(q.gB()) +do r+=J.ao(q.gB()) while(q.p())}else{r=s -do r=r+b+J.ay(q.gB()) +do r=r+b+J.ao(q.gB()) while(q.p())}return r.charCodeAt(0)==0?r:r}, -aQ(a){return this.aq(0,"")}, -aH(a,b){var s +aR(a){return this.ar(0,"")}, +aC(a,b){var s A.x(this).h("A(h.E)").a(b) for(s=this.gF(this);s.p();)if(b.$1(s.gB()))return!0 return!1}, -cz(a,b){var s=A.x(this).h("h.E") -if(b)s=A.a7(this,s) -else{s=A.a7(this,s) +bT(a,b){var s=A.x(this).h("h.E") +if(b)s=A.a8(this,s) +else{s=A.a8(this,s) s.$flags=1 s=s}return s}, -iB(a){return this.cz(0,!0)}, +iC(a){return this.bT(0,!0)}, gn(a){var s,r=this.gF(this) for(s=0;r.p();)++s return s}, gN(a){return!this.gF(this).p()}, -gaP(a){return!this.gN(this)}, -bk(a,b){return A.rZ(this,b,A.x(this).h("h.E"))}, -aX(a,b){return A.rX(this,b,A.x(this).h("h.E"))}, -gbU(a){var s,r=this.gF(this) -if(!r.p())throw A.f(A.bi()) +gaQ(a){return!this.gN(this)}, +bk(a,b){return A.t8(this,b,A.x(this).h("h.E"))}, +aX(a,b){return A.t6(this,b,A.x(this).h("h.E"))}, +gbn(a){var s,r=this.gF(this) +if(!r.p())throw A.f(A.ba()) s=r.gB() -if(r.p())throw A.f(A.ru()) +if(r.p())throw A.f(A.qc()) return s}, -cq(a,b,c){var s,r +cs(a,b,c){var s,r A.x(this).h("A(h.E)").a(b) for(s=this.gF(this);s.p();){r=s.gB() -if(b.$1(r))return r}throw A.f(A.bi())}, -cp(a,b){return this.cq(0,b,null)}, +if(b.$1(r))return r}throw A.f(A.ba())}, +cr(a,b){return this.cs(0,b,null)}, ag(a,b){var s,r -A.aF(b,"index") +A.aH(b,"index") s=this.gF(this) for(r=b;s.p();){if(r===0)return s.gB();--r}throw A.f(A.iM(b,b-r,this,null,"index"))}, -j(a){return A.vW(this,"(",")")}} -A.b0.prototype={ +j(a){return A.w5(this,"(",")")}} +A.aC.prototype={ j(a){return"MapEntry("+A.k(this.a)+": "+A.k(this.b)+")"}} -A.aK.prototype={ +A.aN.prototype={ gq(a){return A.p.prototype.gq.call(this,0)}, j(a){return"null"}} A.p.prototype={$ip:1, v(a,b){return this===b}, gq(a){return A.dy(this)}, j(a){return"Instance of '"+A.jC(this)+"'"}, -ij(a,b){throw A.f(A.n6(this,t.bg.a(b)))}, -gaz(a){return A.cN(this)}, +ik(a,b){throw A.f(A.nc(this,t.bg.a(b)))}, +gaA(a){return A.cP(this)}, toString(){return this.j(this)}} A.kW.prototype={ j(a){return""}, -$id1:1} -A.bV.prototype={ +$id2:1} +A.bX.prototype={ gF(a){return new A.jJ(this.a)}} A.jJ.prototype={ gB(){return this.d}, @@ -8496,23 +8513,23 @@ r=o+1 if((s&64512)===55296&&r=r)return A.c(s,0) r=s.charCodeAt(0)===47}else r=!1 if(r)s=B.b.ab(s,1) -q=s.length===0?B.j6:A.rC(new A.Q(A.i(s.split("/"),t.s),t.f6.a(A.yS()),t.iZ),t.N) -p.x!==$&&A.dc() +q=s.length===0?B.j6:A.rM(new A.Q(A.i(s.split("/"),t.s),t.f6.a(A.z0()),t.iZ),t.N) +p.x!==$&&A.dd() o=p.x=q}return o}, gq(a){var s,r=this,q=r.y -if(q===$){s=B.b.gq(r.ght()) -r.y!==$&&A.dc() +if(q===$){s=B.b.gq(r.ghu()) +r.y!==$&&A.dd() r.y=s q=s}return q}, -gfg(){return this.b}, -gc6(){var s=this.c +gfh(){return this.b}, +gc7(){var s=this.c if(s==null)return"" if(B.b.U(s,"[")&&!B.b.aa(s,"v",1))return B.b.t(s,1,s.length-1) return s}, -gcZ(){var s=this.d -return s==null?A.tH(this.a):s}, -gd_(){var s=this.f +gd0(){var s=this.d +return s==null?A.tR(this.a):s}, +gd1(){var s=this.f return s==null?"":s}, -gcR(){var s=this.r +gcT(){var s=this.r return s==null?"":s}, -ni(a){var s=this.a +nk(a){var s=this.a if(a.length!==s.length)return!1 -return A.xS(a,s,0)>=0}, -iw(a){var s,r,q,p,o,n,m,l=this -a=A.qG(a,0,a.length) +return A.y1(a,s,0)>=0}, +ix(a){var s,r,q,p,o,n,m,l=this +a=A.qR(a,0,a.length) s=a==="file" r=l.b q=l.d -if(a!==l.a)q=A.p1(q,a) +if(a!==l.a)q=A.p9(q,a) p=l.c if(!(p!=null))p=r.length!==0||q!=null||s?"":null o=l.e @@ -8570,12 +8587,12 @@ if(!s)n=p!=null&&o.length!==0 else n=!0 if(n&&!B.b.U(o,"/"))o="/"+o m=o -return A.hx(a,r,p,q,m,l.f,l.r)}, -hg(a,b){var s,r,q,p,o,n,m,l,k -for(s=0,r=0;B.b.aa(b,"../",r);){r+=3;++s}q=B.b.cU(a,"/") +return A.hz(a,r,p,q,m,l.f,l.r)}, +hh(a,b){var s,r,q,p,o,n,m,l,k +for(s=0,r=0;B.b.aa(b,"../",r);){r+=3;++s}q=B.b.cW(a,"/") p=a.length for(;;){if(!(q>0&&s>0))break -o=B.b.dO(a,"/",q-1) +o=B.b.dQ(a,"/",q-1) if(o<0)break n=q-o m=n!==2 @@ -8587,86 +8604,86 @@ if(!(m0){k=B.b.t(n,0,l) -n=a.geS()?k+A.dN(a.gaT()):k+A.dN(h.hg(B.b.ab(n,k.length),a.gaT()))}else if(a.geS())n=A.dN(a.gaT()) +n=a.geW()?k+A.dN(a.gaT()):k+A.dN(h.hh(B.b.ab(n,k.length),a.gaT()))}else if(a.geW())n=A.dN(a.gaT()) else if(n.length===0)if(p==null)n=s.length===0?a.gaT():A.dN(a.gaT()) else n=A.dN("/"+a.gaT()) -else{j=h.hg(n,a.gaT()) +else{j=h.hh(n,a.gaT()) r=s.length===0 if(!r||p!=null||B.b.U(n,"/"))n=A.dN(j) -else n=A.qI(j,!r||p!=null)}m=a.gdL()?a.gd_():null}}}i=a.gdK()?a.gcR():null -return A.hx(s,q,p,o,n,m,i)}, -geV(){return this.a.length!==0}, -geT(){return this.c!=null}, -gdL(){return this.f!=null}, -gdK(){return this.r!=null}, -gi9(){return this.e.length===0}, -geS(){return B.b.U(this.e,"/")}, -ff(){var s,r=this,q=r.a -if(q!==""&&q!=="file")throw A.f(A.ac("Cannot extract a file path from a "+q+" URI")) +else n=A.qT(j,!r||p!=null)}m=a.gdN()?a.gd1():null}}}i=a.gdM()?a.gcT():null +return A.hz(s,q,p,o,n,m,i)}, +geZ(){return this.a.length!==0}, +geX(){return this.c!=null}, +gdN(){return this.f!=null}, +gdM(){return this.r!=null}, +gia(){return this.e.length===0}, +geW(){return B.b.U(this.e,"/")}, +fg(){var s,r=this,q=r.a +if(q!==""&&q!=="file")throw A.f(A.a6("Cannot extract a file path from a "+q+" URI")) q=r.f -if((q==null?"":q)!=="")throw A.f(A.ac(u.z)) +if((q==null?"":q)!=="")throw A.f(A.a6(u.z)) q=r.r -if((q==null?"":q)!=="")throw A.f(A.ac(u.E)) -if(r.c!=null&&r.gc6()!=="")A.P(A.ac(u.Q)) -s=r.gnG() -A.xC(s,!1) -q=A.qj(B.b.U(r.e,"/")?"/":"",s,"/") +if((q==null?"":q)!=="")throw A.f(A.a6(u.E)) +if(r.c!=null&&r.gc7()!=="")A.M(A.a6(u.Q)) +s=r.gnI() +A.xM(s,!1) +q=A.qu(B.b.U(r.e,"/")?"/":"",s,"/") q=q.charCodeAt(0)==0?q:q return q}, -j(a){return this.ght()}, +j(a){return this.ghu()}, v(a,b){var s,r,q,p=this if(b==null)return!1 if(p===b)return!0 s=!1 -if(t.jJ.b(b))if(p.a===b.gaV())if(p.c!=null===b.geT())if(p.b===b.gfg())if(p.gc6()===b.gc6())if(p.gcZ()===b.gcZ())if(p.e===b.gaT()){r=p.f +if(t.jJ.b(b))if(p.a===b.gaV())if(p.c!=null===b.geX())if(p.b===b.gfh())if(p.gc7()===b.gc7())if(p.gd0()===b.gd0())if(p.e===b.gaT()){r=p.f q=r==null -if(!q===b.gdL()){if(q)r="" -if(r===b.gd_()){r=p.r +if(!q===b.gdN()){if(q)r="" +if(r===b.gd1()){r=p.r q=r==null -if(!q===b.gdK()){s=q?"":r -s=s===b.gcR()}}}}return s}, +if(!q===b.gdM()){s=q?"":r +s=s===b.gcT()}}}}return s}, $ik1:1, gaV(){return this.a}, gaT(){return this.e}} -A.nS.prototype={ -giD(){var s,r,q,p,o=this,n=null,m=o.c +A.nZ.prototype={ +giE(){var s,r,q,p,o=this,n=null,m=o.c if(m==null){m=o.b if(0>=m.length)return A.c(m,0) s=o.a m=m[0]+1 r=B.b.ap(s,"?",m) q=s.length -if(r>=0){p=A.hy(s,r+1,q,256,!1,!1) +if(r>=0){p=A.hA(s,r+1,q,256,!1,!1) q=r}else p=n -m=o.c=new A.kE("data","",n,n,A.hy(s,m,q,128,!1,!1),p,n)}return m}, +m=o.c=new A.kE("data","",n,n,A.hA(s,m,q,128,!1,!1),p,n)}return m}, j(a){var s,r=this.b if(0>=r.length)return A.c(r,0) s=this.a return r[0]===-1?"data:"+s:s}} -A.bN.prototype={ -geV(){return this.b>0}, -geT(){return this.c>0}, -geU(){return this.c>0&&this.d+10}, +geX(){return this.c>0}, +geY(){return this.c>0&&this.d+1r?B.b.t(this.a,r,s-1):""}, -gc6(){var s=this.c +gc7(){var s=this.c return s>0?B.b.t(this.a,s,this.d):""}, -gcZ(){var s,r=this -if(r.geU())return A.lA(B.b.t(r.a,r.d+1,r.e),null) +gd0(){var s,r=this +if(r.geY())return A.lA(B.b.t(r.a,r.d+1,r.e),null) s=r.b if(s===4&&B.b.U(r.a,"http"))return 80 if(s===5&&B.b.U(r.a,"https"))return 443 return 0}, gaT(){return B.b.t(this.a,this.e,this.f)}, -gd_(){var s=this.f,r=this.r +gd1(){var s=this.f,r=this.r return s=q.length)return s -return new A.bN(B.b.t(q,0,r),s.b,s.c,s.d,s.e,s.f,r,s.w)}, -iw(a){var s,r,q,p,o,n,m,l,k,j,i,h=this,g=null -a=A.qG(a,0,a.length) +return new A.bO(B.b.t(q,0,r),s.b,s.c,s.d,s.e,s.f,r,s.w)}, +ix(a){var s,r,q,p,o,n,m,l,k,j,i,h=this,g=null +a=A.qR(a,0,a.length) s=!(h.b===a.length&&B.b.U(h.a,a)) r=a==="file" q=h.c p=q>0?B.b.t(h.a,h.b+3,q):"" -o=h.geU()?h.gcZ():g -if(s)o=A.p1(o,a) +o=h.geY()?h.gd0():g +if(s)o=A.p9(o,a) q=h.c if(q>0)n=B.b.t(h.a,q,h.d) else n=p.length!==0||o!=null||r?"":g @@ -8715,38 +8732,38 @@ k=h.r j=m0)return b s=b.c if(s>0){r=a.b if(r<=0)return b q=r===4 if(q&&B.b.U(a.a,"file"))p=b.e!==b.f -else if(q&&B.b.U(a.a,"http"))p=!b.ha("80") -else p=!(r===5&&B.b.U(a.a,"https"))||!b.ha("443") +else if(q&&B.b.U(a.a,"http"))p=!b.hb("80") +else p=!(r===5&&B.b.U(a.a,"https"))||!b.hb("443") if(p){o=r+1 -return new A.bN(B.b.t(a.a,0,o)+B.b.ab(b.a,c+1),r,s+o,b.d+o,b.e+o,b.f+o,b.r+o,a.w)}else return this.hw().d5(b)}n=b.e +return new A.bO(B.b.t(a.a,0,o)+B.b.ab(b.a,c+1),r,s+o,b.d+o,b.e+o,b.f+o,b.r+o,a.w)}else return this.hx().d8(b)}n=b.e c=b.f if(n===c){s=b.r if(c0?l:m o=k-n -return new A.bN(B.b.t(a.a,0,k)+B.b.ab(s,n),a.b,a.c,a.d,m,c+o,b.r+o,a.w)}j=a.e +return new A.bO(B.b.t(a.a,0,k)+B.b.ab(s,n),a.b,a.c,a.d,m,c+o,b.r+o,a.w)}j=a.e i=a.f if(j===i&&a.c>0){while(B.b.aa(s,"../",n))n+=3 o=j-n+1 -return new A.bN(B.b.t(a.a,0,j)+"/"+B.b.ab(s,n),a.b,a.c,a.d,j,c+o,b.r+o,a.w)}h=a.a -l=A.tB(this) +return new A.bO(B.b.t(a.a,0,j)+"/"+B.b.ab(s,n),a.b,a.c,a.d,j,c+o,b.r+o,a.w)}h=a.a +l=A.tL(this) if(l>=0)g=l else for(g=j;B.b.aa(h,"../",g);)g+=3 f=0 @@ -8758,15 +8775,15 @@ if(h.charCodeAt(i)===47){if(f===0){d="/" break}--f d="/"}}if(i===g&&a.b<=0&&!B.b.aa(h,"/",j)){n-=f*3 d=""}o=i-n+d.length -return new A.bN(B.b.t(h,0,i)+d+B.b.ab(s,n),a.b,a.c,a.d,j,c+o,b.r+o,a.w)}, -ff(){var s,r=this,q=r.b +return new A.bO(B.b.t(h,0,i)+d+B.b.ab(s,n),a.b,a.c,a.d,j,c+o,b.r+o,a.w)}, +fg(){var s,r=this,q=r.b if(q>=0){s=!(q===4&&B.b.U(r.a,"file")) q=s}else q=!1 -if(q)throw A.f(A.ac("Cannot extract a file path from a "+r.gaV()+" URI")) +if(q)throw A.f(A.a6("Cannot extract a file path from a "+r.gaV()+" URI")) q=r.f s=r.a -if(q0?s.gc6():r,n=s.geU()?s.gcZ():r,m=s.a,l=s.f,k=B.b.t(m,s.e,l),j=s.r -l=l0?s.gc7():r,n=s.geY()?s.gd0():r,m=s.a,l=s.f,k=B.b.t(m,s.e,l),j=s.r +l=l864e13)A.P(A.af(r,-864e13,864e13,"millisecondsSinceEpoch",null)) +if(r<-864e13||r>864e13)A.M(A.af(r,-864e13,864e13,"millisecondsSinceEpoch",null)) A.dP(!0,"isUtc",t.k4) -return new A.dh(r,0,!0)}if(a instanceof RegExp)throw A.f(A.W("structured clone of RegExp",null)) -if(a instanceof Promise)return A.zq(a,t.X) +return new A.di(r,0,!0)}if(a instanceof RegExp)throw A.f(A.W("structured clone of RegExp",null)) +if(a instanceof Promise)return A.zy(a,t.X) q=Object.getPrototypeOf(a) if(q===Object.prototype||q===null){p=t.X -o=A.az(p,p) +o=A.aA(p,p) s.k(0,a,o) n=Object.keys(a) m=[] -for(s=J.c4(n),p=s.gF(n);p.p();)m.push(A.up(p.gB())) +for(s=J.c7(n),p=s.gF(n);p.p();)m.push(A.uA(p.gB())) for(l=0;l"))}} -A.bQ.prototype={ -bQ(){var s,r -if(this.as==null)this.i3() +A.bR.prototype={ +bR(){var s,r +if(this.as==null)this.i4() s=this.as -r=s==null?null:s.e1() -return r==null?null:r.aF()}, -i3(){var s,r +r=s==null?null:s.e5() +return r==null?null:r.aH()}, +i4(){var s,r if(this.as!=null)return s=this.Q -if(s!=null){r=s.e1().aF() +if(s!=null){r=s.e5().aH() this.as=new A.it(r)}}} A.dV.prototype={ -bn(){return"CompressionType."+this.b}} +bo(){return"CompressionType."+this.b}} A.lJ.prototype={ ad(a){var s,r,q,p,o,n=this if(a===0)return 0 if(n.c===0){n.c=8 -n.b=n.a.aK()}for(s=n.a,r=0;q=n.c,a>q;){p=B.f.aW(r,q) +n.b=n.a.aL()}for(s=n.a,r=0;q=n.c,a>q;){p=B.f.aW(r,q) o=n.b if(!(q>=0&&q<9))return A.c(B.aY,q) r=p+(o&B.aY[q]) @@ -8858,15 +8875,15 @@ q.toString o=s.c++ if(!(o>=0&&o0){if(q===0){n.c=8 -n.b=s.aK()}s=B.f.aW(r,a) +n.b=s.aL()}s=B.f.aW(r,a) q=n.b p=n.c-a -q=B.f.cI(q,p) +q=B.f.cK(q,p) if(!(a<9))return A.c(B.aY,a) r=s+(q&B.aY[a]) n.c=p}return r}} A.lH.prototype={ -mk(a,b){var s,r,q,p,o,n=this,m=new A.lJ(a) +mm(a,b){var s,r,q,p,o,n=this,m=new A.lJ(a) n.cx=n.CW=n.ch=n.ay=0 if(m.ad(8)!==66||m.ad(8)!==90||m.ad(8)!==104)return!1 s=n.a=m.ad(8)-48 @@ -8877,25 +8894,25 @@ for(;;){s=a.c q=a.d q===$&&A.o() if(!(s>>31)^o^4294967295}else if(p===2){m.ad(8) m.ad(8) m.ad(8) m.ad(8) return!0}}return!0}, -kN(a){var s,r,q,p +kO(a){var s,r,q,p for(s=!0,r=!0,q=0;q<6;++q){p=a.ad(8) if(p!==B.jo[q])r=!1 if(p!==B.j_[q])s=!1 if(!s&&!r)return-1}return r?0:2}, -kO(d4,d5){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,d0=this,d1=4294967295,d2=d4.ad(1),d3=((d4.ad(8)<<8|d4.ad(8))<<8|d4.ad(8))>>>0 +kP(d4,d5){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,d0=this,d1=4294967295,d2=d4.ad(1),d3=((d4.ad(8)<<8|d4.ad(8))<<8|d4.ad(8))>>>0 d0.c=new Uint8Array(16) for(s=0;s<16;++s){r=d0.c q=d4.ad(1) @@ -8906,7 +8923,7 @@ q=p+o n=d4.ad(1) r.$flags&2&&A.t(r) if(!(q<256))return A.c(r,q) -r[q]=n}d0.kA() +r[q]=n}d0.kB() r=d0.fx if(r===0)return-1 m=r+2 @@ -8930,7 +8947,7 @@ h=k[i] for(;i>0;i=g){g=i-1 k[i]=k[g]}k[0]=h j&2&&A.t(q) -q[s]=h}d0.fr=t.aE.a(A.aE(6,$.uP(),!1,t.ev)) +q[s]=h}d0.fr=t.aE.a(A.aB(6,$.v0(),!1,t.ev)) for(f=0;fc)c=b if(b=0;--a2){for(n=a2*16,a3=15;a3>=0;--a3){if(!(a1>=0&&a1<4096))return A.c(r,a1) r[a1]=n+a3;--a1}q[a2]=a1+1}d0.ay=0 d0.ch=-1 -a4=d0.ej(d4) +a4=d0.en(d4) if(a4<0)return-1 for(a5=0;;){if(a4===a)break if(a4===0||a4===1){a6=-1 @@ -8984,7 +9001,7 @@ do{if(a7>=2097152)return-1 if(a4===0)a6+=a7 else if(a4===1)a6+=2*a7 a7*=2 -a4=d0.ej(d4)}while(a4===0||a4===1);++a6 +a4=d0.en(d4)}while(a4===0||a4===1);++a6 r=d0.e r===$&&A.o() q=d0.f @@ -9034,7 +9051,7 @@ r&2&&A.t(q) if(!(n>=0&&n<4096))return A.c(q,n) q[n]=j;--a9}r&2&&A.t(q) if(!(b0>=0&&b0<4096))return A.c(q,b0) -q[b0]=a8}else{b2=B.f.av(a9,16) +q[b0]=a8}else{b2=B.f.aw(a9,16) b3=B.f.bl(a9,16) if(!(b2>=0&&b2<16))return A.c(r,b2) b0=r[b2]+b3 @@ -9078,7 +9095,7 @@ q=q[a8] j.$flags&2&&A.t(j) if(!(a5>=0&&a5=a5)return-1 for(r=d0.at,s=0;s<=255;++s){q=r[s] if(q<0||q>a5)return-1}r=d0.dy=new Int32Array(257) @@ -9117,7 +9134,7 @@ b9=0 c0=0}c1=a5+1 c2=d1 if(n)for(c3=0,c4=0,c5=1;;c4=b8,b8=c7){for(r=c4&255;;){if(c3===0)break -d5.cA(c4) +d5.cB(c4) q=c2>>>24&255^r if(!(q<256))return A.c(B.X,q) c2=(c2<<8^B.X[q])>>>0;--c3}if(c5===c1)return c2 @@ -9179,10 +9196,10 @@ if(c0===512)c0=0}r=b9===1?1:0 c7=b6&255^r c5=c5+1+1 b6=b7}else for(c8=b8,c3=0,c4=0,c5=1;;c4=c8,c8=c9){if(c3>0){for(r=c4&255;;){if(c3===1)break -d5.cA(c4) +d5.cB(c4) q=c2>>>24&255^r if(!(q<256))return A.c(B.X,q) -c2=c2<<8^B.X[q];--c3}d5.cA(c4) +c2=c2<<8^B.X[q];--c3}d5.cB(c4) r=c2>>>24&255^r if(!(r<256))return A.c(B.X,r) c2=(c2<<8^B.X[r])>>>0}if(c5>c1)return-1 @@ -9196,12 +9213,12 @@ b6=q[b6] c6=b6&255 b6=b6>>>8;++c5 c3=0 -if(c6!==c8){d5.cA(c8) +if(c6!==c8){d5.cB(c8) r=c2>>>24&255^c8&255 if(!(r<256))return A.c(B.X,r) c2=(c2<<8^B.X[r])>>>0 c9=c6 -continue}if(c5===c1){d5.cA(c8) +continue}if(c5===c1){d5.cB(c8) r=c2>>>24&255^c8&255 if(!(r<256))return A.c(B.X,r) c2=(c2<<8^B.X[r])>>>0 @@ -9235,7 +9252,7 @@ b6=q[b7] c9=b6&255 b6=b6>>>8 c5=c5+1+1}return c2}, -ej(a){var s,r,q,p,o=this,n=o.ay +en(a){var s,r,q,p,o=this,n=o.ay if(n===0){n=++o.ch s=o.ax s===$&&A.o() @@ -9276,7 +9293,7 @@ s=o.db s===$&&A.o() if(!(n>=0&&n=0&&p=0&&q>>0)-l}}, -kA(){var s,r,q,p=this +kB(){var s,r,q,p=this p.fx=0 p.e=new Uint8Array(256) for(s=0;s<256;++s){r=p.d @@ -9320,88 +9337,88 @@ q=p.fx++ r.$flags&2&&A.t(r) if(!(q<256))return A.c(r,q) r[q]=s}}}} -A.ot.prototype={ -fa(a,b){var s,r,q,p,o,n=this,m=n.a=n.ks(a) +A.oA.prototype={ +fc(a,b){var s,r,q,p,o,n=this,m=n.a=n.kt(a) if(m<0)return a.c=m -if(a.ak()!==101010256)return +if(a.al()!==101010256)return a.a5() a.a5() a.a5() a.a5() -n.f=a.ak() -n.r=a.ak() +n.f=a.al() +n.r=a.al() s=a.a5() -if(s>0)a.is(s,!1) -n.kP(a) +if(s>0)a.it(s,!1) +n.kQ(a) m=n.r r=n.f -q=a.fG(Math.min(r,1024),r,m) +q=a.fH(Math.min(r,1024),r,m) m=n.x for(;;){r=q.c p=q.d p===$&&A.o() if(!(r=0;){a.c=p -n=a.dc(q,p) +n=a.dg(q,p) m=a.c l=n.b a.c=m+(l==null?0:l.length-n.c) k=new A.e_(B.F) -k.fM(n.aF(),B.F,null,null) +k.fN(n.aH(),B.F,null,null) for(j=o;j>=0;--j){k.c=j -if(k.ak()===101010256){a.c=s +if(k.al()===101010256){a.c=s return p+j}}p=p>0&&p=0&&p>>0 +hB(a){var s=this.ch +B.a.k(s,0,A.cK(A.uF(s[0].cA(0),a))) +B.a.k(s,1,s[1].cC(0,s[0].e2(0,A.cK(255)))) +B.a.k(s,1,s[1].b2(0,A.cK(134775813)).cC(0,A.cK(1)).e2(0,A.cK(4294967295))) +B.a.k(s,2,A.cK(A.uF(s[2].cA(0),s[1].e9(0,24).cA(0))))}, +h5(){var s=(this.ch[2].e2(0,A.cK(65535)).cA(0)|2)>>>0 return s*((s^1)>>>0)>>>8&255}, -kf(a){var s,r,q,p,o,n=this,m=null +kg(a){var s,r,q,p,o,n=this,m=null if(n.Q==null)return A.bv(new Uint8Array(0),B.F,m,m) for(s=0;s<12;++s){r=n.Q q=r.b q.toString r=r.c++ if(!(r>=0&&r0)j.at=a.dV(s) -if(r>0){p=a.be(r).aF() +j.Q=a.al() +j.as=a.al() +if(s>0)j.at=a.dZ(s) +if(r>0){p=a.be(r).aH() j.ax=p if(r>=4){o=A.bv(p,B.F,null,null) for(;;){p=o.b if(!((p==null?0:p.length-o.c)>=4))break n=o.a5() m=o.a5() -l=o.dc(m,o.c) +l=o.dg(m,o.c) p=o.c k=l.b o.c=p+(k==null?0:k.length-l.c) -if(n===1){if(m>=8&&j.x===4294967295){j.x=l.bz() -m-=8}if(m>=8&&j.w===4294967295){j.w=l.bz() -m-=8}if(m>=8&&j.as===4294967295){j.as=l.bz() -m-=8}if(m>=4&&j.y===65535)j.y=l.ak()}}}}if(q>0)a.dV(q) +if(n===1){if(m>=8&&j.x===4294967295){j.x=l.bA() +m-=8}if(m>=8&&j.w===4294967295){j.w=l.bA() +m-=8}if(m>=8&&j.as===4294967295){j.as=l.bA() +m-=8}if(m>=4&&j.y===65535)j.y=l.al()}}}}if(q>0)a.dZ(q) b.c=j.as -p=new A.ku(B.aW,j,B.aC,A.i([A.cI(0),A.cI(0),A.cI(0)],t.aa)) +p=new A.ku(B.aW,j,B.aC,A.i([A.cK(0),A.cK(0),A.cK(0)],t.aa)) j.ch=p -p.fa(b,c)}, +p.fc(b,c)}, j(a){return this.at}} -A.os.prototype={ -ml(a,a0,a1,a2){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c=null,b=new A.ot(A.i([],t.iJ)) +A.oz.prototype={ +mn(a,a0,a1,a2){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c=null,b=new A.oA(A.i([],t.iJ)) this.a=b -b.fa(a,a1) +b.fc(a,a1) b=A.i([],t.c_) -s=A.az(t.N,t.S) -r=new A.hQ(b,s) -for(q=this.a.x,p=q.length,o=t.L,n=0;n>>16 j=l.x -i=B.b.bu(j,"/")||B.b.bu(j,"\\") +i=B.b.bv(j,"/")||B.b.bv(j,"\\") h=s.m(0,j) if(h!=null){if(h>>>0!==h||h>=b.length)return A.c(b,h) g=b[h]}else g=c -if(g==null){g=i?new A.bQ(j,B.f.av(Date.now(),1000)):A.rd(j,l.w,l) +if(g==null){g=i?new A.bR(j,B.f.aw(Date.now(),1000)):A.ro(j,l.w,l) r.l(0,g)}g.b=k -if(m.a>>>8===3)if((k&61440)===40960){f=A.rd(j,l.w,l) -if(f.as==null)f.i3() +if(m.a>>>8===3)if((k&61440)===40960){f=A.ro(j,l.w,l) +if(f.as==null)f.i4() j=f.as if(j==null)e=c else{j=j.a e=new A.e_(B.F) -e.fM(j,B.F,c,c)}d=e==null?c:e.aF() +e.fN(j,B.F,c,c)}d=e==null?c:e.aH() if(d!=null){o.a(d) -new A.kZ(!1).h1(d,0,c,!0)}}}return r}} -A.mD.prototype={ -jU(a){var s,r,q,p,o,n,m,l,k,j,i,h,g=this,f=a.length +new A.kZ(!1).h2(d,0,c,!0)}}}return r}} +A.mI.prototype={ +jV(a){var s,r,q,p,o,n,m,l,k,j,i,h,g=this,f=a.length for(s=0;sg.b)g.b=r if(r>>1}for(h=(l|s)>>>0,i=j;i=0))return A.c(p,i) p[i]=h}++n}++o n=n<<1>>>0 m=m<<1>>>0}}} -A.oq.prototype={} -A.p6.prototype={ -i2(a,b,c,d){var s,r,q=null +A.ox.prototype={} +A.pe.prototype={ +i3(a,b,c,d){var s,r,q=null for(;;){s=a.c r=a.d r===$&&A.o() if(!(s=r s=r}else s=!0 if(s)return!1 q=p.b4(3) -switch(B.f.b5(q,1)){case 0:if(p.kH()===-1)return!1 +switch(B.f.b5(q,1)){case 0:if(p.kI()===-1)return!1 break -case 1:if(p.h2($.uR(),$.uQ())===-1)return!1 +case 1:if(p.h3($.v2(),$.v1())===-1)return!1 break -case 2:if(p.kG()===-1)return!1 +case 2:if(p.kH()===-1)return!1 break default:return!1}return(q&1)===0}, b4(a){var s,r,q,p,o=this @@ -9651,11 +9668,11 @@ s=o.d r=o.e o.d=(s|B.f.aW(q,r))>>>0 o.e=r+8}r=o.d -p=B.f.bp(1,a) -o.d=B.f.dt(r,a) +p=B.f.bq(1,a) +o.d=B.f.dv(r,a) o.e=s-a return(r&p-1)>>>0}, -er(a){var s,r,q,p,o,n,m,l=this,k=a.a +ew(a){var s,r,q,p,o,n,m,l=this,k=a.a k===$&&A.o() s=a.b while(r=l.e,r>>0 if(!(o>>16 -l.d=B.f.dt(q,m) +l.d=B.f.dv(q,m) l.e=r-m return n&65535}, -kH(){var s,r,q=this +kI(){var s,r,q=this q.e=q.d=0 s=q.b4(16) r=q.b4(16) if(s!==0&&s!==(r^65535)>>>0)return-1 if(s>q.gbi().gn(0))return-1 -q.c.oy(q.gbi().be(s)) +q.c.oB(q.gbi().be(s)) return 0}, -kG(){var s,r,q,p,o,n,m,l,k,j,i=this,h=i.b4(5) +kH(){var s,r,q,p,o,n,m,l,k,j,i=this,h=i.b4(5) if(h===-1)return-1 h+=257 if(h>288)return-1 @@ -9709,28 +9726,28 @@ n=h+s l=new Uint8Array(n) k=J.dS(B.k.ga9(l),0,h) j=J.dS(B.k.ga9(l),h,s) -if(i.kd(n,m,l)===-1)return-1 -return i.h2(A.ix(k),A.ix(j))}, -h2(a,b){var s,r,q,p,o,n,m=this -for(s=m.c;;){r=m.er(a) +if(i.ke(n,m,l)===-1)return-1 +return i.h3(A.ix(k),A.ix(j))}, +h3(a,b){var s,r,q,p,o,n,m=this +for(s=m.c;;){r=m.ew(a) if(r<0||r>285)return-1 if(r===256)break -if(r<256){s.cA(r&255) +if(r<256){s.cB(r&255) continue}q=r-257 if(!(q>=0&&q<29))return A.c(B.d_,q) p=B.d_[q] o=m.b4(B.jn[q]) -n=m.er(b) +n=m.ew(b) if(n<0||n>29)return-1 if(!(n>=0&&n<30))return A.c(B.d0,n) -s.ov(B.d0[n]+m.b4(B.iX[n]),p+o)}while(s=m.e,s>=8){m.e=s-8 +s.oy(B.d0[n]+m.b4(B.iX[n]),p+o)}while(s=m.e,s>=8){m.e=s-8 s=m.gbi() p=--s.c o=s.d o===$&&A.o() -s.c=B.f.m0(p,0,o)}return 0}, -kd(a,b,c){var s,r,q,p,o,n,m,l,k=this -for(s=0,r=0;rq.byteLength)A.P(A.W("Input buffer too short",null)) -if(16>r.byteLength)A.P(A.W("Output buffer too short",null)) +if(16>q.byteLength)A.M(A.W("Input buffer too short",null)) +if(16>r.byteLength)A.M(A.W("Output buffer too short",null)) k=l.c j=l.b if(k){j===$&&A.o() -l.kl(q,0,r,0,j)}else{j===$&&A.o() -l.kg(q,0,r,0,j)}for(i=0;i=0))return A.c(p,l) j=p[l] if(!(l<4))return A.c(p,l) p[l]=j+1 if(p[l]!==0)break}j=k.a -k.kq(j.a,j.b,p,o,n) -n+=r}B.k.bD(c,d,d+s,o) +k.kr(j.a,j.b,p,o,n) +n+=r}B.k.bE(c,d,d+s,o) return k.a.c}, -kq(a,b,c,d,e){var s,r,q,p,o,n,m,l,k,j,i,h=this +kr(a,b,c,d,e){var s,r,q,p,o,n,m,l,k,j,i,h=this if(b<=0)throw A.f(A.W("Iteration count must be at least 1.",null)) s=h.b r=s.a -r.bA(a,0,a.length) -r.bA(c,0,4) +r.bB(a,0,a.length) +r.bB(c,0,4) q=h.c q===$&&A.o() -s.c4(q,0) +s.c5(q,0) q=h.c -B.k.bD(d,e,e+q.length,q) +B.k.bE(d,e,e+q.length,q) for(q=d.length,p=1;p>>0 @@ -9872,95 +9889,95 @@ if(s!==q){q=r.a q===$&&A.o();++q r.a=q r.a=q>>>0}}, -j(a){var s=this,r=new A.Y(""),q=s.a +j(a){var s=this,r=new A.X(""),q=s.a q===$&&A.o() -s.hj(r,q) +s.hk(r,q) q=s.b q===$&&A.o() -s.hj(r,q) +s.hk(r,q) q=r.a return q.charCodeAt(0)==0?q:q}, -hj(a,b){var s,r=B.f.d6(b,16) +hk(a,b){var s,r=B.f.d9(b,16) for(s=8-r.length;s>0;--s)a.a+="0" a.a+=r}, gq(a){var s,r=this.a r===$&&A.o() s=this.b s===$&&A.o() -return A.aX(r,s,B.u,B.u)}} +return A.b1(r,s,B.u,B.u)}} A.jx.prototype={ -aL(){var s,r=this -r.a.jl(0) +aM(){var s,r=this +r.a.jm(0) r.c=0 -B.k.c5(r.b,0,4,0) +B.k.c6(r.b,0,4,0) r.w=0 s=r.r -B.a.c5(s,0,s.length,0) +B.a.c6(s,0,s.length,0) s=r.f B.a.k(s,0,1732584193) B.a.k(s,1,4023233417) B.a.k(s,2,2562383102) B.a.k(s,3,271733878) B.a.k(s,4,3285377520)}, -dX(a){var s,r=this,q=r.b,p=r.c +e0(a){var s,r=this,q=r.b,p=r.c p===$&&A.o() s=p+1 r.c=s q.$flags&2&&A.t(q) if(!(p<4))return A.c(q,p) q[p]=a&255 -if(s===4){r.hn(q,0) -r.c=0}r.a.fH(1)}, -bA(a,b,c){var s=this.kL(a,b,c) +if(s===4){r.ho(q,0) +r.c=0}r.a.fI(1)}, +bB(a,b,c){var s=this.kM(a,b,c) b+=s c-=s -s=this.kM(a,b,c) -this.kI(a,b+s,c-s)}, -c4(a,b){var s,r=this,q=A.rL(r.a),p=q.a +s=this.kN(a,b,c) +this.kJ(a,b+s,c-s)}, +c5(a,b){var s,r=this,q=A.rV(r.a),p=q.a p===$&&A.o() -p=A.r0(p,3) +p=A.rb(p,3) q.a=p s=q.b s===$&&A.o() q.a=(p|s>>>29)>>>0 -q.b=A.r0(s,3) -r.kK() -r.kJ(q) -r.ef() -r.kD(a,b) -r.aL() +q.b=A.rb(s,3) +r.kL() +r.kK(q) +r.ej() +r.kE(a,b) +r.aM() return 20}, -hn(a,b){var s=this,r=s.w +ho(a,b){var s=this,r=s.w r===$&&A.o() s.w=r+1 -B.a.k(s.r,r,J.bf(B.k.ga9(a),a.byteOffset,a.length).getUint32(b,B.bE===s.d)) -if(s.w===16)s.ef()}, -ef(){this.nL() +B.a.k(s.r,r,J.bg(B.k.ga9(a),a.byteOffset,a.length).getUint32(b,B.bE===s.d)) +if(s.w===16)s.ej()}, +ej(){this.nN() this.w=0 -B.a.c5(this.r,0,16,0)}, -kI(a,b,c){var s +B.a.c6(this.r,0,16,0)}, +kJ(a,b,c){var s for(s=a.length;c>0;){if(!(b4;){this.hn(a,b) +this.e0(a[b]);++b;--c}}, +kN(a,b,c){var s,r +for(s=this.a,r=0;c>4;){this.ho(a,b) b+=4 c-=4 -s.fH(4) +s.fI(4) r+=4}return r}, -kL(a,b,c){var s,r=a.length,q=0 +kM(a,b,c){var s,r=a.length,q=0 for(;;){s=this.c s===$&&A.o() if(!(s!==0&&c>0))break if(!(b14)r.ef() +if(q>14)r.ej() q=r.d switch(q){case B.bE:q=r.r s=a.b @@ -9978,15 +9995,15 @@ s=a.b s===$&&A.o() B.a.k(q,15,s) break -default:throw A.f(A.ce("Invalid endianness: "+q.j(0)))}}, -kD(a,b){var s,r,q,p,o,n,m,l +default:throw A.f(A.ch("Invalid endianness: "+q.j(0)))}}, +kE(a,b){var s,r,q,p,o,n,m,l for(s=this.e,r=this.f,q=r.length,p=a.length,o=B.bE===this.d,n=0;n>>31)>>>0)}p=this.f +B.a.k(s,q,((l&$.aP[1])<<1|l>>>31)>>>0)}p=this.f o=p.length if(0>=o)return A.c(p,0) k=p[0] @@ -10011,11 +10028,11 @@ if(3>=o)return A.c(p,3) h=p[3] if(4>=o)return A.c(p,4) g=p[4] -for(f=k,e=0,d=0;d<4;++d,e=c){o=$.aM[5] +for(f=k,e=0,d=0;d<4;++d,e=c){o=$.aP[5] c=e+1 if(!(e>>27)>>>0)+((j&i|~j&h)>>>0)+s[e]+1518500249>>>0 -n=$.aM[30] +n=$.aP[30] j=((j&n)<<30|j>>>2)>>>0 e=c+1 if(!(c>>2)>>>0 c=e+1 if(!(e>>27)>>>0)+((i&h|~i&g)>>>0)+s[e]+1518500249>>>0 -i=((i&n)<<30|i>>>2)>>>0}for(d=0;d<4;++d,e=c){o=$.aM[5] +i=((i&n)<<30|i>>>2)>>>0}for(d=0;d<4;++d,e=c){o=$.aP[5] c=e+1 if(!(e>>27)>>>0)+((j^i^h)>>>0)+s[e]+1859775393>>>0 -n=$.aM[30] +n=$.aP[30] j=((j&n)<<30|j>>>2)>>>0 e=c+1 if(!(c>>2)>>>0 c=e+1 if(!(e>>27)>>>0)+((i^h^g)>>>0)+s[e]+1859775393>>>0 -i=((i&n)<<30|i>>>2)>>>0}for(d=0;d<4;++d,e=c){o=$.aM[5] +i=((i&n)<<30|i>>>2)>>>0}for(d=0;d<4;++d,e=c){o=$.aP[5] c=e+1 if(!(e>>27)>>>0)+((j&i|j&h|i&h)>>>0)+s[e]+2400959708>>>0 -n=$.aM[30] +n=$.aP[30] j=((j&n)<<30|j>>>2)>>>0 e=c+1 if(!(c>>2)>>>0 c=e+1 if(!(e>>27)>>>0)+((i&h|i&g|h&g)>>>0)+s[e]+2400959708>>>0 -i=((i&n)<<30|i>>>2)>>>0}for(d=0;d<4;++d,e=c){o=$.aM[5] +i=((i&n)<<30|i>>>2)>>>0}for(d=0;d<4;++d,e=c){o=$.aP[5] c=e+1 if(!(e>>27)>>>0)+((j^i^h)>>>0)+s[e]+3395469782>>>0 -n=$.aM[30] +n=$.aP[30] j=((j&n)<<30|j>>>2)>>>0 e=c+1 if(!(c>>0) B.a.k(p,3,p[3]+h>>>0) B.a.k(p,4,p[4]+g>>>0)}} A.jw.prototype={ -ia(a){var s,r,q,p,o=this,n=o.a -n.aL() +ib(a){var s,r,q,p,o=this,n=o.a +n.aM() s=a.a s===$&&A.o() r=s.length q=o.c q===$&&A.o() -if(r>q){n.bA(s,0,r) +if(r>q){n.bB(s,0,r) s=o.d s===$&&A.o() -n.c4(s,0) +n.c5(s,0) s=o.b s===$&&A.o() r=s}else{p=o.d p===$&&A.o() -B.k.bD(p,0,r,s)}s=o.d +B.k.bE(p,0,r,s)}s=o.d s===$&&A.o() -B.k.c5(s,r,s.length,0) +B.k.c6(s,r,s.length,0) s=o.e s===$&&A.o() -B.k.bD(s,0,q,o.d) -o.hE(o.d,q,54) -o.hE(o.e,q,92) +B.k.bE(s,0,q,o.d) +o.hF(o.d,q,54) +o.hF(o.e,q,92) q=o.d -n.bA(q,0,q.length)}, -c4(a,b){var s,r,q=this,p=q.a,o=q.e +n.bB(q,0,q.length)}, +c5(a,b){var s,r,q=this,p=q.a,o=q.e o===$&&A.o() s=q.c s===$&&A.o() -p.c4(o,s) +p.c5(o,s) o=q.e -p.bA(o,0,o.length) -r=p.c4(a,b) +p.bB(o,0,o.length) +r=p.c5(a,b) o=q.e -B.k.c5(o,s,o.length,0) +B.k.c6(o,s,o.length,0) o=q.d o===$&&A.o() -p.bA(o,0,o.length) +p.bB(o,0,o.length) return r}, -hE(a,b,c){var s,r,q,p +hF(a,b,c){var s,r,q,p for(s=a.length,r=a.$flags|0,q=0;q>>8&255]&255)<<8|(B.L[a>>>16&255]&255)<<16|B.L[a>>>24&255]<<24)>>>0}, -iN(a0,a1){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b=this,a=a1.a +A.nq.prototype={} +A.np.prototype={ +cL(a){return(B.L[a&255]&255|(B.L[a>>>8&255]&255)<<8|(B.L[a>>>16&255]&255)<<16|B.L[a>>>24&255]<<24)>>>0}, +iO(a0,a1){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b=this,a=a1.a a===$&&A.o() s=a.length if(s<16||s>32||(s&7)!==0)throw A.f(A.W("Key length not 128/192/256 bits.",null)) @@ -10156,9 +10173,9 @@ r=s>>>2 q=r+6 b.a=q p=q+1 -o=J.rv(p,t.L) -for(q=t.S,n=0;n=a)return A.c(o,0) @@ -10170,7 +10187,7 @@ j=m.getUint32(8,!0) B.a.k(q,2,j) i=m.getUint32(12,!0) B.a.k(q,3,i) -for(n=1;n<=10;++n){l=(l^b.cJ((i>>>8|(i&$.aM[24])<<24)>>>0)^B.iU[n-1])>>>0 +for(n=1;n<=10;++n){l=(l^b.cL((i>>>8|(i&$.aP[24])<<24)>>>0)^B.iU[n-1])>>>0 if(!(n>>0 B.a.k(q,2,j) i=(i^j)>>>0 B.a.k(q,3,i)}break -case 6:m=J.bf(B.k.ga9(a),a.byteOffset,s) +case 6:m=J.bg(B.k.ga9(a),a.byteOffset,s) l=m.getUint32(0,!0) a=o.length if(0>=a)return A.c(o,0) @@ -10199,7 +10216,7 @@ q=o[n] B.a.k(q,0,h) B.a.k(q,1,g) e=f<<1 -l=(l^b.cJ((g>>>8|(g&$.aM[24])<<24)>>>0)^f)>>>0 +l=(l^b.cL((g>>>8|(g&$.aP[24])<<24)>>>0)^f)>>>0 B.a.k(q,2,l) k=(k^l)>>>0 B.a.k(q,3,k) @@ -10215,7 +10232,7 @@ B.a.k(q,2,h) g=(g^h)>>>0 B.a.k(q,3,g) f=e<<1 -l=(l^b.cJ((g>>>8|(g&$.aM[24])<<24)>>>0)^e)>>>0 +l=(l^b.cL((g>>>8|(g&$.aP[24])<<24)>>>0)^e)>>>0 q=n+2 if(!(q=13)break h=(h^i)>>>0 g=(g^h)>>>0}break -case 8:m=J.bf(B.k.ga9(a),a.byteOffset,s) +case 8:m=J.bg(B.k.ga9(a),a.byteOffset,s) l=m.getUint32(0,!0) a=o.length if(0>=a)return A.c(o,0) @@ -10253,7 +10270,7 @@ B.a.k(q,2,d) c=m.getUint32(28,!0) B.a.k(q,3,c) for(n=2,f=1;;f=e){e=f<<1 -l=(l^b.cJ((c>>>8|(c&$.aM[24])<<24)>>>0)^f)>>>0 +l=(l^b.cL((c>>>8|(c&$.aP[24])<<24)>>>0)^f)>>>0 if(!(n>>0 B.a.k(q,3,i);++n if(n>=15)break -h=(h^b.cJ(i))>>>0 +h=(h^b.cL(i))>>>0 if(!(n>>0 B.a.k(q,2,d) c=(c^d)>>>0 B.a.k(q,3,c);++n}break -default:throw A.f(A.ce("Should never get here"))}return o}, -kl(b3,b4,b5,b6,b7){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,b0,b1,b2 +default:throw A.f(A.ch("Should never get here"))}return o}, +km(b3,b4,b5,b6,b7){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,b0,b1,b2 t.eP.a(b7) -s=J.bf(B.k.ga9(b3),b3.byteOffset,16) +s=J.bg(B.k.ga9(b3),b3.byteOffset,16) r=s.getUint32(b4,!0) q=s.getUint32(b4+4,!0) p=s.getUint32(b4+8,!0) @@ -10291,11 +10308,11 @@ j=p^m[2] i=o^m[3] for(m=this.a-1,h=1;h>>8&255] -e=$.aM[8] +e=$.aP[8] d=B.j[j>>>16&255] -c=$.aM[16] +c=$.aP[16] b=B.j[i>>>24&255] -a=$.aM[24] +a=$.aP[24] if(!(h>>24|(f&e)<<8)^(d>>>16|(d&c)<<16)^(b>>>8|(b&a)<<24)^a0[0] @@ -10336,27 +10353,27 @@ a0=B.j[a1>>>8&255] d=B.j[a2>>>16&255] g=B.j[a3>>>24&255];++h i=f^(a0>>>24|(a0&e)<<8)^(d>>>16|(d&c)<<16)^(g>>>8|(g&a)<<24)^b[3]}n=B.j[l&255] -m=A.as(B.j[k>>>8&255],24) -g=A.as(B.j[j>>>16&255],16) -f=A.as(B.j[i>>>24&255],8) +m=A.av(B.j[k>>>8&255],24) +g=A.av(B.j[j>>>16&255],16) +f=A.av(B.j[i>>>24&255],8) if(!(h>>8&255],24) -m=A.as(B.j[i>>>16&255],16) -n=A.as(B.j[l>>>24&255],8) +g=A.av(B.j[j>>>8&255],24) +m=A.av(B.j[i>>>16&255],16) +n=A.av(B.j[l>>>24&255],8) if(!(h>>8&255],24) -g=A.as(B.j[l>>>16&255],16) -f=A.as(B.j[k>>>24&255],8) +m=A.av(B.j[i>>>8&255],24) +g=A.av(B.j[l>>>16&255],16) +f=A.av(B.j[k>>>24&255],8) if(!(h>>8&255],24) -k=A.as(B.j[k>>>16&255],16) -j=A.as(B.j[j>>>24&255],8) +l=A.av(B.j[l>>>8&255],24) +k=A.av(B.j[k>>>16&255],16) +j=A.av(B.j[j>>>24&255],8) i=h+1 g=b7.length if(!(h>>24&255] g=g[3] -m=J.bf(B.k.ga9(b5),b5.byteOffset,16) +m=J.bg(B.k.ga9(b5),b5.byteOffset,16) m.$flags&2&&A.t(m,11) m.setUint32(b6,(j&255^(k&255)<<8^(f&255)<<16^n<<24^e)>>>0,!0) -e=J.bf(B.k.ga9(b5),b5.byteOffset,16) +e=J.bg(B.k.ga9(b5),b5.byteOffset,16) e.$flags&2&&A.t(e,11) e.setUint32(b6+4,(d&255^(c&255)<<8^(b&255)<<16^a<<24^a0)>>>0,!0) -a0=J.bf(B.k.ga9(b5),b5.byteOffset,16) +a0=J.bg(B.k.ga9(b5),b5.byteOffset,16) a0.$flags&2&&A.t(a0,11) a0.setUint32(b6+8,(a5&255^(a6&255)<<8^(a7&255)<<16^a8<<24^a9)>>>0,!0) -a9=J.bf(B.k.ga9(b5),b5.byteOffset,16) +a9=J.bg(B.k.ga9(b5),b5.byteOffset,16) a9.$flags&2&&A.t(a9,11) a9.setUint32(b6+12,(b0&255^(b1&255)<<8^(b2&255)<<16^l<<24^g)>>>0,!0)}, -kg(b3,b4,b5,b6,b7){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,b0,b1,b2 +kh(b3,b4,b5,b6,b7){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,b0,b1,b2 t.eP.a(b7) -s=J.bf(B.k.ga9(b3),b3.byteOffset,16).getUint32(b4,!0) -r=J.bf(B.k.ga9(b3),b3.byteOffset,16).getUint32(b4+4,!0) -q=J.bf(B.k.ga9(b3),b3.byteOffset,16).getUint32(b4+8,!0) -p=J.bf(B.k.ga9(b3),b3.byteOffset,16).getUint32(b4+12,!0) +s=J.bg(B.k.ga9(b3),b3.byteOffset,16).getUint32(b4,!0) +r=J.bg(B.k.ga9(b3),b3.byteOffset,16).getUint32(b4+4,!0) +q=J.bg(B.k.ga9(b3),b3.byteOffset,16).getUint32(b4+8,!0) +p=J.bg(B.k.ga9(b3),b3.byteOffset,16).getUint32(b4+12,!0) o=this.a n=b7.length if(!(o1;){m=B.i[l&255] g=B.i[h>>>8&255] -f=$.aM[8] +f=$.aP[8] e=B.i[j>>>16&255] -d=$.aM[16] +d=$.aP[16] c=B.i[o>>>24&255] -b=$.aM[24] +b=$.aP[24] if(!(i>>24|(g&f)<<8)^(e>>>16|(e&d)<<16)^(c>>>8|(c&b)<<24)^k[0] @@ -10475,27 +10492,27 @@ k=B.i[a1>>>8&255] e=B.i[a0>>>16&255] m=B.i[a>>>24&255];--i h=g^(k>>>24|(k&f)<<8)^(e>>>16|(e&d)<<16)^(m>>>8|(m&b)<<24)^c[3]}n=B.i[l&255] -m=A.as(B.i[h>>>8&255],24) -g=A.as(B.i[j>>>16&255],16) -f=A.as(B.i[o>>>24&255],8) +m=A.av(B.i[h>>>8&255],24) +g=A.av(B.i[j>>>16&255],16) +f=A.av(B.i[o>>>24&255],8) if(!(i>=0&&i>>8&255],24) -m=A.as(B.i[h>>>16&255],16) -n=A.as(B.i[j>>>24&255],8) +g=A.av(B.i[l>>>8&255],24) +m=A.av(B.i[h>>>16&255],16) +n=A.av(B.i[j>>>24&255],8) if(!(i>>8&255],24) -g=A.as(B.i[l>>>16&255],16) -f=A.as(B.i[h>>>24&255],8) +m=A.av(B.i[o>>>8&255],24) +g=A.av(B.i[l>>>16&255],16) +f=A.av(B.i[h>>>24&255],8) if(!(i>>8&255],24) -o=A.as(B.i[o>>>16&255],16) -l=A.as(B.i[l>>>24&255],8) +j=A.av(B.i[j>>>8&255],24) +o=A.av(B.i[o>>>16&255],16) +l=A.av(B.i[l>>>24&255],8) g=b7.length if(!(i>>24&255 if(!(b1>>0,!0) b2.setUint32(b6+4,(d&255^(c&255)<<8^(b&255)<<16^k<<24^a2)>>>0,!0) b2.setUint32(b6+8,(a3&255^(a4&255)<<8^(a5&255)<<16^a6<<24^a7)>>>0,!0) b2.setUint32(b6+12,(a8&255^(a9&255)<<8^(b0&255)<<16^b1<<24^g)>>>0,!0)}} -A.fe.prototype={} +A.fg.prototype={} A.it.prototype={ gn(a){var s=this.a.length return s}, -e1(){return A.bv(this.a,B.F,null,null)}} +e5(){return A.bv(this.a,B.F,null,null)}} A.e_.prototype={ -fM(a,b,c,d){var s,r +fN(a,b,c,d){var s,r if(d==null)d=0 -if(c==null)c=J.b6(a)-d -s=J.ad(a) +if(c==null)c=J.b8(a)-d +s=J.ae(a) if(d+c>s.gn(a))c=s.gn(a)-d -r=t.ev.b(a)?a:new Uint8Array(A.hC(a)) +r=t.ev.b(a)?a:new Uint8Array(A.hE(a)) s=J.dS(B.k.ga9(r),r.byteOffset+d,c) this.b=s this.d=s.length}, gn(a){var s=this.b return s==null?0:s.length-this.c}, -fG(a,b,c){var s=this.b +fH(a,b,c){var s=this.b if(s==null)return A.bv(A.i([],t.Z),B.F,null,null) return A.bv(s,this.a,b,c)}, -dc(a,b){return this.fG(null,a,b)}, -aK(){var s,r=this.b +dg(a,b){return this.fH(null,a,b)}, +aL(){var s,r=this.b r.toString s=this.c++ if(!(s>=0&&sq)s=q-r return J.dS(B.k.ga9(o),p.b.byteOffset+p.c,s)}} A.iO.prototype={ -a5(){var s=this.aK(),r=this.aK() +a5(){var s=this.aL(),r=this.aL() if(this.a===B.aU)return(s<<8|r)>>>0 return(r<<8|s)>>>0}, -ak(){var s=this,r=s.aK(),q=s.aK(),p=s.aK(),o=s.aK() +al(){var s=this,r=s.aL(),q=s.aL(),p=s.aL(),o=s.aL() if(s.a===B.aU)return(r<<24|q<<16|p<<8|o)>>>0 return(o<<24|p<<16|q<<8|r)>>>0}, -bz(){var s=this,r=s.aK(),q=s.aK(),p=s.aK(),o=s.aK(),n=s.aK(),m=s.aK(),l=s.aK(),k=s.aK() -if(s.a===B.aU)return(B.f.bp(r,56)|B.f.bp(q,48)|B.f.bp(p,40)|B.f.bp(o,32)|n<<24|m<<16|l<<8|k)>>>0 -return(B.f.bp(k,56)|B.f.bp(l,48)|B.f.bp(m,40)|B.f.bp(n,32)|o<<24|p<<16|q<<8|r)>>>0}, -be(a){var s=this,r=s.dc(a,s.c) +bA(){var s=this,r=s.aL(),q=s.aL(),p=s.aL(),o=s.aL(),n=s.aL(),m=s.aL(),l=s.aL(),k=s.aL() +if(s.a===B.aU)return(B.f.bq(r,56)|B.f.bq(q,48)|B.f.bq(p,40)|B.f.bq(o,32)|n<<24|m<<16|l<<8|k)>>>0 +return(B.f.bq(k,56)|B.f.bq(l,48)|B.f.bq(m,40)|B.f.bq(n,32)|o<<24|p<<16|q<<8|r)>>>0}, +be(a){var s=this,r=s.dg(a,s.c) s.c=s.c+r.gn(0) return r}, -is(a,b){return new A.mI(b).$1(this.be(a).aF())}, -dV(a){return this.is(a,!0)}} -A.mI.prototype={ +it(a,b){return new A.mN(b).$1(this.be(a).aH())}, +dZ(a){return this.it(a,!0)}} +A.mN.prototype={ $1(a){var s,r,q t.L.a(a) -try{s=this.a?B.hV.bL(a):A.aA(a,0,null) -return s}catch(r){q=A.aA(a,0,null) +try{s=this.a?B.hV.bM(a):A.aD(a,0,null) +return s}catch(r){q=A.aD(a,0,null) return q}}, -$S:120} -A.fy.prototype={ -e_(){return J.dS(B.k.ga9(this.c),this.c.byteOffset,this.b)}, -cA(a){var s,r,q=this -if(q.b===q.c.length)q.ko() +$S:81} +A.fA.prototype={ +e3(){return J.dS(B.k.ga9(this.c),this.c.byteOffset,this.b)}, +cB(a){var s,r,q=this +if(q.b===q.c.length)q.kp() s=q.c r=q.b++ s.$flags&2&&A.t(s) if(!(r>=0&&ro)n.dh(q-o) -B.k.bD(p,r,q,a) +while(r=n.b,q=r+s,p=n.c,o=p.length,q>o)n.dl(q-o) +B.k.bE(p,r,q,a) n.b+=s}, -oy(a){var s,r,q,p,o,n,m=this +oB(a){var s,r,q,p,o,n,m=this for(;;){s=m.b r=a.b q=r==null @@ -10627,10 +10644,10 @@ p=q?0:r.length-a.c o=m.c n=o.length if(!(s+p>n))break -m.dh(s+(q?0:r.length-a.c)-n)}if(!q)B.k.bb(o,s,s+a.gn(0),r,a.c) +m.dl(s+(q?0:r.length-a.c)-n)}if(!q)B.k.bb(o,s,s+a.gn(0),r,a.c) m.b=m.b+a.gn(0)}, -ov(a,b){var s,r,q,p,o,n,m,l,k,j,i=this -while(s=i.b,r=s+b,q=i.c,p=q.length,r>p)i.dh(r-p) +oy(a,b){var s,r,q,p,o,n,m,l,k,j,i=this +while(s=i.b,r=s+b,q=i.c,p=q.length,r>p)i.dl(r-p) o=s-a if(a>=b)B.k.bb(q,s,r,q,o) else for(n=q.$flags|0,m=o;s=0))return A.c(q,s) q[s]=j}i.b+=b}, -dh(a){var s,r=this.c,q=r.length,p=q+(a==null?1:a),o=q===0?32768:q*2 +dl(a){var s,r=this.c,q=r.length,p=q+(a==null?1:a),o=q===0?32768:q*2 if(o=0;)++r +s=new A.cR(q,p,0,240) +for(r=0;s.cZ()>=0;)++r return r}, ag(a,b){var s,r,q,p,o,n -A.aF(b,"index") +A.aH(b,"index") s=this.a r=s.length q=0 -if(r!==0){p=new A.cP(s,r,0,240) -for(o=0;n=p.cX(),n>=0;o=n){if(q===b)return B.b.t(s,o,n);++q}}throw A.f(A.vR(b,this,"index",null,q))}, +if(r!==0){p=new A.cR(s,r,0,240) +for(o=0;n=p.cZ(),n>=0;o=n){if(q===b)return B.b.t(s,o,n);++q}}throw A.f(A.w1(b,this,"index",null,q))}, C(a,b){var s if(typeof b!="string")return!1 s=b.length if(s===0)return!1 -if(new A.cP(b,s,0,240).cX()!==s)return!1 +if(new A.cR(b,s,0,240).cZ()!==s)return!1 s=this.a -return A.y4(s,b,0,s.length)>=0}, -hr(a,b,c){var s,r +return A.ye(s,b,0,s.length)>=0}, +hs(a,b,c){var s,r if(a===0||b===this.a.length)return b s=this.a -c=new A.cP(s,s.length,b,240) -do{r=c.cX() +c=new A.cR(s,s.length,b,240) +do{r=c.cZ() if(r<0)break if(--a,a>0){b=r continue}else{b=r break}}while(!0) return b}, -aX(a,b){A.aF(b,"count") -return this.kY(b)}, -kY(a){var s=this.hr(a,0,null),r=this.a +aX(a,b){A.aH(b,"count") +return this.l_(b)}, +l_(a){var s=this.hs(a,0,null),r=this.a if(s===r.length)return B.hT -return new A.d3(B.b.ab(r,s))}, -bk(a,b){A.aF(b,"count") -return this.l2(b)}, -l2(a){var s=this.hr(a,0,null),r=this.a +return new A.d4(B.b.ab(r,s))}, +bk(a,b){A.aH(b,"count") +return this.l4(b)}, +l4(a){var s=this.hs(a,0,null),r=this.a if(s===r.length)return this -return new A.d3(B.b.t(r,0,s))}, +return new A.d4(B.b.t(r,0,s))}, v(a,b){if(b==null)return!1 -return b instanceof A.d3&&this.a===b.a}, +return b instanceof A.d4&&this.a===b.a}, gq(a){return B.b.gq(this.a)}, j(a){return this.a}} -A.fR.prototype={ +A.fT.prototype={ gB(){var s=this,r=s.d return r==null?s.d=B.b.t(s.a,s.b,s.c):r}, -p(){return this.fR(1,this.c)}, -fR(a,b){var s,r,q,p,o,n,m,l,k,j,i,h=this,g=u.j,f=u.e,e=u.U +p(){return this.fS(1,this.c)}, +fS(a,b){var s,r,q,p,o,n,m,l,k,j,i,h=this,g=u.j,f=u.e,e=u.U if(a>0){s=h.c for(r=h.a,q=r.length,p=240;s=0))return A.c(r,s) o=r.charCodeAt(s) @@ -10731,16 +10748,16 @@ return a===1&&p!==240}else{h.b=b h.d=null return!0}}, $iL:1} -A.cP.prototype={ -cX(){var s,r,q=this,p=u.U -for(s=q.b;r=q.c,r=0&&i=0&&is;){q.da() +kA(){var s,r,q=this,p=u.t +for(s=q.b;r=q.c,r>s;){q.df() if(q.d<280)return r}r=(q.d&-4)+18 if(!(r<380))return A.c(p,r) q.d=p.charCodeAt(r) return s}} -A.eR.prototype={ -aI(a,b){return J.N(a,b)}, -Y(a){return J.B(a)}, -$ibS:1} +A.eS.prototype={ +aJ(a,b){return J.O(a,b)}, +Y(a){return J.C(a)}, +$ibT:1} A.e2.prototype={ -aI(a,b){var s,r,q,p=this.$ti.h("h<1>?") +aJ(a,b){var s,r,q,p=this.$ti.h("h<1>?") p.a(a) p.a(b) if(a===b)return!0 -s=J.at(a) -r=J.at(b) +s=J.aw(a) +r=J.aw(b) for(p=this.a;;){q=s.p() if(q!==r.p())return!1 if(!q)return!0 -if(!p.aI(s.gB(),r.gB()))return!1}}, +if(!p.aJ(s.gB(),r.gB()))return!1}}, Y(a){var s,r,q this.$ti.h("h<1>?").a(a) -for(s=J.at(a),r=this.a,q=0;s.p();){q=q+r.Y(s.gB())&2147483647 +for(s=J.aw(a),r=this.a,q=0;s.p();){q=q+r.Y(s.gB())&2147483647 q=q+(q<<10>>>0)&2147483647 q^=q>>>6}q=q+(q<<3>>>0)&2147483647 q^=q>>>11 return q+(q<<15>>>0)&2147483647}, -$ibS:1} -A.cX.prototype={ -aI(a,b){var s,r,q,p,o=this.$ti.h("m<1>?") +$ibT:1} +A.cZ.prototype={ +aJ(a,b){var s,r,q,p,o=this.$ti.h("m<1>?") o.a(a) o.a(b) if(a===b)return!0 -o=J.ad(a) +o=J.ae(a) s=o.gn(a) -r=J.ad(b) +r=J.ae(b) if(s!==r.gn(b))return!1 -for(q=this.a,p=0;p?").a(a) -for(s=J.ad(a),r=this.a,q=0,p=0;p>>0)&2147483647 q^=q>>>6}q=q+(q<<3>>>0)&2147483647 q^=q>>>11 return q+(q<<15>>>0)&2147483647}, -$ibS:1} +$ibT:1} A.bE.prototype={ -aI(a,b){var s,r,q,p,o=A.x(this),n=o.h("bE.T?") +aJ(a,b){var s,r,q,p,o=A.x(this),n=o.h("bE.T?") n.a(a) n.a(b) if(a===b)return!0 n=this.a -s=A.rr(o.h("A(bE.E,bE.E)").a(n.gar()),o.h("b(bE.E)").a(n.gdM()),n.gnj(),o.h("bE.E"),t.S) -for(o=J.at(a),r=0;o.p();){q=o.gB() +s=A.rC(o.h("A(bE.E,bE.E)").a(n.gau()),o.h("b(bE.E)").a(n.gdO()),n.gnl(),o.h("bE.E"),t.S) +for(o=J.aw(a),r=0;o.p();){q=o.gB() p=s.m(0,q) -s.k(0,q,(p==null?0:p)+1);++r}for(o=J.at(b);o.p();){q=o.gB() +s.k(0,q,(p==null?0:p)+1);++r}for(o=J.aw(b);o.p();){q=o.gB() p=s.m(0,q) if(p==null||p===0)return!1 s.k(0,q,p-1);--r}return r===0}, Y(a){var s,r,q A.x(this).h("bE.T?").a(a) -for(s=J.at(a),r=this.a,q=0;s.p();)q=q+r.Y(s.gB())&2147483647 +for(s=J.aw(a),r=this.a,q=0;s.p();)q=q+r.Y(s.gB())&2147483647 q=q+(q<<3>>>0)&2147483647 q^=q>>>11 return q+(q<<15>>>0)&2147483647}, -$ibS:1} +$ibT:1} A.ei.prototype={} A.ey.prototype={ gq(a){var s=this.a @@ -10901,50 +10918,50 @@ return 3*s.a.Y(this.b)+7*s.b.Y(this.c)&2147483647}, v(a,b){var s if(b==null)return!1 if(b instanceof A.ey){s=this.a -s=s.a.aI(this.b,b.b)&&s.b.aI(this.c,b.c)}else s=!1 +s=s.a.aJ(this.b,b.b)&&s.b.aJ(this.c,b.c)}else s=!1 return s}} A.e9.prototype={ -aI(a,b){var s,r,q,p,o=this.$ti.h("d<1,2>?") +aJ(a,b){var s,r,q,p,o=this.$ti.h("d<1,2>?") o.a(a) o.a(b) if(a===b)return!0 if(a.gn(a)!==b.gn(b))return!1 -s=A.rr(null,null,null,t.fA,t.S) -for(o=a.gaR(),o=o.gF(o);o.p();){r=o.gB() +s=A.rC(null,null,null,t.fA,t.S) +for(o=a.gaS(),o=o.gF(o);o.p();){r=o.gB() q=new A.ey(this,r,a.m(0,r)) p=s.m(0,q) -s.k(0,q,(p==null?0:p)+1)}for(o=b.gaR(),o=o.gF(o);o.p();){r=o.gB() +s.k(0,q,(p==null?0:p)+1)}for(o=b.gaS(),o=o.gF(o);o.p();){r=o.gB() q=new A.ey(this,r,b.m(0,r)) p=s.m(0,q) if(p==null||p===0)return!1 s.k(0,q,p-1)}return!0}, Y(a){var s,r,q,p,o,n,m,l=this.$ti l.h("d<1,2>?").a(a) -for(s=a.gaR(),s=s.gF(s),r=this.a,q=this.b,l=l.y[1],p=0;s.p();){o=s.gB() +for(s=a.gaS(),s=s.gF(s),r=this.a,q=this.b,l=l.y[1],p=0;s.p();){o=s.gB() n=r.Y(o) m=a.m(0,o) p=p+3*n+7*q.Y(m==null?l.a(m):m)&2147483647}p=p+(p<<3>>>0)&2147483647 p^=p>>>11 return p+(p<<15>>>0)&2147483647}, -$ibS:1} -A.eQ.prototype={ -aI(a,b){var s=this,r=t.hj -if(r.b(a))return r.b(b)&&new A.ei(s,t.cu).aI(a,b) +$ibT:1} +A.eR.prototype={ +aJ(a,b){var s=this,r=t.hj +if(r.b(a))return r.b(b)&&new A.ei(s,t.cu).aJ(a,b) r=t.av -if(r.b(a))return r.b(b)&&new A.e9(s,s,t.a3).aI(a,b) +if(r.b(a))return r.b(b)&&new A.e9(s,s,t.a3).aJ(a,b) r=t.p -if(r.b(a))return r.b(b)&&new A.cX(s,t.hI).aI(a,b) +if(r.b(a))return r.b(b)&&new A.cZ(s,t.hI).aJ(a,b) r=t.e7 -if(r.b(a))return r.b(b)&&new A.e2(s,t.nZ).aI(a,b) -return J.N(a,b)}, +if(r.b(a))return r.b(b)&&new A.e2(s,t.nZ).aJ(a,b) +return J.O(a,b)}, Y(a){var s=this if(t.hj.b(a))return new A.ei(s,t.cu).Y(a) if(t.av.b(a))return new A.e9(s,s,t.a3).Y(a) -if(t.p.b(a))return new A.cX(s,t.hI).Y(a) +if(t.p.b(a))return new A.cZ(s,t.hI).Y(a) if(t.e7.b(a))return new A.e2(s,t.nZ).Y(a) -return J.B(a)}, -nk(a){return!0}, -$ibS:1} +return J.C(a)}, +nm(a){return!0}, +$ibT:1} A.ev.prototype={ C(a,b){return B.a.C(this.a,b)}, ag(a,b){var s=this.a @@ -10952,17 +10969,17 @@ if(!(b>=0&&b"))}, gn(a){return this.a.length}, -c8(a,b,c){var s=this.a,r=A.w(s) +c9(a,b,c){var s=this.a,r=A.w(s) return new A.Q(s,r.u(c).h("1(2)").a(this.$ti.u(c).h("1(2)").a(b)),r.h("@<1>").u(c).h("Q<1,2>"))}, aX(a,b){var s=this.a -return A.bX(s,b,null,A.w(s).c)}, +return A.c_(s,b,null,A.w(s).c)}, bk(a,b){var s=this.a -return A.bX(s,0,A.dP(b,"count",t.S),A.w(s).c)}, -iG(a,b){return new A.O(this.a,b.h("O<0>"))}, +return A.c_(s,0,A.dP(b,"count",t.S),A.w(s).c)}, +iH(a,b){return new A.P(this.a,b.h("P<0>"))}, j(a){return A.iT(this.a,"[","]")}, $ih:1} A.dY.prototype={ @@ -10971,238 +10988,238 @@ if(!(b>=0&&b").a(b))}, -giz(a){var s=this.a -return new A.X(s,A.w(s).h("X<1>"))}, -bV(a,b){B.a.bV(this.a,this.$ti.h("b(1,1)?").a(b))}, +giA(a){var s=this.a +return new A.Y(s,A.w(s).h("Y<1>"))}, +bW(a,b){B.a.bW(this.a,this.$ti.h("b(1,1)?").a(b))}, $iz:1, $im:1} A.kR.prototype={ an(){var s=this,r=s.d r===$&&A.o() s.c=r -s.d=s.a.bP(!1) +s.d=s.a.bQ(!1) return r}, -hf(a,b){var s=this,r=s.d +hg(a,b){var s=this,r=s.d r===$&&A.o() if(r.a===a){s.c=r -s.d=s.a.bP(!1) +s.d=s.a.bQ(!1) return!0}else return!1}, -dm(a){return this.hf(a,!1)}, -aM(a){if(!this.hf(a,!1))this.eg(A.t0(a))}, -eg(a){var s,r=this.an(),q=null -try{q="expected "+a+", but found "+A.k(r)}catch(s){q="parsing error expected "+a}this.ci(q,r.b)}, -ci(a,b){$.eE.aY().n0(a,b)}, +ds(a){return this.hg(a,!1)}, +aN(a){if(!this.hg(a,!1))this.ek(A.ta(a))}, +ek(a){var s,r=this.an(),q=null +try{q="expected "+a+", but found "+A.k(r)}catch(s){q="parsing error expected "+a}this.cj(q,r.b)}, +cj(a,b){$.eE.aY().n2(a,b)}, ae(a){var s=this.c if(s==null||s.b.ai(0,a)<0)return a -return a.aO(0,this.c.b)}, -ip(){var s,r,q=this,p=A.i([],t.fG),o=q.d +return a.aP(0,this.c.b)}, +iq(){var s,r,q=this,p=A.i([],t.fG),o=q.d o===$&&A.o() s=q.a s.e=!0 -do{r=q.io() -if(r!=null)B.a.l(p,r)}while(q.dm(19)) +do{r=q.ip() +if(r!=null)B.a.l(p,r)}while(q.ds(19)) s.e=!1 if(p.length!==0)return new A.jL(p,q.ae(o.b)) return null}, -io(){var s,r=A.i([],t.iM),q=this.d +ip(){var s,r=A.i([],t.iM),q=this.d q===$&&A.o() -for(;;){s=this.jm(r.length===0) +for(;;){s=this.jn(r.length===0) if(s!=null)B.a.l(r,s) else break}if(r.length===0)return null -return new A.d_(r,this.ae(q.b))}, -nM(){var s,r,q,p,o,n,m,l=this.io() -if(l!=null)for(s=l.b,r=s.length,q=$.eE.a,p=0;p10)r=B.b.t(r,0,8)+"..." return s+"("+r+")"}else return s}} A.iz.prototype={ gZ(){return this.c}} A.jX.prototype={ -bP(a){var s,r,q,p,o,n,m,l,k,j=this +bQ(a){var s,r,q,p,o,n,m,l,k,j=this j.r=j.f -s=j.cl() -switch(s){case 10:case 13:case 32:case 9:return j.n5() -case 0:return new A.I(1,j.a.K(j.r,j.f)) -case 64:r=j.cm() +s=j.cm() +switch(s){case 10:case 13:case 32:case 9:return j.n7() +case 0:return new A.I(1,j.a.M(j.r,j.f)) +case 64:r=j.co() if(A.jY(r)||r===45){q=j.f p=j.r j.r=q -j.cl() -j.dI() +j.cm() +j.dK() o=j.b n=j.r -m=A.ql(B.j2,"type",o,n,j.f-n) +m=A.qw(B.j2,"type",o,n,j.f-n) if(m===-1){n=j.r -m=A.ql(B.iY,"type",o,n,j.f-n)}if(m!==-1)return new A.I(m,j.a.K(j.r,j.f)) +m=A.qw(B.iY,"type",o,n,j.f-n)}if(m!==-1)return new A.I(m,j.a.M(j.r,j.f)) else{j.r=p -j.f=q}}return new A.I(10,j.a.K(j.r,j.f)) +j.f=q}}return new A.I(10,j.a.M(j.r,j.f)) case 46:l=j.r -if(j.ns()){o=j.a -if(j.dJ().a===60){j.r=l -return new A.I(62,o.K(l,j.f))}else return new A.I(65,o.K(j.r,j.f))}return new A.I(8,j.a.K(j.r,j.f)) -case 40:return new A.I(2,j.a.K(j.r,j.f)) -case 41:return new A.I(3,j.a.K(j.r,j.f)) -case 123:return new A.I(6,j.a.K(j.r,j.f)) -case 125:return new A.I(7,j.a.K(j.r,j.f)) -case 91:return new A.I(4,j.a.K(j.r,j.f)) -case 93:if(j.af(93)&&j.af(62))return j.c9() -return new A.I(5,j.a.K(j.r,j.f)) -case 35:return new A.I(11,j.a.K(j.r,j.f)) -case 43:if(j.hi(s))return j.dJ() -return new A.I(12,j.a.K(j.r,j.f)) +if(j.nu()){o=j.a +if(j.dL().a===60){j.r=l +return new A.I(62,o.M(l,j.f))}else return new A.I(65,o.M(j.r,j.f))}return new A.I(8,j.a.M(j.r,j.f)) +case 40:return new A.I(2,j.a.M(j.r,j.f)) +case 41:return new A.I(3,j.a.M(j.r,j.f)) +case 123:return new A.I(6,j.a.M(j.r,j.f)) +case 125:return new A.I(7,j.a.M(j.r,j.f)) +case 91:return new A.I(4,j.a.M(j.r,j.f)) +case 93:if(j.af(93)&&j.af(62))return j.ca() +return new A.I(5,j.a.M(j.r,j.f)) +case 35:return new A.I(11,j.a.M(j.r,j.f)) +case 43:if(j.hj(s))return j.dL() +return new A.I(12,j.a.M(j.r,j.f)) case 45:o=j.d -if(o)return new A.I(34,j.a.K(j.r,j.f)) -else if(j.hi(s))return j.dJ() -else if(A.jY(s)||s===45)return j.dI() -return new A.I(34,j.a.K(j.r,j.f)) -case 62:return new A.I(13,j.a.K(j.r,j.f)) -case 126:if(j.af(61))return new A.I(530,j.a.K(j.r,j.f)) -return new A.I(14,j.a.K(j.r,j.f)) -case 42:if(j.af(61))return new A.I(534,j.a.K(j.r,j.f)) -return new A.I(15,j.a.K(j.r,j.f)) -case 38:return new A.I(36,j.a.K(j.r,j.f)) -case 124:if(j.af(61))return new A.I(531,j.a.K(j.r,j.f)) -return new A.I(16,j.a.K(j.r,j.f)) -case 58:return new A.I(17,j.a.K(j.r,j.f)) -case 44:return new A.I(19,j.a.K(j.r,j.f)) -case 59:return new A.I(9,j.a.K(j.r,j.f)) -case 37:return new A.I(24,j.a.K(j.r,j.f)) -case 39:return new A.I(25,j.a.K(j.r,j.f)) -case 34:return new A.I(26,j.a.K(j.r,j.f)) -case 47:if(j.af(42))return j.n4() -return new A.I(27,j.a.K(j.r,j.f)) -case 60:if(j.af(33))if(j.af(45)&&j.af(45))return j.n3() +if(o)return new A.I(34,j.a.M(j.r,j.f)) +else if(j.hj(s))return j.dL() +else if(A.jY(s)||s===45)return j.dK() +return new A.I(34,j.a.M(j.r,j.f)) +case 62:return new A.I(13,j.a.M(j.r,j.f)) +case 126:if(j.af(61))return new A.I(530,j.a.M(j.r,j.f)) +return new A.I(14,j.a.M(j.r,j.f)) +case 42:if(j.af(61))return new A.I(534,j.a.M(j.r,j.f)) +return new A.I(15,j.a.M(j.r,j.f)) +case 38:return new A.I(36,j.a.M(j.r,j.f)) +case 124:if(j.af(61))return new A.I(531,j.a.M(j.r,j.f)) +return new A.I(16,j.a.M(j.r,j.f)) +case 58:return new A.I(17,j.a.M(j.r,j.f)) +case 44:return new A.I(19,j.a.M(j.r,j.f)) +case 59:return new A.I(9,j.a.M(j.r,j.f)) +case 37:return new A.I(24,j.a.M(j.r,j.f)) +case 39:return new A.I(25,j.a.M(j.r,j.f)) +case 34:return new A.I(26,j.a.M(j.r,j.f)) +case 47:if(j.af(42))return j.n6() +return new A.I(27,j.a.M(j.r,j.f)) +case 60:if(j.af(33))if(j.af(45)&&j.af(45))return j.n5() else{o=!1 if(j.af(91)){n=j.Q.a k=n.length @@ -11298,25 +11315,25 @@ if(j.af(n.charCodeAt(0))){if(1>=k)return A.c(n,1) if(j.af(n.charCodeAt(1))){if(2>=k)return A.c(n,2) if(j.af(n.charCodeAt(2))){if(3>=k)return A.c(n,3) if(j.af(n.charCodeAt(3))){if(4>=k)return A.c(n,4) -o=j.af(n.charCodeAt(4))&&j.af(91)}}}}}if(o)return j.c9()}return new A.I(32,j.a.K(j.r,j.f)) -case 61:return new A.I(28,j.a.K(j.r,j.f)) -case 94:if(j.af(61))return new A.I(532,j.a.K(j.r,j.f)) -return new A.I(30,j.a.K(j.r,j.f)) -case 36:if(j.af(61))return new A.I(533,j.a.K(j.r,j.f)) -return new A.I(31,j.a.K(j.r,j.f)) -case 33:return j.dI() -default:if(!j.e&&s===92)return new A.I(35,j.a.K(j.r,j.f)) -if(j.c)o=(s===j.w||s===j.x)&&j.cm()===j.y +o=j.af(n.charCodeAt(4))&&j.af(91)}}}}}if(o)return j.ca()}return new A.I(32,j.a.M(j.r,j.f)) +case 61:return new A.I(28,j.a.M(j.r,j.f)) +case 94:if(j.af(61))return new A.I(532,j.a.M(j.r,j.f)) +return new A.I(30,j.a.M(j.r,j.f)) +case 36:if(j.af(61))return new A.I(533,j.a.M(j.r,j.f)) +return new A.I(31,j.a.M(j.r,j.f)) +case 33:return j.dK() +default:if(!j.e&&s===92)return new A.I(35,j.a.M(j.r,j.f)) +if(j.c)o=(s===j.w||s===j.x)&&j.co()===j.y else o=!1 -if(o){j.cl() +if(o){j.cm() o=j.r=j.f -return new A.I(508,j.a.K(o,o))}else{o=s===118 -if(o&&j.af(97)&&j.af(114)&&j.af(45))return new A.I(400,j.a.K(j.r,j.f)) -else if(o&&j.af(97)&&j.af(114)&&j.cm()===45)return new A.I(401,j.a.K(j.r,j.f)) -else if(A.jY(s)||s===45)return j.dI() -else if(s>=48&&s<=57)return j.dJ()}return new A.I(65,j.a.K(j.r,j.f))}}, -c9(){return this.bP(!1)}, -dI(){var s,r,q,p,o,n,m,l,k,j=this,i=A.i([],t.Z),h=j.f +return new A.I(508,j.a.M(o,o))}else{o=s===118 +if(o&&j.af(97)&&j.af(114)&&j.af(45))return new A.I(400,j.a.M(j.r,j.f)) +else if(o&&j.af(97)&&j.af(114)&&j.co()===45)return new A.I(401,j.a.M(j.r,j.f)) +else if(A.jY(s)||s===45)return j.dK() +else if(s>=48&&s<=57)return j.dL()}return new A.I(65,j.a.M(j.r,j.f))}}, +ca(){return this.bQ(!1)}, +dK(){var s,r,q,p,o,n,m,l,k,j=this,i=A.i([],t.Z),h=j.f j.f=j.r r=j.b s=r.length @@ -11325,7 +11342,7 @@ if(!(q=0))return A.c(r,q) p=r.charCodeAt(q) if(p===92&&j.c){o=j.f=q+1 -j.mQ(o+6) +j.mS(o+6) q=j.f if(q!==o){B.a.l(i,A.lA("0x"+B.b.t(r,o,q),null)) q=j.f @@ -11341,25 +11358,25 @@ B.a.l(i,r.charCodeAt(q))}}else{n=!0 if(q>=h)if(j.d){if(!A.jY(p))n=p>=48&&p<=57}else{if(!A.jY(p))n=p>=48&&p<=57 else n=!0 n=n||p===45}if(n){B.a.l(i,p);++j.f}else{s=q -break}}}m=j.a.K(j.r,s) -l=A.aA(i,0,null) +break}}}m=j.a.M(j.r,s) +l=A.aD(i,0,null) if(!j.d&&!j.e){s=j.r -k=A.ql(B.d1,"unit",r,s,j.f-s)}else k=-1 +k=A.qw(B.d1,"unit",r,s,j.f-s)}else k=-1 if(k===-1)k=B.b.t(r,j.r,j.f)==="!important"?505:-1 return new A.iz(l,k>=0?k:511,m)}, -dJ(){var s,r=this -r.i4() -if(r.cm()===46){r.cl() -s=r.cm() -if(s>=48&&s<=57){r.i4() -return new A.I(62,r.a.K(r.r,r.f))}else --r.f}return new A.I(60,r.a.K(r.r,r.f))}, -ns(){var s=this.f,r=this.b,q=r.length +dL(){var s,r=this +r.i5() +if(r.co()===46){r.cm() +s=r.co() +if(s>=48&&s<=57){r.i5() +return new A.I(62,r.a.M(r.r,r.f))}else --r.f}return new A.I(60,r.a.M(r.r,r.f))}, +nu(){var s=this.f,r=this.b,q=r.length if(s=0))return A.c(r,s) r=r.charCodeAt(s) r=r>=48&&r<=57}else r=!1 if(r){this.f=s+1 return!0}return!1}, -mQ(a){var s,r,q,p=this.b,o=p.length +mS(a){var s,r,q,p=this.b,o=p.length a=Math.min(a,o) while(s=this.f,s=0&&s=0))return A.c(r,s) return r.charCodeAt(s)}else return 0}, -hl(a){var s=this.f+a,r=this.b,q=r.length +hm(a){var s=this.f+a,r=this.b,q=r.length if(s=0))return A.c(r,s) return r.charCodeAt(s)}else return 0}, -cm(){return this.hl(0)}, +co(){return this.hm(0)}, af(a){var s=this.f,r=this.b,q=r.length if(s=0))return A.c(r,s) if(r.charCodeAt(s)===a){this.f=s+1 return!0}else return!1}else return!1}, -hi(a){var s,r +hj(a){var s,r if(a>=48&&a<=57)return!0 -s=this.cm() +s=this.co() if(a===46)return s>=48&&s<=57 -if(a===43||a===45){if(!(s>=48&&s<=57))if(s===46){r=this.hl(1) +if(a===43||a===45){if(!(s>=48&&s<=57))if(s===46){r=this.hm(1) r=r>=48&&r<=57}else r=!1 else r=!0 return r}return!1}, -n5(){var s,r,q,p,o=this,n=--o.f +n7(){var s,r,q,p,o=this,n=--o.f for(s=o.b,r=s.length;n=0))return A.c(s,n) p=s.charCodeAt(n) if(!(p===32||p===9||p===13))if(p===10){if(!o.c){n=o.a s=o.r -r=new A.aw(n,s,q) -r.aG(n,s,q) +r=new A.az(n,s,q) +r.aI(n,s,q) return new A.I(63,r)}}else{n=o.f=q-1 -if(o.c)return o.c9() +if(o.c)return o.ca() else{s=o.a r=o.r -q=new A.aw(s,r,n) -q.aG(s,r,n) -return new A.I(63,q)}}}return new A.I(1,o.a.K(o.r,n))}, -i4(){var s,r,q,p +q=new A.az(s,r,n) +q.aI(s,r,n) +return new A.I(63,q)}}}return new A.I(1,o.a.M(o.r,n))}, +i5(){var s,r,q,p for(s=this.b,r=s.length;q=this.f,q=0))return A.c(s,q) p=s.charCodeAt(q) if(p>=48&&p<=57)this.f=q+1 else return}}} A.ec.prototype={ -bn(){return"MessageLevel."+this.b}} +bo(){return"MessageLevel."+this.b}} A.eb.prototype={ j(a){var s=this,r=s.d&&B.dZ.a7(s.a),q=r?B.dZ.m(0,s.a):null,p=r?A.k(q):"" p=p+A.k(B.pd.m(0,s.a))+" " if(r)p+="\x1b[0m" -p=p+"on "+s.c.ig(s.b,q) +p=p+"on "+s.c.ih(s.b,q) return p.charCodeAt(0)==0?p:p}} A.j5.prototype={ -n0(a,b){var s=new A.eb(B.by,a,b,this.b.w) +n2(a,b){var s=new A.eb(B.by,a,b,this.b.w) B.a.l(this.c,s) this.a.$1(s)}} -A.ns.prototype={} -A.cs.prototype={ -M(a){return null}, +A.ny.prototype={} +A.cu.prototype={ +K(a){return null}, j(a){var s=this.a -s=A.aA(B.aA.am(s.a.c,s.b,s.c),0,null) +s=A.aD(B.aA.am(s.a.c,s.b,s.c),0,null) return s}, ga8(){return this.b}} -A.d4.prototype={ -M(a){return null}, +A.d5.prototype={ +K(a){return null}, ga8(){return"*"}} A.jV.prototype={ -M(a){return null}, +K(a){return null}, ga8(){return"&"}} A.je.prototype={ -M(a){return null}, +K(a){return null}, ga8(){return"not"}} A.jL.prototype={ -M(a){return B.a.aH(this.b,a.gfn())}} -A.d_.prototype={ +K(a){return B.a.aC(this.b,a.gfo())}} +A.d1.prototype={ gn(a){return this.b.length}, -M(a){return a.iF(this)}} -A.fL.prototype={ -M(a){this.c.M(a) +K(a){return a.iG(this)}} +A.fN.prototype={ +K(a){this.c.K(a) return null}, j(a){return this.c.b.ga8()}} -A.bc.prototype={ +A.bd.prototype={ ga8(){return this.b.ga8()}, -M(a){return t.in.a(this.b).M(a)}} -A.di.prototype={ -M(a){var s=this.b -return s instanceof A.d4||a.a.x===s.ga8().toLowerCase()}, +K(a){return t.in.a(this.b).K(a)}} +A.dj.prototype={ +K(a){var s=this.b +return s instanceof A.d5||a.a.x===s.ga8().toLowerCase()}, j(a){return this.b.ga8()}} A.j6.prototype={ -gih(){var s=this.d -if(s instanceof A.d4)s="*" +gii(){var s=this.d +if(s instanceof A.d5)s="*" else s=s==null?"":t.gx.a(s).b return s}, -M(a){return a.on(this)}, -j(a){return this.gih()+"|"+t.g9.a(this.b).b.ga8()}} -A.hW.prototype={ -nq(){var s,r=this.d +K(a){return a.oq(this)}, +j(a){return this.gii()+"|"+t.g9.a(this.b).b.ga8()}} +A.hY.prototype={ +ns(){var s,r=this.d A:{if(28===r){s="=" break A}if(530===r){s="~=" break A}if(531===r){s="|=" @@ -11500,84 +11517,84 @@ break A}if(534===r){s="*=" break A}if(535===r){s="" break A}s=null break A}return s}, -oi(){var s=this.e -if(s!=null)if(s instanceof A.cs)return s.j(0) +om(){var s=this.e +if(s!=null)if(s instanceof A.cu)return s.j(0) else return'"'+A.k(s)+'"' else return""}, -M(a){return a.oj(this)}, -j(a){return"["+this.b.ga8()+A.k(this.nq())+this.oi()+"]"}} +K(a){return a.on(this)}, +j(a){return"["+this.b.ga8()+A.k(this.ns())+this.om()+"]"}} A.iy.prototype={ -M(a){return a.a.geW()===this.b.ga8()}, +K(a){return a.a.gf_()===this.b.ga8()}, j(a){return"#"+A.k(this.b)}} -A.i3.prototype={ -M(a){var s,r=a.a +A.i5.prototype={ +K(a){var s,r=a.a r.toString s=this.b.ga8() -return new A.ia(r).d0().C(0,s)}, +return new A.ia(r).d3().C(0,s)}, j(a){return"."+A.k(this.b)}} A.ed.prototype={ -M(a){return a.op(this)}, +K(a){return a.os(this)}, j(a){return":"+this.b.ga8()}} A.ee.prototype={ -M(a){a.or(this) +K(a){a.ou(this) return!1}, j(a){var s=this.d?":":"::" return s+this.b.ga8()}} -A.fD.prototype={ -M(a){return a.oo(this)}} +A.fF.prototype={ +K(a){return a.or(this)}} A.jE.prototype={ -M(a){return a.oq(this)}} +K(a){return a.ot(this)}} A.eh.prototype={ -M(a){a.l4(this.b) +K(a){a.l6(this.b) return null}} A.jf.prototype={ -M(a){return!A.hA(this.d.M(a))}} +K(a){return!A.hC(this.d.K(a))}} A.jo.prototype={ -M(a){return null}} +K(a){return null}} A.jn.prototype={ -M(a){return null}} +K(a){return null}} A.al.prototype={ -M(a){return null}} +K(a){return null}} A.jm.prototype={ -M(a){return null}} +K(a){return null}} A.bA.prototype={ -M(a){return null}, -j(a){return this.d+A.k(A.wS(this.f))}} +K(a){return null}, +j(a){return this.d+A.k(A.x1(this.f))}} A.j0.prototype={ -M(a){return null}} +K(a){return null}} A.jz.prototype={ -M(a){return null}} +K(a){return null}} A.ib.prototype={ -M(a){return null}} +K(a){return null}} A.is.prototype={ -M(a){return null}} -A.hN.prototype={ -M(a){return null}} +K(a){return null}} +A.hP.prototype={ +K(a){return null}} A.jW.prototype={ -M(a){return null}} +K(a){return null}} A.iw.prototype={ -M(a){return null}} +K(a){return null}} A.iv.prototype={ -M(a){return null}} +K(a){return null}} A.jI.prototype={ -M(a){return null}} -A.i1.prototype={ -M(a){return null}} +K(a){return null}} +A.i3.prototype={ +K(a){return null}} A.jG.prototype={ -M(a){return null}} +K(a){return null}} A.j1.prototype={ -M(a){return null}} +K(a){return null}} A.k6.prototype={ -M(a){return null}} +K(a){return null}} A.R.prototype={} -A.ao.prototype={} +A.ap.prototype={} A.k7.prototype={ -l4(a){var s +l6(a){var s t.lR.a(a) -for(s=0;s>>0}, v(a,b){var s=this @@ -11585,16 +11602,16 @@ if(b==null)return!1 t.gF.a(b) if(s===b)return!0 return b.a.v(0,s.a)&&b.b.v(0,s.b)&&b.c===s.c}} -A.ma.prototype={ +A.mf.prototype={ $1(a){A.q(a) return!0}, $S:4} -A.mb.prototype={ +A.mg.prototype={ $0(){return""}, $S:8} -A.mc.prototype={ +A.mh.prototype={ $1(a){return t.fj.a(a).a}, -$S:70} +$S:77} A.lM.prototype={ $1(a){var s,r t.A.a(a) @@ -11611,38 +11628,38 @@ r=this.b if(!(r")),r=r.c,q=null,p=null,o=null;s.p();){n=s.d @@ -11655,52 +11672,52 @@ break case"scheme":o=m break}}if(q==null||q.length===0)throw A.f(A.S("Incorrect EPUB navigation meta: meta name is missing.")) if(p==null)throw A.f(A.S("Incorrect EPUB navigation meta: meta content is missing.")) -B.a.l(this.a,new A.f5(q,p,o))}}, +B.a.l(this.a,new A.f7(q,p,o))}}, $S:2} -A.mU.prototype={ +A.n_.prototype={ $1(a){return t.q.a(a)!=null}, $S:5} -A.mW.prototype={ +A.n1.prototype={ $1(a){t.P.a(a) -if(a.b.ga_().toLowerCase()==="navpoint")B.a.l(this.a,A.rH(a))}, +if(a.b.ga_().toLowerCase()==="navpoint")B.a.l(this.a,A.rR(a))}, $S:2} -A.mV.prototype={ +A.n0.prototype={ $1(a){t.P.a(a) -if(a.b.ga_().toLowerCase()==="li")B.a.l(this.a,A.wi(a))}, +if(a.b.ga_().toLowerCase()==="li")B.a.l(this.a,A.ws(a))}, $S:2} -A.mX.prototype={ +A.n2.prototype={ $1(a){t.P.a(a) -switch(a.b.ga_().toLowerCase()){case"navlabel":B.a.l(this.a,A.mT(a)) +switch(a.b.ga_().toLowerCase()){case"navlabel":B.a.l(this.a,A.mZ(a)) break -case"content":A.qb(a) +case"content":A.qm(a) break}}, $S:2} -A.mZ.prototype={ +A.n4.prototype={ $1(a){t.P.a(a) -switch(a.b.ga_().toLowerCase()){case"navlabel":B.a.l(this.b,A.mT(a)) +switch(a.b.ga_().toLowerCase()){case"navlabel":B.a.l(this.b,A.mZ(a)) break -case"content":this.a.a=A.qb(a) +case"content":this.a.a=A.qm(a) break -case"navpoint":B.a.l(this.c,A.rH(a)) +case"navpoint":B.a.l(this.c,A.rR(a)) break}}, $S:2} -A.mY.prototype={ +A.n3.prototype={ $1(a){var s,r,q,p t.P.a(a) -switch(a.b.ga_().toLowerCase()){case"a":case"span":B.a.l(this.b,new A.cS(B.b.ba(A.cH(a)))) -this.a.a=A.wa(a) +switch(a.b.ga_().toLowerCase()){case"a":case"span":B.a.l(this.b,new A.cU(B.b.ba(A.cJ(a)))) +this.a.a=A.wk(a) break -case"ol":for(s=A.rG(a).a,r=s.length,q=this.c,p=0;p")),r=r.c,q=null,p=null,o=null;s.p();){n=s.d @@ -11713,9 +11730,9 @@ break case"href":o=m break}}if(q==null||q.length===0)throw A.f(A.S("Incorrect EPUB guide: item type is missing")) if(o==null||o.length===0)throw A.f(A.S("Incorrect EPUB guide: item href is missing")) -B.a.l(this.a,new A.eZ(q,p,o))}}, +B.a.l(this.a,new A.f0(q,p,o))}}, $S:2} -A.n9.prototype={ +A.nf.prototype={ $1(a){var s,r,q,p,o,n,m,l,k,j,i,h,g,f=null t.P.a(a) if(a.b.ga_().toLowerCase()==="item"){for(s=a.y$.a,r=A.w(s),s=new J.J(s,s.length,r.h("J<1>")),r=r.c,q=f,p=q,o=p,n=o,m=n,l=m,k=l,j=k,i=j;s.p();){h=s.d @@ -11741,282 +11758,282 @@ case"properties":q=g break}}if(i==null||i.length===0)throw A.f(A.S("Incorrect EPUB manifest: item ID is missing")) if(j==null||j.length===0)throw A.f(A.S("Incorrect EPUB manifest: item href is missing")) if(k==null||k.length===0)throw A.f(A.S("Incorrect EPUB manifest: item media type is missing")) -B.a.l(this.a,new A.dk(i,j,k,l,m,n,o,p,q))}}, +B.a.l(this.a,new A.dl(i,j,k,l,m,n,o,p,q))}}, $S:2} -A.na.prototype={ +A.ng.prototype={ $1(a){var s,r,q,p,o,n,m=this t.P.a(a) -s=A.cH(a) +s=A.cJ(a) r=a.b q=r.ga_().toLowerCase() A:{if("title"===q){r=B.a.l(m.b,s) -break A}if("creator"===q){r=B.a.l(m.c,A.wp(a)) +break A}if("creator"===q){r=B.a.l(m.c,A.wz(a)) break A}if("subject"===q){r=B.a.l(m.d,s) break A}if("description"===q){m.a.a=s r=s break A}if("publisher"===q){r=B.a.l(m.e,s) -break A}if("contributor"===q){r=B.a.l(m.f,A.wo(a)) -break A}if("date"===q){p=a.fq("event",r.gcV()) +break A}if("contributor"===q){r=B.a.l(m.f,A.wy(a)) +break A}if("date"===q){p=a.fs("event",r.gcX()) o=p!=null&&p.length!==0?p:null -r=B.a.l(m.r,new A.f0(A.cH(a),o)) +r=B.a.l(m.r,new A.f2(A.cJ(a),o)) break A}if("type"===q){r=B.a.l(m.w,s) break A}if("format"===q){r=B.a.l(m.x,s) -break A}if("identifier"===q){r=B.a.l(m.y,A.wq(a)) +break A}if("identifier"===q){r=B.a.l(m.y,A.wA(a)) break A}if("source"===q){r=B.a.l(m.z,s) break A}if("language"===q){r=B.a.l(m.Q,s) break A}if("relation"===q){r=B.a.l(m.as,s) break A}if("coverage"===q){r=B.a.l(m.at,s) break A}if("rights"===q){r=B.a.l(m.ax,s) break A}n="meta"===q -if(n&&m.ay===B.bG){r=B.a.l(m.ch,A.wr(a)) -break A}if(n&&m.ay===B.cT){r=B.a.l(m.ch,A.ws(a)) +if(n&&m.ay===B.bG){r=B.a.l(m.ch,A.wB(a)) +break A}if(n&&m.ay===B.cT){r=B.a.l(m.ch,A.wC(a)) break A}r=null break A}return r}, $S:2} -A.nb.prototype={ +A.nh.prototype={ $1(a){return t.u.a(a).a===this.a}, $S:9} -A.nc.prototype={ +A.ni.prototype={ $1(a){return t.q.a(a)!=null}, $S:5} -A.nd.prototype={ +A.nj.prototype={ $1(a){return t.q.a(a)!=null}, $S:5} -A.ne.prototype={ +A.nk.prototype={ $1(a){return t.q.a(a)!=null}, $S:5} -A.nf.prototype={ +A.nl.prototype={ $1(a){return t.q.a(a)!=null}, $S:5} -A.ng.prototype={ +A.nm.prototype={ $1(a){return t.q.a(a)!=null}, $S:5} -A.nh.prototype={ +A.nn.prototype={ $1(a){var s,r,q t.P.a(a) -if(a.b.ga_().toLowerCase()==="itemref"){s=a.cd("idref") +if(a.b.ga_().toLowerCase()==="itemref"){s=a.ce("idref") if(s==null||s.length===0)throw A.f(A.S("Incorrect EPUB spine: item ID ref is missing")) -r=a.cd("linear") +r=a.ce("linear") q=r==null||r.toLowerCase()==="no" -B.a.l(this.a,new A.fa(s,q))}}, +B.a.l(this.a,new A.fc(s,q))}}, $S:2} -A.nD.prototype={ +A.nJ.prototype={ $1(a){return t.u.a(a).a==="META-INF/container.xml"}, $S:9} -A.nE.prototype={ +A.nK.prototype={ $1(a){return t.q.a(a)!=null}, $S:5} -A.nF.prototype={ +A.nL.prototype={ $1(a){t.I.a(a) -return a instanceof A.aG&&"rootfile"===a.b.ga_()}, -$S:29} -A.eY.prototype={ +return a instanceof A.aI&&"rootfile"===a.b.ga_()}, +$S:35} +A.f_.prototype={ gq(a){var s=this -return(B.b.gq(s.b)^B.b.gq(s.c)^A.dy(s.d)^s.e.gq(0)^J.B(s.f))>>>0}, +return(B.b.gq(s.b)^B.b.gq(s.c)^A.dy(s.d)^s.e.gq(0)^J.C(s.f))>>>0}, v(a,b){var s=this if(b==null)return!1 t.gw.a(b) if(s===b)return!0 -return b.b===s.b&&b.c===s.c&&B.l.gar().$2(b.d,s.d)&&b.e.v(0,s.e)&&J.N(b.f,s.f)}} -A.bg.prototype={} +return b.b===s.b&&b.c===s.c&&B.l.gau().$2(b.d,s.d)&&b.e.v(0,s.e)&&J.O(b.f,s.f)}} +A.bh.prototype={} A.bu.prototype={ -gq(a){var s=this,r=J.B(s.a),q=B.b.gq(s.b),p=B.b.gq(s.c),o=J.B(s.d),n=B.l.gdM().$1(s.e) -if(typeof n!=="number")return A.aN(n) +gq(a){var s=this,r=J.C(s.a),q=B.b.gq(s.b),p=B.b.gq(s.c),o=J.C(s.d),n=B.l.gdO().$1(s.e) +if(typeof n!=="number")return A.aQ(n) return(r^q^p^o^n)>>>0}, v(a,b){var s=this if(b==null)return!1 t.k5.a(b) if(s===b)return!0 -return J.N(b.a,s.a)&&b.b===s.b&&b.c===s.c&&b.d==s.d&&B.l.gar().$2(b.e,s.e)}, -fb(){var s=0,r=A.br(t.N),q,p=this -var $async$fb=A.bs(function(a,b){if(a===1)return A.bo(b,r) -for(;;)switch(s){case 0:q=p.a.dU() +return J.O(b.a,s.a)&&b.b===s.b&&b.c===s.c&&b.d==s.d&&B.l.gau().$2(b.e,s.e)}, +dY(){var s=0,r=A.br(t.N),q,p=this +var $async$dY=A.bs(function(a,b){if(a===1)return A.bo(b,r) +for(;;)switch(s){case 0:q=p.a.dX() s=1 break case 1:return A.bp(q,r)}}) -return A.bq($async$fb,r)}, +return A.bq($async$dY,r)}, j(a){return"Title: "+this.b+", Subchapter count: "+this.e.length}} -A.dj.prototype={ +A.dk.prototype={ gq(a){var s=this -return(s.a.gq(0)^B.b.gq(s.b)^J.B(s.c)^B.b.gq(s.d))>>>0}, +return(s.a.gq(0)^B.b.gq(s.b)^J.C(s.c)^B.b.gq(s.d))>>>0}, v(a,b){var s=this if(b==null)return!1 if(s===b)return!0 -return b instanceof A.dj&&b.b===s.b&&b.c==s.c&&b.d===s.d}, -ft(){var s=this.a,r=A.qr(s.e.c,this.b),q=A.bI(new A.cE(s.a.a,t.bW),new A.lU(r),t.u) +return b instanceof A.dk&&b.b===s.b&&b.c==s.c&&b.d===s.d}, +fu(){var s=this.a,r=A.qC(s.e.c,this.b),q=A.bJ(new A.cG(s.a.a,t.bW),new A.lU(r),t.u) if(q==null)throw A.f(A.S("EPUB parsing error: file "+r+" not found in archive.")) return q}, -f3(a){var s=0,r=A.br(t.L),q,p=this,o,n -var $async$f3=A.bs(function(b,c){if(b===1)return A.bo(c,r) +f7(a){var s=0,r=A.br(t.L),q,p=this,o,n +var $async$f7=A.bs(function(b,c){if(b===1)return A.bo(c,r) for(;;)switch(s){case 0:o=A.i([],t.Z) -n=a.bQ() -if((n==null?$.dd():n).length===0)throw A.f(A.S('Incorrect EPUB file: content file "'+p.b+'" specified in manifest is not found.')) -n=a.bQ() -B.a.a1(o,n==null?$.dd():n) +n=a.bR() +if((n==null?$.de():n).length===0)throw A.f(A.S('Incorrect EPUB file: content file "'+p.b+'" specified in manifest is not found.')) +n=a.bR() +B.a.a1(o,n==null?$.de():n) q=o s=1 break case 1:return A.bp(q,r)}}) -return A.bq($async$f3,r)}, -nB(a){var s=A.i([],t.Z),r=a.bQ() -if((r==null?$.dd():r).length===0)throw A.f(A.S('Incorrect EPUB file: content file "'+this.b+'" specified in manifest is not found.')) -r=a.bQ() -B.a.a1(s,r==null?$.dd():r) +return A.bq($async$f7,r)}, +nD(a){var s=A.i([],t.Z),r=a.bR() +if((r==null?$.de():r).length===0)throw A.f(A.S('Incorrect EPUB file: content file "'+this.b+'" specified in manifest is not found.')) +r=a.bR() +B.a.a1(s,r==null?$.de():r) return s}, -d1(){var s=0,r=A.br(t.L),q,p=this -var $async$d1=A.bs(function(a,b){if(a===1)return A.bo(b,r) +d4(){var s=0,r=A.br(t.L),q,p=this +var $async$d4=A.bs(function(a,b){if(a===1)return A.bo(b,r) for(;;)switch(s){case 0:s=3 -return A.c3(p.f3(p.ft()),$async$d1) +return A.bF(p.f7(p.fu()),$async$d4) case 3:q=b s=1 break case 1:return A.bp(q,r)}}) -return A.bq($async$d1,r)}, -dU(){var s=0,r=A.br(t.N),q,p=this,o -var $async$dU=A.bs(function(a,b){if(a===1)return A.bo(b,r) +return A.bq($async$d4,r)}, +dX(){var s=0,r=A.br(t.N),q,p=this,o +var $async$dX=A.bs(function(a,b){if(a===1)return A.bo(b,r) for(;;)switch(s){case 0:o=B.E s=3 -return A.c3(p.d1(),$async$dU) +return A.bF(p.d4(),$async$dX) case 3:q=o.b0(b) s=1 break case 1:return A.bp(q,r)}}) -return A.bq($async$dU,r)}} +return A.bq($async$dX,r)}} A.lU.prototype={ $1(a){return t.u.a(a).a===this.a}, $S:9} A.ih.prototype={ -gq(a){var s,r,q,p=this,o=B.l.gdM(),n=o.$1(p.a),m=o.$1(p.b) -if(typeof n!=="number")return n.jT() -if(typeof m!=="number")return A.aN(m) +gq(a){var s,r,q,p=this,o=B.l.gdO(),n=o.$1(p.a),m=o.$1(p.b) +if(typeof n!=="number")return n.jU() +if(typeof m!=="number")return A.aQ(m) s=o.$1(p.c) -if(typeof s!=="number")return A.aN(s) +if(typeof s!=="number")return A.aQ(s) r=o.$1(p.d) -if(typeof r!=="number")return A.aN(r) +if(typeof r!=="number")return A.aQ(r) q=o.$1(p.e) -if(typeof q!=="number")return A.aN(q) +if(typeof q!=="number")return A.aQ(q) return(n^m^s^r^q)>>>0}, v(a,b){var s,r=this if(b==null)return!1 t.aN.a(b) if(r===b)return!0 -s=B.l.gar() +s=B.l.gau() return s.$2(b.a,r.a)&&s.$2(b.b,r.b)&&s.$2(b.c,r.c)&&s.$2(b.d,r.d)&&s.$2(b.e,r.e)}} -A.fb.prototype={ +A.fd.prototype={ gq(a){var s=this -return(s.a.gq(0)^B.b.gq(s.b)^B.b.gq(s.d)^J.B(s.c))>>>0}, +return(s.a.gq(0)^B.b.gq(s.b)^B.b.gq(s.d)^J.C(s.c))>>>0}, v(a,b){var s=this if(b==null)return!1 t.am.a(b) if(s===b)return!0 return b.a.v(0,s.a)&&b.b===s.b&&b.d===s.d&&b.c==s.c}} -A.f3.prototype={ -gq(a){return J.B(this.a)^J.B(this.b)}, +A.f5.prototype={ +gq(a){return J.C(this.a)^J.C(this.b)}, v(a,b){if(b==null)return!1 t.j1.a(b) if(this===b)return!0 return b.a==this.a&&b.b==this.b}, j(a){return"Source: "+A.k(this.b)}} -A.f2.prototype={ +A.f4.prototype={ gq(a){var s=this -return(J.B(s.a)^B.l.Y(s.b.a)^B.l.Y(s.c)^B.l.Y(s.d.a)^J.B(s.e)^B.l.Y(s.f))>>>0}, +return(J.C(s.a)^B.l.Y(s.b.a)^B.l.Y(s.c)^B.l.Y(s.d.a)^J.C(s.e)^B.l.Y(s.f))>>>0}, v(a,b){var s,r=this if(b==null)return!1 t.kZ.a(b) if(r===b)return!0 -s=B.l.gar() -return J.N(b.a,r.a)&&b.b.v(0,r.b)&&s.$2(b.c,r.c)&&b.d.v(0,r.d)&&J.N(b.e,r.e)&&s.$2(b.f,r.f)}} -A.cm.prototype={ +s=B.l.gau() +return J.O(b.a,r.a)&&b.b.v(0,r.b)&&s.$2(b.c,r.c)&&b.d.v(0,r.d)&&J.O(b.e,r.e)&&s.$2(b.f,r.f)}} +A.co.prototype={ gq(a){return B.l.Y(this.a)}, v(a,b){if(b==null)return!1 t.ck.a(b) if(this===b)return!0 -return B.l.gar().$2(b.a,this.a)}} -A.f4.prototype={ +return B.l.gau().$2(b.a,this.a)}} +A.f6.prototype={ gq(a){return B.l.Y(this.a)}, v(a,b){if(b==null)return!1 t.f5.a(b) if(this===b)return!0 -return B.l.gar().$2(b.a,this.a)}} +return B.l.gau().$2(b.a,this.a)}} A.il.prototype={ gq(a){return B.l.Y(this.a)}, v(a,b){if(b==null)return!1 t.aw.a(b) if(this===b)return!0 -return B.l.gar().$2(b.a,this.a)}} -A.f5.prototype={ -gq(a){return B.b.gq(this.a)^B.b.gq(this.b)^J.B(this.c)}, +return B.l.gau().$2(b.a,this.a)}} +A.f7.prototype={ +gq(a){return B.b.gq(this.a)^B.b.gq(this.b)^J.C(this.c)}, v(a,b){var s=this if(b==null)return!1 t.eo.a(b) if(s===b)return!0 return b.a===s.a&&b.b===s.b&&b.c==s.c}} -A.cS.prototype={ +A.cU.prototype={ gq(a){return B.b.gq(this.a)}, v(a,b){if(b==null)return!1 t.gK.a(b) if(this===b)return!0 return b.a===this.a}, j(a){return this.a}} -A.cn.prototype={ +A.cp.prototype={ gq(a){var s=this -return(J.B(s.a)^J.B(s.b)^B.l.Y(s.c)^B.l.Y(s.d))>>>0}, +return(J.C(s.a)^J.C(s.b)^B.l.Y(s.c)^B.l.Y(s.d))>>>0}, v(a,b){var s,r=this if(b==null)return!1 t.c9.a(b) if(r===b)return!0 -s=B.l.gar() +s=B.l.gau() return b.a==r.a&&b.b==r.b&&s.$2(b.c,r.c)&&s.$2(b.d,r.d)}} -A.f6.prototype={ +A.f8.prototype={ gq(a){return B.l.Y(this.a)}, v(a,b){if(b==null)return!1 t.ni.a(b) if(this===b)return!0 -return B.l.gar().$2(b.a,this.a)}} +return B.l.gau().$2(b.a,this.a)}} A.im.prototype={ gq(a){return B.l.Y(this.a)}, v(a,b){if(b==null)return!1 t.eH.a(b) if(this===b)return!0 -return B.l.gar().$2(b.a,this.a)}} -A.f7.prototype={ +return B.l.gau().$2(b.a,this.a)}} +A.f9.prototype={ gq(a){var s=this -return(J.B(s.a)^J.B(s.b)^B.cU.gq(s.c)^J.B(s.d)^J.B(s.e)^B.l.Y(s.f)^B.cU.gq(s.r))>>>0}, +return(J.C(s.a)^J.C(s.b)^B.cU.gq(s.c)^J.C(s.d)^J.C(s.e)^B.l.Y(s.f)^B.cU.gq(s.r))>>>0}, v(a,b){var s=this if(b==null)return!1 t.on.a(b) if(s===b)return!0 -return b.a==s.a&&b.b==s.b&&b.d==s.d&&b.e==s.e&&B.l.gar().$2(b.f,s.f)&&!0}} -A.cT.prototype={ -bn(){return"EpubNavigationPageTargetType."+this.b}} -A.co.prototype={ +return b.a==s.a&&b.b==s.b&&b.d==s.d&&b.e==s.e&&B.l.gau().$2(b.f,s.f)&&!0}} +A.cV.prototype={ +bo(){return"EpubNavigationPageTargetType."+this.b}} +A.cq.prototype={ gq(a){var s=this -return(J.B(s.a)^J.B(s.b)^J.B(s.c)^B.l.Y(s.d)^J.B(s.e)^B.l.Y(s.f))>>>0}, +return(J.C(s.a)^J.C(s.b)^J.C(s.c)^B.l.Y(s.d)^J.C(s.e)^B.l.Y(s.f))>>>0}, v(a,b){var s,r=this if(b==null)return!1 t.iV.a(b) if(r===b)return!0 -s=B.l.gar() -return b.a==r.a&&b.b==r.b&&b.c==r.c&&s.$2(b.d,r.d)&&J.N(b.e,r.e)&&s.$2(b.f,r.f)}, +s=B.l.gau() +return b.a==r.a&&b.b==r.b&&b.c==r.c&&s.$2(b.d,r.d)&&J.O(b.e,r.e)&&s.$2(b.f,r.f)}, j(a){var s=this.e s=s==null?null:s.b return"Id: "+A.k(this.a)+", Content.Source: "+A.k(s)}} -A.f8.prototype={ +A.fa.prototype={ gq(a){var s=this -return(B.b.gq(s.a)^J.B(s.b)^J.B(s.c)^J.B(s.d)^B.l.Y(s.e)^J.B(s.f))>>>0}, +return(B.b.gq(s.a)^J.C(s.b)^J.C(s.c)^J.C(s.d)^B.l.Y(s.e)^J.C(s.f))>>>0}, v(a,b){var s=this if(b==null)return!1 t.p7.a(b) if(s===b)return!0 -return b.a===s.a&&b.b==s.b&&b.c==s.c&&b.d==s.d&&B.l.gar().$2(b.e,s.e)&&J.N(b.f,s.f)}} +return b.a===s.a&&b.b==s.b&&b.c==s.c&&b.d==s.d&&B.l.gau().$2(b.e,s.e)&&J.O(b.f,s.f)}} A.ii.prototype={ gq(a){return B.l.Y(this.a)}, v(a,b){if(b==null)return!1 t.fc.a(b) if(this===b)return!0 -return B.l.gar().$2(b.a,this.a)}} -A.eZ.prototype={ -gq(a){return B.b.gq(this.a)^J.B(this.b)^B.b.gq(this.c)}, +return B.l.gau().$2(b.a,this.a)}} +A.f0.prototype={ +gq(a){return B.b.gq(this.a)^J.C(this.b)^B.b.gq(this.c)}, v(a,b){var s=this if(b==null)return!1 t.iA.a(b) @@ -12028,10 +12045,10 @@ gq(a){return B.l.Y(this.a)}, v(a,b){if(b==null)return!1 t.pd.a(b) if(this===b)return!0 -return B.l.gar().$2(b.a,this.a)}} -A.dk.prototype={ +return B.l.gau().$2(b.a,this.a)}} +A.dl.prototype={ gq(a){var s=this -return B.b.gq(s.a)^B.b.gq(s.b)^B.b.gq(s.c)^J.B(s.d)^J.B(s.e)^J.B(s.f)^J.B(s.r)^J.B(s.w)^J.B(s.x)}, +return B.b.gq(s.a)^B.b.gq(s.b)^B.b.gq(s.c)^J.C(s.d)^J.C(s.e)^J.C(s.f)^J.C(s.r)^J.C(s.w)^J.C(s.x)}, v(a,b){var s=this if(b==null)return!1 t.A.a(b) @@ -12040,95 +12057,95 @@ return b.a===s.a&&b.b===s.b&&b.c===s.c&&b.d==s.d&&b.e==s.e&&b.f==s.f&&b.r==s.r&& j(a){var s=this return"Id: "+s.a+", Href = "+s.b+", MediaType = "+s.c+", Properties = "+A.k(s.x)+", MediaOverlay = "+A.k(s.d)}} A.ik.prototype={ -gq(a){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e=this,d=B.l.gdM(),c=d.$1(e.a),b=d.$1(e.b) -if(typeof c!=="number")return c.jT() -if(typeof b!=="number")return A.aN(b) +gq(a){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e=this,d=B.l.gdO(),c=d.$1(e.a),b=d.$1(e.b) +if(typeof c!=="number")return c.jU() +if(typeof b!=="number")return A.aQ(b) s=d.$1(e.c) -if(typeof s!=="number")return A.aN(s) -r=J.B(e.d) +if(typeof s!=="number")return A.aQ(s) +r=J.C(e.d) q=d.$1(e.e) -if(typeof q!=="number")return A.aN(q) +if(typeof q!=="number")return A.aQ(q) p=d.$1(e.f) -if(typeof p!=="number")return A.aN(p) +if(typeof p!=="number")return A.aQ(p) o=d.$1(e.r) -if(typeof o!=="number")return A.aN(o) +if(typeof o!=="number")return A.aQ(o) n=d.$1(e.w) -if(typeof n!=="number")return A.aN(n) +if(typeof n!=="number")return A.aQ(n) m=d.$1(e.x) -if(typeof m!=="number")return A.aN(m) +if(typeof m!=="number")return A.aQ(m) l=d.$1(e.y) -if(typeof l!=="number")return A.aN(l) +if(typeof l!=="number")return A.aQ(l) k=d.$1(e.z) -if(typeof k!=="number")return A.aN(k) +if(typeof k!=="number")return A.aQ(k) j=d.$1(e.Q) -if(typeof j!=="number")return A.aN(j) +if(typeof j!=="number")return A.aQ(j) i=d.$1(e.as) -if(typeof i!=="number")return A.aN(i) +if(typeof i!=="number")return A.aQ(i) h=d.$1(e.at) -if(typeof h!=="number")return A.aN(h) +if(typeof h!=="number")return A.aQ(h) g=d.$1(e.ax) -if(typeof g!=="number")return A.aN(g) +if(typeof g!=="number")return A.aQ(g) f=d.$1(e.ay) -if(typeof f!=="number")return A.aN(f) +if(typeof f!=="number")return A.aQ(f) return(c^b^s^r^q^p^o^n^m^l^k^j^i^h^g^f)>>>0}, v(a,b){var s,r=this if(b==null)return!1 t.mz.a(b) if(r===b)return!0 -s=B.l.gar() +s=B.l.gau() return s.$2(b.a,r.a)&&s.$2(b.b,r.b)&&s.$2(b.c,r.c)&&b.d==r.d&&s.$2(b.e,r.e)&&s.$2(b.f,r.f)&&s.$2(b.r,r.r)&&s.$2(b.w,r.w)&&s.$2(b.x,r.x)&&s.$2(b.y,r.y)&&s.$2(b.z,r.z)&&s.$2(b.Q,r.Q)&&s.$2(b.as,r.as)&&s.$2(b.at,r.at)&&s.$2(b.ax,r.ax)&&s.$2(b.ay,r.ay)}} -A.f_.prototype={ -gq(a){return B.b.gq(this.a)^J.B(this.b)^J.B(this.c)}, +A.f1.prototype={ +gq(a){return B.b.gq(this.a)^J.C(this.b)^J.C(this.c)}, v(a,b){var s=this if(b==null)return!1 t.ib.a(b) if(s===b)return!0 return b.a===s.a&&b.b==s.b&&b.c==s.c}} -A.dl.prototype={ -gq(a){return B.b.gq(this.a)^J.B(this.b)^J.B(this.c)}, +A.dm.prototype={ +gq(a){return B.b.gq(this.a)^J.C(this.b)^J.C(this.c)}, v(a,b){var s=this if(b==null)return!1 t.fj.a(b) if(s===b)return!0 return b.a===s.a&&b.b==s.b&&b.c==s.c}} -A.f0.prototype={ -gq(a){return B.b.gq(this.a)^J.B(this.b)}, +A.f2.prototype={ +gq(a){return B.b.gq(this.a)^J.C(this.b)}, v(a,b){if(b==null)return!1 t.fW.a(b) if(this===b)return!0 return b.a===this.a&&b.b==this.b}} -A.f1.prototype={ -gq(a){return J.B(this.a)^J.B(this.b)^B.b.gq(this.c)}, +A.f3.prototype={ +gq(a){return J.C(this.a)^J.C(this.b)^B.b.gq(this.c)}, v(a,b){var s=this if(b==null)return!1 t.mv.a(b) if(s===b)return!0 return b.a==s.a&&b.b==s.b&&b.c===s.c}} -A.cR.prototype={ +A.cT.prototype={ gq(a){var s=this -return(J.B(s.a)^J.B(s.b)^J.B(s.c)^J.B(s.d)^J.B(s.e)^J.B(s.f)^B.l.Y(s.r))>>>0}, +return(J.C(s.a)^J.C(s.b)^J.C(s.c)^J.C(s.d)^J.C(s.e)^J.C(s.f)^B.l.Y(s.r))>>>0}, v(a,b){var s=this if(b==null)return!1 t.az.a(b) if(s===b)return!0 -return b.a==s.a&&b.b==s.b&&b.c==s.c&&b.d==s.d&&b.e==s.e&&b.f==s.f&&B.l.gar().$2(b.r,s.r)}} +return b.a==s.a&&b.b==s.b&&b.c==s.c&&b.d==s.d&&b.e==s.e&&b.f==s.f&&B.l.gau().$2(b.r,s.r)}} A.io.prototype={ gq(a){var s=this -return(A.dy(s.a)^s.b.gq(0)^B.l.Y(s.c.a)^s.d.gq(0)^J.B(s.e))>>>0}, +return(A.dy(s.a)^s.b.gq(0)^B.l.Y(s.c.a)^s.d.gq(0)^J.C(s.e))>>>0}, v(a,b){var s=this if(b==null)return!1 t.hl.a(b) if(s===b)return!0 -return b.a===s.a&&b.b.v(0,s.b)&&b.c.v(0,s.c)&&b.d.v(0,s.d)&&J.N(b.e,s.e)}} +return b.a===s.a&&b.b.v(0,s.b)&&b.c.v(0,s.c)&&b.d.v(0,s.d)&&J.O(b.e,s.e)}} A.iq.prototype={ -gq(a){var s=J.B(this.a),r=B.l.Y(this.b),q=this.c?519018:218159 +gq(a){var s=J.C(this.a),r=B.l.Y(this.b),q=this.c?519018:218159 return(s^r^q)>>>0}, v(a,b){var s=this if(b==null)return!1 t.oe.a(b) if(s===b)return!0 -return b.a==s.a&&B.l.gar().$2(b.b,s.b)&&b.c===s.c}} -A.fa.prototype={ +return b.a==s.a&&B.l.gau().$2(b.b,s.b)&&b.c===s.c}} +A.fc.prototype={ gq(a){var s=B.b.gq(this.a) return s^(this.b?519018:218159)}, v(a,b){if(b==null)return!1 @@ -12137,22 +12154,22 @@ if(this===b)return!0 return b.a===this.a&&b.b===this.b}, j(a){return"IdRef: "+this.a}} A.ir.prototype={ -bn(){return"EpubVersion."+this.b}} +bo(){return"EpubVersion."+this.b}} A.ig.prototype={ -iO(a){var s,r,q={} +iP(a){var s,r,q={} q.a=a -q.a=A.ch(this.$ti.c).j(0)+"."+a -try{s=B.a.cp(this.a,new A.lT(q,this)) +q.a=A.ck(this.$ti.c).j(0)+"."+a +try{s=B.a.cr(this.a,new A.lT(q,this)) return s}catch(r){return null}}} A.lT.prototype={ -$1(a){return J.ay(this.b.$ti.c.a(a)).toUpperCase()===this.a.a.toUpperCase()}, +$1(a){return J.ao(this.b.$ti.c.a(a)).toUpperCase()===this.a.a.toUpperCase()}, $S(){return this.b.$ti.h("A(1)")}} -A.aO.prototype={ +A.aR.prototype={ j(a){var s=this.a,r=this.b return s!=null?s+":"+r:r}, -gq(a){return 37*(37*(J.B(this.a)&2097151)+B.b.gq(this.b)&2097151)+B.b.gq(this.c)&1073741823}, +gq(a){return 37*(37*(J.C(this.a)&2097151)+B.b.gq(this.b)&2097151)+B.b.gq(this.c)&1073741823}, ai(a,b){var s,r,q -if(!(b instanceof A.aO))return 1 +if(!(b instanceof A.aR))return 1 s=this.a if(s==null)s="" r=b.a @@ -12162,135 +12179,146 @@ q=B.b.ai(this.b,b.b) if(q!==0)return q return B.b.ai(this.c,b.c)}, v(a,b){if(b==null)return!1 -return b instanceof A.aO&&this.a==b.a&&this.b===b.b&&this.c===b.c}, -$ia6:1} +return b instanceof A.aR&&this.a==b.a&&this.b===b.b&&this.c===b.c}, +$ia7:1} A.kQ.prototype={} -A.oU.prototype={} +A.p1.prototype={} A.kI.prototype={} A.am.prototype={ -gL(){var s,r=this,q=r.c +gJ(){var s,r=this,q=r.c if(q===$){s=A.i([],t.cx) -r.c!==$&&A.dc() +r.c!==$&&A.dd() q=r.c=new A.ji(r,s)}return q}, -fQ(a){var s,r,q -for(s=this.gL().a,r=A.w(s),s=new J.J(s,s.length,r.h("J<1>")),r=r.c;s.p();){q=s.d;(q==null?r.a(q):q).cg(a)}}, -dW(a){var s=this.a -if(s!=null)B.a.W(s.gL().a,this) +fR(a){var s,r,q +for(s=this.gJ().a,r=A.w(s),s=new J.J(s,s.length,r.h("J<1>")),r=r.c;s.p();){q=s.d;(q==null?r.a(q):q).ci(a)}}, +e_(a){var s=this.a +if(s!=null)B.a.W(s.gJ().a,this) return this}, -nb(a,b){var s -if(b==null)this.gL().l(0,a) -else{s=this.gL() -s.bx(0,s.al(s,b),a)}}, -df(a,b,c){var s,r,q,p,o -A.uj(c,t.fh,"T","_clone") +nd(a,b){var s +if(b==null)this.gJ().l(0,a) +else{s=this.gJ() +s.by(0,s.aj(s,b),a)}}, +ob(a){var s,r=this,q=r.a +if(q==null)throw A.f(A.a6("Node must have a parent to replace it.")) +q=q.gJ() +s=r.a.gJ() +q.k(0,s.aj(s,r),a) +return r}, +dj(a,b,c){var s,r,q,p,o +A.ut(c,t.fh,"T","_clone") c.a(a) -if(b)for(s=this.gL().a,r=A.w(s),s=new J.J(s,s.length,r.h("J<1>")),r=r.c;s.p();){q=s.d -q=(q==null?r.a(q):q).cM(!0) -p=a.gL() +if(b)for(s=this.gJ().a,r=A.w(s),s=new J.J(s,s.length,r.h("J<1>")),r=r.c;s.p();){q=s.d +q=(q==null?r.a(q):q).cO(!0) +p=a.gJ() o=q.a -if(o!=null)B.a.W(o.gL().a,q) +if(o!=null)B.a.W(o.gJ().a,q) q.a=p.b -p.bW(0,q)}return a}, +p.bX(0,q)}return a}, saZ(a){this.b=t.oP.a(a)}} -A.eT.prototype={ +A.eU.prototype={ +gaq(){return 9}, j(a){return"#document"}, -cg(a){return this.fQ(a)}, -cM(a){return this.df(A.ro(),!0,t.dA)}} -A.i9.prototype={ +ci(a){return this.fR(a)}, +cO(a){return this.dj(A.rz(),!0,t.dA)}} +A.eV.prototype={ +gaq(){return 10}, j(a){var s,r=this,q=r.x,p=q==null if(!p||r.y!=null){if(p)q="" s=r.y if(s==null)s="" return"'}else return""}, -cg(a){var s=this.j(0) +ci(a){var s=this.j(0) a.a+=s}, -cM(a){return A.rp(this.w,this.x,this.y)}} -A.bY.prototype={ -j(a){var s=J.ay(this.w) +cO(a){return A.rA(this.w,this.x,this.y)}} +A.c0.prototype={ +gaq(){return 3}, +j(a){var s=J.ao(this.w) this.w=s return'"'+s+'"'}, -cg(a){return A.zF(a,this)}, -cM(a){var s=J.ay(this.w) +ci(a){return A.zM(a,this)}, +cO(a){var s=J.ao(this.w) this.w=s -return A.qk(s)}, -hM(a){var s=this.w;(!(s instanceof A.Y)?this.w=new A.Y(A.k(s)):s).a+=a}} +return A.qv(s)}, +hN(a){var s=this.w;(!(s instanceof A.X)?this.w=new A.X(A.k(s)):s).a+=a}} A.K.prototype={ -gdR(){var s,r,q,p,o=this.a +gaq(){return 1}, +gdT(){var s,r,q,p,o=this.a if(o==null)return null -s=o.gL() -for(r=s.al(s,this)-1,o=s.a,q=o.length;r>=0;--r){if(!(r=0;--r){if(!(r=0))return A.c(q,r) +s=n.gJ() +for(r=s.aj(s,this)+1,q=s.a,p=q.length;r=0))return A.c(q,r) o=q[r] if(o instanceof A.K)return o}return null}, -j(a){var s=A.rF(this.w) +j(a){var s=A.rP(this.w) return"<"+(s==null?"":s+" ")+A.k(this.x)+">"}, -cg(a){var s,r,q,p,o=this +ci(a){var s,r,q,p,o=this a.a+="<" -s=A.vI(o.w) +s=A.vT(o.w) r=o.x q=A.k(r) a.a=(a.a+=s)+q s=o.b if(s.a!==0)s.T(0,new A.lR(a)) a.a+=">" -s=o.gL() +s=o.gJ() if(!s.gN(s)){if(r==="pre"||r==="textarea"||r==="listing"){s=s.a if(0>=s.length)return A.c(s,0) p=s[0] -if(p instanceof A.bY){s=J.ay(p.w) +if(p instanceof A.c0){s=J.ao(p.w) p.w=s s=B.b.U(s,"\n")}else s=!1 -if(s)a.a+="\n"}o.fQ(a)}if(!A.zi(r))a.a+=""}, -cM(a){var s=this,r=A.q1(s.x,s.w) +if(s)a.a+="\n"}o.fR(a)}if(!A.zr(r))a.a+=""}, +cO(a){var s=this,r=A.qb(s.x,s.w) r.saZ(A.j2(s.b,t.K,t.N)) -return s.df(r,a,t.Q)}, -geW(){var s=this.b.m(0,"id") +return s.dj(r,a,t.Q)}, +gf_(){var s=this.b.m(0,"id") return s==null?"":s}} A.lR.prototype={ $2(a,b){var s,r -A.cg(a) +A.cj(a) A.q(b) s=this.a s.a+=" " r=A.k(a) s.a=(s.a+=r)+'="' -r=A.uw(b,!0) +r=A.uH(b,!0) s.a=(s.a+=r)+'"'}, -$S:17} -A.i6.prototype={ +$S:24} +A.eP.prototype={ +gaq(){return 8}, j(a){return""}, -cg(a){a.a+=""}, -cM(a){return A.rm(this.w)}} +ci(a){a.a+=""}, +cO(a){return A.rx(this.w)}} A.ji.prototype={ l(a,b){t.fh.a(b) -b.dW(0) +b.e_(0) b.a=this.b -this.bW(0,b)}, -a1(a,b){var s,r,q,p,o,n=this.kt(t.fY.a(b)) -for(s=A.w(n).h("X<1>"),r=new A.X(n,s),r=new A.M(r,r.gn(0),s.h("M")),q=this.b,s=s.h("G.E");r.p();){p=r.d +this.bX(0,b)}, +a1(a,b){var s,r,q,p,o,n=this.ku(t.fY.a(b)) +for(s=A.w(n).h("Y<1>"),r=new A.Y(n,s),r=new A.N(r,r.gn(0),s.h("N")),q=this.b,s=s.h("G.E");r.p();){p=r.d if(p==null)p=s.a(p) o=p.a -if(o!=null)B.a.W(o.gL().a,p) -p.a=q}this.jM(0,n)}, -bx(a,b,c){c.dW(0) +if(o!=null)B.a.W(o.gJ().a,p) +p.a=q}this.jN(0,n)}, +by(a,b,c){c.e_(0) c.a=this.b -this.fK(0,b,c)}, +this.fL(0,b,c)}, bc(a){var s,r,q -for(s=this.a,r=A.w(s),s=new J.J(s,s.length,r.h("J<1>")),r=r.c;s.p();){q=s.d;(q==null?r.a(q):q).a=null}this.jJ(this)}, +for(s=this.a,r=A.w(s),s=new J.J(s,s.length,r.h("J<1>")),r=r.c;s.p();){q=s.d;(q==null?r.a(q):q).a=null}this.jK(this)}, k(a,b,c){var s t.fh.a(c) s=this.a if(!(b>=0&&b=0&&b=s)return else if(b<0)throw A.f(A.W("Invalid list length",null)) -this.fc(0,b,s)}, +this.fd(0,b,s)}, l(a,b){this.a.l(0,t.Q.a(b))}, C(a,b){return!1}, -bV(a,b){t.dU.a(b) -throw A.f(A.ac("TODO(jacobr): should we impl?"))}, -fc(a,b,c){var s=t.w -s=A.a7(new A.O(this.a,s),s.h("h.E")) +bW(a,b){t.dU.a(b) +throw A.f(A.a6("TODO(jacobr): should we impl?"))}, +fd(a,b,c){var s=t.w +s=A.a8(new A.P(this.a,s),s.h("h.E")) s.$flags=1 -B.a.T(B.a.am(s,b,c),new A.md())}, -c8(a,b,c){var s,r +B.a.T(B.a.am(s,b,c),new A.mi())}, +c9(a,b,c){var s,r c.h("0(K)").a(b) s=t.w -s=A.a7(new A.O(this.a,s),s.h("h.E")) +s=A.a8(new A.P(this.a,s),s.h("h.E")) s.$flags=1 s=s r=A.w(s) return new A.Q(s,r.u(c).h("1(2)").a(b),r.h("@<1>").u(c).h("Q<1,2>"))}, ag(a,b){var s=t.w -s=A.a7(new A.O(this.a,s),s.h("h.E")) +s=A.a8(new A.P(this.a,s),s.h("h.E")) s.$flags=1 s=s if(!(b>=0&&b=0&&b"))}, $iz:1, $im:1} -A.md.prototype={ -$1(a){return t.Q.a(a).dW(0)}, -$S:96} +A.mi.prototype={ +$1(a){return t.Q.a(a).e_(0)}, +$S:58} +A.oK.prototype={ +j(a){var s=this.a.a +return s.charCodeAt(0)==0?s:s}} A.kF.prototype={} A.kG.prototype={} A.kH.prototype={} A.kJ.prototype={} A.kK.prototype={} A.kN.prototype={} -A.mB.prototype={ -gaD(){var s=this.x -return s===$?this.x=this.gbo():s}, -gbo(){var s=this,r=s.Q +A.nW.prototype={ +K(a){var s,r=this,q=a.gaq() +A:{if(1===q){s=r.da(t.Q.a(a)) +break A}if(3===q){t.oI.a(a) +s=J.ao(a.w) +a.w=s +r.a.a+=s +s=null +break A}if(8===q){s=r.da(t.hK.a(a)) +break A}if(11===q){s=r.da(t.lG.a(a)) +break A}if(9===q){s=r.da(t.dA.a(a)) +break A}if(10===q){s=r.da(t.cc.a(a)) +break A}s=A.M(A.a6("DOM node type "+a.gaq()))}return s}, +da(a){var s,r,q +for(s=a.gJ(),s=s.bT(s,!1),r=s.length,q=0;q") -o=A.a7(new A.aV(o,n),n.h("h.E")) +hJ(a){var s,r,q,p,o=a.e,n=A.x(o).h("b_<1>") +o=A.a8(new A.b_(o,n),n.h("h.E")) o.$flags=1 o=o n=o.length s=0 -for(;s") -o=A.a7(new A.aV(o,n),n.h("h.E")) +eB(a){var s,r,q,p,o=a.e,n=A.x(o).h("b_<1>") +o=A.a8(new A.b_(o,n),n.h("h.E")) o.$flags=1 o=o n=o.length s=0 -for(;s"),p=new A.X(r,q),p=new A.M(p,p.gn(0),q.h("M")),q=q.h("G.E"),s=s.a;p.p();){o=p.d +iy(){var s,r,q,p,o,n,m,l=this +for(s=l.d,r=s.c,q=A.w(r).h("Y<1>"),p=new A.Y(r,q),p=new A.N(p,p.gn(0),q.h("N")),q=q.h("G.E"),s=s.a;p.p();){o=p.d if(o==null)o=q.a(o) n=o.x if(0>=r.length)return A.c(r,0) m=o===r[0] if(m)n=l.w switch(n){case"select":case"colgroup":case"head":case"html":break}if(!m&&o.w!=s)continue -switch(n){case"select":l.x=l.gbH() +switch(n){case"select":l.x=l.gbI() return -case"td":l.x=l.gdj() +case"td":l.x=l.gdn() return -case"th":l.x=l.gdj() +case"th":l.x=l.gdn() return -case"tr":l.x=l.gdk() +case"tr":l.x=l.gdq() return -case"tbody":l.x=l.gcj() +case"tbody":l.x=l.gck() return -case"thead":l.x=l.gcj() +case"thead":l.x=l.gck() return -case"tfoot":l.x=l.gcj() +case"tfoot":l.x=l.gck() return -case"caption":l.x=l.gek() +case"caption":l.x=l.geo() return -case"colgroup":l.x=l.gel() +case"colgroup":l.x=l.gep() return -case"table":l.x=l.gaA() +case"table":l.x=l.gaB() return case"head":l.x=l.ga4() return case"body":l.x=l.ga4() return -case"frameset":l.x=l.gem() +case"frameset":l.x=l.geq() return -case"html":l.x=l.gfT() +case"html":l.x=l.gfU() return}}l.x=l.ga4()}, -cY(a,b){var s,r,q=this +d_(a,b){var s,r,q=this q.d.O(a) s=t.c r=q.c -if(b==="RAWTEXT")r.x=s.a(r.gdT()) -else r.x=s.a(r.gcu()) -q.y=q.gaD() -q.x=q.ghu()}} -A.aa.prototype={ +if(b==="RAWTEXT")r.x=s.a(r.gdW()) +else r.x=s.a(r.gcw()) +q.y=q.gaF() +q.x=q.ghv()}} +A.ac.prototype={ ac(){throw A.f(A.k_(null))}, -cb(a){var s=this.b -s.cr(a,B.a.gA(s.c)) +cc(a){var s=this.b +s.ct(a,B.a.gA(s.c)) return null}, -im(a){this.a.a2(a.a,"unexpected-doctype") +io(a){this.a.a2(a.a,"unexpected-doctype") return null}, -a3(a){this.b.bN(a.gaC(),a.a) +a3(a){this.b.bO(a.gaE(),a.a) return null}, -aJ(a){this.b.bN(a.gaC(),a.a) +aK(a){this.b.bO(a.gaE(),a.a) return null}, -J(a){throw A.f(A.k_(null))}, +L(a){throw A.f(A.k_(null))}, bg(a){var s,r=this.a if(!r.f&&a.b==="html")r.a2(a.a,"non-html-root") s=this.b.c if(0>=s.length)return A.c(s,0) s[0].e=a.a -a.e.T(0,new A.nq(this)) +a.e.T(0,new A.nw(this)) r.f=!1 return null}, P(a){throw A.f(A.k_(null))}, -ct(a){var s,r=a.b,q=this.b.c +cv(a){var s,r=a.b,q=this.b.c if(0>=q.length)return A.c(q,-1) s=q.pop() while(s.x!=r){if(0>=q.length)return A.c(q,-1) s=q.pop()}}} -A.nq.prototype={ +A.nw.prototype={ $2(a,b){var s -A.cg(a) +A.cj(a) A.q(b) s=this.a.b.c if(0>=s.length)return A.c(s,0) -s[0].b.f7(a,new A.np(b))}, -$S:17} -A.np.prototype={ +s[0].b.fb(a,new A.nv(b))}, +$S:24} +A.nv.prototype={ $0(){return this.a}, $S:8} A.iN.prototype={ -aJ(a){return null}, -cb(a){var s=this.b,r=s.b +aK(a){return null}, +cc(a){var s=this.b,r=s.b r===$&&A.o() -s.cr(a,r) +s.ct(a,r) return null}, -im(a){var s,r,q=this,p=a.d,o=a.b,n=o==null?null:A.c9(o),m=a.c,l=a.e +io(a){var s,r,q=this,p=a.d,o=a.b,n=o==null?null:A.cc(o),m=a.c,l=a.e o=!0 if(p==="html")if(n==null)o=m!=null&&m!=="about:legacy-compat" if(o)q.a.a2(a.a,"unknown-doctype") if(n==null)n="" -s=A.rp(a.d,a.b,a.c) +s=A.rA(a.d,a.b,a.c) s.e=a.a o=q.b.b o===$&&A.o() -o.gL().l(0,s) +o.gJ().l(0,s) o=!0 -if(l)if(a.d==="html"){r=B.b.gfF(n) -if(!B.a.aH(B.iW,r))if(!B.a.C(B.jl,n))if(!(B.a.aH(B.cW,r)&&m==null))o=m!=null&&m.toLowerCase()==="http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"}if(o)q.a.r="quirks" -else{o=B.b.gfF(n) -if(!B.a.aH(B.jf,o))o=B.a.aH(B.cW,o)&&m!=null +if(l)if(a.d==="html"){r=B.b.gfG(n) +if(!B.a.aC(B.iW,r))if(!B.a.C(B.jl,n))if(!(B.a.aC(B.cW,r)&&m==null))o=m!=null&&m.toLowerCase()==="http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"}if(o)q.a.r="quirks" +else{o=B.b.gfG(n) +if(!B.a.aC(B.jf,o))o=B.a.aC(B.cW,o)&&m!=null else o=!0 if(o)q.a.r="limited quirks"}o=q.a -o.x=o.gfU() +o.x=o.gfV() return null}, -br(){var s=this.a +bs(){var s=this.a s.r="quirks" -s.x=s.gfU()}, +s.x=s.gfV()}, a3(a){this.a.a2(a.a,"expected-doctype-but-got-chars") -this.br() +this.bs() return a}, -J(a){this.a.G(a.a,"expected-doctype-but-got-start-tag",A.v(["name",a.b],t.N,t.X)) -this.br() +L(a){this.a.G(a.a,"expected-doctype-but-got-start-tag",A.v(["name",a.b],t.N,t.X)) +this.bs() return a}, P(a){this.a.G(a.a,"expected-doctype-but-got-end-tag",A.v(["name",a.b],t.N,t.X)) -this.br() +this.bs() return a}, ac(){var s=this.a -s.a2(s.ghd(),"expected-doctype-but-got-eof") -this.br() +s.a2(s.ghe(),"expected-doctype-but-got-eof") +this.bs() return!0}} -A.hZ.prototype={ -dN(){var s=this.b,r=s.i1(A.aZ("html",A.ae(t.K,t.N),null,!1)) +A.i0.prototype={ +dP(){var s=this.b,r=s.i2(A.b3("html",A.aa(t.K,t.N),null,!1)) B.a.l(s.c,r) s=s.b s===$&&A.o() -s.gL().l(0,r) +s.gJ().l(0,r) s=this.a -s.x=s.gfT()}, -ac(){this.dN() +s.x=s.gfU()}, +ac(){this.dP() return!0}, -cb(a){var s=this.b,r=s.b +cc(a){var s=this.b,r=s.b r===$&&A.o() -s.cr(a,r) +s.ct(a,r) return null}, -aJ(a){return null}, -a3(a){this.dN() +aK(a){return null}, +a3(a){this.dP() return a}, -J(a){if(a.b==="html")this.a.f=!0 -this.dN() +L(a){if(a.b==="html")this.a.f=!0 +this.dP() return a}, P(a){var s=a.b -switch(s){case"head":case"body":case"html":case"br":this.dN() +switch(s){case"head":case"body":case"html":case"br":this.dP() return a default:this.a.G(a.a,"unexpected-end-tag-before-html",A.v(["name",s],t.N,t.X)) return null}}} -A.hY.prototype={ -J(a){switch(a.b){case"html":return this.a.ga4().J(a) -case"head":this.cF(a) +A.i_.prototype={ +L(a){switch(a.b){case"html":return this.a.ga4().L(a) +case"head":this.cG(a) return null -default:this.cF(A.aZ("head",A.ae(t.K,t.N),null,!1)) +default:this.cG(A.b3("head",A.aa(t.K,t.N),null,!1)) return a}}, P(a){var s=a.b -switch(s){case"head":case"body":case"html":case"br":this.cF(A.aZ("head",A.ae(t.K,t.N),null,!1)) +switch(s){case"head":case"body":case"html":case"br":this.cG(A.b3("head",A.aa(t.K,t.N),null,!1)) return a default:this.a.G(a.a,"end-tag-after-implied-root",A.v(["name",s],t.N,t.X)) return null}}, -ac(){this.cF(A.aZ("head",A.ae(t.K,t.N),null,!1)) +ac(){this.cG(A.b3("head",A.aa(t.K,t.N),null,!1)) return!0}, -aJ(a){return null}, -a3(a){this.cF(A.aZ("head",A.ae(t.K,t.N),null,!1)) +aK(a){return null}, +a3(a){this.cG(A.b3("head",A.aa(t.K,t.N),null,!1)) return a}, -cF(a){var s=this.b +cG(a){var s=this.b s.O(a) s.e=B.a.gA(s.c) s=this.a -s.x=s.gc0()}} +s.x=s.gc1()}} A.iG.prototype={ -J(a){var s,r,q,p,o,n=this,m=null -switch(a.b){case"html":return n.a.ga4().J(a) -case"title":n.a.cY(a,"RCDATA") +L(a){var s,r,q,p,o,n=this,m=null +switch(a.b){case"html":return n.a.ga4().L(a) +case"title":n.a.d_(a,"RCDATA") return m -case"noscript":case"noframes":case"style":n.a.cY(a,"RAWTEXT") +case"noscript":case"noframes":case"style":n.a.d_(a,"RAWTEXT") return m case"script":n.b.O(a) s=n.a r=s.c -r.x=t.c.a(r.gbC()) -s.y=s.gaD() -s.x=s.ghu() +r.x=t.c.a(r.gbD()) +s.y=s.gaF() +s.x=s.ghv() return m case"base":case"basefont":case"bgsound":case"command":case"link":s=n.b s.O(a) @@ -12718,31 +12759,31 @@ q=a.e s=n.a.c.a if(!s.b){p=q.m(0,"charset") o=q.m(0,"content") -if(p!=null)s.hS(p) -else if(o!=null)s.hS(new A.lN(new A.lS(o)).nE())}return m +if(p!=null)s.hT(p) +else if(o!=null)s.hT(new A.lN(new A.lS(o)).nG())}return m case"head":n.a.a2(a.a,"two-heads-are-not-better-than-one") return m -default:n.cO(new A.H("head",!1)) +default:n.cQ(new A.H("head",!1)) return a}}, P(a){var s=a.b -switch(s){case"head":this.cO(a) +switch(s){case"head":this.cQ(a) return null -case"br":case"html":case"body":this.cO(new A.H("head",!1)) +case"br":case"html":case"body":this.cQ(new A.H("head",!1)) return a default:this.a.G(a.a,"unexpected-end-tag",A.v(["name",s],t.N,t.X)) return null}}, -ac(){this.cO(new A.H("head",!1)) +ac(){this.cQ(new A.H("head",!1)) return!0}, -a3(a){this.cO(new A.H("head",!1)) +a3(a){this.cQ(new A.H("head",!1)) return a}, -cO(a){var s,r=this.a,q=r.d,p=q.c +cQ(a){var s,r=this.a,q=r.d,p=q.c if(0>=p.length)return A.c(p,-1) p.pop() s=r.ay -r.x=s===$?r.ay=new A.hM(r,q):s}} -A.hM.prototype={ -J(a){var s=this,r=null,q=a.b -switch(q){case"html":return s.a.ga4().J(a) +r.x=s===$?r.ay=new A.hO(r,q):s}} +A.hO.prototype={ +L(a){var s=this,r=null,q=a.b +switch(q){case"html":return s.a.ga4().L(a) case"body":q=s.a q.z=!1 s.b.O(a) @@ -12750,111 +12791,111 @@ q.x=q.ga4() return r case"frameset":s.b.O(a) q=s.a -q.x=q.gem() +q.x=q.geq() return r -case"base":case"basefont":case"bgsound":case"link":case"meta":case"noframes":case"script":case"style":case"title":s.jv(a) +case"base":case"basefont":case"bgsound":case"link":case"meta":case"noframes":case"script":case"style":case"title":s.jw(a) return r case"head":s.a.G(a.a,"unexpected-start-tag",A.v(["name",q],t.N,t.X)) return r -default:s.br() +default:s.bs() return a}}, P(a){var s=a.b -switch(s){case"body":case"html":case"br":this.br() +switch(s){case"body":case"html":case"br":this.bs() return a default:this.a.G(a.a,"unexpected-end-tag",A.v(["name",s],t.N,t.X)) return null}}, -ac(){this.br() +ac(){this.bs() return!0}, -a3(a){this.br() +a3(a){this.bs() return a}, -jv(a){var s,r,q,p=this.a +jw(a){var s,r,q,p=this.a p.G(a.a,"unexpected-start-tag-out-of-my-head",A.v(["name",a.b],t.N,t.X)) s=this.b r=s.c B.a.l(r,t.Q.a(s.e)) -p.gc0().J(a) -for(p=A.w(r).h("X<1>"),s=new A.X(r,p),s=new A.M(s,s.gn(0),p.h("M")),p=p.h("G.E");s.p();){q=s.d +p.gc1().L(a) +for(p=A.w(r).h("Y<1>"),s=new A.Y(r,p),s=new A.N(s,s.gn(0),p.h("N")),p=p.h("G.E");s.p();){q=s.d if(q==null)q=p.a(q) if(q.x==="head"){B.a.W(r,q) break}}}, -br(){this.b.O(A.aZ("body",A.ae(t.K,t.N),null,!1)) +bs(){this.b.O(A.b3("body",A.aa(t.K,t.N),null,!1)) var s=this.a s.x=s.ga4() s.z=!0}} A.iA.prototype={ -J(a){var s,r,q,p,o,n=this,m=null,l="p",k="button",j="unexpected-start-tag",i="unexpected-start-tag-implies-end-tag",h="RAWTEXT",g=a.b +L(a){var s,r,q,p,o,n=this,m=null,l="p",k="button",j="unexpected-start-tag",i="unexpected-start-tag-implies-end-tag",h="RAWTEXT",g=a.b switch(g){case"html":return n.bg(a) -case"base":case"basefont":case"bgsound":case"command":case"link":case"meta":case"noframes":case"script":case"style":case"title":return n.a.gc0().J(a) -case"body":n.js(a) +case"base":case"basefont":case"bgsound":case"command":case"link":case"meta":case"noframes":case"script":case"style":case"title":return n.a.gc1().L(a) +case"body":n.jt(a) return m -case"frameset":n.ju(a) +case"frameset":n.jv(a) return m -case"address":case"article":case"aside":case"blockquote":case"center":case"details":case"dir":case"div":case"dl":case"fieldset":case"figcaption":case"figure":case"footer":case"header":case"hgroup":case"menu":case"nav":case"ol":case"p":case"section":case"summary":case"ul":n.fz(a) +case"address":case"article":case"aside":case"blockquote":case"center":case"details":case"dir":case"div":case"dl":case"fieldset":case"figcaption":case"figure":case"footer":case"header":case"hgroup":case"menu":case"nav":case"ol":case"p":case"section":case"summary":case"ul":n.fA(a) return m case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":g=n.b -if(g.a0(l,k))n.bt(new A.H(l,!1)) +if(g.a0(l,k))n.bu(new A.H(l,!1)) s=g.c if(B.hS.C(0,B.a.gA(s).x)){n.a.G(a.a,j,A.v(["name",a.b],t.N,t.X)) if(0>=s.length)return A.c(s,-1) s.pop()}g.O(a) return m case"pre":case"listing":g=n.b -if(g.a0(l,k))n.bt(new A.H(l,!1)) +if(g.a0(l,k))n.bu(new A.H(l,!1)) g.O(a) n.a.z=!1 n.c=!0 return m case"form":g=n.b if(g.f!=null)n.a.G(a.a,j,A.v(["name","form"],t.N,t.X)) -else{if(g.a0(l,k))n.bt(new A.H(l,!1)) +else{if(g.a0(l,k))n.bu(new A.H(l,!1)) g.O(a) g.f=B.a.gA(g.c)}return m -case"li":case"dd":case"dt":n.jy(a) +case"li":case"dd":case"dt":n.jz(a) return m case"plaintext":g=n.b -if(g.a0(l,k))n.bt(new A.H(l,!1)) +if(g.a0(l,k))n.bu(new A.H(l,!1)) g.O(a) g=n.a.c -g.x=t.c.a(g.gnH()) +g.x=t.c.a(g.gnJ()) return m case"a":g=n.b -r=g.i5("a") +r=g.i6("a") if(r!=null){n.a.G(a.a,i,A.v(["startName","a","endName","a"],t.N,t.X)) -n.i8(new A.H("a",!1)) +n.i9(new A.H("a",!1)) B.a.W(g.c,r) -B.a.W(g.d.a,r)}g.aE() -n.ew(a) +B.a.W(g.d.a,r)}g.aG() +n.eA(a) return m -case"b":case"big":case"code":case"em":case"font":case"i":case"s":case"small":case"strike":case"strong":case"tt":case"u":n.b.aE() -n.ew(a) +case"b":case"big":case"code":case"em":case"font":case"i":case"s":case"small":case"strike":case"strong":case"tt":case"u":n.b.aG() +n.eA(a) return m case"nobr":g=n.b -g.aE() +g.aG() if(g.b6("nobr")){n.a.G(a.a,i,A.v(["startName","nobr","endName","nobr"],t.N,t.X)) n.P(new A.H("nobr",!1)) -g.aE()}n.ew(a) +g.aG()}n.eA(a) return m -case"button":return n.jt(a) +case"button":return n.ju(a) case"applet":case"marquee":case"object":g=n.b -g.aE() +g.aG() g.O(a) g.d.l(0,m) n.a.z=!1 return m case"xmp":g=n.b -if(g.a0(l,k))n.bt(new A.H(l,!1)) -g.aE() +if(g.a0(l,k))n.bu(new A.H(l,!1)) +g.aG() g=n.a g.z=!1 -g.cY(a,h) +g.d_(a,h) return m case"table":g=n.a if(g.r!=="quirks")if(n.b.a0(l,k))n.P(new A.H(l,!1)) n.b.O(a) g.z=!1 -g.x=g.gaA() +g.x=g.gaB() return m -case"area":case"br":case"embed":case"img":case"keygen":case"wbr":n.fE(a) +case"area":case"br":case"embed":case"img":case"keygen":case"wbr":n.fF(a) return m case"param":case"source":case"track":g=n.b g.O(a) @@ -12865,12 +12906,12 @@ a.r=!0 return m case"input":g=n.a q=g.z -n.fE(a) +n.fF(a) s=a.e.m(0,"type") -if((s==null?m:A.c9(s))==="hidden")g.z=q +if((s==null?m:A.cc(s))==="hidden")g.z=q return m case"hr":g=n.b -if(g.a0(l,k))n.bt(new A.H(l,!1)) +if(g.a0(l,k))n.bu(new A.H(l,!1)) g.O(a) g=g.c if(0>=g.length)return A.c(g,-1) @@ -12879,46 +12920,46 @@ a.r=!0 n.a.z=!1 return m case"image":n.a.G(a.a,"unexpected-start-tag-treated-as",A.v(["originalName","image","newName","img"],t.N,t.X)) -n.J(A.aZ("img",a.e,m,a.c)) +n.L(A.b3("img",a.e,m,a.c)) return m -case"isindex":n.jx(a) +case"isindex":n.jy(a) return m case"textarea":n.b.O(a) g=n.a s=g.c -s.x=t.c.a(s.gcu()) +s.x=t.c.a(s.gcw()) n.c=!0 g.z=!1 return m case"iframe":g=n.a g.z=!1 -g.cY(a,h) +g.d_(a,h) return m -case"noembed":case"noscript":n.a.cY(a,h) +case"noembed":case"noscript":n.a.d_(a,h) return m case"select":g=n.b -g.aE() +g.aG() g.O(a) g=n.a g.z=!1 -if(g.gaA()===g.gaD()||g.gek()===g.gaD()||g.gel()===g.gaD()||g.gcj()===g.gaD()||g.gdk()===g.gaD()||g.gdj()===g.gaD()){p=g.go -g.x=p===$?g.go=new A.iI(g,g.d):p}else g.x=g.gbH() +if(g.gaB()===g.gaF()||g.geo()===g.gaF()||g.gep()===g.gaF()||g.gck()===g.gaF()||g.gdq()===g.gaF()||g.gdn()===g.gaF()){p=g.go +g.x=p===$?g.go=new A.iI(g,g.d):p}else g.x=g.gbI() return m case"rp":case"rt":g=n.b -if(g.b6("ruby")){g.cc() +if(g.b6("ruby")){g.cd() o=B.a.gA(g.c) if(o.x!=="ruby")n.a.a2(o.e,"undefined-error")}g.O(a) return m case"option":case"optgroup":g=n.b -if(B.a.gA(g.c).x==="option")n.a.gaD().P(new A.H("option",!1)) -g.aE() +if(B.a.gA(g.c).x==="option")n.a.gaF().P(new A.H("option",!1)) +g.aG() n.a.d.O(a) return m case"math":g=n.b -g.aE() +g.aG() s=n.a -s.hH(a) -s.ex(a) +s.hI(a) +s.eB(a) a.w="http://www.w3.org/1998/Math/MathML" g.O(a) if(a.c){g=g.c @@ -12926,10 +12967,10 @@ if(0>=g.length)return A.c(g,-1) g.pop() a.r=!0}return m case"svg":g=n.b -g.aE() +g.aG() s=n.a -s.hI(a) -s.ex(a) +s.hJ(a) +s.eB(a) a.w="http://www.w3.org/2000/svg" g.O(a) if(a.c){g=g.c @@ -12939,82 +12980,82 @@ a.r=!0}return m case"caption":case"col":case"colgroup":case"frame":case"head":case"tbody":case"td":case"tfoot":case"th":case"thead":case"tr":n.a.G(a.a,"unexpected-start-tag-ignored",A.v(["name",g],t.N,t.X)) return m default:g=n.b -g.aE() +g.aG() g.O(a) return m}}, P(a){var s,r,q,p,o,n=this,m=null,l="end-tag-too-early",k="unexpected-end-tag",j=a.b -switch(j){case"body":n.i7(a) +switch(j){case"body":n.i8(a) return m -case"html":return n.eP(a) +case"html":return n.eT(a) case"address":case"article":case"aside":case"blockquote":case"button":case"center":case"details":case"dir":case"div":case"dl":case"fieldset":case"figcaption":case"figure":case"footer":case"header":case"hgroup":case"listing":case"menu":case"nav":case"ol":case"pre":case"section":case"summary":case"ul":if(j==="pre")n.c=!1 s=n.b r=s.b6(j) -if(r)s.cc() +if(r)s.cd() j=B.a.gA(s.c) s=a.b if(j.x!=s)n.a.G(a.a,l,A.v(["name",s],t.N,t.X)) -if(r)n.ct(a) +if(r)n.cv(a) return m case"form":j=n.b q=j.f j.f=null if(q==null||!j.b6(q))n.a.G(a.a,k,A.v(["name","form"],t.N,t.X)) -else{j.cc() +else{j.cd() j=j.c if(B.a.gA(j)!==q)n.a.G(a.a,"end-tag-too-early-ignored",A.v(["name","form"],t.N,t.X)) B.a.W(j,q)}return m -case"p":n.bt(a) +case"p":n.bu(a) return m case"dd":case"dt":case"li":p=j==="li"?"list":m s=n.b j=s.a0(j,p) o=a.b if(!j)n.a.G(a.a,k,A.v(["name",o],t.N,t.X)) -else{s.bS(o) +else{s.bU(o) j=B.a.gA(s.c) s=a.b if(j.x!=s)n.a.G(a.a,l,A.v(["name",s],t.N,t.X)) -n.ct(a)}return m -case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":n.mW(a) +n.cv(a)}return m +case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":n.mY(a) return m -case"a":case"b":case"big":case"code":case"em":case"font":case"i":case"nobr":case"s":case"small":case"strike":case"strong":case"tt":case"u":n.i8(a) +case"a":case"b":case"big":case"code":case"em":case"font":case"i":case"nobr":case"s":case"small":case"strike":case"strong":case"tt":case"u":n.i9(a) return m case"applet":case"marquee":case"object":s=n.b -if(s.b6(j))s.cc() +if(s.b6(j))s.cd() j=B.a.gA(s.c) o=a.b if(j.x!=o)n.a.G(a.a,l,A.v(["name",o],t.N,t.X)) -if(s.b6(a.b)){n.ct(a) -s.eC()}return m +if(s.b6(a.b)){n.cv(a) +s.eG()}return m case"br":j=t.N n.a.G(a.a,"unexpected-end-tag-treated-as",A.v(["originalName","br","newName","br element"],j,t.X)) s=n.b -s.aE() -s.O(A.aZ("br",A.ae(t.K,j),m,!1)) +s.aG() +s.O(A.b3("br",A.aa(t.K,j),m,!1)) s=s.c if(0>=s.length)return A.c(s,-1) s.pop() return m -default:n.mY(a) +default:n.n_(a) return m}}, -nh(a,b){var s,r +nj(a,b){var s,r if(a.x!=b.x||a.w!=b.w)return!1 else{s=a.b if(s.a!==b.b.a)return!1 -else for(s=new A.cv(s,s.r,s.e,A.x(s).h("cv<1>"));s.p();){r=s.d +else for(s=new A.cx(s,s.r,s.e,A.x(s).h("cx<1>"));s.p();){r=s.d if(a.b.m(0,r)!=b.b.m(0,r))return!1}}return!0}, -ew(a){var s,r,q,p,o,n,m=this.b +eA(a){var s,r,q,p,o,n,m=this.b m.O(a) s=B.a.gA(m.c) r=A.i([],t.hg) -for(m=m.d,q=A.x(m).h("X"),p=new A.X(m,q),p=new A.M(p,p.gn(0),q.h("M")),o=t.Q,q=q.h("G.E");p.p();){n=p.d +for(m=m.d,q=A.x(m).h("Y"),p=new A.Y(m,q),p=new A.N(p,p.gn(0),q.h("N")),o=t.Q,q=q.h("G.E");p.p();){n=p.d if(n==null)n=q.a(n) if(n==null)break else{o.a(n) -if(this.nh(n,s))B.a.l(r,n)}}if(r.length===3)B.a.W(m.a,B.a.gA(r)) +if(this.nj(n,s))B.a.l(r,n)}}if(r.length===3)B.a.W(m.a,B.a.gA(r)) m.l(0,s)}, ac(){var s,r,q,p -A:for(s=this.b.c,r=A.w(s).h("X<1>"),s=new A.X(s,r),s=new A.M(s,s.gn(0),r.h("M")),r=r.h("G.E");s.p();){q=s.d +A:for(s=this.b.c,r=A.w(s).h("Y<1>"),s=new A.Y(s,r),s=new A.N(s,s.gn(0),r.h("N")),r=r.h("G.E");s.p();){q=s.d if(q==null)q=r.a(q) switch(q.x){case"dd":case"dt":case"li":case"p":case"tbody":case"td":case"tfoot":case"th":case"thead":case"tr":case"body":case"html":continue A}s=this.a p=q.e @@ -13023,37 +13064,37 @@ if(p==null){r=s.c.a q=r.w if(q==null)p=null else{r=r.y -new A.bh(q,r).bh(q,r) -p=new A.aw(q,r,r) -p.aG(q,r,r)}}B.a.l(s.e,new A.bb("expected-closing-tag-but-got-eof",p,B.bi)) +new A.bi(q,r).bh(q,r) +p=new A.az(q,r,r) +p.aI(q,r,r)}}B.a.l(s.e,new A.bc("expected-closing-tag-but-got-eof",p,B.bi)) break A}return!1}, a3(a){var s -if(a.gaC()==="\x00")return null +if(a.gaE()==="\x00")return null s=this.b -s.aE() -s.bN(a.gaC(),a.a) +s.aG() +s.bO(a.gaE(),a.a) s=this.a -if(s.z&&!A.qQ(a.gaC()))s.z=!1 +if(s.z&&!A.r0(a.gaE()))s.z=!1 return null}, -aJ(a){var s,r,q,p=this -if(p.c){s=a.gaC() +aK(a){var s,r,q,p=this +if(p.c){s=a.gaE() r=p.c=!1 if(B.b.U(s,"\n")){q=B.a.gA(p.b.c) -if(B.a.C(B.jh,q.x)){r=q.gL() +if(B.a.C(B.jh,q.x)){r=q.gJ() r=r.gN(r)}if(r)s=B.b.ab(s,1)}if(s.length!==0){r=p.b -r.aE() -r.bN(s,a.a)}}else{r=p.b -r.aE() -r.bN(a.gaC(),a.a)}return null}, -js(a){var s,r,q=this.a +r.aG() +r.bO(s,a.a)}}else{r=p.b +r.aG() +r.bO(a.gaE(),a.a)}return null}, +jt(a){var s,r,q=this.a q.G(a.a,"unexpected-start-tag",A.v(["name","body"],t.N,t.X)) s=this.b.c r=s.length if(r!==1){if(1>=r)return A.c(s,1) s=s[1].x!=="body"}else s=!0 if(!s){q.z=!1 -a.e.T(0,new A.mF(this))}}, -ju(a){var s,r,q,p,o=this.a +a.e.T(0,new A.mK(this))}}, +jv(a){var s,r,q,p,o=this.a o.G(a.a,"unexpected-start-tag",A.v(["name","frameset"],t.N,t.X)) s=this.b r=s.c @@ -13063,53 +13104,53 @@ p=r[1].x!=="body"}else p=!0 if(!p)if(o.z){if(1>=q)return A.c(r,1) q=r[1] p=q.a -if(p!=null){p=p.gL() +if(p!=null){p=p.gJ() if(1>=r.length)return A.c(r,1) B.a.W(p.a,q)}while(B.a.gA(r).x!=="html"){if(0>=r.length)return A.c(r,-1) r.pop()}s.O(a) -o.x=o.gem()}}, -fz(a){var s=this.b -if(s.a0("p","button"))this.bt(new A.H("p",!1)) +o.x=o.geq()}}, +fA(a){var s=this.b +if(s.a0("p","button"))this.bu(new A.H("p",!1)) s.O(a)}, -jy(a){var s,r,q,p,o,n,m,l,k=this.a +jz(a){var s,r,q,p,o,n,m,l,k=this.a k.z=!1 s=a.b s.toString s=B.qF.m(0,s) s.toString -for(r=this.b,q=r.c,p=A.w(q).h("X<1>"),q=new A.X(q,p),q=new A.M(q,q.gn(0),p.h("M")),p=p.h("G.E");q.p();){o=q.d +for(r=this.b,q=r.c,p=A.w(q).h("Y<1>"),q=new A.Y(q,p),q=new A.N(q,q.gn(0),p.h("N")),p=p.h("G.E");q.p();){o=q.d if(o==null)o=p.a(o) n=o.x if(B.a.C(s,n)){m=k.x -if(m===$)m=k.x=k.gbo() +if(m===$)m=k.x=k.gbp() m.P(new A.H(n,!1)) break}l=o.w -if(B.cC.C(0,new A.l(l==null?"http://www.w3.org/1999/xhtml":l,n))&&!B.a.C(B.j3,n))break}if(r.a0("p","button"))k.gaD().P(new A.H("p",!1)) +if(B.cC.C(0,new A.l(l==null?"http://www.w3.org/1999/xhtml":l,n))&&!B.a.C(B.j3,n))break}if(r.a0("p","button"))k.gaF().P(new A.H("p",!1)) r.O(a)}, -jt(a){var s=this.b,r=this.a +ju(a){var s=this.b,r=this.a if(s.b6("button")){r.G(a.a,"unexpected-start-tag-implies-end-tag",A.v(["startName","button","endName","button"],t.N,t.X)) this.P(new A.H("button",!1)) -return a}else{s.aE() +return a}else{s.aG() s.O(a) r.z=!1}return null}, -fE(a){var s=this.b -s.aE() +fF(a){var s=this.b +s.aG() s.O(a) s=s.c if(0>=s.length)return A.c(s,-1) s.pop() a.r=!0 this.a.z=!1}, -jx(a){var s,r,q,p,o,n=this,m=null,l="action",k=t.N +jy(a){var s,r,q,p,o,n=this,m=null,l="action",k=t.N n.a.G(a.a,"deprecated-tag",A.v(["name","isindex"],k,t.X)) if(n.b.f!=null)return s=t.K -r=A.ae(s,k) +r=A.aa(s,k) q=a.e.m(0,l) if(q!=null)r.k(0,l,q) -n.J(A.aZ("form",r,m,!1)) -n.J(A.aZ("hr",A.ae(s,k),m,!1)) -n.J(A.aZ("label",A.ae(s,k),m,!1)) +n.L(A.b3("form",r,m,!1)) +n.L(A.b3("hr",A.aa(s,k),m,!1)) +n.L(A.b3("label",A.aa(s,k),m,!1)) p=a.e.m(0,"prompt") if(p==null)p="This is a searchable index. Enter search keywords: " n.a3(new A.D(m,p)) @@ -13117,22 +13158,22 @@ o=A.j2(a.e,s,k) o.W(0,l) o.W(0,"prompt") o.k(0,"name","isindex") -n.J(A.aZ("input",o,m,a.c)) +n.L(A.b3("input",o,m,a.c)) n.P(new A.H("label",!1)) -n.J(A.aZ("hr",A.ae(s,k),m,!1)) +n.L(A.b3("hr",A.aa(s,k),m,!1)) n.P(new A.H("form",!1))}, -bt(a){var s=this,r="unexpected-end-tag",q=s.b +bu(a){var s=this,r="unexpected-end-tag",q=s.b if(!q.a0("p","button")){q=t.N -s.fz(A.aZ("p",A.ae(t.K,q),null,!1)) +s.fA(A.b3("p",A.aa(t.K,q),null,!1)) s.a.G(a.a,r,A.v(["name","p"],q,t.X)) -s.bt(new A.H("p",!1))}else{q.bS("p") +s.bu(new A.H("p",!1))}else{q.bU("p") if(B.a.gA(q.c).x!=="p")s.a.G(a.a,r,A.v(["name","p"],t.N,t.X)) -s.ct(a)}}, -i7(a){var s,r,q,p,o,n,m=this,l=m.b +s.cv(a)}}, +i8(a){var s,r,q,p,o,n,m=this,l=m.b if(!l.b6("body")){m.a.a2(a.a,"undefined-error") return}else{l=l.c if(B.a.gA(l).x==="body")B.a.gA(l) -else A:for(l=A.r1(l,2,null,t.Q),s=l.length,r=0;r=q.length)return A.c(q,-1) q.pop() -s.bS(null)}break}q=s.c +s.bU(null)}break}q=s.c o=B.a.gA(q) n=a.b if(o.x!=n)this.a.G(a.a,"end-tag-too-early",A.v(["name",n],t.N,t.X)) @@ -13161,9 +13202,9 @@ for(r=0;r<6;++r)if(s.b6(B.cY[r])){if(0>=q.length)return A.c(q,-1) m=q.pop() while(!B.hS.C(0,m.x)){if(0>=q.length)return A.c(q,-1) m=q.pop()}break}}, -i8(b4){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,b0,b1,b2,b3=null -for(s=this.b,r=s.d,q=r.a,p=A.x(r).h("b9.E"),o=s.c,n=t.K,m=t.N,l=t.Q,k=this.a,j=t.X,i=t.n,h=k.c.a,g=0;g<8;){++g -f=s.i5(b4.b) +i9(b4){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,b0,b1,b2,b3=null +for(s=this.b,r=s.d,q=r.a,p=A.x(r).h("bb.E"),o=s.c,n=t.K,m=t.N,l=t.Q,k=this.a,j=t.X,i=t.n,h=k.c.a,g=0;g<8;){++g +f=s.i6(b4.b) if(f!=null)e=B.a.C(o,f)&&!s.b6(f.x) else e=!0 if(e){d=b4.a @@ -13171,27 +13212,27 @@ s=i.a(A.v(["name",b4.b],m,j)) if(d==null){r=h.w if(r==null)d=b3 else{q=h.y -new A.bh(r,q).bh(r,q) -d=new A.aw(r,q,q) -d.aG(r,q,q)}}B.a.l(k.e,new A.bb("adoption-agency-1.1",d,s)) +new A.bi(r,q).bh(r,q) +d=new A.az(r,q,q) +d.aI(r,q,q)}}B.a.l(k.e,new A.bc("adoption-agency-1.1",d,s)) return}else if(!B.a.C(o,f)){d=b4.a s=i.a(A.v(["name",b4.b],m,j)) if(d==null){r=h.w if(r==null)d=b3 else{p=h.y -new A.bh(r,p).bh(r,p) -d=new A.aw(r,p,p) -d.aG(r,p,p)}}B.a.l(k.e,new A.bb("adoption-agency-1.2",d,s)) +new A.bi(r,p).bh(r,p) +d=new A.az(r,p,p) +d.aI(r,p,p)}}B.a.l(k.e,new A.bc("adoption-agency-1.2",d,s)) B.a.W(q,f) return}if(f!==B.a.gA(o)){d=b4.a e=i.a(A.v(["name",b4.b],m,j)) if(d==null){c=h.w if(c==null)d=b3 else{b=h.y -new A.bh(c,b).bh(c,b) -d=new A.aw(c,b,b) -d.aG(c,b,b)}}B.a.l(k.e,new A.bb("adoption-agency-1.3",d,e))}a=B.a.al(o,f) -e=A.r1(o,a,b3,l) +new A.bi(c,b).bh(c,b) +d=new A.az(c,b,b) +d.aI(c,b,b)}}B.a.l(k.e,new A.bc("adoption-agency-1.3",d,e))}a=B.a.aj(o,f) +e=A.rc(o,a,b3,l) c=e.length a1=0 for(;;){if(!(a1=o.length)return A.c(o,-1) +break}e.length===c||(0,A.Z)(e);++a1}if(a0==null){if(0>=o.length)return A.c(o,-1) a2=o.pop() while(a2!==f){if(0>=o.length)return A.c(o,-1) a2=o.pop()}B.a.W(q,a2) return}e=a-1 if(!(e>=0&&e=0&&a6"),p=new A.X(r,q),p=new A.M(p,p.gn(0),q.h("M")),q=q.h("G.E");p.p();){o=p.d +B.a.by(o,B.a.aj(o,a0)+1,b1)}}, +n_(a){var s,r,q,p,o,n,m,l,k,j,i="unexpected-end-tag" +for(s=this.b,r=s.c,q=A.w(r).h("Y<1>"),p=new A.Y(r,q),p=new A.N(p,p.gn(0),q.h("N")),q=q.h("G.E");p.p();){o=p.d if(o==null)o=q.a(o) n=o.x m=a.b if(n==m){l=B.a.gA(r).x if(l!=m&&B.a.C(B.bH,l)){if(0>=r.length)return A.c(r,-1) r.pop() -s.bS(m)}s=B.a.gA(r) +s.bU(m)}s=B.a.gA(r) q=a.b if(s.x!=q){s=this.a k=a.a @@ -13278,9 +13319,9 @@ if(k==null){p=s.c.a n=p.w if(n==null)k=null else{p=p.y -new A.bh(n,p).bh(n,p) -k=new A.aw(n,p,p) -k.aG(n,p,p)}}B.a.l(s.e,new A.bb(i,k,q))}for(;;){if(0>=r.length)return A.c(r,-1) +new A.bi(n,p).bh(n,p) +k=new A.az(n,p,p) +k.aI(n,p,p)}}B.a.l(s.e,new A.bc(i,k,q))}for(;;){if(0>=r.length)return A.c(r,-1) if(!(r.pop()!==o))break}break}else{j=o.w if(B.cC.C(0,new A.l(j==null?"http://www.w3.org/1999/xhtml":j,n))){s=this.a k=a.a @@ -13289,23 +13330,23 @@ if(k==null){q=s.c.a p=q.w if(p==null)k=null else{q=q.y -new A.bh(p,q).bh(p,q) -k=new A.aw(p,q,q) -k.aG(p,q,q)}}B.a.l(s.e,new A.bb(i,k,r)) +new A.bi(p,q).bh(p,q) +k=new A.az(p,q,q) +k.aI(p,q,q)}}B.a.l(s.e,new A.bc(i,k,r)) break}}}}} -A.mF.prototype={ +A.mK.prototype={ $2(a,b){var s -A.cg(a) +A.cj(a) A.q(b) s=this.a.b.c if(1>=s.length)return A.c(s,1) -s[1].b.f7(a,new A.mE(b))}, -$S:17} -A.mE.prototype={ +s[1].b.fb(a,new A.mJ(b))}, +$S:24} +A.mJ.prototype={ $0(){return this.a}, $S:8} A.jU.prototype={ -J(a){throw A.f(A.ce("Cannot process start stag in text phase"))}, +L(a){throw A.f(A.ch("Cannot process start stag in text phase"))}, P(a){var s,r,q=this if(a.b==="script"){s=q.b.c if(0>=s.length)return A.c(s,-1) @@ -13322,7 +13363,7 @@ r=s.y r.toString s.x=r return null}, -a3(a){this.b.bN(a.gaC(),a.a) +a3(a){this.b.bO(a.gaE(),a.a) return null}, ac(){var s=this.b.c,r=B.a.gA(s),q=this.a q.G(r.e,"expected-named-closing-tag-but-got-eof",A.v(["name",r.x],t.N,t.X)) @@ -13333,32 +13374,32 @@ s.toString q.x=s return!0}} A.iL.prototype={ -J(a){var s,r,q=this,p=null +L(a){var s,r,q=this,p=null switch(a.b){case"html":return q.bg(a) -case"caption":q.eE() +case"caption":q.eI() s=q.b s.d.l(0,p) s.O(a) s=q.a -s.x=s.gek() +s.x=s.geo() return p -case"colgroup":q.fA(a) +case"colgroup":q.fB(a) return p -case"col":q.fA(A.aZ("colgroup",A.ae(t.K,t.N),p,!1)) +case"col":q.fB(A.b3("colgroup",A.aa(t.K,t.N),p,!1)) return a -case"tbody":case"tfoot":case"thead":q.fC(a) +case"tbody":case"tfoot":case"thead":q.fD(a) return p -case"td":case"th":case"tr":q.fC(A.aZ("tbody",A.ae(t.K,t.N),p,!1)) +case"td":case"th":case"tr":q.fD(A.b3("tbody",A.aa(t.K,t.N),p,!1)) return a -case"table":return q.jz(a) -case"style":case"script":return q.a.gc0().J(a) +case"table":return q.jA(a) +case"style":case"script":return q.a.gc1().L(a) case"input":s=a.e.m(0,"type") -if((s==null?p:A.c9(s))==="hidden"){q.a.a2(a.a,"unexpected-hidden-input-in-table") +if((s==null?p:A.cc(s))==="hidden"){q.a.a2(a.a,"unexpected-hidden-input-in-table") s=q.b s.O(a) s=s.c if(0>=s.length)return A.c(s,-1) -s.pop()}else q.fB(a) +s.pop()}else q.fC(a) return p case"form":q.a.a2(a.a,"unexpected-form-in-table") s=q.b @@ -13367,10 +13408,10 @@ r=s.c s.f=B.a.gA(r) if(0>=r.length)return A.c(r,-1) r.pop()}return p -default:q.fB(a) +default:q.fC(a) return p}}, P(a){var s,r=this,q=a.b -switch(q){case"table":r.bM(a) +switch(q){case"table":r.bN(a) return null case"body":case"caption":case"col":case"colgroup":case"html":case"tbody":case"td":case"tfoot":case"th":case"thead":case"tr":r.a.G(a.a,"unexpected-end-tag",A.v(["name",q],t.N,t.X)) return null @@ -13381,132 +13422,132 @@ q.r=!0 s.ga4().P(a) q.r=!1 return null}}, -eE(){var s=this.b.c +eI(){var s=this.b.c for(;;){if(!(B.a.gA(s).x!=="table"&&B.a.gA(s).x!=="html"))break if(0>=s.length)return A.c(s,-1) s.pop()}}, ac(){var s=B.a.gA(this.b.c) if(s.x!=="html")this.a.a2(s.e,"eof-in-table") return!1}, -aJ(a){var s=this.a,r=s.gaD(),q=s.gen() +aK(a){var s=this.a,r=s.gaF(),q=s.ger() s.x=q q.c=r -s.gaD().aJ(a) +s.gaF().aK(a) return null}, -a3(a){var s=this.a,r=s.gaD(),q=s.gen() +a3(a){var s=this.a,r=s.gaF(),q=s.ger() s.x=q q.c=r -s.gaD().a3(a) +s.gaF().a3(a) return null}, -fA(a){var s -this.eE() +fB(a){var s +this.eI() this.b.O(a) s=this.a -s.x=s.gel()}, -fC(a){var s -this.eE() +s.x=s.gep()}, +fD(a){var s +this.eI() this.b.O(a) s=this.a -s.x=s.gcj()}, -jz(a){var s=this.a +s.x=s.gck()}, +jA(a){var s=this.a s.G(a.a,"unexpected-start-tag-implies-end-tag",A.v(["startName","table","endName","table"],t.N,t.X)) -s.gaD().P(new A.H("table",!1)) +s.gaF().P(new A.H("table",!1)) return a}, -fB(a){var s,r=this.a +fC(a){var s,r=this.a r.G(a.a,u.M,A.v(["name",a.b],t.N,t.X)) s=this.b s.r=!0 -r.ga4().J(a) +r.ga4().L(a) s.r=!1}, -bM(a){var s,r=this,q=r.b -if(q.a0("table","table")){q.cc() +bN(a){var s,r=this,q=r.b +if(q.a0("table","table")){q.cd() q=q.c s=B.a.gA(q).x if(s!=="table")r.a.G(a.a,"end-tag-too-early-named",A.v(["gotName","table","expectedName",s],t.N,t.X)) while(B.a.gA(q).x!=="table"){if(0>=q.length)return A.c(q,-1) q.pop()}if(0>=q.length)return A.c(q,-1) q.pop() -r.a.ix()}else r.a.a2(a.a,"undefined-error")}} -A.fg.prototype={ -cP(){var s,r,q=this,p=q.d +r.a.iy()}else r.a.a2(a.a,"undefined-error")}} +A.fi.prototype={ +cR(){var s,r,q=this,p=q.d if(p.length===0)return s=A.w(p) -r=new A.Q(p,s.h("e(1)").a(new A.mG()),s.h("Q<1,e>")).aq(0,"") -if(!A.qQ(r)){p=q.a.gaA() +r=new A.Q(p,s.h("e(1)").a(new A.mL()),s.h("Q<1,e>")).ar(0,"") +if(!A.r0(r)){p=q.a.gaB() s=p.b s.r=!0 p.a.ga4().a3(new A.D(null,r)) -s.r=!1}else if(r.length!==0)q.b.bN(r,null) +s.r=!1}else if(r.length!==0)q.b.bO(r,null) q.d=A.i([],t.ks)}, -cb(a){var s -this.cP() +cc(a){var s +this.cR() s=this.c s.toString this.a.x=s return a}, -ac(){this.cP() +ac(){this.cR() var s=this.c s.toString this.a.x=s return!0}, -a3(a){if(a.gaC()==="\x00")return null +a3(a){if(a.gaE()==="\x00")return null B.a.l(this.d,a) return null}, -aJ(a){B.a.l(this.d,a) +aK(a){B.a.l(this.d,a) return null}, -J(a){var s -this.cP() +L(a){var s +this.cR() s=this.c s.toString this.a.x=s return a}, P(a){var s -this.cP() +this.cR() s=this.c s.toString this.a.x=s return a}} -A.mG.prototype={ -$1(a){return t.v.a(a).gaC()}, -$S:101} +A.mL.prototype={ +$1(a){return t.v.a(a).gaE()}, +$S:57} A.iB.prototype={ -J(a){switch(a.b){case"html":return this.bg(a) -case"caption":case"col":case"colgroup":case"tbody":case"td":case"tfoot":case"th":case"thead":case"tr":return this.jA(a) -default:return this.a.ga4().J(a)}}, +L(a){switch(a.b){case"html":return this.bg(a) +case"caption":case"col":case"colgroup":case"tbody":case"td":case"tfoot":case"th":case"thead":case"tr":return this.jB(a) +default:return this.a.ga4().L(a)}}, P(a){var s=this,r=a.b -switch(r){case"caption":s.mV(a) +switch(r){case"caption":s.mX(a) return null -case"table":return s.bM(a) +case"table":return s.bN(a) case"body":case"col":case"colgroup":case"html":case"tbody":case"td":case"tfoot":case"th":case"thead":case"tr":s.a.G(a.a,"unexpected-end-tag",A.v(["name",r],t.N,t.X)) return null default:return s.a.ga4().P(a)}}, ac(){this.a.ga4().ac() return!1}, a3(a){return this.a.ga4().a3(a)}, -jA(a){var s,r=this.a +jB(a){var s,r=this.a r.a2(a.a,"undefined-error") s=this.b.a0("caption","table") -r.gaD().P(new A.H("caption",!1)) +r.gaF().P(new A.H("caption",!1)) if(s)return a return null}, -mV(a){var s,r=this,q=r.b -if(q.a0("caption","table")){q.cc() +mX(a){var s,r=this,q=r.b +if(q.a0("caption","table")){q.cd() s=q.c if(B.a.gA(s).x!=="caption")r.a.G(a.a,"expected-one-end-tag-but-got-another",A.v(["gotName","caption","expectedName",B.a.gA(s).x],t.N,t.X)) while(B.a.gA(s).x!=="caption"){if(0>=s.length)return A.c(s,-1) s.pop()}if(0>=s.length)return A.c(s,-1) s.pop() -q.eC() +q.eG() q=r.a -q.x=q.gaA()}else r.a.a2(a.a,"undefined-error")}, -bM(a){var s,r=this.a +q.x=q.gaB()}else r.a.a2(a.a,"undefined-error")}, +bN(a){var s,r=this.a r.a2(a.a,"undefined-error") s=this.b.a0("caption","table") -r.gaD().P(new A.H("caption",!1)) +r.gaF().P(new A.H("caption",!1)) if(s)return a return null}} A.iD.prototype={ -J(a){var s,r=this +L(a){var s,r=this switch(a.b){case"html":return r.bg(a) case"col":s=r.b s.O(a) @@ -13515,92 +13556,92 @@ if(0>=s.length)return A.c(s,-1) s.pop() return null default:s=B.a.gA(r.b.c) -r.cN(new A.H("colgroup",!1)) +r.cP(new A.H("colgroup",!1)) return s.x==="html"?null:a}}, P(a){var s,r=this -switch(a.b){case"colgroup":r.cN(a) +switch(a.b){case"colgroup":r.cP(a) return null case"col":r.a.G(a.a,"no-end-tag",A.v(["name","col"],t.N,t.X)) return null default:s=B.a.gA(r.b.c) -r.cN(new A.H("colgroup",!1)) +r.cP(new A.H("colgroup",!1)) return s.x==="html"?null:a}}, ac(){if(B.a.gA(this.b.c).x==="html")return!1 -else{this.cN(new A.H("colgroup",!1)) +else{this.cP(new A.H("colgroup",!1)) return!0}}, a3(a){var s=B.a.gA(this.b.c) -this.cN(new A.H("colgroup",!1)) +this.cP(new A.H("colgroup",!1)) return s.x==="html"?null:a}, -cN(a){var s=this.b.c,r=this.a +cP(a){var s=this.b.c,r=this.a if(B.a.gA(s).x==="html")r.a2(a.a,"undefined-error") else{if(0>=s.length)return A.c(s,-1) s.pop() -r.x=r.gaA()}}} +r.x=r.gaB()}}} A.iK.prototype={ -J(a){var s,r=this,q=a.b +L(a){var s,r=this,q=a.b switch(q){case"html":return r.bg(a) -case"tr":r.fD(a) +case"tr":r.fE(a) return null case"td":case"th":s=t.N r.a.G(a.a,"unexpected-cell-in-table-body",A.v(["name",q],s,t.X)) -r.fD(A.aZ("tr",A.ae(t.K,s),null,!1)) +r.fE(A.b3("tr",A.aa(t.K,s),null,!1)) return a -case"caption":case"col":case"colgroup":case"tbody":case"tfoot":case"thead":return r.bM(a) -default:return r.a.gaA().J(a)}}, +case"caption":case"col":case"colgroup":case"tbody":case"tfoot":case"thead":return r.bN(a) +default:return r.a.gaB().L(a)}}, P(a){var s=this,r=a.b -switch(r){case"tbody":case"tfoot":case"thead":s.dG(a) +switch(r){case"tbody":case"tfoot":case"thead":s.dI(a) return null -case"table":return s.bM(a) +case"table":return s.bN(a) case"body":case"caption":case"col":case"colgroup":case"html":case"td":case"th":case"tr":s.a.G(a.a,"unexpected-end-tag-in-table-body",A.v(["name",r],t.N,t.X)) return null -default:return s.a.gaA().P(a)}}, -eD(){for(var s=this.b.c;!B.a.C(B.jk,B.a.gA(s).x);){if(0>=s.length)return A.c(s,-1) +default:return s.a.gaB().P(a)}}, +eH(){for(var s=this.b.c;!B.a.C(B.jk,B.a.gA(s).x);){if(0>=s.length)return A.c(s,-1) s.pop()}B.a.gA(s)}, -ac(){this.a.gaA().ac() +ac(){this.a.gaB().ac() return!1}, -aJ(a){return this.a.gaA().aJ(a)}, -a3(a){return this.a.gaA().a3(a)}, -fD(a){var s -this.eD() +aK(a){return this.a.gaB().aK(a)}, +a3(a){return this.a.gaB().a3(a)}, +fE(a){var s +this.eH() this.b.O(a) s=this.a -s.x=s.gdk()}, -dG(a){var s=this.b,r=this.a -if(s.a0(a.b,"table")){this.eD() +s.x=s.gdq()}, +dI(a){var s=this.b,r=this.a +if(s.a0(a.b,"table")){this.eH() s=s.c if(0>=s.length)return A.c(s,-1) s.pop() -r.x=r.gaA()}else r.G(a.a,"unexpected-end-tag-in-table-body",A.v(["name",a.b],t.N,t.X))}, -bM(a){var s=this,r="table",q=s.b -if(q.a0("tbody",r)||q.a0("thead",r)||q.a0("tfoot",r)){s.eD() -s.dG(new A.H(B.a.gA(q.c).x,!1)) +r.x=r.gaB()}else r.G(a.a,"unexpected-end-tag-in-table-body",A.v(["name",a.b],t.N,t.X))}, +bN(a){var s=this,r="table",q=s.b +if(q.a0("tbody",r)||q.a0("thead",r)||q.a0("tfoot",r)){s.eH() +s.dI(new A.H(B.a.gA(q.c).x,!1)) return a}else s.a.a2(a.a,"undefined-error") return null}} A.iH.prototype={ -J(a){var s,r,q=this +L(a){var s,r,q=this switch(a.b){case"html":return q.bg(a) -case"td":case"th":q.hV() +case"td":case"th":q.hW() s=q.b s.O(a) r=q.a -r.x=r.gdj() +r.x=r.gdn() s.d.l(0,null) return null case"caption":case"col":case"colgroup":case"tbody":case"tfoot":case"thead":case"tr":s=q.b.a0("tr","table") -q.dH(new A.H("tr",!1)) +q.dJ(new A.H("tr",!1)) return!s?null:a -default:return q.a.gaA().J(a)}}, +default:return q.a.gaB().L(a)}}, P(a){var s=this,r=a.b -switch(r){case"tr":s.dH(a) +switch(r){case"tr":s.dJ(a) return null case"table":r=s.b.a0("tr","table") -s.dH(new A.H("tr",!1)) +s.dJ(new A.H("tr",!1)) return!r?null:a -case"tbody":case"tfoot":case"thead":return s.dG(a) +case"tbody":case"tfoot":case"thead":return s.dI(a) case"body":case"caption":case"col":case"colgroup":case"html":case"td":case"th":s.a.G(a.a,"unexpected-end-tag-in-table-row",A.v(["name",r],t.N,t.X)) return null -default:return s.a.gaA().P(a)}}, -hV(){var s,r,q,p,o,n,m,l,k,j,i +default:return s.a.gaB().P(a)}}, +hW(){var s,r,q,p,o,n,m,l,k,j,i for(s=this.b.c,r=this.a,q=t.N,p=t.X,o=t.n,n=r.c.a;;){m=B.a.gA(s) l=m.x if(l==="tr"||l==="html")break @@ -13609,60 +13650,60 @@ l=o.a(A.v(["name",B.a.gA(s).x],q,p)) if(k==null){j=n.w if(j==null)k=null else{i=n.y -new A.bh(j,i).bh(j,i) -k=new A.aw(j,i,i) -k.aG(j,i,i)}}B.a.l(r.e,new A.bb("unexpected-implied-end-tag-in-table-row",k,l)) +new A.bi(j,i).bh(j,i) +k=new A.az(j,i,i) +k.aI(j,i,i)}}B.a.l(r.e,new A.bc("unexpected-implied-end-tag-in-table-row",k,l)) if(0>=s.length)return A.c(s,-1) s.pop()}}, -ac(){this.a.gaA().ac() +ac(){this.a.gaB().ac() return!1}, -aJ(a){return this.a.gaA().aJ(a)}, -a3(a){return this.a.gaA().a3(a)}, -dH(a){var s=this.b,r=this.a -if(s.a0("tr","table")){this.hV() +aK(a){return this.a.gaB().aK(a)}, +a3(a){return this.a.gaB().a3(a)}, +dJ(a){var s=this.b,r=this.a +if(s.a0("tr","table")){this.hW() s=s.c if(0>=s.length)return A.c(s,-1) s.pop() -r.x=r.gcj()}else r.a2(a.a,"undefined-error")}, -dG(a){if(this.b.a0(a.b,"table")){this.dH(new A.H("tr",!1)) +r.x=r.gck()}else r.a2(a.a,"undefined-error")}, +dI(a){if(this.b.a0(a.b,"table")){this.dJ(new A.H("tr",!1)) return a}else{this.a.a2(a.a,"undefined-error") return null}}} A.iC.prototype={ -J(a){switch(a.b){case"html":return this.bg(a) -case"caption":case"col":case"colgroup":case"tbody":case"td":case"tfoot":case"th":case"thead":case"tr":return this.jB(a) -default:return this.a.ga4().J(a)}}, +L(a){switch(a.b){case"html":return this.bg(a) +case"caption":case"col":case"colgroup":case"tbody":case"td":case"tfoot":case"th":case"thead":case"tr":return this.jC(a) +default:return this.a.ga4().L(a)}}, P(a){var s=this,r=a.b -switch(r){case"td":case"th":s.eR(a) +switch(r){case"td":case"th":s.eV(a) return null case"body":case"caption":case"col":case"colgroup":case"html":s.a.G(a.a,"unexpected-end-tag",A.v(["name",r],t.N,t.X)) return null -case"table":case"tbody":case"tfoot":case"thead":case"tr":return s.mX(a) +case"table":case"tbody":case"tfoot":case"thead":case"tr":return s.mZ(a) default:return s.a.ga4().P(a)}}, -hW(){var s=this.b -if(s.a0("td","table"))this.eR(new A.H("td",!1)) -else if(s.a0("th","table"))this.eR(new A.H("th",!1))}, +hX(){var s=this.b +if(s.a0("td","table"))this.eV(new A.H("td",!1)) +else if(s.a0("th","table"))this.eV(new A.H("th",!1))}, ac(){this.a.ga4().ac() return!1}, a3(a){return this.a.ga4().a3(a)}, -jB(a){var s=this.b -if(s.a0("td","table")||s.a0("th","table")){this.hW() +jC(a){var s=this.b +if(s.a0("td","table")||s.a0("th","table")){this.hX() return a}else{this.a.a2(a.a,"undefined-error") return null}}, -eR(a){var s,r=this,q=r.b,p=q.a0(a.b,"table"),o=a.b -if(p){q.bS(o) +eV(a){var s,r=this,q=r.b,p=q.a0(a.b,"table"),o=a.b +if(p){q.bU(o) p=q.c o=B.a.gA(p) s=a.b if(o.x!=s){r.a.G(a.a,"unexpected-cell-end-tag",A.v(["name",s],t.N,t.X)) -r.ct(a)}else{if(0>=p.length)return A.c(p,-1) -p.pop()}q.eC() +r.cv(a)}else{if(0>=p.length)return A.c(p,-1) +p.pop()}q.eG() q=r.a -q.x=q.gdk()}else r.a.G(a.a,"unexpected-end-tag",A.v(["name",o],t.N,t.X))}, -mX(a){if(this.b.a0(a.b,"table")){this.hW() +q.x=q.gdq()}else r.a.G(a.a,"unexpected-end-tag",A.v(["name",o],t.N,t.X))}, +mZ(a){if(this.b.a0(a.b,"table")){this.hX() return a}else this.a.a2(a.a,"undefined-error") return null}} A.iJ.prototype={ -J(a){var s,r=this,q=null,p=a.b +L(a){var s,r=this,q=null,p=a.b switch(p){case"html":return r.bg(a) case"option":p=r.b s=p.c @@ -13676,10 +13717,10 @@ s.pop()}if(B.a.gA(s).x==="optgroup"){if(0>=s.length)return A.c(s,-1) s.pop()}p.O(a) return q case"select":r.a.a2(a.a,"unexpected-select-in-select") -r.eQ(new A.H("select",!1)) +r.eU(new A.H("select",!1)) return q -case"input":case"keygen":case"textarea":return r.jw(a) -case"script":return r.a.gc0().J(a) +case"input":case"keygen":case"textarea":return r.jx(a) +case"script":return r.a.gc1().L(a) default:r.a.G(a.a,"unexpected-start-tag-in-select",A.v(["name",p],t.N,t.X)) return q}}, P(a){var s,r,q=this,p=null,o="unexpected-end-tag-in-select",n=a.b @@ -13697,45 +13738,45 @@ if(s){if(0>=n.length)return A.c(n,-1) n.pop()}if(B.a.gA(n).x==="optgroup"){if(0>=n.length)return A.c(n,-1) n.pop()}else q.a.G(a.a,o,A.v(["name","optgroup"],t.N,t.X)) return p -case"select":q.eQ(a) +case"select":q.eU(a) return p default:q.a.G(a.a,o,A.v(["name",n],t.N,t.X)) return p}}, ac(){var s=B.a.gA(this.b.c) if(s.x!=="html")this.a.a2(s.e,"eof-in-select") return!1}, -a3(a){if(a.gaC()==="\x00")return null -this.b.bN(a.gaC(),a.a) +a3(a){if(a.gaE()==="\x00")return null +this.b.bO(a.gaE(),a.a) return null}, -jw(a){var s="select" +jx(a){var s="select" this.a.a2(a.a,"unexpected-input-in-select") -if(this.b.a0(s,s)){this.eQ(new A.H(s,!1)) +if(this.b.a0(s,s)){this.eU(new A.H(s,!1)) return a}return null}, -eQ(a){var s=this.a -if(this.b.a0("select","select")){this.ct(a) -s.ix()}else s.a2(a.a,"undefined-error")}} +eU(a){var s=this.a +if(this.b.a0("select","select")){this.cv(a) +s.iy()}else s.a2(a.a,"undefined-error")}} A.iI.prototype={ -J(a){var s,r=a.b +L(a){var s,r=a.b switch(r){case"caption":case"table":case"tbody":case"tfoot":case"thead":case"tr":case"td":case"th":s=this.a s.G(a.a,u.a,A.v(["name",r],t.N,t.X)) -s.gbH().P(new A.H("select",!1)) +s.gbI().P(new A.H("select",!1)) return a -default:return this.a.gbH().J(a)}}, -P(a){switch(a.b){case"caption":case"table":case"tbody":case"tfoot":case"thead":case"tr":case"td":case"th":return this.bM(a) -default:return this.a.gbH().P(a)}}, -ac(){this.a.gbH().ac() +default:return this.a.gbI().L(a)}}, +P(a){switch(a.b){case"caption":case"table":case"tbody":case"tfoot":case"thead":case"tr":case"td":case"th":return this.bN(a) +default:return this.a.gbI().P(a)}}, +ac(){this.a.gbI().ac() return!1}, -a3(a){return this.a.gbH().a3(a)}, -bM(a){var s=this.a +a3(a){return this.a.gbI().a3(a)}, +bN(a){var s=this.a s.G(a.a,u.r,A.v(["name",a.b],t.N,t.X)) -if(this.b.a0(a.b,"table")){s.gbH().P(new A.H("select",!1)) +if(this.b.a0(a.b,"table")){s.gbI().P(new A.H("select",!1)) return a}return null}} A.iE.prototype={ a3(a){var s -if(a.gaC()==="\x00"){a.c="\ufffd" +if(a.gaE()==="\x00"){a.c="\ufffd" a.b=null}else{s=this.a -if(s.z&&!A.qQ(a.gaC()))s.z=!1}return this.jN(a)}, -J(a){var s,r,q,p=this,o=p.b,n=o.c,m=B.a.gA(n) +if(s.z&&!A.r0(a.gaE()))s.z=!1}return this.jO(a)}, +L(a){var s,r,q,p=this,o=p.b,n=o.c,m=B.a.gA(n) if(!B.a.C(B.j5,a.b))if(a.b==="font")s=a.e.a7("color")||a.e.a7("face")||a.e.a7("size") else s=!1 else s=!0 @@ -13743,32 +13784,32 @@ if(s){s=p.a s.G(a.a,u.G,A.v(["name",a.b],t.N,t.X)) o=o.a for(;;){r=!1 -if(B.a.gA(n).w!=o)if(!s.ic(B.a.gA(n))){r=B.a.gA(n) -r=!B.hP.C(0,new A.l(r.w,r.x))}if(!r)break +if(B.a.gA(n).w!=o)if(!s.ie(B.a.gA(n))){r=B.a.gA(n) +r=!B.hQ.C(0,new A.l(r.w,r.x))}if(!r)break if(0>=n.length)return A.c(n,-1) n.pop()}return a}else{s=m.w -if(s==="http://www.w3.org/1998/Math/MathML")p.a.hH(a) +if(s==="http://www.w3.org/1998/Math/MathML")p.a.hI(a) else if(s==="http://www.w3.org/2000/svg"){q=B.rp.m(0,a.b) if(q!=null)a.b=q -p.a.hI(a)}p.a.ex(a) +p.a.hJ(a)}p.a.eB(a) a.w=s o.O(a) if(a.c){if(0>=n.length)return A.c(n,-1) n.pop() a.r=!0}return null}}, P(a){var s,r,q,p=this,o=p.b,n=o.c,m=n.length-1,l=B.a.gA(n),k=l.x -k=k==null?null:A.c9(k) +k=k==null?null:A.cc(k) s=a.b if(k!=s)p.a.G(a.a,"unexpected-end-tag",A.v(["name",s],t.N,t.X)) for(o=o.a;r=null,!0;){k=l.x -k=k==null?null:A.c9(k) +k=k==null?null:A.cc(k) if(k==a.b){o=p.a q=o.x -if(q===$)q=o.x=o.gbo() -if(q===o.gen()){q=o.x -if(q===$)q=o.x=o.gbo() +if(q===$)q=o.x=o.gbp() +if(q===o.ger()){q=o.x +if(q===$)q=o.x=o.gbp() t.aB.a(q) -q.cP() +q.cR() k=q.c k.toString o.x=k}for(;;){if(0>=n.length)return A.c(n,-1) @@ -13778,37 +13819,37 @@ l=n[m] if(l.w!=o)continue else{o=p.a q=o.x -r=(q===$?o.x=o.gbo():q).P(a) +r=(q===$?o.x=o.gbp():q).P(a) break}}return r}} -A.hK.prototype={ -J(a){var s,r=a.b -if(r==="html")return this.a.ga4().J(a) +A.hM.prototype={ +L(a){var s,r=a.b +if(r==="html")return this.a.ga4().L(a) s=this.a s.G(a.a,"unexpected-start-tag-after-body",A.v(["name",r],t.N,t.X)) s.x=s.ga4() return a}, P(a){var s,r=a.b -if(r==="html"){this.eP(a) +if(r==="html"){this.eT(a) return null}s=this.a s.G(a.a,"unexpected-end-tag-after-body",A.v(["name",r],t.N,t.X)) s.x=s.ga4() return a}, ac(){return!1}, -cb(a){var s=this.b,r=s.c +cc(a){var s=this.b,r=s.c if(0>=r.length)return A.c(r,0) -s.cr(a,r[0]) +s.ct(a,r[0]) return null}, a3(a){var s=this.a s.a2(a.a,"unexpected-char-after-body") s.x=s.ga4() return a}, -eP(a){var s,r,q,p -for(s=this.b.c,r=A.w(s).h("X<1>"),s=new A.X(s,r),s=new A.M(s,s.gn(0),r.h("M")),r=r.h("G.E");s.p();){q=s.d +eT(a){var s,r,q,p +for(s=this.b.c,r=A.w(s).h("Y<1>"),s=new A.Y(s,r),s=new A.N(s,s.gn(0),r.h("N")),r=r.h("G.E");s.p();){q=s.d if((q==null?r.a(q):q).x==="html")break}s=this.a p=s.k4 -s.x=p===$?s.k4=new A.hI(s,s.d):p}} +s.x=p===$?s.k4=new A.hK(s,s.d):p}} A.iF.prototype={ -J(a){var s=this,r=a.b +L(a){var s=this,r=a.b switch(r){case"html":return s.bg(a) case"frameset":s.b.O(a) return null @@ -13818,7 +13859,7 @@ r=r.c if(0>=r.length)return A.c(r,-1) r.pop() return null -case"noframes":return s.a.ga4().J(a) +case"noframes":return s.a.ga4().L(a) default:s.a.G(a.a,"unexpected-start-tag-in-frameset",A.v(["name",r],t.N,t.X)) return null}}, P(a){var s,r=this,q=a.b @@ -13828,7 +13869,7 @@ else{if(0>=q.length)return A.c(q,-1) q.pop()}q=B.a.gA(q) if(q.x!=="frameset"){q=r.a s=q.k3 -q.x=s===$?q.k3=new A.hL(q,q.d):s}return null +q.x=s===$?q.k3=new A.hN(q,q.d):s}return null default:r.a.G(a.a,"unexpected-end-tag-in-frameset",A.v(["name",q],t.N,t.X)) return null}}, ac(){var s=B.a.gA(this.b.c) @@ -13836,34 +13877,34 @@ if(s.x!=="html")this.a.a2(s.e,"eof-in-frameset") return!1}, a3(a){this.a.a2(a.a,"unexpected-char-in-frameset") return null}} -A.hL.prototype={ -J(a){var s=a.b +A.hN.prototype={ +L(a){var s=a.b switch(s){case"html":return this.bg(a) -case"noframes":return this.a.gc0().J(a) +case"noframes":return this.a.gc1().L(a) default:this.a.G(a.a,"unexpected-start-tag-after-frameset",A.v(["name",s],t.N,t.X)) return null}}, P(a){var s,r=a.b,q=this.a switch(r){case"html":s=q.ok -q.x=s===$?q.ok=new A.hJ(q,q.d):s +q.x=s===$?q.ok=new A.hL(q,q.d):s return null default:q.G(a.a,"unexpected-end-tag-after-frameset",A.v(["name",r],t.N,t.X)) return null}}, ac(){return!1}, a3(a){this.a.a2(a.a,"unexpected-char-after-frameset") return null}} -A.hI.prototype={ -J(a){var s,r=a.b -if(r==="html")return this.a.ga4().J(a) +A.hK.prototype={ +L(a){var s,r=a.b +if(r==="html")return this.a.ga4().L(a) s=this.a s.G(a.a,"expected-eof-but-got-start-tag",A.v(["name",r],t.N,t.X)) s.x=s.ga4() return a}, ac(){return!1}, -cb(a){var s=this.b,r=s.b +cc(a){var s=this.b,r=s.b r===$&&A.o() -s.cr(a,r) +s.ct(a,r) return null}, -aJ(a){return this.a.ga4().aJ(a)}, +aK(a){return this.a.ga4().aK(a)}, a3(a){var s=this.a s.a2(a.a,"expected-eof-but-got-char") s.x=s.ga4() @@ -13872,131 +13913,131 @@ P(a){var s=this.a s.G(a.a,"expected-eof-but-got-end-tag",A.v(["name",a.b],t.N,t.X)) s.x=s.ga4() return a}} -A.hJ.prototype={ -J(a){var s=a.b,r=this.a -switch(s){case"html":return r.ga4().J(a) -case"noframes":return r.gc0().J(a) +A.hL.prototype={ +L(a){var s=a.b,r=this.a +switch(s){case"html":return r.ga4().L(a) +case"noframes":return r.gc1().L(a) default:r.G(a.a,"expected-eof-but-got-start-tag",A.v(["name",s],t.N,t.X)) return null}}, ac(){return!1}, -cb(a){var s=this.b,r=s.b +cc(a){var s=this.b,r=s.b r===$&&A.o() -s.cr(a,r) +s.ct(a,r) return null}, -aJ(a){return this.a.ga4().aJ(a)}, +aK(a){return this.a.ga4().aK(a)}, a3(a){this.a.a2(a.a,"expected-eof-but-got-char") return null}, P(a){this.a.G(a.a,"expected-eof-but-got-end-tag",A.v(["name",a.b],t.N,t.X)) return null}} -A.bb.prototype={ +A.bc.prototype={ j(a){var s,r,q=this,p=q.b if(p==null){p=B.fX.m(0,q.a) p.toString -return A.ut(p,q.c)}s=B.fX.m(0,q.a) +return A.uE(p,q.c)}s=B.fX.m(0,q.a) s.toString -r=p.ig(A.ut(s,q.c),null) +r=p.ih(A.uE(s,q.c),null) return p.a.a==null?"ParserError on "+r:"On "+r}, $iaj:1} -A.nB.prototype={} +A.nH.prototype={} A.ia.prototype={ -d0(){var s,r,q,p,o=A.w2(t.N),n=this.a.b.m(0,"class") +d3(){var s,r,q,p,o=A.wc(t.N),n=this.a.b.m(0,"class") for(s=(n==null?"":n).split(" "),r=s.length,q=0;q=this.a.length)throw A.f(A.qx("No more elements")) +sav(a){if(this.b>=this.a.length)throw A.f(A.qI("No more elements")) this.b=a}, -gau(){var s=this.b -if(s>=this.a.length)throw A.f(A.qx("No more elements")) +gav(){var s=this.b +if(s>=this.a.length)throw A.f(A.qI("No more elements")) if(s>=0)return s else return 0}, -kZ(a){var s,r,q,p,o=this +l0(a){var s,r,q,p,o=this t.pi.a(a) -if(a==null)a=A.um() -s=o.gau() +if(a==null)a=A.ux() +s=o.gav() for(r=o.a,q=r.length;s=0))return A.c(r,s) p=r[s] if(!a.$1(p)){o.b=s return p}++s}o.b=s return null}, -hq(){return this.kZ(null)}, -l_(a){var s,r,q,p +hr(){return this.l0(null)}, +l1(a){var s,r,q,p t.dB.a(a) -s=this.gau() +s=this.gav() for(r=this.a,q=r.length;s=0))return A.c(r,s) p=r[s] if(a.$1(p)){this.b=s return p}++s}return null}, -hb(a){var s=B.b.ap(this.a,a,this.gau()) +hc(a){var s=B.b.ap(this.a,a,this.gav()) if(s>=0){this.b=s+a.length-1 -return!0}else throw A.f(A.qx("No more elements"))}, -es(a,b){if(b==null)b=this.a.length +return!0}else throw A.f(A.qI("No more elements"))}, +ex(a,b){if(b==null)b=this.a.length if(b<0)b+=this.a.length return B.b.t(this.a,a,b)}, -l0(a){return this.es(a,null)}} +l2(a){return this.ex(a,null)}} A.lN.prototype={ -nE(){var s,r,q,p,o,n,m,l +nG(){var s,r,q,p,o,n,m,l try{p=this.a -p.hb("charset") -p.sau(p.gau()+1) -p.hq() +p.hc("charset") +p.sav(p.gav()+1) +p.hr() o=p.a -n=p.gau() +n=p.gav() m=o.length if(!(n>=0&&n=0&&n=0&&n=0&&n0){r=h.x q=r.length -B.a.fc(r,q-n,q)}}, -hS(a){var s=A.ce("cannot change encoding when parsing a String.") +B.a.fd(r,q-n,q)}}, +hT(a){var s=A.ch("cannot change encoding when parsing a String.") throw A.f(s)}, D(){var s,r,q,p,o=this,n=o.y,m=o.x,l=m.length if(n>=l)return null @@ -14013,84 +14054,84 @@ if((m[n]&64512)===55296){if(!(q>=0))return A.c(m,q) n=(m[q]&64512)===56320}else n=p}else n=p if(n){o.y=s+1 if(!(s>=0&&s=q)return null if(!(s>=0))return A.c(r,s) return r[s]}, -lZ(a){var s,r,q=this +m0(a){var s,r,q=this t.nO.a(a) s=q.y -for(;;){r=q.cs() -if(!(r!=null&&!a.C(0,r)))break;++q.y}return A.aA(B.a.am(q.x,s,q.y),0,null)}, -hT(a){var s,r=this,q=r.y -for(;;){s=r.cs() -if(!(s!=null&&a!==s))break;++r.y}return A.aA(B.a.am(r.x,q,r.y),0,null)}, -co(a,b){var s,r,q=this,p=q.y -for(;;){s=q.cs() +for(;;){r=q.cu() +if(!(r!=null&&!a.C(0,r)))break;++q.y}return A.aD(B.a.am(q.x,s,q.y),0,null)}, +hU(a){var s,r=this,q=r.y +for(;;){s=r.cu() +if(!(s!=null&&a!==s))break;++r.y}return A.aD(B.a.am(r.x,q,r.y),0,null)}, +cq(a,b){var s,r,q=this,p=q.y +for(;;){s=q.cu() if(s!=null)r=!(a===s||b===s) else r=!1 -if(!r)break;++q.y}return A.aA(B.a.am(q.x,p,q.y),0,null)}, -hU(a,b,c){var s,r,q=this,p=q.y -for(;;){s=q.cs() +if(!r)break;++q.y}return A.aD(B.a.am(q.x,p,q.y),0,null)}, +hV(a,b,c){var s,r,q=this,p=q.y +for(;;){s=q.cu() if(s!=null)r=!(a===s||b===s||c===s) else r=!1 -if(!r)break;++q.y}return A.aA(B.a.am(q.x,p,q.y),0,null)}, -m_(a){var s,r,q=this,p=q.y -for(;;){s=q.cs() +if(!r)break;++q.y}return A.aD(B.a.am(q.x,p,q.y),0,null)}, +m1(a){var s,r,q=this,p=q.y +for(;;){s=q.cu() if(s!=null)if(!(s>=65&&s<=90))r=s>=97&&s<=122 else r=!0 else r=!1 -if(!r)break;++q.y}return A.aA(B.a.am(q.x,p,q.y),0,null)}, -cL(a){var s,r,q=this,p=q.y -for(;;){s=q.cs() +if(!r)break;++q.y}return A.aD(B.a.am(q.x,p,q.y),0,null)}, +cN(a){var s,r,q=this,p=q.y +for(;;){s=q.cu() if(s!=null)r=s===32||s===10||s===13||s===9||s===12 else r=!1 -if(!r)break;++q.y}return A.aA(B.a.am(q.x,p,q.y),0,null)}, +if(!r)break;++q.y}return A.aD(B.a.am(q.x,p,q.y),0,null)}, X(a){if(a!=null)this.y=this.y-a.length}} -A.b9.prototype={ +A.bb.prototype={ gn(a){return this.a.length}, gF(a){var s=this.a return new J.J(s,s.length,A.w(s).h("J<1>"))}, m(a,b){var s=this.a if(!(b>=0&&b").a(b))}} -A.d0.prototype={ -f8(a,b){var s,r,q,p,o,n,m -for(s=a.gL().gF(0),r=new A.bZ(s,t.pl),q=b.b,p=this.gfn(),o=t.Q;r.p();){n=o.a(s.gB()) +l(a,b){B.a.l(this.a,A.x(this).h("bb.E").a(b))}, +by(a,b,c){return B.a.by(this.a,b,A.x(this).h("bb.E").a(c))}, +a1(a,b){B.a.a1(this.a,A.x(this).h("h").a(b))}} +A.bY.prototype={ +dV(a,b){var s,r,q,p,o,n,m +for(s=a.gJ().gF(0),r=new A.c1(s,t.pl),q=b.b,p=this.gfo(),o=t.Q;r.p();){n=o.a(s.gB()) this.a=n -if(B.a.aH(q,p))return n -m=this.f8(n,b) +if(B.a.aC(q,p))return n +m=this.dV(n,b) if(m!=null)return m}return null}, -f9(a,b,c){var s,r,q,p,o,n +d2(a,b,c){var s,r,q,p,o,n t.jB.a(c) -for(s=a.gL().gF(0),r=new A.bZ(s,t.pl),q=b.b,p=this.gfn(),o=t.Q;r.p();){n=o.a(s.gB()) +for(s=a.gJ().gF(0),r=new A.c1(s,t.pl),q=b.b,p=this.gfo(),o=t.Q;r.p();){n=o.a(s.gB()) this.a=n -if(B.a.aH(q,p))B.a.l(c,n) -this.f9(n,b,c)}}, -iF(a){var s,r,q,p,o,n,m,l,k,j,i=this,h=null +if(B.a.aC(q,p))B.a.l(c,n) +this.d2(n,b,c)}}, +iG(a){var s,r,q,p,o,n,m,l,k,j,i=this,h=null t.dT.a(a) s=i.a -for(r=a.b,q=A.w(r).h("X<1>"),r=new A.X(r,q),r=new A.M(r,r.gn(0),q.h("M")),q=q.h("G.E"),p=h;o=!0,r.p();){n=r.d +for(r=a.b,q=A.w(r).h("Y<1>"),r=new A.Y(r,q),r=new A.N(r,r.gn(0),q.h("N")),q=q.h("G.E"),p=h;o=!0,r.p();){n=r.d if(n==null)n=q.a(n) -if(p==null)o=A.hA(n.c.M(i)) +if(p==null)o=A.hC(n.c.K(i)) else{if(p===514){m=n.c do{l=i.a.a k=l instanceof A.K?l:h -i.a=k}while(k!=null&&!A.hA(m.M(i))) +i.a=k}while(k!=null&&!A.hC(m.K(i))) m=i.a o=m!=null}else if(p===517){m=n.c -do{k=i.a.gdR() -i.a=k}while(k!=null&&!A.hA(m.M(i))) +do{k=i.a.gdT() +i.a=k}while(k!=null&&!A.hC(m.K(i))) m=i.a o=m!=null}p=h}if(!o)break j=n.b -switch(j){case 515:i.a=i.a.gdR() +switch(j){case 515:i.a=i.a.gdT() break case 516:l=i.a.a i.a=l instanceof A.K?l:h @@ -14098,28 +14139,28 @@ break case 514:case 517:p=j break case 513:break -default:throw A.f(i.hz(a))}if(i.a==null){o=!1 +default:throw A.f(i.hA(a))}if(i.a==null){o=!1 break}}i.a=s return o}, -cK(a){return new A.fW("'"+a.j(0)+"' selector of type "+A.cN(a).j(0)+" is not implemented")}, -hz(a){return new A.aC("'"+a.j(0)+"' is not a valid selector",null,null)}, -op(a){var s=this,r=a.b +cM(a){return new A.fY("'"+a.j(0)+"' selector of type "+A.cP(a).j(0)+" is not implemented")}, +hA(a){return new A.aG("'"+a.j(0)+"' is not a valid selector",null,null)}, +os(a){var s=this,r=a.b switch(r.ga8()){case"root":r=s.a return r.x==="html"&&r.a==null -case"empty":r=s.a.gL() -return r.aH(r,new A.nI()) -case"blank":r=s.a.gL() -return r.aH(r,new A.nJ()) -case"first-child":return s.a.gdR()==null -case"last-child":return s.a.gii()==null -case"only-child":return s.a.gdR()==null&&s.a.gii()==null +case"empty":r=s.a.gJ() +return r.aC(r,new A.nO()) +case"blank":r=s.a.gJ() +return r.aC(r,new A.nP()) +case"first-child":return s.a.gdT()==null +case"last-child":return s.a.gij()==null +case"only-child":return s.a.gdT()==null&&s.a.gij()==null case"link":return s.a.b.m(0,"href")!=null -case"visited":return!1}if(A.rW(r.ga8()))return!1 -throw A.f(s.cK(a))}, -or(a){if(A.rW(a.b.ga8()))return!1 -throw A.f(this.cK(a))}, -oq(a){return A.P(this.cK(a))}, -oo(a){var s,r,q,p,o,n,m=this +case"visited":return!1}if(A.t5(r.ga8()))return!1 +throw A.f(s.cM(a))}, +ou(a){if(A.t5(a.b.ga8()))return!1 +throw A.f(this.cM(a))}, +ot(a){return A.M(this.cM(a))}, +or(a){var s,r,q,p,o,n,m=this switch(a.b.ga8()){case"nth-child":s=t.b9.a(a.f).b r=s.length if(r===1){if(0>=r)return A.c(s,0) @@ -14129,95 +14170,95 @@ r=t.mH.a(s[0]).c if(typeof r!="number")return!1 p=m.a.a q=!1 -if(p!=null)if(r>0){q=p.gL() -r=q.al(q,m.a)===r}else r=q +if(p!=null)if(r>0){q=p.gJ() +r=q.aj(q,m.a)===r}else r=q else r=q return r}break case"lang":r=t.b9.a(a.f) r=r.a r.toString -o=A.aA(B.aA.am(r.a.c,r.b,r.c),0,null) -n=A.wL(m.a) -return n!=null&&B.b.U(n,o)}throw A.f(m.cK(a))}, -on(a){if(!A.hA(t.g9.a(a.b).M(this)))return!1 -if(a.d instanceof A.d4)return!0 -if(a.gih()==="")return this.a.w==null -throw A.f(this.cK(a))}, -oj(a){var s,r,q,p=this.a.b.m(0,a.b.ga8().toLowerCase()) +o=A.aD(B.aA.am(r.a.c,r.b,r.c),0,null) +n=A.wV(m.a) +return n!=null&&B.b.U(n,o)}throw A.f(m.cM(a))}, +oq(a){if(!A.hC(t.g9.a(a.b).K(this)))return!1 +if(a.d instanceof A.d5)return!0 +if(a.gii()==="")return this.a.w==null +throw A.f(this.cM(a))}, +on(a){var s,r,q,p=this.a.b.m(0,a.b.ga8().toLowerCase()) if(p==null)return!1 s=a.d if(s===535)return!0 r=A.k(a.e) A:{if(28===s){s=p===r -break A}if(530===s){s=B.a.aH(A.i(p.split(" "),t.s),new A.nG(r)) +break A}if(530===s){s=B.a.aC(A.i(p.split(" "),t.s),new A.nM(r)) break A}if(531===s){if(B.b.U(p,r)){s=p.length q=r.length if(s!==q){if(!(q1114111){l=A.v(["charAsInt",n],t.N,t.X) @@ -14258,11 +14299,11 @@ k.i(new A.j(l,j,i)) m="\ufffd"}else{l=!0 if(!(1<=n&&n<=8))if(!(14<=n&&n<=31))if(!(127<=n&&n<=159))l=64976<=n&&n<=65007||B.a.C(B.jj,n) if(l){l=A.v(["charAsInt",n],t.N,t.X) -k.i(new A.j(l,j,i))}m=A.aA(A.i([n],t.Z),0,j)}if(o!==";"){k.i(new A.j(j,j,"numeric-entity-without-semicolon")) +k.i(new A.j(l,j,i))}m=A.aD(A.i([n],t.Z),0,j)}if(o!==";"){k.i(new A.j(j,j,"numeric-entity-without-semicolon")) p.X(o)}return m}, -dF(a,b){var s,r,q,p,o,n,m,l,k,j=this,i=null,h=j.a,g=A.i([h.D()],t.mf) +dH(a,b){var s,r,q,p,o,n,m,l,k,j=this,i=null,h=j.a,g=A.i([h.D()],t.mf) if(0>=g.length)return A.c(g,0) -if(!A.a8(g[0])){if(0>=g.length)return A.c(g,0) +if(!A.a9(g[0])){if(0>=g.length)return A.c(g,0) s=g[0] s=s==="<"||s==="&"||s==null||a===s}else s=!0 if(s){if(0>=g.length)return A.c(g,0) @@ -14271,13 +14312,13 @@ r="&"}else{if(0>=g.length)return A.c(g,0) if(g[0]==="#"){B.a.l(g,h.D()) q=B.a.gA(g)==="x"||B.a.gA(g)==="X" if(q)B.a.l(g,h.D()) -if(!(q&&A.uy(B.a.gA(g))))s=!q&&A.pJ(B.a.gA(g)) +if(!(q&&A.uJ(B.a.gA(g))))s=!q&&A.pR(B.a.gA(g)) else s=!0 if(s){h.X(B.a.gA(g)) -r=j.me(q)}else{j.i(new A.j(i,i,"expected-numeric-entity")) +r=j.mg(q)}else{j.i(new A.j(i,i,"expected-numeric-entity")) if(0>=g.length)return A.c(g,-1) h.X(g.pop()) -r="&"+B.a.aQ(g)}}else{s=B.a.gA(g) +r="&"+B.a.aR(g)}}else{s=B.a.gA(g) if(s==null)s=i else{if(0>=s.length)return A.c(s,0) s=s.charCodeAt(0)}p=B.kS.m(0,s) @@ -14288,7 +14329,7 @@ if(s==null)s=i else{if(0>=s.length)return A.c(s,0) s=s.charCodeAt(0)}p=p.m(0,s)}n=g.length-1 for(;;){if(!(n>1)){o=i -break}m=B.a.aQ(B.a.am(g,0,n)) +break}m=B.a.aR(B.a.am(g,0,n)) if(B.fs.a7(m)){o=m break}--n}if(o!=null){s=o.length l=s-1 @@ -14298,97 +14339,97 @@ if(s)j.i(new A.j(i,i,"named-entity-without-semicolon")) l=!1 if(s)if(b){if(!(n>=0&&n=g.length)return A.c(g,-1) h.X(g.pop()) -r="&"+B.a.aQ(g)}else{r=B.fs.m(0,o) +r="&"+B.a.aR(g)}else{r=B.fs.m(0,o) if(0>=g.length)return A.c(g,-1) h.X(g.pop()) -r=A.k(r)+B.a.aQ(A.r1(g,n,i,t.jv))}}else{if(!b)j.i(new A.j(i,i,"expected-named-entity")) +r=A.k(r)+B.a.aR(A.rc(g,n,i,t.jv))}}else{if(!b)j.i(new A.j(i,i,"expected-named-entity")) if(0>=g.length)return A.c(g,-1) h.X(g.pop()) -r="&"+B.a.aQ(g)}}}if(b)j.ay.a+=r -else{if(A.a8(r))k=new A.dC(i,r) +r="&"+B.a.aR(g)}}}if(b)j.ay.a+=r +else{if(A.a9(r))k=new A.dC(i,r) else k=new A.D(i,r) j.i(k)}}, -i0(){return this.dF(null,!1)}, +i1(){return this.dH(null,!1)}, b7(){var s,r,q,p,o,n,m=this,l=null,k=m.w k.toString -if(k instanceof A.cA){s=k.b -k.b=s==null?l:A.c9(s) +if(k instanceof A.cC){s=k.b +k.b=s==null?l:A.cc(s) if(k instanceof A.H){if(m.Q!=null)m.i(new A.j(l,l,"attributes-in-end-tag")) -if(k.c)m.i(new A.j(l,l,"this-closing-flag-on-end-tag"))}else if(k instanceof A.d2){k.saC(A.ae(t.K,t.N)) +if(k.c)m.i(new A.j(l,l,"this-closing-flag-on-end-tag"))}else if(k instanceof A.d3){k.saE(A.aa(t.K,t.N)) s=m.Q -if(s!=null)for(r=s.length,q=0;q"){s.i(new A.j(r,r,"expected-tag-name-but-got-right-bracket")) +oh(){var s=this,r=null,q=s.a,p=q.D() +if(p==="!")s.x=t.c.a(s.gnq()) +else if(p==="/")s.x=t.c.a(s.gm3()) +else if(A.b6(p)){s.w=A.b3(p,r,r,!1) +s.x=t.c.a(s.giB())}else if(p===">"){s.i(new A.j(r,r,"expected-tag-name-but-got-right-bracket")) s.i(new A.D(r,"<>")) s.x=t.c.a(s.gE())}else if(p==="?"){s.i(new A.j(r,r,"expected-tag-name-but-got-question-mark")) q.X(p) -s.x=t.c.a(s.geB())}else{s.i(new A.j(r,r,"expected-tag-name")) +s.x=t.c.a(s.geF())}else{s.i(new A.j(r,r,"expected-tag-name")) s.i(new A.D(r,"<")) q.X(p) s.x=t.c.a(s.gE())}return!0}, -m2(){var s,r=this,q=null,p=r.a,o=p.D() -if(A.b4(o)){r.w=new A.H(o,!1) -r.x=t.c.a(r.giA())}else if(o===">"){r.i(new A.j(q,q,u.g)) +m4(){var s,r=this,q=null,p=r.a,o=p.D() +if(A.b6(o)){r.w=new A.H(o,!1) +r.x=t.c.a(r.giB())}else if(o===">"){r.i(new A.j(q,q,u.g)) r.x=t.c.a(r.gE())}else if(o==null){r.i(new A.j(q,q,"expected-closing-tag-but-got-eof")) r.i(new A.D(q,"")r.b7() else if(p==null){r.i(new A.j(q,q,"eof-in-tag-name")) r.x=t.c.a(r.gE())}else if(p==="/")r.x=t.c.a(r.gbm()) @@ -14396,205 +14437,205 @@ else if(p==="\x00"){r.i(new A.j(q,q,"invalid-codepoint")) s=t.fn.a(r.w) s.b=A.k(s.b)+"\ufffd"}else{s=t.fn.a(r.w) s.b=A.k(s.b)+p}return!0}, -o3(){var s=this,r=s.a,q=r.D() +o5(){var s=this,r=s.a,q=r.D() if(q==="/"){s.y.a="" -s.x=t.c.a(s.go0())}else{s.i(new A.D(null,"<")) +s.x=t.c.a(s.go2())}else{s.i(new A.D(null,"<")) r.X(q) -s.x=t.c.a(s.gcu())}return!0}, -o1(){var s=this,r=s.a,q=r.D() -if(A.b4(q)){s.y.a+=A.k(q) -s.x=t.c.a(s.gnZ())}else{s.i(new A.D(null,""&&q){r.w=new A.H(r.y.j(0),!1) r.b7() r.x=t.c.a(r.gE())}else{s=r.y -if(A.b4(o))s.a+=A.k(o) +if(A.b6(o))s.a+=A.k(o) else{s=s.j(0) r.i(new A.D(null,""&&q){r.w=new A.H(r.y.j(0),!1) r.b7() r.x=t.c.a(r.gE())}else{s=r.y -if(A.b4(o))s.a+=A.k(o) +if(A.b6(o))s.a+=A.k(o) else{s=s.j(0) r.i(new A.D(null,""&&q){r.w=new A.H(r.y.j(0),!1) r.b7() r.x=t.c.a(r.gE())}else{s=r.y -if(A.b4(o))s.a+=A.k(o) +if(A.b6(o))s.a+=A.k(o) else{s=s.j(0) r.i(new A.D(null,""){s.i(new A.D(r,">")) -s.x=t.c.a(s.gbC())}else if(q==="\x00"){s.i(new A.j(r,r,"invalid-codepoint")) +s.x=t.c.a(s.gbD())}else if(q==="\x00"){s.i(new A.j(r,r,"invalid-codepoint")) s.i(new A.D(r,"\ufffd")) s.x=t.c.a(s.gbf())}else if(q==null)s.x=t.c.a(s.gE()) else{s.i(new A.D(r,q)) s.x=t.c.a(s.gbf())}return!0}, -jf(){var s,r=this,q=r.a,p=q.D() +jg(){var s,r=this,q=r.a,p=q.D() if(p==="/"){r.y.a="" -r.x=t.c.a(r.gjd())}else if(A.b4(p)){q=A.k(p) +r.x=t.c.a(r.gje())}else if(A.b6(p)){q=A.k(p) r.i(new A.D(null,"<"+q)) s=r.y s.a="" s.a=q -r.x=t.c.a(r.giT())}else{r.i(new A.D(null,"<")) +r.x=t.c.a(r.giU())}else{r.i(new A.D(null,"<")) q.X(p) r.x=t.c.a(r.gbf())}return!0}, -je(){var s=this,r=s.a,q=r.D() -if(A.b4(q)){r=s.y +jf(){var s=this,r=s.a,q=r.D() +if(A.b6(q)){r=s.y r.a="" r.a=A.k(q) -s.x=t.c.a(s.gjb())}else{s.i(new A.D(null,""&&q){r.w=new A.H(r.y.j(0),!1) r.b7() r.x=t.c.a(r.gE())}else{s=r.y -if(A.b4(o))s.a+=A.k(o) +if(A.b6(o))s.a+=A.k(o) else{s=s.j(0) r.i(new A.D(null,""){s.i(new A.D(q==null?new A.Y(""):null,q)) +iV(){var s=this,r=s.a,q=r.D() +if(A.a9(q)||q==="/"||q===">"){s.i(new A.D(q==null?new A.X(""):null,q)) r=t.c -if(s.y.j(0).toLowerCase()==="script")s.x=r.a(s.gbB()) -else s.x=r.a(s.gbf())}else if(A.b4(q)){s.i(new A.D(q==null?new A.Y(""):null,q)) +if(s.y.j(0).toLowerCase()==="script")s.x=r.a(s.gbC()) +else s.x=r.a(s.gbf())}else if(A.b6(q)){s.i(new A.D(q==null?new A.X(""):null,q)) s.y.a+=A.k(q)}else{r.X(q) s.x=t.c.a(s.gbf())}return!0}, -j_(){var s=this,r=null,q=s.a.D() +j0(){var s=this,r=null,q=s.a.D() if(q==="-"){s.i(new A.D(r,"-")) -s.x=t.c.a(s.giX())}else if(q==="<"){s.i(new A.D(r,"<")) -s.x=t.c.a(s.ge3())}else if(q==="\x00"){s.i(new A.j(r,r,"invalid-codepoint")) +s.x=t.c.a(s.giY())}else if(q==="<"){s.i(new A.D(r,"<")) +s.x=t.c.a(s.ge7())}else if(q==="\x00"){s.i(new A.j(r,r,"invalid-codepoint")) s.i(new A.D(r,"\ufffd"))}else if(q==null){s.i(new A.j(r,r,"eof-in-script-in-script")) s.x=t.c.a(s.gE())}else s.i(new A.D(r,q)) return!0}, -iY(){var s=this,r=null,q=s.a.D() +iZ(){var s=this,r=null,q=s.a.D() if(q==="-"){s.i(new A.D(r,"-")) -s.x=t.c.a(s.giV())}else if(q==="<"){s.i(new A.D(r,"<")) -s.x=t.c.a(s.ge3())}else if(q==="\x00"){s.i(new A.j(r,r,"invalid-codepoint")) +s.x=t.c.a(s.giW())}else if(q==="<"){s.i(new A.D(r,"<")) +s.x=t.c.a(s.ge7())}else if(q==="\x00"){s.i(new A.j(r,r,"invalid-codepoint")) s.i(new A.D(r,"\ufffd")) -s.x=t.c.a(s.gbB())}else if(q==null){s.i(new A.j(r,r,"eof-in-script-in-script")) +s.x=t.c.a(s.gbC())}else if(q==null){s.i(new A.j(r,r,"eof-in-script-in-script")) s.x=t.c.a(s.gE())}else{s.i(new A.D(r,q)) -s.x=t.c.a(s.gbB())}return!0}, -iW(){var s=this,r=null,q=s.a.D() +s.x=t.c.a(s.gbC())}return!0}, +iX(){var s=this,r=null,q=s.a.D() if(q==="-")s.i(new A.D(r,"-")) else if(q==="<"){s.i(new A.D(r,"<")) -s.x=t.c.a(s.ge3())}else if(q===">"){s.i(new A.D(r,">")) -s.x=t.c.a(s.gbC())}else if(q==="\x00"){s.i(new A.j(r,r,"invalid-codepoint")) +s.x=t.c.a(s.ge7())}else if(q===">"){s.i(new A.D(r,">")) +s.x=t.c.a(s.gbD())}else if(q==="\x00"){s.i(new A.j(r,r,"invalid-codepoint")) s.i(new A.D(r,"\ufffd")) -s.x=t.c.a(s.gbB())}else if(q==null){s.i(new A.j(r,r,"eof-in-script-in-script")) +s.x=t.c.a(s.gbC())}else if(q==null){s.i(new A.j(r,r,"eof-in-script-in-script")) s.x=t.c.a(s.gE())}else{s.i(new A.D(r,q)) -s.x=t.c.a(s.gbB())}return!0}, -iZ(){var s=this,r=s.a,q=r.D() +s.x=t.c.a(s.gbC())}return!0}, +j_(){var s=this,r=s.a,q=r.D() if(q==="/"){s.i(new A.D(null,"/")) s.y.a="" -s.x=t.c.a(s.giR())}else{r.X(q) -s.x=t.c.a(s.gbB())}return!0}, -iS(){var s=this,r=s.a,q=r.D() -if(A.a8(q)||q==="/"||q===">"){s.i(new A.D(q==null?new A.Y(""):null,q)) +s.x=t.c.a(s.giS())}else{r.X(q) +s.x=t.c.a(s.gbC())}return!0}, +iT(){var s=this,r=s.a,q=r.D() +if(A.a9(q)||q==="/"||q===">"){s.i(new A.D(q==null?new A.X(""):null,q)) r=t.c if(s.y.j(0).toLowerCase()==="script")s.x=r.a(s.gbf()) -else s.x=r.a(s.gbB())}else if(A.b4(q)){s.i(new A.D(q==null?new A.Y(""):null,q)) +else s.x=r.a(s.gbC())}else if(A.b6(q)){s.i(new A.D(q==null?new A.X(""):null,q)) s.y.a+=A.k(q)}else{r.X(q) -s.x=t.c.a(s.gbB())}return!0}, -lH(){var s=this,r=null,q=s.a,p=q.D() -if(A.a8(p))q.cL(!0) +s.x=t.c.a(s.gbC())}return!0}, +lJ(){var s=this,r=null,q=s.a,p=q.D() +if(A.a9(p))q.cN(!0) else{q=p==null -if(!q&&A.b4(p)){s.bF(p) -s.x=t.c.a(s.gbI())}else if(p===">")s.b7() +if(!q&&A.b6(p)){s.bG(p) +s.x=t.c.a(s.gbJ())}else if(p===">")s.b7() else if(p==="/")s.x=t.c.a(s.gbm()) else if(q){s.i(new A.j(r,r,"expected-attribute-name-but-got-eof")) s.x=t.c.a(s.gE())}else if(B.b.C("'\"=<",p)){s.i(new A.j(r,r,"invalid-character-in-attribute-name")) -s.bF(p) -s.x=t.c.a(s.gbI())}else if(p==="\x00"){s.i(new A.j(r,r,"invalid-codepoint")) -s.bF("\ufffd") -s.x=t.c.a(s.gbI())}else{s.bF(p) -s.x=t.c.a(s.gbI())}}return!0}, -lt(){var s,r,q=this,p=null,o=q.a,n=o.D(),m=!0,l=!1 -if(n==="=")q.x=t.c.a(q.ghP()) -else if(A.b4(n)){s=q.ax +s.bG(p) +s.x=t.c.a(s.gbJ())}else if(p==="\x00"){s.i(new A.j(r,r,"invalid-codepoint")) +s.bG("\ufffd") +s.x=t.c.a(s.gbJ())}else{s.bG(p) +s.x=t.c.a(s.gbJ())}}return!0}, +lv(){var s,r,q=this,p=null,o=q.a,n=o.D(),m=!0,l=!1 +if(n==="=")q.x=t.c.a(q.ghQ()) +else if(A.b6(n)){s=q.ax s.a+=A.k(n) -o=o.m_(!0) +o=o.m1(!0) s.a+=o m=!1}else{l=n===">" -if(!l)if(A.a8(n))q.x=t.c.a(q.gld()) +if(!l)if(A.a9(n))q.x=t.c.a(q.glf()) else if(n==="/")q.x=t.c.a(q.gbm()) else if(n==="\x00"){q.i(new A.j(p,p,"invalid-codepoint")) q.ax.a+="\ufffd" m=!1}else{m=n==null if(m){q.i(new A.j(p,p,"eof-in-attribute-name")) q.x=t.c.a(q.gE())}else if(B.b.C("'\"<",n)){q.i(new A.j(p,p,"invalid-character-in-attribute-name")) -q.ax.a+=n}else q.ax.a+=n}}if(m){q.dl(-1) +q.ax.a+=n}else q.ax.a+=n}}if(m){q.dr(-1) o=q.ax.a -r=A.c9(o.charCodeAt(0)==0?o:o) +r=A.cc(o.charCodeAt(0)==0?o:o) o=q.Q o.toString B.a.gA(o).a=r @@ -14602,105 +14643,105 @@ o=q.as if((o==null?q.as=A.j3(t.N):o).C(0,r))q.i(new A.j(p,p,"duplicate-attribute")) q.as.l(0,r) if(l)q.b7()}return!0}, -le(){var s=this,r=null,q=s.a,p=q.D() -if(A.a8(p))q.cL(!0) -else if(p==="=")s.x=t.c.a(s.ghP()) +lg(){var s=this,r=null,q=s.a,p=q.D() +if(A.a9(p))q.cN(!0) +else if(p==="=")s.x=t.c.a(s.ghQ()) else if(p===">")s.b7() else{q=p==null -if(!q&&A.b4(p)){s.bF(p) -s.x=t.c.a(s.gbI())}else if(p==="/")s.x=t.c.a(s.gbm()) +if(!q&&A.b6(p)){s.bG(p) +s.x=t.c.a(s.gbJ())}else if(p==="/")s.x=t.c.a(s.gbm()) else if(p==="\x00"){s.i(new A.j(r,r,"invalid-codepoint")) -s.bF("\ufffd") -s.x=t.c.a(s.gbI())}else if(q){s.i(new A.j(r,r,"expected-end-of-tag-but-got-eof")) +s.bG("\ufffd") +s.x=t.c.a(s.gbJ())}else if(q){s.i(new A.j(r,r,"expected-end-of-tag-but-got-eof")) s.x=t.c.a(s.gE())}else if(B.b.C("'\"<",p)){s.i(new A.j(r,r,"invalid-character-after-attribute-name")) -s.bF(p) -s.x=t.c.a(s.gbI())}else{s.bF(p) -s.x=t.c.a(s.gbI())}}return!0}, -lI(){var s=this,r=null,q=s.a,p=q.D() -if(A.a8(p))q.cL(!0) -else if(p==='"'){s.ck(0) -s.x=t.c.a(s.glx())}else if(p==="&"){s.x=t.c.a(s.gdE()) +s.bG(p) +s.x=t.c.a(s.gbJ())}else{s.bG(p) +s.x=t.c.a(s.gbJ())}}return!0}, +lK(){var s=this,r=null,q=s.a,p=q.D() +if(A.a9(p))q.cN(!0) +else if(p==='"'){s.cl(0) +s.x=t.c.a(s.glz())}else if(p==="&"){s.x=t.c.a(s.gdG()) q.X(p) -s.ck(0)}else if(p==="'"){s.ck(0) -s.x=t.c.a(s.glD())}else if(p===">"){s.i(new A.j(r,r,u.F)) +s.cl(0)}else if(p==="'"){s.cl(0) +s.x=t.c.a(s.glF())}else if(p===">"){s.i(new A.j(r,r,u.F)) s.b7()}else if(p==="\x00"){s.i(new A.j(r,r,"invalid-codepoint")) -s.ck(-1) +s.cl(-1) s.ay.a+="\ufffd" -s.x=t.c.a(s.gdE())}else if(p==null){s.i(new A.j(r,r,"expected-attribute-value-but-got-eof")) +s.x=t.c.a(s.gdG())}else if(p==null){s.i(new A.j(r,r,"expected-attribute-value-but-got-eof")) s.x=t.c.a(s.gE())}else if(B.b.C("=<`",p)){s.i(new A.j(r,r,"equals-in-unquoted-attribute-value")) -s.ck(-1) +s.cl(-1) s.ay.a+=p -s.x=t.c.a(s.gdE())}else{s.ck(-1) +s.x=t.c.a(s.gdG())}else{s.cl(-1) s.ay.a+=p -s.x=t.c.a(s.gdE())}return!0}, -ly(){var s,r=this,q=null,p=r.a,o=p.D() -if(o==='"'){r.c1(-1) -r.dl(0) -r.x=t.c.a(r.ghJ())}else if(o==="&")r.dF('"',!0) +s.x=t.c.a(s.gdG())}return!0}, +lA(){var s,r=this,q=null,p=r.a,o=p.D() +if(o==='"'){r.c2(-1) +r.dr(0) +r.x=t.c.a(r.ghK())}else if(o==="&")r.dH('"',!0) else if(o==="\x00"){r.i(new A.j(q,q,"invalid-codepoint")) r.ay.a+="\ufffd"}else if(o==null){r.i(new A.j(q,q,"eof-in-attribute-value-double-quote")) -r.c1(-1) +r.c2(-1) r.x=t.c.a(r.gE())}else{s=r.ay s.a+=o -p=p.co(34,38) +p=p.cq(34,38) s.a+=p}return!0}, -lE(){var s,r=this,q=null,p=r.a,o=p.D() -if(o==="'"){r.c1(-1) -r.dl(0) -r.x=t.c.a(r.ghJ())}else if(o==="&")r.dF("'",!0) +lG(){var s,r=this,q=null,p=r.a,o=p.D() +if(o==="'"){r.c2(-1) +r.dr(0) +r.x=t.c.a(r.ghK())}else if(o==="&")r.dH("'",!0) else if(o==="\x00"){r.i(new A.j(q,q,"invalid-codepoint")) r.ay.a+="\ufffd"}else if(o==null){r.i(new A.j(q,q,"eof-in-attribute-value-single-quote")) -r.c1(-1) +r.c2(-1) r.x=t.c.a(r.gE())}else{s=r.ay s.a+=o -p=p.co(39,38) +p=p.cq(39,38) s.a+=p}return!0}, -lF(){var s,r=this,q=null,p=r.a,o=p.D() -if(A.a8(o)){r.c1(-1) -r.x=t.c.a(r.gbs())}else if(o==="&")r.dF(">",!0) -else if(o===">"){r.c1(-1) +lH(){var s,r=this,q=null,p=r.a,o=p.D() +if(A.a9(o)){r.c2(-1) +r.x=t.c.a(r.gbt())}else if(o==="&")r.dH(">",!0) +else if(o===">"){r.c2(-1) r.b7()}else if(o==null){r.i(new A.j(q,q,"eof-in-attribute-value-no-quotes")) -r.c1(-1) +r.c2(-1) r.x=t.c.a(r.gE())}else if(B.b.C("\"'=<`",o)){r.i(new A.j(q,q,u.V)) r.ay.a+=o}else if(o==="\x00"){r.i(new A.j(q,q,"invalid-codepoint")) r.ay.a+="\ufffd"}else{s=r.ay s.a+=o -p=p.lZ(B.Ml) +p=p.m0(B.Mn) s.a+=p}return!0}, -lf(){var s=this,r=null,q=s.a,p=q.D() -if(A.a8(p))s.x=t.c.a(s.gbs()) +lh(){var s=this,r=null,q=s.a,p=q.D() +if(A.a9(p))s.x=t.c.a(s.gbt()) else if(p===">")s.b7() else if(p==="/")s.x=t.c.a(s.gbm()) else if(p==null){s.i(new A.j(r,r,"unexpected-EOF-after-attribute-value")) q.X(p) s.x=t.c.a(s.gE())}else{s.i(new A.j(r,r,u.H)) q.X(p) -s.x=t.c.a(s.gbs())}return!0}, -jk(){var s=this,r=null,q=s.a,p=q.D() +s.x=t.c.a(s.gbt())}return!0}, +jl(){var s=this,r=null,q=s.a,p=q.D() if(p===">"){t.fn.a(s.w).c=!0 s.b7()}else if(p==null){s.i(new A.j(r,r,"unexpected-EOF-after-solidus-in-tag")) q.X(p) s.x=t.c.a(s.gE())}else{s.i(new A.j(r,r,u.B)) q.X(p) -s.x=t.c.a(s.gbs())}return!0}, -lP(){var s=this,r=s.a,q=r.hT(62) -q=A.cO(q,"\x00","\ufffd") +s.x=t.c.a(s.gbt())}return!0}, +lR(){var s=this,r=s.a,q=r.hU(62) +q=A.cQ(q,"\x00","\ufffd") s.i(new A.dU(null,q)) r.D() s.x=t.c.a(s.gE()) return!0}, -np(){var s,r,q,p,o,n,m=this,l=m.a,k=A.i([l.D()],t.mf) +nr(){var s,r,q,p,o,n,m=this,l=m.a,k=A.i([l.D()],t.mf) if(B.a.gA(k)==="-"){B.a.l(k,l.D()) -if(B.a.gA(k)==="-"){m.w=new A.dU(new A.Y(""),null) -m.x=t.c.a(m.gmb()) +if(B.a.gA(k)==="-"){m.w=new A.dU(new A.X(""),null) +m.x=t.c.a(m.gmd()) return!0}}else if(B.a.gA(k)==="d"||B.a.gA(k)==="D"){r=0 for(;;){if(!(r<6)){s=!0 break}q=B.j1[r] p=l.D() B.a.l(k,p) if(p==null||!B.b.C(q,p)){s=!1 -break}++r}if(s){m.w=new A.eS(!0) -m.x=t.c.a(m.gmM()) +break}++r}if(s){m.w=new A.eT(!0) +m.x=t.c.a(m.gmO()) return!0}}else{o=!1 if(B.a.gA(k)==="["){n=m.f if(n!=null){o=n.d.c @@ -14709,14 +14750,14 @@ for(;;){if(!(r<6)){s=!0 break}q=B.j0[r] B.a.l(k,l.D()) if(B.a.gA(k)!==q){s=!1 -break}++r}if(s){m.x=t.c.a(m.glT()) +break}++r}if(s){m.x=t.c.a(m.glV()) return!0}}}m.i(new A.j(null,null,"expected-dashes-or-doctype")) while(o=k.length,o!==0){if(0>=o)return A.c(k,-1) o=k.pop() -if(o!=null)l.y=l.y-o.length}m.x=t.c.a(m.geB()) +if(o!=null)l.y=l.y-o.length}m.x=t.c.a(m.geF()) return!0}, -mc(){var s,r=this,q=null,p=r.a.D() -if(p==="-")r.x=t.c.a(r.gm9()) +me(){var s,r=this,q=null,p=r.a.D() +if(p==="-")r.x=t.c.a(r.gmb()) else if(p==="\x00"){r.i(new A.j(q,q,"invalid-codepoint")) t.v.a(r.w).b.a+="\ufffd"}else if(p===">"){r.i(new A.j(q,q,"incorrect-comment")) s=r.w @@ -14727,9 +14768,9 @@ s=r.w s.toString r.i(s) r.x=t.c.a(r.gE())}else{t.v.a(r.w).b.a+=p -r.x=t.c.a(r.gbJ())}return!0}, -ma(){var s,r=this,q=null,p=r.a.D() -if(p==="-")r.x=t.c.a(r.ghZ()) +r.x=t.c.a(r.gbK())}return!0}, +mc(){var s,r=this,q=null,p=r.a.D() +if(p==="-")r.x=t.c.a(r.gi_()) else if(p==="\x00"){r.i(new A.j(q,q,"invalid-codepoint")) t.v.a(r.w).b.a+="-\ufffd"}else if(p===">"){r.i(new A.j(q,q,"incorrect-comment")) s=r.w @@ -14741,9 +14782,9 @@ s.toString r.i(s) r.x=t.c.a(r.gE())}else{s=t.v.a(r.w).b s.a=(s.a+="-")+p -r.x=t.c.a(r.gbJ())}return!0}, -md(){var s,r=this,q=null,p=r.a,o=p.D() -if(o==="-")r.x=t.c.a(r.ghY()) +r.x=t.c.a(r.gbK())}return!0}, +mf(){var s,r=this,q=null,p=r.a,o=p.D() +if(o==="-")r.x=t.c.a(r.ghZ()) else if(o==="\x00"){r.i(new A.j(q,q,"invalid-codepoint")) t.v.a(r.w).b.a+="\ufffd"}else if(o==null){r.i(new A.j(q,q,"eof-in-comment")) p=r.w @@ -14751,28 +14792,28 @@ p.toString r.i(p) r.x=t.c.a(r.gE())}else{s=t.v.a(r.w) s.b.a+=o -p=p.co(45,0) +p=p.cq(45,0) s=s.b s.a+=p}return!0}, -m7(){var s,r=this,q=null,p=r.a.D() -if(p==="-")r.x=t.c.a(r.ghZ()) +m9(){var s,r=this,q=null,p=r.a.D() +if(p==="-")r.x=t.c.a(r.gi_()) else if(p==="\x00"){r.i(new A.j(q,q,"invalid-codepoint")) t.v.a(r.w).b.a+="-\ufffd" -r.x=t.c.a(r.gbJ())}else if(p==null){r.i(new A.j(q,q,"eof-in-comment-end-dash")) +r.x=t.c.a(r.gbK())}else if(p==null){r.i(new A.j(q,q,"eof-in-comment-end-dash")) s=r.w s.toString r.i(s) r.x=t.c.a(r.gE())}else{s=t.v.a(r.w).b s.a=(s.a+="-")+p -r.x=t.c.a(r.gbJ())}return!0}, -m8(){var s,r=this,q=null,p=r.a.D() +r.x=t.c.a(r.gbK())}return!0}, +ma(){var s,r=this,q=null,p=r.a.D() if(p===">"){s=r.w s.toString r.i(s) r.x=t.c.a(r.gE())}else if(p==="\x00"){r.i(new A.j(q,q,"invalid-codepoint")) t.v.a(r.w).b.a+="--\ufffd" -r.x=t.c.a(r.gbJ())}else if(p==="!"){r.i(new A.j(q,q,u.x)) -r.x=t.c.a(r.gm5())}else if(p==="-"){r.i(new A.j(q,q,u.K)) +r.x=t.c.a(r.gbK())}else if(p==="!"){r.i(new A.j(q,q,u.x)) +r.x=t.c.a(r.gm7())}else if(p==="-"){r.i(new A.j(q,q,u.K)) s=t.v.a(r.w) p.toString s.b.a+=p}else if(p==null){r.i(new A.j(q,q,"eof-in-comment-double-dash")) @@ -14782,69 +14823,69 @@ r.i(s) r.x=t.c.a(r.gE())}else{r.i(new A.j(q,q,"unexpected-char-in-comment")) s=t.v.a(r.w).b s.a=(s.a+="--")+p -r.x=t.c.a(r.gbJ())}return!0}, -m6(){var s,r=this,q=null,p=r.a.D() +r.x=t.c.a(r.gbK())}return!0}, +m8(){var s,r=this,q=null,p=r.a.D() if(p===">"){s=r.w s.toString r.i(s) r.x=t.c.a(r.gE())}else if(p==="-"){t.v.a(r.w).b.a+="--!" -r.x=t.c.a(r.ghY())}else if(p==="\x00"){r.i(new A.j(q,q,"invalid-codepoint")) +r.x=t.c.a(r.ghZ())}else if(p==="\x00"){r.i(new A.j(q,q,"invalid-codepoint")) t.v.a(r.w).b.a+="--!\ufffd" -r.x=t.c.a(r.gbJ())}else if(p==null){r.i(new A.j(q,q,"eof-in-comment-end-bang-state")) +r.x=t.c.a(r.gbK())}else if(p==null){r.i(new A.j(q,q,"eof-in-comment-end-bang-state")) s=r.w s.toString r.i(s) r.x=t.c.a(r.gE())}else{s=t.v.a(r.w).b s.a=(s.a+="--!")+p -r.x=t.c.a(r.gbJ())}return!0}, -mN(){var s=this,r=null,q=s.a,p=q.D() -if(A.a8(p))s.x=t.c.a(s.ghQ()) +r.x=t.c.a(r.gbK())}return!0}, +mP(){var s=this,r=null,q=s.a,p=q.D() +if(A.a9(p))s.x=t.c.a(s.ghR()) else if(p==null){s.i(new A.j(r,r,"expected-doctype-name-but-got-eof")) q=t.W.a(s.w) q.e=!1 s.i(q) s.x=t.c.a(s.gE())}else{s.i(new A.j(r,r,"need-space-after-doctype")) q.X(p) -s.x=t.c.a(s.ghQ())}return!0}, -lJ(){var s,r=this,q=null,p=r.a.D() -if(A.a8(p))return!0 +s.x=t.c.a(s.ghR())}return!0}, +lL(){var s,r=this,q=null,p=r.a.D() +if(A.a9(p))return!0 else if(p===">"){r.i(new A.j(q,q,u.f)) s=t.W.a(r.w) s.e=!1 r.i(s) r.x=t.c.a(r.gE())}else if(p==="\x00"){r.i(new A.j(q,q,"invalid-codepoint")) t.W.a(r.w).d="\ufffd" -r.x=t.c.a(r.geL())}else if(p==null){r.i(new A.j(q,q,"expected-doctype-name-but-got-eof")) +r.x=t.c.a(r.geP())}else if(p==null){r.i(new A.j(q,q,"expected-doctype-name-but-got-eof")) s=t.W.a(r.w) s.e=!1 r.i(s) r.x=t.c.a(r.gE())}else{t.W.a(r.w).d=p -r.x=t.c.a(r.geL())}return!0}, -mD(){var s,r,q=this,p=null,o=q.a.D() -if(A.a8(o)){s=t.W.a(q.w) +r.x=t.c.a(r.geP())}return!0}, +mF(){var s,r,q=this,p=null,o=q.a.D() +if(A.a9(o)){s=t.W.a(q.w) r=s.d -s.d=r==null?p:A.c9(r) -q.x=t.c.a(q.glg())}else if(o===">"){s=t.W.a(q.w) +s.d=r==null?p:A.cc(r) +q.x=t.c.a(q.gli())}else if(o===">"){s=t.W.a(q.w) r=s.d -s.d=r==null?p:A.c9(r) +s.d=r==null?p:A.cc(r) s=q.w s.toString q.i(s) q.x=t.c.a(q.gE())}else if(o==="\x00"){q.i(new A.j(p,p,"invalid-codepoint")) s=t.W.a(q.w) s.d=A.k(s.d)+"\ufffd" -q.x=t.c.a(q.geL())}else if(o==null){q.i(new A.j(p,p,"eof-in-doctype-name")) +q.x=t.c.a(q.geP())}else if(o==null){q.i(new A.j(p,p,"eof-in-doctype-name")) s=t.W.a(q.w) s.e=!1 r=s.d -s.d=r==null?p:A.c9(r) +s.d=r==null?p:A.cc(r) s=q.w s.toString q.i(s) q.x=t.c.a(q.gE())}else{s=t.W.a(q.w) s.d=A.k(s.d)+o}return!0}, -lh(){var s,r,q,p=this,o=p.a,n=o.D() -if(A.a8(n))return!0 +lj(){var s,r,q,p=this,o=p.a,n=o.D() +if(A.a9(n))return!0 else if(n===">"){o=p.w o.toString p.i(o) @@ -14859,33 +14900,33 @@ for(;;){if(!(r<5)){s=!0 break}q=B.ji[r] n=o.D() if(n==null||!B.b.C(q,n)){s=!1 -break}++r}if(s){p.x=t.c.a(p.glj()) +break}++r}if(s){p.x=t.c.a(p.gll()) return!0}}else if(n==="s"||n==="S"){r=0 for(;;){if(!(r<5)){s=!0 break}q=B.iZ[r] n=o.D() if(n==null||!B.b.C(q,n)){s=!1 -break}++r}if(s){p.x=t.c.a(p.glm()) +break}++r}if(s){p.x=t.c.a(p.glo()) return!0}}o.X(n) o=A.v(["data",n],t.N,t.X) p.i(new A.j(o,null,u.p)) t.W.a(p.w).e=!1 -p.x=t.c.a(p.gcn())}return!0}, -lk(){var s=this,r=null,q=s.a,p=q.D() -if(A.a8(p))s.x=t.c.a(s.gez()) +p.x=t.c.a(p.gcp())}return!0}, +lm(){var s=this,r=null,q=s.a,p=q.D() +if(A.a9(p))s.x=t.c.a(s.geD()) else if(p==="'"||p==='"'){s.i(new A.j(r,r,"unexpected-char-in-doctype")) q.X(p) -s.x=t.c.a(s.gez())}else if(p==null){s.i(new A.j(r,r,"eof-in-doctype")) +s.x=t.c.a(s.geD())}else if(p==null){s.i(new A.j(r,r,"eof-in-doctype")) q=t.W.a(s.w) q.e=!1 s.i(q) s.x=t.c.a(s.gE())}else{q.X(p) -s.x=t.c.a(s.gez())}return!0}, -lK(){var s,r=this,q=null,p=r.a.D() -if(A.a8(p))return!0 +s.x=t.c.a(s.geD())}return!0}, +lM(){var s,r=this,q=null,p=r.a.D() +if(A.a9(p))return!0 else if(p==='"'){t.W.a(r.w).b="" -r.x=t.c.a(r.gmG())}else if(p==="'"){t.W.a(r.w).b="" -r.x=t.c.a(r.gmI())}else if(p===">"){r.i(new A.j(q,q,"unexpected-end-of-doctype")) +r.x=t.c.a(r.gmI())}else if(p==="'"){t.W.a(r.w).b="" +r.x=t.c.a(r.gmK())}else if(p===">"){r.i(new A.j(q,q,"unexpected-end-of-doctype")) s=t.W.a(r.w) s.e=!1 r.i(s) @@ -14895,9 +14936,9 @@ s.e=!1 r.i(s) r.x=t.c.a(r.gE())}else{r.i(new A.j(q,q,"unexpected-char-in-doctype")) t.W.a(r.w).e=!1 -r.x=t.c.a(r.gcn())}return!0}, -mH(){var s,r=this,q=null,p=r.a.D() -if(p==='"')r.x=t.c.a(r.ghK()) +r.x=t.c.a(r.gcp())}return!0}, +mJ(){var s,r=this,q=null,p=r.a.D() +if(p==='"')r.x=t.c.a(r.ghL()) else if(p==="\x00"){r.i(new A.j(q,q,"invalid-codepoint")) s=t.W.a(r.w) s.b=A.k(s.b)+"\ufffd"}else if(p===">"){r.i(new A.j(q,q,"unexpected-end-of-doctype")) @@ -14910,8 +14951,8 @@ s.e=!1 r.i(s) r.x=t.c.a(r.gE())}else{s=t.W.a(r.w) s.b=A.k(s.b)+p}return!0}, -mJ(){var s,r=this,q=null,p=r.a.D() -if(p==="'")r.x=t.c.a(r.ghK()) +mL(){var s,r=this,q=null,p=r.a.D() +if(p==="'")r.x=t.c.a(r.ghL()) else if(p==="\x00"){r.i(new A.j(q,q,"invalid-codepoint")) s=t.W.a(r.w) s.b=A.k(s.b)+"\ufffd"}else if(p===">"){r.i(new A.j(q,q,"unexpected-end-of-doctype")) @@ -14924,51 +14965,51 @@ s.e=!1 r.i(s) r.x=t.c.a(r.gE())}else{s=t.W.a(r.w) s.b=A.k(s.b)+p}return!0}, -li(){var s,r=this,q=null,p="unexpected-char-in-doctype",o=r.a.D() -if(A.a8(o))r.x=t.c.a(r.glM()) +lk(){var s,r=this,q=null,p="unexpected-char-in-doctype",o=r.a.D() +if(A.a9(o))r.x=t.c.a(r.glO()) else if(o===">"){s=r.w s.toString r.i(s) r.x=t.c.a(r.gE())}else if(o==='"'){r.i(new A.j(q,q,p)) t.W.a(r.w).c="" -r.x=t.c.a(r.geM())}else if(o==="'"){r.i(new A.j(q,q,p)) +r.x=t.c.a(r.geQ())}else if(o==="'"){r.i(new A.j(q,q,p)) t.W.a(r.w).c="" -r.x=t.c.a(r.geN())}else if(o==null){r.i(new A.j(q,q,"eof-in-doctype")) +r.x=t.c.a(r.geR())}else if(o==null){r.i(new A.j(q,q,"eof-in-doctype")) s=t.W.a(r.w) s.e=!1 r.i(s) r.x=t.c.a(r.gE())}else{r.i(new A.j(q,q,p)) t.W.a(r.w).e=!1 -r.x=t.c.a(r.gcn())}return!0}, -lN(){var s,r=this,q=null,p=r.a.D() -if(A.a8(p))return!0 +r.x=t.c.a(r.gcp())}return!0}, +lP(){var s,r=this,q=null,p=r.a.D() +if(A.a9(p))return!0 else if(p===">"){s=r.w s.toString r.i(s) r.x=t.c.a(r.gE())}else if(p==='"'){t.W.a(r.w).c="" -r.x=t.c.a(r.geM())}else if(p==="'"){t.W.a(r.w).c="" -r.x=t.c.a(r.geN())}else if(p==null){r.i(new A.j(q,q,"eof-in-doctype")) +r.x=t.c.a(r.geQ())}else if(p==="'"){t.W.a(r.w).c="" +r.x=t.c.a(r.geR())}else if(p==null){r.i(new A.j(q,q,"eof-in-doctype")) s=t.W.a(r.w) s.e=!1 r.i(s) r.x=t.c.a(r.gE())}else{r.i(new A.j(q,q,"unexpected-char-in-doctype")) t.W.a(r.w).e=!1 -r.x=t.c.a(r.gcn())}return!0}, -ln(){var s=this,r=null,q=s.a,p=q.D() -if(A.a8(p))s.x=t.c.a(s.geA()) +r.x=t.c.a(r.gcp())}return!0}, +lp(){var s=this,r=null,q=s.a,p=q.D() +if(A.a9(p))s.x=t.c.a(s.geE()) else if(p==="'"||p==='"'){s.i(new A.j(r,r,"unexpected-char-in-doctype")) q.X(p) -s.x=t.c.a(s.geA())}else if(p==null){s.i(new A.j(r,r,"eof-in-doctype")) +s.x=t.c.a(s.geE())}else if(p==null){s.i(new A.j(r,r,"eof-in-doctype")) q=t.W.a(s.w) q.e=!1 s.i(q) s.x=t.c.a(s.gE())}else{q.X(p) -s.x=t.c.a(s.geA())}return!0}, -lL(){var s,r=this,q=null,p="unexpected-char-in-doctype",o=r.a.D() -if(A.a8(o))return!0 +s.x=t.c.a(s.geE())}return!0}, +lN(){var s,r=this,q=null,p="unexpected-char-in-doctype",o=r.a.D() +if(A.a9(o))return!0 else if(o==='"'){t.W.a(r.w).c="" -r.x=t.c.a(r.geM())}else if(o==="'"){t.W.a(r.w).c="" -r.x=t.c.a(r.geN())}else if(o===">"){r.i(new A.j(q,q,p)) +r.x=t.c.a(r.geQ())}else if(o==="'"){t.W.a(r.w).c="" +r.x=t.c.a(r.geR())}else if(o===">"){r.i(new A.j(q,q,p)) s=t.W.a(r.w) s.e=!1 r.i(s) @@ -14978,9 +15019,9 @@ s.e=!1 r.i(s) r.x=t.c.a(r.gE())}else{r.i(new A.j(q,q,p)) t.W.a(r.w).e=!1 -r.x=t.c.a(r.gcn())}return!0}, -mO(){var s,r=this,q=null,p=r.a.D() -if(p==='"')r.x=t.c.a(r.ghL()) +r.x=t.c.a(r.gcp())}return!0}, +mQ(){var s,r=this,q=null,p=r.a.D() +if(p==='"')r.x=t.c.a(r.ghM()) else if(p==="\x00"){r.i(new A.j(q,q,"invalid-codepoint")) s=t.W.a(r.w) s.c=A.k(s.c)+"\ufffd"}else if(p===">"){r.i(new A.j(q,q,"unexpected-end-of-doctype")) @@ -14993,8 +15034,8 @@ s.e=!1 r.i(s) r.x=t.c.a(r.gE())}else{s=t.W.a(r.w) s.c=A.k(s.c)+p}return!0}, -mP(){var s,r=this,q=null,p=r.a.D() -if(p==="'")r.x=t.c.a(r.ghL()) +mR(){var s,r=this,q=null,p=r.a.D() +if(p==="'")r.x=t.c.a(r.ghM()) else if(p==="\x00"){r.i(new A.j(q,q,"invalid-codepoint")) s=t.W.a(r.w) s.c=A.k(s.c)+"\ufffd"}else if(p===">"){r.i(new A.j(q,q,"unexpected-end-of-doctype")) @@ -15007,8 +15048,8 @@ s.e=!1 r.i(s) r.x=t.c.a(r.gE())}else{s=t.W.a(r.w) s.c=A.k(s.c)+p}return!0}, -ll(){var s,r=this,q=null,p=r.a.D() -if(A.a8(p))return!0 +ln(){var s,r=this,q=null,p=r.a.D() +if(A.a9(p))return!0 else if(p===">"){s=r.w s.toString r.i(s) @@ -15017,8 +15058,8 @@ s=t.W.a(r.w) s.e=!1 r.i(s) r.x=t.c.a(r.gE())}else{r.i(new A.j(q,q,"unexpected-char-in-doctype")) -r.x=t.c.a(r.gcn())}return!0}, -lQ(){var s=this,r=s.a,q=r.D() +r.x=t.c.a(r.gcp())}return!0}, +lS(){var s=this,r=s.a,q=r.D() if(q===">"){r=s.w r.toString s.i(r) @@ -15027,7 +15068,7 @@ r=s.w r.toString s.i(r) s.x=t.c.a(s.gE())}return!0}, -lU(){var s,r,q,p=this,o=A.i([],t.s) +lW(){var s,r,q,p=this,o=A.i([],t.s) for(s=p.a,r=0;;){q=s.D() if(q==null)break if(q==="\x00"){p.i(new A.j(null,null,"invalid-codepoint")) @@ -15039,52 +15080,52 @@ if(0>=o.length)return A.c(o,-1) o.pop() if(0>=o.length)return A.c(o,-1) o.pop() -break}r=0}}if(o.length!==0){s=B.a.aQ(o) +break}r=0}}if(o.length!==0){s=B.a.aR(o) p.i(new A.D(null,s))}p.x=t.c.a(p.gE()) return!0}, $iL:1, -jD(){return this.gjC().$0()}} -A.mC.prototype={ +jE(){return this.gjD().$0()}} +A.mH.prototype={ $0(){var s=this.a.b s===$&&A.o() return s}, $S:8} -A.hH.prototype={ +A.hJ.prototype={ l(a,b){var s,r,q,p,o,n,m,l,k,j=this,i="http://www.w3.org/1999/xhtml" t.mV.a(b) -if(b!=null)for(s=A.x(j).h("X"),r=new A.X(j,s),r=new A.M(r,r.gn(0),s.h("M")),q=b.x,p=b.w,s=s.h("G.E"),o=0;r.p();){n=r.d +if(b!=null)for(s=A.x(j).h("Y"),r=new A.Y(j,s),r=new A.N(r,r.gn(0),s.h("N")),q=b.x,p=b.w,s=s.h("G.E"),o=0;r.p();){n=r.d if(n==null)n=s.a(n) if(n==null)break m=n.w if(m==null)m=i l=n.x k=p==null?i:p -if(new A.l(m,l).$s===new A.l(k,q).$s&&m===k&&l==q&&A.yo(n.b,b.b))++o +if(new A.l(m,l).$s===new A.l(k,q).$s&&m===k&&l==q&&A.yy(n.b,b.b))++o if(o===3){B.a.W(j.a,n) -break}}j.bW(0,b)}} -A.nP.prototype={ -aL(){var s=this +break}}j.bX(0,b)}} +A.nV.prototype={ +aM(){var s=this B.a.bc(s.c) s.d.sn(0,0) s.f=s.e=null s.r=!1 -s.b=A.ro()}, +s.b=A.rz()}, a0(a,b){var s,r,q,p,o,n,m,l,k,j="We should never reach this point",i="http://www.w3.org/1999/xhtml",h=a instanceof A.am,g=!1 if(b!=null)switch(b){case"button":s=B.cE -r=B.Mj +r=B.Ml break case"list":s=B.cE -r=B.Mo +r=B.Mr break -case"table":s=B.Ms +case"table":s=B.Mw r=B.cD break -case"select":s=B.Mq +case"select":s=B.Mt r=B.cD g=!0 break -default:throw A.f(A.ce(j))}else{s=B.cE -r=B.cD}for(q=this.c,p=A.w(q).h("X<1>"),q=new A.X(q,p),q=new A.M(q,q.gn(0),p.h("M")),o=!h,p=p.h("G.E");q.p();){n=q.d +default:throw A.f(A.ch(j))}else{s=B.cE +r=B.cD}for(q=this.c,p=A.w(q).h("Y<1>"),q=new A.Y(q,p),q=new A.N(q,q.gn(0),p.h("N")),o=!h,p=p.h("G.E");q.p();){n=q.d if(n==null)n=p.a(n) if(o){m=n.x m=m==null?a==null:m===a}else m=!1 @@ -15097,9 +15138,9 @@ k=m?i:l n=n.x if(!s.C(0,new A.l(k,n)))n=r.C(0,new A.l(m?i:l,n)) else n=!0 -if(g!==n)return!1}}throw A.f(A.ce(j))}, +if(g!==n)return!1}}throw A.f(A.ch(j))}, b6(a){return this.a0(a,null)}, -aE(){var s,r,q,p,o,n,m,l,k,j,i,h=this,g=h.d +aG(){var s,r,q,p,o,n,m,l,k,j,i,h=this,g=h.d if(g.gn(0)===0)return s=g.a r=s.length @@ -15112,65 +15153,65 @@ for(;;){if(!(p!=null&&!B.a.C(r,p)))break if(q===0){q=-1 break}--q if(!(q>=0&&q=0&&q"),s=new A.X(s,r),s=new A.M(s,s.gn(0),r.h("M")),r=r.h("G.E");s.p();){q=s.d +r=s.d6(s)}}, +i6(a){var s,r,q +for(s=this.d,r=A.x(s).h("Y"),s=new A.Y(s,r),s=new A.N(s,s.gn(0),r.h("N")),r=r.h("G.E");s.p();){q=s.d if(q==null)q=r.a(q) if(q==null)break else if(q.x==a)return q}return null}, -cr(a,b){var s=b.gL(),r=A.rm(a.gaC()) +ct(a,b){var s=b.gJ(),r=A.rx(a.gaE()) r.e=a.a s.l(0,r)}, -i1(a){var s,r=a.b,q=a.w +i2(a){var s,r=a.b,q=a.w if(q==null)q=this.a this.b===$&&A.o() -s=A.q1(r,q===""?null:q) +s=A.qb(r,q===""?null:q) s.saZ(a.e) s.e=a.a return s}, -O(a){if(this.r)return this.nc(a) -return this.ib(a)}, -ib(a){var s,r,q=a.b,p=a.w +O(a){if(this.r)return this.ne(a) +return this.ic(a)}, +ic(a){var s,r,q=a.b,p=a.w if(p==null)p=this.a this.b===$&&A.o() -s=A.q1(q,p===""?null:p) +s=A.qb(q,p===""?null:p) s.saZ(a.e) s.e=a.a r=this.c -B.a.gA(r).gL().l(0,s) +B.a.gA(r).gJ().l(0,s) B.a.l(r,s) return s}, -nc(a){var s,r,q=this,p=q.i1(a),o=q.c -if(!B.hQ.C(0,B.a.gA(o).x))return q.ib(a) -else{s=q.e2() +ne(a){var s,r,q=this,p=q.i2(a),o=q.c +if(!B.hR.C(0,B.a.gA(o).x))return q.ic(a) +else{s=q.e6() r=s[1] -if(r==null)s[0].gL().l(0,p) -else s[0].nb(p,r) +if(r==null)s[0].gJ().l(0,p) +else s[0].nd(p,r) B.a.l(o,p)}return p}, -bN(a,b){var s,r=this.c,q=B.a.gA(r) -if(this.r)r=!B.hQ.C(0,B.a.gA(r).x) +bO(a,b){var s,r=this.c,q=B.a.gA(r) +if(this.r)r=!B.hR.C(0,B.a.gA(r).x) else r=!0 -if(r)A.t2(q,a,b,null) -else{s=this.e2() +if(r)A.tc(q,a,b,null) +else{s=this.e6() r=s[0] r.toString -A.t2(r,a,b,t.mV.a(s[1]))}}, -e2(){var s,r,q,p,o=this.c,n=A.w(o).h("X<1>"),m=new A.X(o,n) -m=new A.M(m,m.gn(0),n.h("M")) +A.tc(r,a,b,t.mV.a(s[1]))}}, +e6(){var s,r,q,p,o=this.c,n=A.w(o).h("Y<1>"),m=new A.Y(o,n) +m=new A.N(m,m.gn(0),n.h("N")) n=n.h("G.E") for(;;){if(!m.p()){s=null break}r=m.d @@ -15178,23 +15219,23 @@ s=r==null?n.a(r):r if(s.x==="table")break}q=null if(s!=null){p=s.a if(p!=null)q=s -else{n=B.a.al(o,s)-1 +else{n=B.a.aj(o,s)-1 if(!(n>=0&&n=o.length)return A.c(o,0) p=o[0]}return A.i([p,q],t.hg)}, -bS(a){var s=this.c,r=B.a.gA(s).x +bU(a){var s=this.c,r=B.a.gA(s).x if(r!=a&&B.a.C(B.bH,r)){if(0>=s.length)return A.c(s,-1) s.pop() -this.bS(a)}}, -cc(){return this.bS(null)}} -A.pB.prototype={ -$2(a,b){var s,r,q,p,o,n,m,l,k,j=new A.Y(""),i="%("+A.q(a)+")" -for(s=this.a,r=i.length,q=J.ci(b),p=0,o="";n=s.a,m=B.b.ap(n,i,p),m>=0;){j.a=o+B.b.t(n,p,m) +this.bU(a)}}, +cd(){return this.bU(null)}} +A.pJ.prototype={ +$2(a,b){var s,r,q,p,o,n,m,l,k,j=new A.X(""),i="%("+A.q(a)+")" +for(s=this.a,r=i.length,q=J.c6(b),p=0,o="";n=s.a,m=B.b.ap(n,i,p),m>=0;){j.a=o+B.b.t(n,p,m) m+=r l=m for(;;){o=s.a if(!(lm){k=A.lA(B.b.t(s.a,m,l),null) +if(!A.pR(o[l]))break;++l}if(l>m){k=A.lA(B.b.t(s.a,m,l),null) m=l}else k=0 o=s.a if(!(m")).gn(0) +n=new A.aE(o,n.h("A(1)").a(s),n.h("aE<1>")).gn(0) q=n}else q=1 s=r?-1:1 this.a.k(0,k,q+s) return""+q+". "}, -$S:44} -A.po.prototype={ -$1(a){return t.Q.a(a).x==="li"}, $S:45} -A.pj.prototype={ +A.pw.prototype={ +$1(a){return t.Q.a(a).x==="li"}, +$S:32} +A.pr.prototype={ $0(){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2,a3,a4,a5,a6=this.b if(a6.length===0)return -s=B.a.cQ(a6,0,new A.pk(),t.S) -if(B.a.aH(a6,new A.pl())){r=A.w(a6) -q=new A.Q(a6,r.h("e(1)").a(new A.pm()),r.h("Q<1,e>")).aQ(0) +s=B.a.cS(a6,0,new A.ps(),t.S) +if(B.a.aC(a6,new A.pt())){r=A.w(a6) +q=new A.Q(a6,r.h("e(1)").a(new A.pu()),r.h("Q<1,e>")).aR(0) p=A.i([0],t.Z) -r=(q.length===0?B.hT:new A.d3(q)).a -o=new A.fR(r,0,0) +r=(q.length===0?B.hT:new A.d4(q)).a +o=new A.fT(r,0,0) n=0 -while(o.fR(1,o.c)){m=o.d +while(o.fS(1,o.c)){m=o.d n+=(m==null?o.d=B.b.t(r,o.b,o.c):m).length B.a.l(p,n)}for(r=this.c,o=this.a,l=t.N,k=t.X,j=t.ke,i=0,h=0;i2048)g=i+f+1 e=p.length for(;;){d=h+1 @@ -15269,64 +15310,67 @@ g=p[h] if(g<=i){if(!(d>=0&&da3){a5=A.ae(l,k) +if(a4>a3){a5=A.aa(l,k) a5.a1(0,a1) a5.k(0,"text",B.b.t(a2,a3,a4)) B.a.l(b,a5)}a+=c if(a>=g)break}B.a.l(r,A.v(["kind",o.b,"offset",o.a+i,"length",g-i,"runs",b,"paragraphEnd",g===s],l,k))}o.a=o.a+(s+1)}B.a.bc(a6)}, $S:1} -A.pk.prototype={ -$2(a,b){return A.ax(a)+A.q(t.f.a(b).m(0,"text")).length}, -$S:19} -A.pl.prototype={ +A.ps.prototype={ +$2(a,b){return A.at(a)+A.q(t.f.a(b).m(0,"text")).length}, +$S:18} +A.pt.prototype={ $1(a){return B.b.ba(A.q(t.f.a(a).m(0,"text"))).length!==0}, $S:47} -A.pm.prototype={ +A.pu.prototype={ $1(a){return A.q(t.f.a(a).m(0,"text"))}, $S:48} -A.pp.prototype={ +A.px.prototype={ $2(a,b){var s,r t.f.a(b) s=this.a -if(!s.c){r=A.a5("\\s+",!0) -a=A.cO(a,r," ")}r=this.b -if(r.length===0&&!s.c)a=B.b.og(a) -if(a.length!==0){s=A.az(t.N,t.X) +if(!s.c){r=A.a3("\\s+",!0) +a=A.cQ(a,r," ")}r=this.b +if(r.length===0&&!s.c)a=B.b.oj(a) +if(a.length!==0){s=A.aA(t.N,t.X) s.k(0,"text",a) s.a1(0,b) B.a.l(r,s)}}, $S:49} -A.pq.prototype={ +A.py.prototype={ $2(a,b){var s,r,q,p,o,n,m,l,k,j,i,h,g,f=this t.f.a(b) -if(a instanceof A.bY){s=J.ay(a.w) +if(a instanceof A.c0){s=J.ao(a.w) a.w=s f.b.$2(s,b) return}if(!(a instanceof A.K))return r=a.x if(r==null)r="" -q=B.Mk.C(0,r) +q=B.Mm.C(0,r) s=f.a p=s.b o=s.c if(q){f.c.$0() s.b=r -s.c=r==="pre"}n=a.geW().length===0?a.b.m(0,"name"):a.geW() -if(n!=null&&n.length!==0)f.d.k(0,n,s.a+B.a.cQ(f.e,0,new A.pr(),t.S)) +s.c=r==="pre"}n=a.gf_().length===0?a.b.m(0,"name"):a.gf_() +if(n!=null&&n.length!==0)f.d.k(0,n,s.a+B.a.cS(f.e,0,new A.pz(),t.S)) m=t.N l=t.X -k=A.w1(b,m,l) -if(B.Mr.C(0,r))k.k(0,"bold",!0) -if(B.Mp.C(0,r))k.k(0,"italic",!0) -if(r==="u"||r==="a")k.k(0,"underline",!0) +k=A.wb(b,m,l) +if(B.Mv.C(0,r))k.k(0,"bold",!0) +if(B.Ms.C(0,r))k.k(0,"italic",!0) +if(r!=="u")j=r==="a"&&a.b.m(0,"href")!=null +else j=!0 +if(j)k.k(0,"underline",!0) +if(r==="a"&&a.b.m(0,"href")!=null)k.k(0,"link",!0) if(r==="s"||r==="del")k.k(0,"strike",!0) if(r==="code"||r==="pre")k.k(0,"code",!0) -if(r==="br"){j=A.az(m,l) +if(r==="br"){j=A.aA(m,l) j.k(0,"text","\n") j.a1(0,k) B.a.l(f.e,j)}if(r==="li")f.b.$2(f.f.$1(a),k) @@ -15334,79 +15378,106 @@ if(r==="td"||r==="th")if(f.e.length!==0)f.b.$2(" | ",k) if(r==="img"){f.c.$0() i=a.b.m(0,"src") if(i!=null){k=a.b.m(0,"width") -h=A.qf(k==null?"":k) +h=A.qq(k==null?"":k) k=a.b.m(0,"height") -g=A.qf(k==null?"":k) +g=A.qq(k==null?"":k) k=s.a j=a.b.m(0,"alt") if(j==null)j="Illustration" B.a.l(f.r,A.v(["kind","image","offset",k,"length",1,"src",i,"alt",j,"aspect",h!=null&&g!=null&&h>0&&g>0?h/g:1.5],m,l)) -s.a+=2}}else for(m=a.gL().a,l=A.w(m),m=new J.J(m,m.length,l.h("J<1>")),l=l.c;m.p();){j=m.d +s.a+=2}}else for(m=a.gJ().a,l=A.w(m),m=new J.J(m,m.length,l.h("J<1>")),l=l.c;m.p();){j=m.d f.$2(j==null?l.a(j):j,k)}if(q){f.c.$0() s.b=p s.c=o}}, $S:50} -A.pr.prototype={ -$2(a,b){return A.ax(a)+A.q(t.f.a(b).m(0,"text")).length}, -$S:19} +A.pz.prototype={ +$2(a,b){return A.at(a)+A.q(t.f.a(b).m(0,"text")).length}, +$S:18} A.lV.prototype={ -eJ(a,b){var s=0,r=A.br(t.f),q,p=this -var $async$eJ=A.bs(function(c,d){if(c===1)return A.bo(d,r) -for(;;)switch(s){case 0:if(a==="open"){q=p.dn(t.ev.a(b)) +eN(a,b){var s=0,r=A.br(t.f),q,p=this +var $async$eN=A.bs(function(c,d){if(c===1)return A.bo(d,r) +for(;;)switch(s){case 0:if(a==="open"){q=p.cn(t.ev.a(b)) s=1 -break}if(a==="chapter"){q=p.cH(A.ax(b)) +break}if(a==="chapter"){q=p.cI(A.at(b)) s=1 break}throw A.f(A.W("Unknown EPUB worker command: "+a,null)) case 1:return A.bp(q,r)}}) -return A.bq($async$eJ,r)}, -dn(a2){var s=0,r=A.br(t.f),q,p=this,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1 -var $async$dn=A.bs(function(a3,a4){if(a3===1)return A.bo(a4,r) -for(;;)switch(s){case 0:s=3 -return A.c3(A.m9(a2),$async$dn) -case 3:c=a4 -b=c.e -a=b.a -a0=a.b -a1=a0==null?null:B.a.aH(a0.ay,new A.lX()) -if(a1===!0)throw A.f(B.ih) -o=A.vz(c) -a1=c.f -n=a1==null?null:a1.a -if(n==null)n=A.az(t.N,t.am) -a1=A.az(t.jv,t.A) -m=a.c.a -if(m==null)m=A.i([],t.bz) -l=m.length -k=0 -for(;k>") -d=A.a7(new A.Q(o,b.h("d(1)").a(new A.m2(i)),a1),a1.h("G.E"))}else d=new A.lY(i).$1(e) -p.a=c -p.b=i -p.c.bc(0) -q=A.v(["count",i.length,"toc",d],t.N,t.X) +return A.bq($async$eN,r)}, +cn(a9){var s=0,r=A.br(t.f),q,p=2,o=[],n=this,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2,a3,a4,a5,a6,a7,a8 +var $async$cn=A.bs(function(b0,b1){if(b0===1){o.push(b1) +s=p}for(;;)switch(s){case 0:s=3 +return A.bF(A.me(a9),$async$cn) +case 3:a5=b1 +a6=a5.e +a7=a6.a.b +a6=a7==null?null:B.a.aC(a7.ay,new A.lX()) +if(a6===!0)throw A.f(B.ih) +i=A.vK(a5) +h=a5.e.a +a6=a5.f +g=a6==null?null:a6.a +if(g==null)g=A.aA(t.N,t.am) +a6=A.aA(t.jv,t.A) +f=h.c.a +if(f==null)f=A.i([],t.bz) +e=f.length +d=0 +for(;d>") +a3=A.a8(new A.Q(i,a6.h("d(1)").a(new A.m2(b)),f),f.h("G.E"))}else a3=new A.lY(b).$1(a2) +n.a=a5 +n.b=b +n.c.bc(0) +m=A.i([],t.Z) +a6=b.length,d=0 +case 4:if(!(f=b.length,d=0&&a")).cQ(0,0,new A.lW(),t.S) -j=j.h("aV<1>") +i=new A.fq(g,j.h("fq<2>")).cS(0,0,new A.lW(),t.S) +j=j.h("b_<1>") for(;;){if(!(g.a>3||i>4194304))break -h=new A.aV(g,j).gF(0) -if(!h.p())A.P(A.bi()) +h=new A.b_(g,j).gF(0) +if(!h.p())A.M(A.ba()) i-=A.q(g.W(0,h.gB()).m(0,"html")).length}q=o s=1 break case 1:return A.bp(q,r)}}) -return A.bq($async$cH,r)}, -ds(a6,a7,a8){var s=0,r=A.br(t.N),q,p=this,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2,a3,a4,a5 -var $async$ds=A.bs(function(a9,b0){if(a9===1)return A.bo(b0,r) -for(;;)switch(s){case 0:a5=A.uE(a6) -for(o=B.hR.gF(B.hR),n=t.il,m=t.kU;o.p();){l=o.gB() -k=A.i([],n) -j=A.i([],m) -i=A.zo(l,j) -if(i==null||j.length!==0)A.P(A.aD("'"+l+"' is not a valid selector: "+A.k(j),null,null)) -new A.d0().f9(a5,i,k) -l=A.i(k.slice(0),n) -h=l.length -g=0 -for(;g") +b=A.qd(new A.aM(new A.aE(new A.bU(d,a),a.h("A(h.E)").a(new A.m8()),a.h("aE")),a.h("e(h.E)").a(new A.m9()),a.h("aM")),l)}d=A.aa(m,l) +a0=new A.K("http://www.w3.org/1999/xhtml","img",d) +d.k(0,"src",b==null?"":b) +g=A.i([],n) +f=A.pY("title",g) +if(f==null||g.length!==0)A.M(A.aq("'title' is not a valid selector: "+A.k(g),null,null)) +a=new A.bY().dV(i,f) +if(a==null)a=null +else{a1=new A.X("") +new A.oK(a1).K(a) +a1=a1.a +a1=a1.charCodeAt(0)==0?a1:a1 +a=a1}d.k(0,"alt",a==null?"Cover":a) +for(d=["width","height"],a2=0;a2<2;++a2){a3=d[a2] +a4=c.b.m(0,a3) +if(a4!=null)a0.b.k(0,a3,a4)}d=i.a +if(d==null)A.M(A.a6("Node must have a parent to replace it.")) +d=d.gJ() +a=i.a.gJ() +d.k(0,a.aj(a,i),a0)}for(b6=B.hO.gF(B.hO);b6.p();){o=b6.gB() +h=A.i([],k) +g=A.i([],n) +f=A.pY(o,g) +if(f==null||g.length!==0)A.M(A.aq("'"+o+"' is not a valid selector: "+A.k(g),null,null)) +new A.bY().d2(b5,f,h) +o=A.i(h.slice(0),k) +m=o.length +j=0 +for(;j") +a9=A.qd(new A.aM(new A.aE(new A.bU(a7,a8),a8.h("A(h.E)").a(new A.ma()),a8.h("aE")),a8.h("e(h.E)").a(new A.mb()),a8.h("aM")),l)}else a9=a7.m(0,"src") +p.kW(a5) +if(a1!=="img"&&!a6){s=4 +break}b=a9==null?null:B.b.ba(a9) +a1=b==null +b0=a1?null:A.tj(b) +if(a1||b.length===0||B.b.U(b,"//")||b0==null||b0.geZ()){a1=a5.a +if(a1!=null)B.a.W(a1.gJ().a,a5) s=4 -break}d=b.gaT() -a=p.kT(e,A.d9(d,0,d.length,B.E,!1)) -if(h==null)a0=null -else{d=h.c -a1=A.x(d).h("dq<1,2>") -a0=A.vV(new A.ba(new A.b_(new A.dq(d,a1),a1.h("A(h.E)").a(new A.m7(p,a)),a1.h("b_")),a1.h("bg(h.E)").a(new A.m8()),a1.h("ba")),l)}if(a0==null){d=f.a -if(d!=null)B.a.W(d.gL().a,f) +break}a1=b0.gaT() +b1=p.kU(k,A.da(a1,0,a1.length,B.E,!1)) +if(a)c=null +else{a1=m.c +a7=A.x(a1).h("bU<1,2>") +c=A.qd(new A.aM(new A.aE(new A.bU(a1,a7),a7.h("A(h.E)").a(new A.mc(p,b1)),a7.h("aE")),a7.h("bh(h.E)").a(new A.md()),a7.h("aM")),n)}if(c==null){a1=a5.a +if(a1!=null)B.a.W(a1.gJ().a,a5) s=4 -break}s=6 -return A.c3(a0.d1(),$async$ds) -case 6:a2=b0 -a3=a0.d -if(!B.b.U(a3.toLowerCase(),"image/")){d=f.a -if(d!=null)B.a.W(d.gL().a,f) +break}b2=c.d +if(!B.b.U(b2.toLowerCase(),"image/")){a1=a5.a +if(a1!=null)B.a.W(a1.gJ().a,a5) s=4 -break}d=f.b -m.a(a2) -d.k(0,"src","data:"+a3+";base64,"+B.cJ.geO().bL(a2)) -case 4:o.length===n||(0,A.a2)(o),++g +break}s=c0?6:7 +break +case 6:s=8 +return A.bF(c.d4(),$async$cJ) +case 8:b3=c2 +a1=a5.b +a7=a6?"href":"src" +d.a(b3) +a1.k(0,a7,"data:"+b2+";base64,"+B.cJ.geS().bM(b3)) +case 7:case 4:b6.length===o||(0,A.Z)(b6),++j s=3 break -case 5:a4=new A.Y("") -a5.cg(a4) -o=a4.a -q=o.charCodeAt(0)==0?o:o +case 5:b4=new A.X("") +b5.ci(b4) +b6=b4.a +q=b6.charCodeAt(0)==0?b6:b6 s=1 break case 1:return A.bp(q,r)}}) -return A.bq($async$ds,r)}, -kU(a){var s,r,q,p,o,n,m,l,k="style",j=a.b,i=A.x(j).h("aV<1>") -j=A.a7(new A.aV(j,i),i.h("h.E")) -i=j.length +return A.bq($async$cJ,r)}, +kV(a,b,c){return this.cJ(a,b,c,!0)}, +kW(a){var s,r,q,p,o,n,m,l,k,j,i="style",h=a.b,g=A.x(h).h("b_<1>") +h=A.a8(new A.b_(h,g),g.h("h.E")) +g=h.length s=0 -for(;s=n.length)return A.c(n,-1) n.pop() for(s=b.split("/"),r=s.length,q=0;q=o)return A.c(n,-1) -n.pop()}}else if(p!=="."&&p.length!==0)B.a.l(n,p)}return B.a.aq(n,"/")}} +n.pop()}}else if(p!=="."&&p.length!==0)B.a.l(n,p)}return B.a.ar(n,"/")}} A.lX.prototype={ $1(a){var s,r="rendition:layout" t.az.a(a) @@ -15540,48 +15672,48 @@ else s=!1 return s}, $S:51} A.m4.prototype={ -$1(a){var s,r,q,p=B.a.gbv(a.c.split("#")) +$1(a){var s,r,q,p=B.a.gbw(a.c.split("#")) if(this.a.l(0,p))B.a.l(this.b,a) -for(s=a.e,r=s.length,q=0;q>") -p=A.a7(new A.Q(p,o.h("d(1)").a(this),n),n.h("G.E")) +p=A.a8(new A.Q(p,o.h("d(1)").a(this),n),n.h("G.E")) return A.v(["title",a.b,"index",q,"anchor",a.d,"children",p],t.N,t.X)}, $S:53} A.m3.prototype={ $1(a){return t.k5.a(a).c===this.a}, -$S:32} +$S:39} A.lY.prototype={ $1(a){var s,r,q,p,o,n,m,l,k,j,i,h,g t.nw.a(a) s=A.i([],t.ke) -for(r=a.length,q=t.N,p=t.X,o=this.a,n=0;n")).cq(0,new A.m0(),new A.m1()) -if(k.gdK()){l=k.gcR() -l=A.d9(l,0,l.length,B.E,!1)}else l=null +g=new A.Q(l,h.h("e(1)").a(new A.m_()),h.h("Q<1,e>")).cs(0,new A.m0(),new A.m1()) +if(k.gdM()){l=k.gcT() +l=A.da(l,0,l.length,B.E,!1)}else l=null B.a.l(s,A.v(["title",g,"index",j,"anchor",l,"children",i],q,p))}return s}, $S:55} A.lZ.prototype={ $1(a){return t.k5.a(a).c===this.a}, -$S:32} +$S:39} A.m_.prototype={ $1(a){var s=B.b.ba(t.gK.a(a).a) return s}, @@ -15593,86 +15725,102 @@ A.m1.prototype={ $0(){return"Chapter"}, $S:8} A.lW.prototype={ -$2(a,b){return A.ax(a)+A.q(t.f.a(b).m(0,"html")).length}, -$S:19} +$2(a,b){return A.at(a)+A.q(t.f.a(b).m(0,"html")).length}, +$S:18} A.m7.prototype={ -$1(a){return B.b.d4(B.b.d4(t.kY.a(a).a,A.a5("^OEBPS/",!0),""),A.a5("^/",!0),"")===B.b.d4(B.b.d4(this.b,A.a5("^OEBPS/",!0),""),A.a5("^/",!0),"")}, -$S:57} +$1(a){return!B.Mu.C(0,t.Q.a(a).x)}, +$S:32} A.m8.prototype={ +$1(a){var s=t.mY.a(a).a,r=J.c6(s) +return r.j(s)==="xlink:href"||r.j(s)==="href"}, +$S:38} +A.m9.prototype={ +$1(a){return t.mY.a(a).b}, +$S:37} +A.ma.prototype={ +$1(a){return B.Mp.C(0,J.ao(t.mY.a(a).a))}, +$S:38} +A.mb.prototype={ +$1(a){return t.mY.a(a).b}, +$S:37} +A.mc.prototype={ +$1(a){return B.b.d7(B.b.d7(t.kY.a(a).a,A.a3("^OEBPS/",!0),""),A.a3("^/",!0),"")===B.b.d7(B.b.d7(this.b,A.a3("^OEBPS/",!0),""),A.a3("^/",!0),"")}, +$S:59} +A.md.prototype={ $1(a){return t.kY.a(a).b}, -$S:58} +$S:60} A.m5.prototype={ $1(a){return B.b.ba(A.q(a))}, $S:33} A.m6.prototype={ $1(a){var s A.q(a) -if(a.length!==0){s=A.a5("(?:url\\s*\\(|@import|expression\\s*\\()",!1) +if(a.length!==0){s=A.a3("(?:url\\s*\\(|@import|expression\\s*\\()",!1) s=!s.b.test(a)}else s=!1 return s}, $S:4} -A.f9.prototype={$iaj:1} +A.fb.prototype={$iaj:1} A.lO.prototype={ -lb(a){var s,r,q=t.mf -A.uf("absolute",A.i([a,null,null,null,null,null,null,null,null,null,null,null,null,null,null],q)) +ld(a){var s,r,q=t.mf +A.up("absolute",A.i([a,null,null,null,null,null,null,null,null,null,null,null,null,null,null],q)) s=this.a -s=s.aU(a)>0&&!s.bO(a) +s=s.aU(a)>0&&!s.bP(a) if(s)return a -s=A.uo() +s=A.uz() r=A.i([s,a,null,null,null,null,null,null,null,null,null,null,null,null,null,null],q) -A.uf("join",r) -return this.nl(new A.O(r,t.lS))}, -nl(a){var s,r,q,p,o,n,m,l,k,j +A.up("join",r) +return this.nn(new A.P(r,t.lS))}, +nn(a){var s,r,q,p,o,n,m,l,k,j t.bq.a(a) -for(s=a.$ti,r=s.h("A(h.E)").a(new A.lP()),q=a.gF(0),s=new A.cF(q,r,s.h("cF")),r=this.a,p=!1,o=!1,n="";s.p();){m=q.gB() -if(r.bO(m)&&o){l=A.jr(m,r) +for(s=a.$ti,r=s.h("A(h.E)").a(new A.lP()),q=a.gF(0),s=new A.cH(q,r,s.h("cH")),r=this.a,p=!1,o=!1,n="";s.p();){m=q.gB() +if(r.bP(m)&&o){l=A.jr(m,r) k=n.charCodeAt(0)==0?n:n -n=B.b.t(k,0,r.cv(k,!0)) +n=B.b.t(k,0,r.cz(k,!0)) l.b=n -if(r.cW(n))B.a.k(l.e,0,r.gce()) -n=l.j(0)}else if(r.aU(m)>0){o=!r.bO(m) +if(r.cY(n))B.a.k(l.e,0,r.gcf()) +n=l.j(0)}else if(r.aU(m)>0){o=!r.bP(m) n=m}else{j=m.length if(j!==0){if(0>=j)return A.c(m,0) -j=r.eH(m[0])}else j=!1 -if(!j)if(p)n+=r.gce() -n+=m}p=r.cW(m)}return n.charCodeAt(0)==0?n:n}, -d9(a,b){var s=A.jr(b,this.a),r=s.d,q=A.w(r),p=q.h("b_<1>") -r=A.a7(new A.b_(r,q.h("A(1)").a(new A.lQ()),p),p.h("h.E")) -s.snF(r) +j=r.eL(m[0])}else j=!1 +if(!j)if(p)n+=r.gcf() +n+=m}p=r.cY(m)}return n.charCodeAt(0)==0?n:n}, +de(a,b){var s=A.jr(b,this.a),r=s.d,q=A.w(r),p=q.h("aE<1>") +r=A.a8(new A.aE(r,q.h("A(1)").a(new A.lQ()),p),p.h("h.E")) +s.snH(r) r=s.b -if(r!=null)B.a.bx(s.d,0,r) +if(r!=null)B.a.by(s.d,0,r) return s.d}, -dP(a){var s -if(!this.kC(a))return a +dR(a){var s +if(!this.kD(a))return a s=A.jr(a,this.a) -s.f2() +s.f6() return s.j(0)}, -kC(a){var s,r,q,p,o,n,m,l=this.a,k=l.aU(a) +kD(a){var s,r,q,p,o,n,m,l=this.a,k=l.aU(a) if(k!==0){if(l===$.lC())for(s=a.length,r=0;r=0))return A.c(a,r) n=a.charCodeAt(r) -if(l.by(n)){if(l===$.lC()&&n===47)return!0 -if(p!=null&&l.by(p))return!0 -if(p===46)m=o==null||o===46||l.by(o) +if(l.bz(n)){if(l===$.lC()&&n===47)return!0 +if(p!=null&&l.bz(p))return!0 +if(p===46)m=o==null||o===46||l.bz(o) else m=!1 if(m)return!0}}if(p==null)return!0 -if(l.by(p))return!0 -if(p===46)l=o==null||l.by(o)||o===46 +if(l.bz(p))return!0 +if(p===46)l=o==null||l.bz(o)||o===46 else l=!1 if(l)return!0 return!1}, -o7(a){var s,r,q,p,o,n,m,l=this,k='Unable to find a path to "',j=l.a,i=j.aU(a) -if(i<=0)return l.dP(a) -s=A.uo() -if(j.aU(s)<=0&&j.aU(a)>0)return l.dP(a) -if(j.aU(a)<=0||j.bO(a))a=l.lb(a) -if(j.aU(a)<=0&&j.aU(s)>0)throw A.f(A.rI(k+a+'" from "'+s+'".')) +o9(a){var s,r,q,p,o,n,m,l=this,k='Unable to find a path to "',j=l.a,i=j.aU(a) +if(i<=0)return l.dR(a) +s=A.uz() +if(j.aU(s)<=0&&j.aU(a)>0)return l.dR(a) +if(j.aU(a)<=0||j.bP(a))a=l.ld(a) +if(j.aU(a)<=0&&j.aU(s)>0)throw A.f(A.rS(k+a+'" from "'+s+'".')) r=A.jr(s,j) -r.f2() +r.f6() q=A.jr(a,j) -q.f2() +q.f6() i=r.d p=i.length if(p!==0){if(0>=p)return A.c(i,0) @@ -15680,7 +15828,7 @@ i=i[0]==="."}else i=!1 if(i)return q.j(0) i=r.b p=q.b -if(i!=p)i=i==null||p==null||!j.f5(i,p) +if(i!=p)i=i==null||p==null||!j.f9(i,p) else i=!1 if(i)return q.j(0) for(;;){i=r.d @@ -15691,122 +15839,122 @@ m=n.length if(m!==0){if(0>=p)return A.c(i,0) i=i[0] if(0>=m)return A.c(n,0) -n=j.f5(i,n[0]) +n=j.f9(i,n[0]) i=n}else i=o}else i=o if(!i)break -B.a.d2(r.d,0) -B.a.d2(r.e,1) -B.a.d2(q.d,0) -B.a.d2(q.e,1)}i=r.d +B.a.d5(r.d,0) +B.a.d5(r.e,1) +B.a.d5(q.d,0) +B.a.d5(q.e,1)}i=r.d p=i.length if(p!==0){if(0>=p)return A.c(i,0) i=i[0]===".."}else i=!1 -if(i)throw A.f(A.rI(k+a+'" from "'+s+'".')) +if(i)throw A.f(A.rS(k+a+'" from "'+s+'".')) i=t.N -B.a.eY(q.d,0,A.aE(p,"..",!1,i)) +B.a.f1(q.d,0,A.aB(p,"..",!1,i)) B.a.k(q.e,0,"") -B.a.eY(q.e,1,A.aE(r.d.length,j.gce(),!1,i)) +B.a.f1(q.e,1,A.aB(r.d.length,j.gcf(),!1,i)) j=q.d i=j.length if(i===0)return"." -if(i>1&&B.a.gA(j)==="."){B.a.d3(q.d) +if(i>1&&B.a.gA(j)==="."){B.a.d6(q.d) j=q.e if(0>=j.length)return A.c(j,-1) j.pop() if(0>=j.length)return A.c(j,-1) j.pop() B.a.l(j,"")}q.b="" -q.iv() +q.iw() return q.j(0)}, -il(a){var s,r,q=this,p=A.u8(a) -if(p.gaV()==="file"&&q.a===$.hF())return p.j(0) -else if(p.gaV()!=="file"&&p.gaV()!==""&&q.a!==$.hF())return p.j(0) -s=q.dP(q.a.f4(A.u8(p))) -r=q.o7(s) -return q.d9(0,r).length>q.d9(0,s).length?s:r}} +im(a){var s,r,q=this,p=A.ui(a) +if(p.gaV()==="file"&&q.a===$.hH())return p.j(0) +else if(p.gaV()!=="file"&&p.gaV()!==""&&q.a!==$.hH())return p.j(0) +s=q.dR(q.a.f8(A.ui(p))) +r=q.o9(s) +return q.de(0,r).length>q.de(0,s).length?s:r}} A.lP.prototype={ $1(a){return A.q(a)!==""}, $S:4} A.lQ.prototype={ $1(a){return A.q(a).length!==0}, $S:4} -A.pg.prototype={ -$1(a){A.hB(a) +A.po.prototype={ +$1(a){A.hD(a) return a==null?"null":'"'+a+'"'}, -$S:60} +$S:124} A.e1.prototype={ -iQ(a){var s,r=this.aU(a) +iR(a){var s,r=this.aU(a) if(r>0)return B.b.t(a,0,r) -if(this.bO(a)){if(0>=a.length)return A.c(a,0) +if(this.bP(a)){if(0>=a.length)return A.c(a,0) s=a[0]}else s=null return s}, -f5(a,b){return a===b}} -A.ni.prototype={ -iv(){var s,r,q=this +f9(a,b){return a===b}} +A.no.prototype={ +iw(){var s,r,q=this for(;;){s=q.d if(!(s.length!==0&&B.a.gA(s)===""))break -B.a.d3(q.d) +B.a.d6(q.d) s=q.e if(0>=s.length)return A.c(s,-1) s.pop()}s=q.e r=s.length if(r!==0)B.a.k(s,r-1,"")}, -f2(){var s,r,q,p,o,n,m=this,l=A.i([],t.s) -for(s=m.d,r=s.length,q=0,p=0;p=n)return A.c(l,-1) -l.pop()}else ++q}else B.a.l(l,o)}if(m.b==null)B.a.eY(l,0,A.aE(q,"..",!1,t.N)) +l.pop()}else ++q}else B.a.l(l,o)}if(m.b==null)B.a.f1(l,0,A.aB(q,"..",!1,t.N)) if(l.length===0&&m.b==null)B.a.l(l,".") m.d=l s=m.a -m.e=A.aE(l.length+1,s.gce(),!0,t.N) +m.e=A.aB(l.length+1,s.gcf(),!0,t.N) r=m.b -if(r==null||l.length===0||!s.cW(r))B.a.k(m.e,0,"") +if(r==null||l.length===0||!s.cY(r))B.a.k(m.e,0,"") r=m.b -if(r!=null&&s===$.lC())m.b=A.cO(r,"/","\\") -m.iv()}, +if(r!=null&&s===$.lC())m.b=A.cQ(r,"/","\\") +m.iw()}, j(a){var s,r,q,p,o,n=this.b n=n!=null?n:"" for(s=this.d,r=s.length,q=this.e,p=q.length,o=0;o=0))return A.c(a,s) s=a.charCodeAt(s)!==47 r=s}else r=!1 return r}, -cv(a,b){var s=a.length +cz(a,b){var s=a.length if(s!==0){if(0>=s)return A.c(a,0) s=a.charCodeAt(0)===47}else s=!1 if(s)return 1 return 0}, -aU(a){return this.cv(a,!1)}, -bO(a){return!1}, -f4(a){var s +aU(a){return this.cz(a,!1)}, +bP(a){return!1}, +f8(a){var s if(a.gaV()===""||a.gaV()==="file"){s=a.gaT() -return A.d9(s,0,s.length,B.E,!1)}throw A.f(A.W("Uri "+a.j(0)+" must have scheme 'file:'.",null))}, +return A.da(s,0,s.length,B.E,!1)}throw A.f(A.W("Uri "+a.j(0)+" must have scheme 'file:'.",null))}, ga8(){return"posix"}, -gce(){return"/"}} +gcf(){return"/"}} A.k3.prototype={ -eH(a){return B.b.C(a,"/")}, -by(a){return a===47}, -cW(a){var s,r=a.length +eL(a){return B.b.C(a,"/")}, +bz(a){return a===47}, +cY(a){var s,r=a.length if(r===0)return!1 s=r-1 if(!(s>=0))return A.c(a,s) if(a.charCodeAt(s)!==47)return!0 -return B.b.bu(a,"://")&&this.aU(a)===r}, -cv(a,b){var s,r,q,p=a.length +return B.b.bv(a,"://")&&this.aU(a)===r}, +cz(a,b){var s,r,q,p=a.length if(p===0)return 0 if(0>=p)return A.c(a,0) if(a.charCodeAt(0)===47)return 1 @@ -15817,26 +15965,26 @@ q=B.b.ap(a,"/",B.b.aa(a,"//",s+1)?s+3:s) if(q<=0)return p if(!b||p=s)return A.c(a,0) s=a.charCodeAt(0)===47}else s=!1 return s}, -f4(a){return a.j(0)}, +f8(a){return a.j(0)}, ga8(){return"url"}, -gce(){return"/"}} +gcf(){return"/"}} A.k9.prototype={ -eH(a){return B.b.C(a,"/")}, -by(a){return a===47||a===92}, -cW(a){var s,r=a.length +eL(a){return B.b.C(a,"/")}, +bz(a){return a===47||a===92}, +cY(a){var s,r=a.length if(r===0)return!1 s=r-1 if(!(s>=0))return A.c(a,s) s=a.charCodeAt(s) return!(s===47||s===92)}, -cv(a,b){var s,r,q=a.length +cz(a,b){var s,r,q=a.length if(q===0)return 0 if(0>=q)return A.c(a,0) if(a.charCodeAt(0)===47)return 1 @@ -15846,78 +15994,78 @@ if(s)return 1 r=B.b.ap(a,"\\",2) if(r>0){r=B.b.ap(a,"\\",r+1) if(r>0)return r}return q}if(q<3)return 0 -if(!A.ux(a.charCodeAt(0)))return 0 +if(!A.uI(a.charCodeAt(0)))return 0 if(a.charCodeAt(1)!==58)return 0 q=a.charCodeAt(2) if(!(q===47||q===92))return 0 return 3}, -aU(a){return this.cv(a,!1)}, -bO(a){return this.aU(a)===1}, -f4(a){var s,r +aU(a){return this.cz(a,!1)}, +bP(a){return this.aU(a)===1}, +f8(a){var s,r if(a.gaV()!==""&&a.gaV()!=="file")throw A.f(A.W("Uri "+a.j(0)+" must have scheme 'file:'.",null)) s=a.gaT() -if(a.gc6()===""){if(s.length>=3&&B.b.U(s,"/")&&A.ur(s,1)!=null)s=B.b.d4(s,"/","")}else s="\\\\"+a.gc6()+s -r=A.cO(s,"/","\\") -return A.d9(r,0,r.length,B.E,!1)}, -m3(a,b){var s +if(a.gc7()===""){if(s.length>=3&&B.b.U(s,"/")&&A.uC(s,1)!=null)s=B.b.d7(s,"/","")}else s="\\\\"+a.gc7()+s +r=A.cQ(s,"/","\\") +return A.da(r,0,r.length,B.E,!1)}, +m5(a,b){var s if(a===b)return!0 if(a===47)return b===92 if(a===92)return b===47 if((a^b)!==32)return!1 s=a|32 return s>=97&&s<=122}, -f5(a,b){var s,r,q +f9(a,b){var s,r,q if(a===b)return!0 s=a.length r=b.length if(s!==r)return!1 for(q=0;q=0)return A.c(s,0) return!1}return!0}return!1}, -gq(a){return J.B(this.a)}, -$inC:1} -A.fr.prototype={ +gq(a){return J.C(this.a)}, +$inI:1} +A.ft.prototype={ gF(a){var s=this -return new A.fs(s.a,s.b,!1,s.c,s.$ti.h("fs<1>"))}} -A.fs.prototype={ +return new A.fu(s.a,s.b,!1,s.c,s.$ti.h("fu<1>"))}} +A.fu.prototype={ gB(){var s=this.e s===$&&A.o() return s}, @@ -15925,21 +16073,21 @@ p(){var s,r,q,p,o,n=this for(s=n.b,r=s.length,q=n.a;p=n.d,p<=r;){o=q.a.I(s,p) p=n.d if(o<0)n.d=p+1 -else{n.e=n.$ti.c.a(q.H(new A.cb(s,p)).gR()) +else{n.e=n.$ti.c.a(q.H(new A.ce(s,p)).gR()) s=n.d if(s===o)n.d=s+1 else n.d=o return!0}}return!1}, $iL:1} -A.cp.prototype={ +A.cr.prototype={ H(a){var s,r=a.a,q=a.b,p=this.a.I(r,q) if(p<0)return new A.F(this.b,r,q) s=B.b.t(r,q,p) return new A.T(s,r,p,t.y)}, I(a,b){return this.a.I(a,b)}, -j(a){var s=this.bE(0) +j(a){var s=this.bF(0) return s+"["+this.b+"]"}} -A.fq.prototype={ +A.fs.prototype={ H(a){var s,r,q=this.a.H(a) if(q instanceof A.F)return q s=this.$ti @@ -15947,48 +16095,48 @@ r=s.y[1].a(this.b.$1(q.gR())) return new A.T(r,q.a,q.b,s.h("T<2>"))}, I(a,b){var s=this.a.I(a,b) return s}} -A.fU.prototype={ +A.fW.prototype={ H(a){var s,r,q,p=this.a.H(a) if(p instanceof A.F)return p s=p.b r=this.$ti -q=r.h("cB<1>") -q=q.a(new A.cB(p.gR(),a.a,a.b,s,q)) -return new A.T(q,p.a,s,r.h("T>"))}, +q=r.h("cD<1>") +q=q.a(new A.cD(p.gR(),a.a,a.b,s,q)) +return new A.T(q,p.a,s,r.h("T>"))}, I(a,b){return this.a.I(a,b)}} -A.pQ.prototype={ -$1(a){return this.a.H(new A.cb(A.q(a),0)).gR()}, -$S:61} -A.pc.prototype={ +A.pZ.prototype={ +$1(a){return this.a.H(new A.ce(A.q(a),0)).gR()}, +$S:63} +A.pk.prototype={ $1(a){var s,r,q A.q(a) s=this.a -r=s?new A.bV(a):new A.ah(a) -q=r.gbU(r) -r=s?new A.bV(a):new A.ah(a) -return new A.ab(q,r.gbU(r))}, -$S:62} -A.pd.prototype={ +r=s?new A.bX(a):new A.ah(a) +q=r.gbn(r) +r=s?new A.bX(a):new A.ah(a) +return new A.ad(q,r.gbn(r))}, +$S:64} +A.pl.prototype={ $3(a,b,c){var s,r,q A.q(a) A.q(b) A.q(c) s=this.a -r=s?new A.bV(a):new A.ah(a) -q=r.gbU(r) -r=s?new A.bV(c):new A.ah(c) -return new A.ab(q,r.gbU(r))}, -$S:63} -A.ca.prototype={ -j(a){return A.cN(this).j(0)}} -A.fM.prototype={ +r=s?new A.bX(a):new A.ah(a) +q=r.gbn(r) +r=s?new A.bX(c):new A.ah(c) +return new A.ad(q,r.gbn(r))}, +$S:65} +A.cd.prototype={ +j(a){return A.cP(this).j(0)}} +A.fO.prototype={ b9(a){return this.a===a}, -j(a){return this.cG(0)+"("+this.a+")"}} -A.ck.prototype={ +j(a){return this.cH(0)+"("+this.a+")"}} +A.cm.prototype={ b9(a){return this.a}, -j(a){return this.cG(0)+"("+this.a+")"}} +j(a){return this.cH(0)+"("+this.a+")"}} A.j4.prototype={ -jV(a){var s,r,q,p,o,n,m,l,k,j,i,h +jW(a){var s,r,q,p,o,n,m,l,k,j,i,h for(s=a.length,r=this.a,q=this.c,p=q.length,o=q.$flags|0,n=0;n>>0!==0}else s=r else s=r return s}, j(a){var s=this -return s.cG(0)+"("+s.a+", "+s.b+", "+A.k(s.c)+")"}} +return s.cH(0)+"("+s.a+", "+s.b+", "+A.k(s.c)+")"}} A.jj.prototype={ b9(a){return!this.a.b9(a)}, -j(a){return this.cG(0)+"("+this.a.j(0)+")"}} -A.ab.prototype={ +j(a){return this.cH(0)+"("+this.a.j(0)+")"}} +A.ad.prototype={ b9(a){return this.a<=a&&a<=this.b}, -j(a){return this.cG(0)+"("+this.a+", "+this.b+")"}} +j(a){return this.cH(0)+"("+this.a+", "+this.b+")"}} A.k8.prototype={ b9(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0 default:return!1}switch(a){case 5760:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0 default:return!1}}} -A.pY.prototype={ +A.q6.prototype={ $1(a){var s -A.ax(a) +A.at(a) s=B.rn.m(0,a) if(s!=null)return s -if(a<32)return"\\x"+B.b.nC(B.f.d6(a,16),2,"0") -return A.a4(a)}, -$S:37} -A.pP.prototype={ -$1(a){A.ax(a) -return new A.ab(a,a)}, -$S:65} -A.pN.prototype={ +if(a<32)return"\\x"+B.b.nE(B.f.d9(a,16),2,"0") +return A.a5(a)}, +$S:44} +A.pX.prototype={ +$1(a){A.at(a) +return new A.ad(a,a)}, +$S:67} +A.pV.prototype={ $2(a,b){var s,r=t.eN r.a(a) r.a(b) r=a.a s=b.a return r!==s?r-s:a.b-b.b}, -$S:66} -A.pO.prototype={ -$2(a,b){A.ax(a) +$S:68} +A.pW.prototype={ +$2(a,b){A.at(a) t.eN.a(b) return a+(b.b-b.a+1)}, -$S:67} +$S:69} A.eO.prototype={ H(a){var s,r,q,p,o=this.a,n=o[0].H(a) if(!(n instanceof A.F))return n @@ -16047,12 +16195,12 @@ q=r.$2(q,n)}return q}, I(a,b){var s,r,q,p for(s=this.a,r=s.length,q=-1,p=0;p=0)return q}return q}} -A.au.prototype={ -gaN(){return A.i([this.a],t.a)}, +A.ax.prototype={ +gaO(){return A.i([this.a],t.b)}, b8(a,b){var s=this -s.bX(a,b) -if(s.a.v(0,a))s.a=A.x(s).h("n").a(b)}} -A.fH.prototype={ +s.bY(a,b) +if(s.a.v(0,a))s.a=A.x(s).h("n").a(b)}} +A.fJ.prototype={ H(a){var s,r,q=this.a.H(a) if(q instanceof A.F)return q s=this.b.H(q) @@ -16065,12 +16213,12 @@ if(b<0)return-1 b=this.b.I(a,b) if(b<0)return-1 return b}, -gaN(){return A.i([this.a,this.b],t.a)}, +gaO(){return A.i([this.a,this.b],t.b)}, b8(a,b){var s=this -s.bX(a,b) +s.bY(a,b) if(s.a.v(0,a))s.a=s.$ti.h("n<1>").a(b) if(s.b.v(0,a))s.b=s.$ti.h("n<2>").a(b)}} -A.nv.prototype={ +A.nB.prototype={ $1(a){this.b.h("@<0>").u(this.c).h("+(1,2)").a(a) return this.a.$2(a.a,a.b)}, $S(){return this.d.h("@<0>").u(this.b).u(this.c).h("1(+(2,3))")}} @@ -16082,7 +16230,7 @@ if(s instanceof A.F)return s r=p.c.H(s) if(r instanceof A.F)return r q=p.$ti -s=q.h("+(1,2,3)").a(new A.hl(o.gR(),s.gR(),r.gR())) +s=q.h("+(1,2,3)").a(new A.hn(o.gR(),s.gR(),r.gR())) return new A.T(s,r.a,r.b,q.h("T<+(1,2,3)>"))}, I(a,b){b=this.a.I(a,b) if(b<0)return-1 @@ -16091,19 +16239,19 @@ if(b<0)return-1 b=this.c.I(a,b) if(b<0)return-1 return b}, -gaN(){return A.i([this.a,this.b,this.c],t.a)}, +gaO(){return A.i([this.a,this.b,this.c],t.b)}, b8(a,b){var s=this -s.bX(a,b) +s.bY(a,b) if(s.a.v(0,a))s.a=s.$ti.h("n<1>").a(b) if(s.b.v(0,a))s.b=s.$ti.h("n<2>").a(b) if(s.c.v(0,a))s.c=s.$ti.h("n<3>").a(b)}} -A.nw.prototype={ +A.nC.prototype={ $1(a){var s=this s.b.h("@<0>").u(s.c).u(s.d).h("+(1,2,3)").a(a) return s.a.$3(a.a,a.b,a.c)}, $S(){var s=this return s.e.h("@<0>").u(s.b).u(s.c).u(s.d).h("1(+(2,3,4))")}} -A.fI.prototype={ +A.fK.prototype={ H(a){var s,r,q,p,o=this,n=o.a.H(a) if(n instanceof A.F)return n s=o.b.H(n) @@ -16113,7 +16261,7 @@ if(r instanceof A.F)return r q=o.d.H(r) if(q instanceof A.F)return q p=o.$ti -r=p.h("+(1,2,3,4)").a(new A.hm([n.gR(),s.gR(),r.gR(),q.gR()])) +r=p.h("+(1,2,3,4)").a(new A.ho([n.gR(),s.gR(),r.gR(),q.gR()])) return new A.T(r,q.a,q.b,p.h("T<+(1,2,3,4)>"))}, I(a,b){var s=this b=s.a.I(a,b) @@ -16125,20 +16273,20 @@ if(b<0)return-1 b=s.d.I(a,b) if(b<0)return-1 return b}, -gaN(){var s=this -return A.i([s.a,s.b,s.c,s.d],t.a)}, +gaO(){var s=this +return A.i([s.a,s.b,s.c,s.d],t.b)}, b8(a,b){var s=this -s.bX(a,b) +s.bY(a,b) if(s.a.v(0,a))s.a=s.$ti.h("n<1>").a(b) if(s.b.v(0,a))s.b=s.$ti.h("n<2>").a(b) if(s.c.v(0,a))s.c=s.$ti.h("n<3>").a(b) if(s.d.v(0,a))s.d=s.$ti.h("n<4>").a(b)}} -A.ny.prototype={ +A.nE.prototype={ $1(a){var s=this,r=s.b.h("@<0>").u(s.c).u(s.d).u(s.e).h("+(1,2,3,4)").a(a).a return s.a.$4(r[0],r[1],r[2],r[3])}, $S(){var s=this return s.f.h("@<0>").u(s.b).u(s.c).u(s.d).u(s.e).h("1(+(2,3,4,5))")}} -A.fJ.prototype={ +A.fL.prototype={ H(a){var s,r,q,p,o,n=this,m=n.a.H(a) if(m instanceof A.F)return m s=n.b.H(m) @@ -16150,7 +16298,7 @@ if(q instanceof A.F)return q p=n.e.H(q) if(p instanceof A.F)return p o=n.$ti -q=o.h("+(1,2,3,4,5)").a(new A.hn([m.gR(),s.gR(),r.gR(),q.gR(),p.gR()])) +q=o.h("+(1,2,3,4,5)").a(new A.hp([m.gR(),s.gR(),r.gR(),q.gR(),p.gR()])) return new A.T(q,p.a,p.b,o.h("T<+(1,2,3,4,5)>"))}, I(a,b){var s=this b=s.a.I(a,b) @@ -16164,21 +16312,21 @@ if(b<0)return-1 b=s.e.I(a,b) if(b<0)return-1 return b}, -gaN(){var s=this -return A.i([s.a,s.b,s.c,s.d,s.e],t.a)}, +gaO(){var s=this +return A.i([s.a,s.b,s.c,s.d,s.e],t.b)}, b8(a,b){var s=this -s.bX(a,b) +s.bY(a,b) if(s.a.v(0,a))s.a=s.$ti.h("n<1>").a(b) if(s.b.v(0,a))s.b=s.$ti.h("n<2>").a(b) if(s.c.v(0,a))s.c=s.$ti.h("n<3>").a(b) if(s.d.v(0,a))s.d=s.$ti.h("n<4>").a(b) if(s.e.v(0,a))s.e=s.$ti.h("n<5>").a(b)}} -A.nz.prototype={ +A.nF.prototype={ $1(a){var s=this,r=s.b.h("@<0>").u(s.c).u(s.d).u(s.e).u(s.f).h("+(1,2,3,4,5)").a(a).a return s.a.$5(r[0],r[1],r[2],r[3],r[4])}, $S(){var s=this return s.r.h("@<0>").u(s.b).u(s.c).u(s.d).u(s.e).u(s.f).h("1(+(2,3,4,5,6))")}} -A.fK.prototype={ +A.fM.prototype={ H(a){var s,r,q,p,o,n,m,l,k=this,j=k.a.H(a) if(j instanceof A.F)return j s=k.b.H(j) @@ -16196,7 +16344,7 @@ if(n instanceof A.F)return n m=k.w.H(n) if(m instanceof A.F)return m l=k.$ti -n=l.h("+(1,2,3,4,5,6,7,8)").a(new A.ho([j.gR(),s.gR(),r.gR(),q.gR(),p.gR(),o.gR(),n.gR(),m.gR()])) +n=l.h("+(1,2,3,4,5,6,7,8)").a(new A.hq([j.gR(),s.gR(),r.gR(),q.gR(),p.gR(),o.gR(),n.gR(),m.gR()])) return new A.T(n,m.a,m.b,l.h("T<+(1,2,3,4,5,6,7,8)>"))}, I(a,b){var s=this b=s.a.I(a,b) @@ -16216,10 +16364,10 @@ if(b<0)return-1 b=s.w.I(a,b) if(b<0)return-1 return b}, -gaN(){var s=this -return A.i([s.a,s.b,s.c,s.d,s.e,s.f,s.r,s.w],t.a)}, +gaO(){var s=this +return A.i([s.a,s.b,s.c,s.d,s.e,s.f,s.r,s.w],t.b)}, b8(a,b){var s=this -s.bX(a,b) +s.bY(a,b) if(s.a.v(0,a))s.a=s.$ti.h("n<1>").a(b) if(s.b.v(0,a))s.b=s.$ti.h("n<2>").a(b) if(s.c.v(0,a))s.c=s.$ti.h("n<3>").a(b) @@ -16228,17 +16376,17 @@ if(s.e.v(0,a))s.e=s.$ti.h("n<5>").a(b) if(s.f.v(0,a))s.f=s.$ti.h("n<6>").a(b) if(s.r.v(0,a))s.r=s.$ti.h("n<7>").a(b) if(s.w.v(0,a))s.w=s.$ti.h("n<8>").a(b)}} -A.nA.prototype={ +A.nG.prototype={ $1(a){var s=this,r=s.b.h("@<0>").u(s.c).u(s.d).u(s.e).u(s.f).u(s.r).u(s.w).u(s.x).h("+(1,2,3,4,5,6,7,8)").a(a).a return s.a.$8(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7])}, $S(){var s=this return s.y.h("@<0>").u(s.b).u(s.c).u(s.d).u(s.e).u(s.f).u(s.r).u(s.w).u(s.x).h("1(+(2,3,4,5,6,7,8,9))")}} A.ds.prototype={ b8(a,b){var s,r,q,p -this.bX(a,b) +this.bY(a,b) for(s=this.a,r=s.length,q=this.$ti.h("n"),p=0;p"))}, I(a,b){var s=this.a.I(a,b) return s<0?b:s}} -A.fP.prototype={ +A.fR.prototype={ H(a){var s,r,q,p,o=this,n=o.b.H(a) if(n instanceof A.F)return n s=o.a.H(n) @@ -16261,9 +16409,9 @@ if(b<0)return-1 b=this.a.I(a,b) if(b<0)return-1 return this.c.I(a,b)}, -gaN(){return A.i([this.b,this.a,this.c],t.a)}, +gaO(){return A.i([this.b,this.a,this.c],t.b)}, b8(a,b){var s=this -s.fJ(a,b) +s.fK(a,b) if(s.b.v(0,a))s.b=b if(s.c.v(0,a))s.c=b}} A.id.prototype={ @@ -16272,12 +16420,12 @@ if(s"))}, I(a,b){return b}, -j(a){return this.bE(0)+"["+A.k(this.a)+"]"}} +j(a){return this.bF(0)+"["+A.k(this.a)+"]"}} A.jg.prototype={ H(a){var s,r=a.a,q=a.b,p=r.length if(q=this.c?b:-1}, -j(a){var s=this,r=s.bE(0),q=s.d +j(a){var s=this,r=s.bF(0),q=s.d return r+"["+s.b+", "+s.c+".."+A.k(q===9007199254740991?"*":q)+"]"}} A.bj.prototype={ H(a){var s,r,q,p,o=this,n=o.$ti,m=A.i([],n.h("y<1>")) @@ -16362,11 +16510,11 @@ for(s=o.b,r=b,q=0;q=s)return-1 p=o.a.I(a,r) if(p<0)return-1;++q}else return r}} -A.fm.prototype={ -gaN(){return A.i([this.a,this.e],t.a)}, -b8(a,b){this.fJ(a,b) +A.fo.prototype={ +gaO(){return A.i([this.a,this.e],t.b)}, +b8(a,b){this.fK(a,b) if(this.e.v(0,a))this.e=b}} -A.fB.prototype={ +A.fD.prototype={ H(a){var s,r,q,p=this,o=p.$ti,n=A.i([],o.h("y<1>")) for(s=p.b,r=a;n.length=q.gn(a)||q.m(a,l)!==10)m=10}if(m===10)B.a.l(o,n+1)}}, -K(a,b){return A.qy(this,a,b)}, -cC(a){var s,r=this -if(a<0)throw A.f(A.aQ("Offset may not be negative, was "+a+".")) -else if(a>r.c.length)throw A.f(A.aQ("Offset "+a+u.D+r.gn(0)+".")) +M(a,b){return A.qJ(this,a,b)}, +cD(a){var s,r=this +if(a<0)throw A.f(A.aT("Offset may not be negative, was "+a+".")) +else if(a>r.c.length)throw A.f(A.aT("Offset "+a+u.D+r.gn(0)+".")) s=r.b -if(a=B.a.gA(s))return s.length-1 -if(r.kx(a)){s=r.d +if(r.ky(a)){s=r.d s.toString -return s}return r.d=r.k6(a)-1}, -kx(a){var s,r,q,p=this.d +return s}return r.d=r.k7(a)-1}, +ky(a){var s,r,q,p=this.d if(p==null)return!1 s=this.b r=s.length @@ -16416,108 +16564,108 @@ q=a=0&&ra)o=r else s=r+1}return o}, -e0(a){var s,r,q,p=this -if(a<0)throw A.f(A.aQ("Offset may not be negative, was "+a+".")) -else if(a>p.c.length)throw A.f(A.aQ("Offset "+a+" must be not be greater than the number of characters in the file, "+p.gn(0)+".")) -s=p.cC(a) +e4(a){var s,r,q,p=this +if(a<0)throw A.f(A.aT("Offset may not be negative, was "+a+".")) +else if(a>p.c.length)throw A.f(A.aT("Offset "+a+" must be not be greater than the number of characters in the file, "+p.gn(0)+".")) +s=p.cD(a) r=p.b if(!(s>=0&&sa)throw A.f(A.aQ("Line "+s+" comes after offset "+a+".")) +if(q>a)throw A.f(A.aT("Line "+s+" comes after offset "+a+".")) return a-q}, -d7(a){var s,r,q,p -if(a<0)throw A.f(A.aQ("Line may not be negative, was "+a+".")) +dc(a){var s,r,q,p +if(a<0)throw A.f(A.aT("Line may not be negative, was "+a+".")) else{s=this.b r=s.length -if(a>=r)throw A.f(A.aQ("Line "+a+" must be less than the number of lines in the file, "+this.gnm()+"."))}q=s[a] +if(a>=r)throw A.f(A.aT("Line "+a+" must be less than the number of lines in the file, "+this.gno()+"."))}q=s[a] if(q<=this.c.length){p=a+1 s=p=s[p]}else s=!0 -if(s)throw A.f(A.aQ("Line "+a+" doesn't have 0 columns.")) +if(s)throw A.f(A.aT("Line "+a+" doesn't have 0 columns.")) return q}} -A.bh.prototype={ +A.bi.prototype={ ga6(){return this.a.a}, -gaj(){return this.a.cC(this.b)}, -gao(){return this.a.e0(this.b)}, +gak(){return this.a.cD(this.b)}, +gao(){return this.a.e4(this.b)}, bh(a,b){var s,r=this.b -if(r<0)throw A.f(A.aQ("Offset may not be negative, was "+r+".")) +if(r<0)throw A.f(A.aT("Offset may not be negative, was "+r+".")) else{s=this.a -if(r>s.c.length)throw A.f(A.aQ("Offset "+r+u.D+s.gn(0)+"."))}}, -gaw(){return this.b}} -A.aw.prototype={ +if(r>s.c.length)throw A.f(A.aT("Offset "+r+u.D+s.gn(0)+"."))}}, +gaz(){return this.b}} +A.az.prototype={ ga6(){return this.a.a}, gn(a){return this.c-this.b}, -gS(){return A.cU(this.a,this.b)}, -gV(){return A.cU(this.a,this.c)}, -gZ(){return A.aA(B.aA.am(this.a.c,this.b,this.c),0,null)}, -gb_(){var s=this,r=s.a,q=s.c,p=r.cC(q) -if(r.e0(q)===0&&p!==0){if(q-s.b===0)return p===r.b.length-1?"":A.aA(B.aA.am(r.c,r.d7(p),r.d7(p+1)),0,null)}else q=p===r.b.length-1?r.c.length:r.d7(p+1) -return A.aA(B.aA.am(r.c,r.d7(r.cC(s.b)),q),0,null)}, -aG(a,b,c){var s,r=this.c,q=this.b +gS(){return A.cW(this.a,this.b)}, +gV(){return A.cW(this.a,this.c)}, +gZ(){return A.aD(B.aA.am(this.a.c,this.b,this.c),0,null)}, +gb_(){var s=this,r=s.a,q=s.c,p=r.cD(q) +if(r.e4(q)===0&&p!==0){if(q-s.b===0)return p===r.b.length-1?"":A.aD(B.aA.am(r.c,r.dc(p),r.dc(p+1)),0,null)}else q=p===r.b.length-1?r.c.length:r.dc(p+1) +return A.aD(B.aA.am(r.c,r.dc(r.cD(s.b)),q),0,null)}, +aI(a,b,c){var s,r=this.c,q=this.b if(rs.c.length)throw A.f(A.aQ("End "+r+u.D+s.gn(0)+".")) -else if(q<0)throw A.f(A.aQ("Start may not be negative, was "+q+"."))}}, +if(r>s.c.length)throw A.f(A.aT("End "+r+u.D+s.gn(0)+".")) +else if(q<0)throw A.f(A.aT("Start may not be negative, was "+q+"."))}}, ai(a,b){var s t.hs.a(b) -if(!(b instanceof A.aw))return this.jP(0,b) +if(!(b instanceof A.az))return this.jQ(0,b) s=B.f.ai(this.b,b.b) return s===0?B.f.ai(this.c,b.c):s}, v(a,b){var s=this if(b==null)return!1 -if(!(b instanceof A.aw))return s.jO(0,b) -return s.b===b.b&&s.c===b.c&&J.N(s.a.a,b.a.a)}, -gq(a){return A.aX(this.b,this.c,this.a.a,B.u)}, -aO(a,b){var s,r=this,q=r.a -if(!J.N(q.a,b.a.a))throw A.f(A.W('Source URLs "'+A.k(r.ga6())+'" and "'+A.k(b.ga6())+"\" don't match.",null)) +if(!(b instanceof A.az))return s.jP(0,b) +return s.b===b.b&&s.c===b.c&&J.O(s.a.a,b.a.a)}, +gq(a){return A.b1(this.b,this.c,this.a.a,B.u)}, +aP(a,b){var s,r=this,q=r.a +if(!J.O(q.a,b.a.a))throw A.f(A.W('Source URLs "'+A.k(r.ga6())+'" and "'+A.k(b.ga6())+"\" don't match.",null)) s=Math.min(r.b,b.b) -return A.qy(q,s,Math.max(r.c,b.c))}, -$irq:1, -$icd:1} -A.me.prototype={ -n7(){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a=this,a0=null,a1=a.a -a.hC(B.a.gbv(a1).c) +return A.qJ(q,s,Math.max(r.c,b.c))}, +$irB:1, +$icg:1} +A.mj.prototype={ +n9(){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a=this,a0=null,a1=a.a +a.hD(B.a.gbw(a1).c) s=a.e -r=A.aE(s,a0,!1,t.dd) +r=A.aB(s,a0,!1,t.dd) for(q=a.r,s=s!==0,p=a.b,o=0;o0){m=a1[o-1] l=n.c -if(!J.N(m.c,l)){a.dw("\u2575") +if(!J.O(m.c,l)){a.dA("\u2575") q.a+="\n" -a.hC(l)}else if(m.b+1!==n.b){a.la("...") -q.a+="\n"}}for(l=n.d,k=A.w(l).h("X<1>"),j=new A.X(l,k),j=new A.M(j,j.gn(0),k.h("M")),k=k.h("G.E"),i=n.b,h=n.a;j.p();){g=j.d +a.hD(l)}else if(m.b+1!==n.b){a.lc("...") +q.a+="\n"}}for(l=n.d,k=A.w(l).h("Y<1>"),j=new A.Y(l,k),j=new A.N(j,j.gn(0),k.h("N")),k=k.h("G.E"),i=n.b,h=n.a;j.p();){g=j.d if(g==null)g=k.a(g) f=g.a -if(f.gS().gaj()!==f.gV().gaj()&&f.gS().gaj()===i&&a.ky(B.b.t(h,0,f.gS().gao()))){e=B.a.al(r,a0) -if(e<0)A.P(A.W(A.k(r)+" contains no null elements.",a0)) -B.a.k(r,e,g)}}a.l9(i) +if(f.gS().gak()!==f.gV().gak()&&f.gS().gak()===i&&a.kz(B.b.t(h,0,f.gS().gao()))){e=B.a.aj(r,a0) +if(e<0)A.M(A.W(A.k(r)+" contains no null elements.",a0)) +B.a.k(r,e,g)}}a.lb(i) q.a+=" " -a.l8(n,r) +a.la(n,r) if(s)q.a+=" " -d=B.a.eX(l,new A.mz()) +d=B.a.f0(l,new A.mE()) if(d===-1)c=a0 else{if(!(d>=0&&d")),q=this.r,r=r.h("C.E");s.p();){p=s.d +dC(a){var s,r,q,p +for(s=new A.ah(a),r=t.gS,s=new A.N(s,s.gn(0),r.h("N")),q=this.r,r=r.h("B.E");s.p();){p=s.d if(p==null)p=r.a(p) if(p===9)q.a+=B.b.b2(" ",4) -else{p=A.a4(p) +else{p=A.a5(p) q.a+=p}}}, -dz(a,b,c){var s={} +dB(a,b,c){var s={} s.a=c if(b!=null)s.a=B.f.j(b+1) -this.b3(new A.mx(s,this,a),"\x1b[34m",t.d)}, -dw(a){return this.dz(a,null,null)}, -la(a){return this.dz(null,null,a)}, -l9(a){return this.dz(null,a,null)}, -ev(){return this.dz(null,null,null)}, -ed(a){var s,r,q,p -for(s=new A.ah(a),r=t.gS,s=new A.M(s,s.gn(0),r.h("M")),r=r.h("C.E"),q=0;s.p();){p=s.d +this.b3(new A.mC(s,this,a),"\x1b[34m",t.d)}, +dA(a){return this.dB(a,null,null)}, +lc(a){return this.dB(null,null,a)}, +lb(a){return this.dB(null,a,null)}, +ez(){return this.dB(null,null,null)}, +eh(a){var s,r,q,p +for(s=new A.ah(a),r=t.gS,s=new A.N(s,s.gn(0),r.h("N")),r=r.h("B.E"),q=0;s.p();){p=s.d if((p==null?r.a(p):p)===9)++q}return q}, -ky(a){var s,r,q -for(s=new A.ah(a),r=t.gS,s=new A.M(s,s.gn(0),r.h("M")),r=r.h("C.E");s.p();){q=s.d +kz(a){var s,r,q +for(s=new A.ah(a),r=t.gS,s=new A.N(s,s.gn(0),r.h("N")),r=r.h("B.E");s.p();){q=s.d if(q==null)q=r.a(q) if(q!==32&&q!==9)return!1}return!0}, b3(a,b,c){var s,r @@ -16597,217 +16745,217 @@ if(s&&b!=null)this.r.a+=b r=a.$0() if(s&&b!=null)this.r.a+="\x1b[0m" return r}} -A.my.prototype={ +A.mD.prototype={ $0(){return this.a}, -$S:68} -A.mg.prototype={ +$S:70} +A.ml.prototype={ $1(a){var s=t.nR.a(a).d,r=A.w(s) -return new A.b_(s,r.h("A(1)").a(new A.mf()),r.h("b_<1>")).gn(0)}, -$S:69} -A.mf.prototype={ +return new A.aE(s,r.h("A(1)").a(new A.mk()),r.h("aE<1>")).gn(0)}, +$S:71} +A.mk.prototype={ $1(a){var s=t.D.a(a).a -return s.gS().gaj()!==s.gV().gaj()}, -$S:21} -A.mh.prototype={ +return s.gS().gak()!==s.gV().gak()}, +$S:19} +A.mm.prototype={ $1(a){return t.nR.a(a).c}, -$S:71} -A.mj.prototype={ +$S:73} +A.mo.prototype={ $1(a){var s=t.D.a(a).a.ga6() return s==null?new A.p():s}, -$S:72} -A.mk.prototype={ +$S:74} +A.mp.prototype={ $2(a,b){var s=t.D return s.a(a).a.ai(0,s.a(b).a)}, -$S:73} -A.ml.prototype={ +$S:75} +A.mq.prototype={ $1(a0){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a t.lO.a(a0) s=a0.a r=a0.b q=A.i([],t.dg) -for(p=J.c4(r),o=p.gF(r),n=t.g7;o.p();){m=o.gB().a +for(p=J.c7(r),o=p.gF(r),n=t.g7;o.p();){m=o.gB().a l=m.gb_() -k=A.pA(l,m.gZ(),m.gS().gao()) +k=A.pI(l,m.gZ(),m.gS().gao()) k.toString -j=B.b.dB("\n",B.b.t(l,0,k)).gn(0) -i=m.gS().gaj()-j +j=B.b.dD("\n",B.b.t(l,0,k)).gn(0) +i=m.gS().gak()-j for(m=l.split("\n"),k=m.length,h=0;hB.a.gA(q).b)B.a.l(q,new A.bD(g,i,s,A.i([],n)));++i}}f=A.i([],n) -for(o=q.length,n=t.aP,e=f.$flags|0,d=0,h=0;h")),b=g.b,k=k.h("G.E");m.p();){a=m.d +for(m=p.aX(r,d),k=m.$ti,m=new A.N(m,m.gn(0),k.h("N")),b=g.b,k=k.h("G.E");m.p();){a=m.d if(a==null)a=k.a(a) -if(a.a.gS().gaj()>b)break +if(a.a.gS().gak()>b)break B.a.l(f,a)}d+=f.length-c B.a.a1(g.d,f)}return q}, -$S:74} -A.mi.prototype={ -$1(a){return t.D.a(a).a.gV().gaj()" return null}, $S:1} -A.mt.prototype={ +A.my.prototype={ $0(){var s=this.a.r,r=this.b===this.c.b?"\u250c":"\u2514" s.a+=r}, $S:3} -A.mu.prototype={ +A.mz.prototype={ $0(){var s=this.a.r,r=this.b==null?"\u2500":"\u253c" s.a+=r}, $S:3} -A.mv.prototype={ +A.mA.prototype={ $0(){this.a.r.a+="\u2500" return null}, $S:1} -A.mw.prototype={ +A.mB.prototype={ $0(){var s,r,q=this,p=q.a,o=p.a?"\u253c":"\u2502" if(q.c!=null)q.b.r.a+=o else{s=q.e r=s.b if(q.d===r){s=q.b -s.b3(new A.mr(p,s),p.b,t.d) +s.b3(new A.mw(p,s),p.b,t.d) p.a=!0 if(p.b==null)p.b=s.b}else{s=q.r===r&&q.f.a.gV().gao()===s.a.length r=q.b if(s)r.r.a+="\u2514" -else r.b3(new A.ms(r,o),p.b,t.d)}}}, +else r.b3(new A.mx(r,o),p.b,t.d)}}}, $S:3} -A.mr.prototype={ +A.mw.prototype={ $0(){var s=this.b.r,r=this.a.a?"\u252c":"\u250c" s.a+=r}, $S:3} -A.ms.prototype={ +A.mx.prototype={ $0(){this.a.r.a+=this.b}, $S:3} -A.mn.prototype={ +A.ms.prototype={ $0(){var s=this -return s.a.dA(B.b.t(s.b,s.c,s.d))}, +return s.a.dC(B.b.t(s.b,s.c,s.d))}, $S:1} -A.mo.prototype={ +A.mt.prototype={ $0(){var s,r,q=this.a,p=q.r,o=p.a,n=this.c.a,m=n.gS().gao(),l=n.gV().gao() n=this.b.a -s=q.ed(B.b.t(n,0,m)) -r=q.ed(B.b.t(n,m,l)) +s=q.eh(B.b.t(n,0,m)) +r=q.eh(B.b.t(n,m,l)) m+=s*3 n=(p.a+=B.b.b2(" ",m))+B.b.b2("^",Math.max(l+(s+r)*3-m,1)) p.a=n return n.length-o.length}, -$S:34} -A.mp.prototype={ -$0(){return this.a.l5(this.b,this.c.a.gS().gao())}, +$S:28} +A.mu.prototype={ +$0(){return this.a.l7(this.b,this.c.a.gS().gao())}, $S:1} -A.mq.prototype={ +A.mv.prototype={ $0(){var s=this,r=s.a,q=r.r,p=q.a if(s.b)q.a=p+B.b.b2("\u2500",3) -else r.hB(s.c,Math.max(s.d.a.gV().gao()-1,0),!1) +else r.hC(s.c,Math.max(s.d.a.gV().gao()-1,0),!1) return q.a.length-p.length}, -$S:34} -A.mx.prototype={ +$S:28} +A.mC.prototype={ $0(){var s=this.b,r=s.r,q=this.a.a if(q==null)q="" -s=B.b.nD(q,s.d) +s=B.b.nF(q,s.d) s=r.a+=s q=this.c r.a=s+(q==null?"\u2502":q)}, $S:3} -A.aL.prototype={ +A.aO.prototype={ j(a){var s=this.a -s="primary "+(""+s.gS().gaj()+":"+s.gS().gao()+"-"+s.gV().gaj()+":"+s.gV().gao()) +s="primary "+(""+s.gS().gak()+":"+s.gS().gao()+"-"+s.gV().gak()+":"+s.gV().gao()) return s.charCodeAt(0)==0?s:s}} -A.oP.prototype={ +A.oX.prototype={ $0(){var s,r,q,p,o=this.a -if(!(t.ol.b(o)&&A.pA(o.gb_(),o.gZ(),o.gS().gao())!=null)){s=A.jO(o.gS().gaw(),0,0,o.ga6()) -r=o.gV().gaw() +if(!(t.ol.b(o)&&A.pI(o.gb_(),o.gZ(),o.gS().gao())!=null)){s=A.jO(o.gS().gaz(),0,0,o.ga6()) +r=o.gV().gaz() q=o.ga6() -p=A.yV(o.gZ(),10) -o=A.nL(s,A.jO(r,A.tu(o.gZ()),p,q),o.gZ(),o.gZ())}return A.xe(A.xg(A.xf(o)))}, -$S:76} +p=A.z3(o.gZ(),10) +o=A.nR(s,A.jO(r,A.tE(o.gZ()),p,q),o.gZ(),o.gZ())}return A.xo(A.xq(A.xp(o)))}, +$S:78} A.bD.prototype={ -j(a){return""+this.b+': "'+this.a+'" ('+B.a.aq(this.d,", ")+")"}} -A.bW.prototype={ -eK(a){var s=this.a -if(!J.N(s,a.ga6()))throw A.f(A.W('Source URLs "'+A.k(s)+'" and "'+A.k(a.ga6())+"\" don't match.",null)) -return Math.abs(this.b-a.gaw())}, +j(a){return""+this.b+': "'+this.a+'" ('+B.a.ar(this.d,", ")+")"}} +A.bZ.prototype={ +eO(a){var s=this.a +if(!J.O(s,a.ga6()))throw A.f(A.W('Source URLs "'+A.k(s)+'" and "'+A.k(a.ga6())+"\" don't match.",null)) +return Math.abs(this.b-a.gaz())}, ai(a,b){var s t.hq.a(b) s=this.a -if(!J.N(s,b.ga6()))throw A.f(A.W('Source URLs "'+A.k(s)+'" and "'+A.k(b.ga6())+"\" don't match.",null)) -return this.b-b.gaw()}, +if(!J.O(s,b.ga6()))throw A.f(A.W('Source URLs "'+A.k(s)+'" and "'+A.k(b.ga6())+"\" don't match.",null)) +return this.b-b.gaz()}, v(a,b){if(b==null)return!1 -return t.hq.b(b)&&J.N(this.a,b.ga6())&&this.b===b.gaw()}, +return t.hq.b(b)&&J.O(this.a,b.ga6())&&this.b===b.gaz()}, gq(a){var s=this.a s=s==null?null:s.gq(s) if(s==null)s=0 return s+this.b}, -j(a){var s=this,r=A.cN(s).j(0),q=s.a +j(a){var s=this,r=A.cP(s).j(0),q=s.a return"<"+r+": "+s.b+" "+(A.k(q==null?"unknown source":q)+":"+(s.c+1)+":"+(s.d+1))+">"}, -$ia6:1, +$ia7:1, ga6(){return this.a}, -gaw(){return this.b}, -gaj(){return this.c}, +gaz(){return this.b}, +gak(){return this.c}, gao(){return this.d}} A.jP.prototype={ -eK(a){if(!J.N(this.a.a,a.ga6()))throw A.f(A.W('Source URLs "'+A.k(this.ga6())+'" and "'+A.k(a.ga6())+"\" don't match.",null)) -return Math.abs(this.b-a.gaw())}, +eO(a){if(!J.O(this.a.a,a.ga6()))throw A.f(A.W('Source URLs "'+A.k(this.ga6())+'" and "'+A.k(a.ga6())+"\" don't match.",null)) +return Math.abs(this.b-a.gaz())}, ai(a,b){t.hq.a(b) -if(!J.N(this.a.a,b.ga6()))throw A.f(A.W('Source URLs "'+A.k(this.ga6())+'" and "'+A.k(b.ga6())+"\" don't match.",null)) -return this.b-b.gaw()}, +if(!J.O(this.a.a,b.ga6()))throw A.f(A.W('Source URLs "'+A.k(this.ga6())+'" and "'+A.k(b.ga6())+"\" don't match.",null)) +return this.b-b.gaz()}, v(a,b){if(b==null)return!1 -return t.hq.b(b)&&J.N(this.a.a,b.ga6())&&this.b===b.gaw()}, +return t.hq.b(b)&&J.O(this.a.a,b.ga6())&&this.b===b.gaz()}, gq(a){var s=this.a.a s=s==null?null:s.gq(s) if(s==null)s=0 return s+this.b}, -j(a){var s=A.cN(this).j(0),r=this.b,q=this.a,p=q.a -return"<"+s+": "+r+" "+(A.k(p==null?"unknown source":p)+":"+(q.cC(r)+1)+":"+(q.e0(r)+1))+">"}, -$ia6:1, -$ibW:1} +j(a){var s=A.cP(this).j(0),r=this.b,q=this.a,p=q.a +return"<"+s+": "+r+" "+(A.k(p==null?"unknown source":p)+":"+(q.cD(r)+1)+":"+(q.e4(r)+1))+">"}, +$ia7:1, +$ibZ:1} A.jQ.prototype={ -jW(a,b,c){var s,r=this.b,q=this.a -if(!J.N(r.ga6(),q.ga6()))throw A.f(A.W('Source URLs "'+A.k(q.ga6())+'" and "'+A.k(r.ga6())+"\" don't match.",null)) -else if(r.gaw()'}, -$ia6:1, -$ibJ:1} -A.cd.prototype={ +return"<"+A.cP(s).j(0)+": from "+s.gS().j(0)+" to "+s.gV().j(0)+' "'+s.gZ()+'">'}, +$ia7:1, +$ibK:1} +A.cg.prototype={ gb_(){return this.d}} -A.aJ.prototype={ +A.aL.prototype={ j(a){var s,r=this,q=r.a if(q!=null){s=r.b.c s="PUBLIC "+s+q+s @@ -16815,84 +16963,84 @@ q=s}else q="SYSTEM" s=r.d.c s=q+" "+s+r.c+s return s.charCodeAt(0)==0?s:s}, -gq(a){return A.aX(this.c,this.a,B.u,B.u)}, +gq(a){return A.b1(this.c,this.a,B.u,B.u)}, v(a,b){if(b==null)return!1 -return b instanceof A.aJ}} +return b instanceof A.aL}} A.kd.prototype={ -mi(a){var s=a.length +mk(a){var s=a.length if(s>1&&a[0]==="#"){if(s>2){s=a[1] s=s==="x"||s==="X"}else s=!1 -if(s)return this.h3(B.b.ab(a,2),16) -else return this.h3(B.b.ab(a,1),10)}else return B.qL.m(0,a)}, -h3(a,b){var s=A.jD(a,b) +if(s)return this.h4(B.b.ab(a,2),16) +else return this.h4(B.b.ab(a,1),10)}else return B.qL.m(0,a)}, +h4(a,b){var s=A.jD(a,b) if(s==null||s<0||1114111=r)return A.c(s,-1) s=s.pop() this.b=s -this.ir(s) +this.is(s) return!0}}, $iL:1} -A.on.prototype={ +A.ou.prototype={ $1(a){t.I.a(a) return a instanceof A.es||a instanceof A.en}, -$S:29} -A.oo.prototype={ +$S:35} +A.ov.prototype={ $1(a){return t.I.a(a).gR()}, -$S:77} -A.nX.prototype={ +$S:79} +A.o3.prototype={ gaZ(){return B.j9}, -fs(a,b){return null}} +ft(a,b){return null}} A.ep.prototype={ -fq(a,b){var s=this.fs(a,b) +fs(a,b){var s=this.ft(a,b) return s==null?null:s.b}, -cd(a){return this.fq(a,null)}, -fs(a,b){var s,r,q,p=A.un(a,b) +ce(a){return this.fs(a,null)}, +ft(a,b){var s,r,q,p=A.uy(a,b) for(s=this.gaZ().a,r=A.w(s),s=new J.J(s,s.length,r.h("J<1>")),r=r.c;s.p();){q=s.d if(q==null)q=r.a(q) if(p.$1(q))return q}return null}, gaZ(){return this.y$}} -A.nY.prototype={ -gaN(){return B.cZ}} -A.d6.prototype={ -gaN(){return this.w$}} -A.cG.prototype={} -A.aS.prototype={ -gca(){return null}, -ey(a){return this.eu()}, -eu(){return A.P(A.ac(this.j(0)+" does not have a parent"))}} -A.Z.prototype={ -gca(){return this.x$}, -ey(a){A.x(this).h("Z.T").a(a) +A.o4.prototype={ +gaO(){return B.cZ}} +A.d7.prototype={ +gaO(){return this.w$}} +A.cI.prototype={} +A.aV.prototype={ +gcb(){return null}, +eC(a){return this.ey()}, +ey(){return A.M(A.a6(this.j(0)+" does not have a parent"))}} +A.a_.prototype={ +gcb(){return this.x$}, +eC(a){A.x(this).h("a_.T").a(a) A.kp(this) this.x$=a}} -A.op.prototype={ +A.ow.prototype={ gR(){return null}} -A.aH.prototype={} +A.aJ.prototype={} A.kn.prototype={ -iC(){var s,r=new A.Y(""),q=new A.kt(r,B.bF) +iD(){var s,r=new A.X(""),q=new A.kt(r,B.bF) this.ah(q) s=r.a return s.charCodeAt(0)==0?s:s}, -j(a){return this.iC()}} -A.aR.prototype={ -gaS(){return B.hW}, -aB(){return A.nW(this.a.aB(),this.b,this.c)}, +j(a){return this.iD()}} +A.aU.prototype={ +gaq(){return B.hW}, +aD(){return A.o2(this.a.aD(),this.b,this.c)}, ah(a){var s,r,q this.a.ah(a) s=a.a s.a+="=" r=this.c q=r.c -q=q+a.b.i6(this.b,r)+q +q=q+a.b.i7(this.b,r)+q s.a+=q return null}, ga8(){return this.a}, @@ -16963,15 +17111,15 @@ gR(){return this.b}} A.l_.prototype={} A.l0.prototype={} A.en.prototype={ -gaS(){return B.bA}, -aB(){return new A.en(this.a,null)}, +gaq(){return B.bA}, +aD(){return new A.en(this.a,null)}, ah(a){var s=a.a,r=(s.a+="" return null}} -A.fY.prototype={ -gaS(){return B.bD}, -aB(){return new A.fY(this.a,null)}, +A.h_.prototype={ +gaq(){return B.bD}, +aD(){return new A.h_(this.a,null)}, ah(a){var s=a.a,r=(s.a+="" @@ -16981,25 +17129,25 @@ gR(){return this.a}} A.l1.prototype={} A.kc.prototype={ gR(){if(this.y$.a.length===0)return"" -var s=this.iC() +var s=this.iD() return B.b.t(s,6,s.length-2)}, -gaS(){return B.cH}, -aB(){var s=this.y$,r=s.a,q=A.w(r) -return A.tb(new A.Q(r,q.h("aR(1)").a(s.$ti.h("aR(1)").a(new A.nZ())),q.h("Q<1,aR>")))}, +gaq(){return B.cH}, +aD(){var s=this.y$,r=s.a,q=A.w(r) +return A.tl(new A.Q(r,q.h("aU(1)").a(s.$ti.h("aU(1)").a(new A.o5())),q.h("Q<1,aU>")))}, ah(a){var s=a.a s.a+="" return null}} -A.nZ.prototype={ +A.o5.prototype={ $1(a){t.G.a(a) -return A.nW(a.a.aB(),a.b,a.c)}, -$S:35} +return A.o2(a.a.aD(),a.b,a.c)}, +$S:26} A.l2.prototype={} A.l3.prototype={} -A.fZ.prototype={ -gaS(){return B.cI}, -aB(){return new A.fZ(this.a,this.b,this.c,null)}, +A.h0.prototype={ +gaq(){return B.cI}, +aD(){return new A.h0(this.a,this.b,this.c,null)}, ah(a){var s,r=a.a,q=(r.a+="" return null}} A.l4.prototype={} A.kf.prototype={ -gaS(){return B.MJ}, -aB(){var s=this.w$,r=s.a,q=A.w(r) -return A.tc(new A.Q(r,q.h("E(1)").a(s.$ti.h("E(1)").a(new A.o0())),q.h("Q<1,E>")))}, -ah(a){return a.ol(this)}} -A.o0.prototype={ -$1(a){return t.I.a(a).aB()}, -$S:36} +gaq(){return B.MN}, +aD(){var s=this.w$,r=s.a,q=A.w(r) +return A.tm(new A.Q(r,q.h("E(1)").a(s.$ti.h("E(1)").a(new A.o7())),q.h("Q<1,E>")))}, +ah(a){return a.oo(this)}} +A.o7.prototype={ +$1(a){return t.I.a(a).aD()}, +$S:25} A.l5.prototype={} -A.aG.prototype={ -gaS(){return B.aT}, -aB(){var s=this,r=s.y$,q=r.a,p=A.w(q),o=s.w$,n=o.a,m=A.w(n) -return A.wY(s.b.aB(),new A.Q(q,p.h("aR(1)").a(r.$ti.h("aR(1)").a(new A.o1())),p.h("Q<1,aR>")),new A.Q(n,m.h("E(1)").a(o.$ti.h("E(1)").a(new A.o2())),m.h("Q<1,E>")),s.a)}, -ah(a){return a.om(this)}, +A.aI.prototype={ +gaq(){return B.aT}, +aD(){var s=this,r=s.y$,q=r.a,p=A.w(q),o=s.w$,n=o.a,m=A.w(n) +return A.x7(s.b.aD(),new A.Q(q,p.h("aU(1)").a(r.$ti.h("aU(1)").a(new A.o8())),p.h("Q<1,aU>")),new A.Q(n,m.h("E(1)").a(o.$ti.h("E(1)").a(new A.o9())),m.h("Q<1,E>")),s.a)}, +ah(a){return a.op(this)}, ga8(){return this.b}} -A.o1.prototype={ +A.o8.prototype={ $1(a){t.G.a(a) -return A.nW(a.a.aB(),a.b,a.c)}, -$S:35} -A.o2.prototype={ -$1(a){return t.I.a(a).aB()}, -$S:36} +return A.o2(a.a.aD(),a.b,a.c)}, +$S:26} +A.o9.prototype={ +$1(a){return t.I.a(a).aD()}, +$S:25} A.l6.prototype={} A.l7.prototype={} A.l8.prototype={} @@ -17050,9 +17198,9 @@ A.ln.prototype={} A.lo.prototype={} A.lp.prototype={} A.lq.prototype={} -A.h4.prototype={ -gaS(){return B.bB}, -aB(){return new A.h4(this.c,this.a,null)}, +A.h6.prototype={ +gaq(){return B.bB}, +aD(){return new A.h6(this.c,this.a,null)}, ah(a){var s=a.a,r=s.a=(s.a+="" return null}} A.es.prototype={ -gaS(){return B.bC}, -aB(){return new A.es(this.a,null)}, -ah(a){var s=a.a,r=A.pV(this.a,$.r7(),t.jt.a(t.po.a(A.uq())),null) +gaq(){return B.bC}, +aD(){return new A.es(this.a,null)}, +ah(a){var s=a.a,r=A.q3(this.a,$.ri(),t.jt.a(t.po.a(A.uB())),null) s.a+=r return null}} A.ka.prototype={ @@ -17070,8 +17218,8 @@ m(a,b){var s,r,q,p,o=this o.$ti.c.a(b) s=o.c if(!s.a7(b)){s.k(0,b,o.a.$1(b)) -for(r=o.b,q=A.x(s).h("aV<1>");s.a>r;){p=new A.aV(s,q).gF(0) -if(!p.p())A.P(A.bi()) +for(r=o.b,q=A.x(s).h("b_<1>");s.a>r;){p=new A.b_(s,q).gF(0) +if(!p.p())A.M(A.ba()) s.W(0,p.gB())}}s=s.m(0,b) s.toString return s}} @@ -17085,106 +17233,106 @@ I(a,b){var s=a.length,r=b").a(b)) -o.jG(0,n) -for(s=n.length,r=0;r").a(b)) +o.jH(0,n) +for(s=n.length,r=0;r").a(a) s=A.i([],p.h("y<1>")) -for(p=J.at(a);p.p();){r=p.gB() -if(r.gaS()===B.hX)B.a.a1(s,this.h7(r)) +for(p=J.aw(a);p.p();){r=p.gB() +if(r.gaq()===B.hX)B.a.a1(s,this.h8(r)) else{q=this.c q===$&&A.o() -if(!q.C(0,r.gaS()))A.P(A.wZ("Got "+r.gaS().j(0)+", but expected one of "+q.aq(0,", "),r,q)) -if(r.gca()!=null)A.P(A.tg(u.d,r,r.gca())) +if(!q.C(0,r.gaq()))A.M(A.x8("Got "+r.gaq().j(0)+", but expected one of "+q.ar(0,", "),r,q)) +if(r.gcb()!=null)A.M(A.tq(u.d,r,r.gcb())) B.a.l(s,r)}}return s}} -A.om.prototype={ +A.ot.prototype={ $1(a){var s,r t.I.a(a) s=this.a r=s.c r===$&&A.o() -A.tf(a,r) -return s.$ti.c.a(a.aB())}, +A.tp(a,r) +return s.$ti.c.a(a.aD())}, $S(){return this.a.$ti.h("1(E)")}} -A.h3.prototype={ -eu(){return A.P(A.n6(this,A.rw(B.hU,"oA",0,[],[],0)))}, -gcV(){var s=A.uA(this.x$,"xmlns",this.b) +A.h5.prototype={ +ey(){return A.M(A.nc(this,A.rG(B.hU,"oD",0,[],[],0)))}, +gcX(){var s=A.uL(this.x$,"xmlns",this.b) return s==null?null:s.b}, -aB(){return new A.h3(this.b,this.c,this.d,null)}, -gik(){return this.b}, +aD(){return new A.h5(this.b,this.c,this.d,null)}, +gil(){return this.b}, ga_(){return this.c}, -gdS(){return this.d}} -A.h5.prototype={ -eu(){return A.P(A.n6(this,A.rw(B.hU,"oB",0,[],[],0)))}, -gik(){return null}, -gdS(){return this.b}, -gcV(){var s=A.uA(this.x$,null,"xmlns") +gdU(){return this.d}} +A.h7.prototype={ +ey(){return A.M(A.nc(this,A.rG(B.hU,"oE",0,[],[],0)))}, +gil(){return null}, +gdU(){return this.b}, +gcX(){var s=A.uL(this.x$,null,"xmlns") return s==null?null:s.b}, -aB(){return new A.h5(this.b,null)}, +aD(){return new A.h7(this.b,null)}, ga_(){return this.b}} A.ks.prototype={} A.kt.prototype={ -ol(a){this.iJ(a.w$)}, -om(a){var s,r,q,p,o=this,n=o.a +oo(a){this.iK(a.w$)}, +op(a){var s,r,q,p,o=this,n=o.a n.a+="<" s=a.b s.ah(o) -o.iH(a) +o.iI(a) r=a.w$ q=r.a.length===0&&a.a p=n.a if(q)n.a=p+"/>" else{n.a=p+">" -o.iJ(r) +o.iK(r) n.a+=""}}, -iH(a){var s=a.y$ +iI(a){var s=a.y$ if(s.a.length!==0){this.a.a+=" " -this.iK(s," ")}}, -iK(a,b){var s,r,q,p,o=this,n=J.at(t.b7.a(a)) +this.iL(s," ")}}, +iL(a,b){var s,r,q,p,o=this,n=J.aw(t.b7.a(a)) if(n.p())if(b==null||b.length===0){s=t.ax r=n.$ti.c do{q=n.d @@ -17195,54 +17343,54 @@ r.a(s).ah(o) for(s=o.a,q=n.$ti.c;n.p();){s.a+=b p=n.d r.a(p==null?q.a(p):p).ah(o)}}}, -iJ(a){return this.iK(a,null)}} +iK(a){return this.iL(a,null)}} A.lu.prototype={} -A.nV.prototype={ -lo(a,b,c,d){var s=this,r=s.r,q=r.length +A.o1.prototype={ +lq(a,b,c,d){var s=this,r=s.r,q=r.length if(q===0)A:{if(a instanceof A.bB){q=s.f -if(!new A.O(q,t.nk).gN(0))throw A.f(A.er("Expected at most one XML declaration",b,c)) +if(!new A.P(q,t.nk).gN(0))throw A.f(A.er("Expected at most one XML declaration",b,c)) else if(q.length!==0)throw A.f(A.er("Unexpected XML declaration",b,c)) B.a.l(q,a) break A}if(a instanceof A.bC){q=s.f -if(!new A.O(q,t.os).gN(0))throw A.f(A.er("Expected at most one doctype declaration",b,c)) -else if(!new A.O(q,t.lH).gN(0))throw A.f(A.er("Unexpected doctype declaration",b,c)) +if(!new A.P(q,t.os).gN(0))throw A.f(A.er("Expected at most one doctype declaration",b,c)) +else if(!new A.P(q,t.lH).gN(0))throw A.f(A.er("Unexpected doctype declaration",b,c)) B.a.l(q,a) -break A}if(a instanceof A.bd){q=s.f -if(!new A.O(q,t.lH).gN(0))throw A.f(A.er("Unexpected root element",b,c)) -B.a.l(q,a)}}B:{if(a instanceof A.bd){if(!a.r)B.a.l(r,a) -break B}if(a instanceof A.bM){if(r.length===0)throw A.f(A.ti(a.e,b,c)) +break A}if(a instanceof A.be){q=s.f +if(!new A.P(q,t.lH).gN(0))throw A.f(A.er("Unexpected root element",b,c)) +B.a.l(q,a)}}B:{if(a instanceof A.be){if(!a.r)B.a.l(r,a) +break B}if(a instanceof A.bN){if(r.length===0)throw A.f(A.ts(a.e,b,c)) else{q=a.e -if(B.a.gA(r).e!==q)throw A.f(A.th(B.a.gA(r).e,q,b,c))}q=r.length +if(B.a.gA(r).e!==q)throw A.f(A.tr(B.a.gA(r).e,q,b,c))}q=r.length if(q!==0){if(0>=q)return A.c(r,-1) r.pop()}}}}} -A.ok.prototype={} -A.ol.prototype={} +A.or.prototype={} +A.os.prototype={} A.km.prototype={} A.kg.prototype={ -bL(a){var s,r=new A.Y("") -J.vk(t.iF.a(a),new A.ld(t.i3.a(new A.dg(r.got(),t.nP)),this.a).giE()) +bM(a){var s,r=new A.X("") +J.vv(t.iF.a(a),new A.ld(t.i3.a(new A.dh(r.gow(),t.nP)),this.a).giF()) s=r.a return s.charCodeAt(0)==0?s:s}} A.ld.prototype={ -fh(a){var s=this.a,r=s.$ti.c +fi(a){var s=this.a,r=s.$ti.c r.a(""))}, -fi(a){var s=this.a,r=s.$ti.c +fj(a){var s=this.a,r=s.$ti.c r.a(""))}, -fj(a){var s=this.a,r=s.$ti.c +fk(a){var s=this.a,r=s.$ti.c r.a(""))}, -fk(a){var s,r,q=this.a,p=q.$ti.c +fl(a){var s,r,q=this.a,p=q.$ti.c p.a(""))}, -fl(a){var s=this.a,r=s.$ti.c +fm(a){var s=this.a,r=s.$ti.c r.a(""))}, -fm(a){var s,r=this.a,q=r.$ti.c +fn(a){var s,r=this.a,q=r.$ti.c q.a(""))}, -fo(a){var s=this.a,r=s.$ti.c +fp(a){var s=this.a,r=s.$ti.c r.a("<") s=s.a s.$1("<") s.$1(r.a(a.e)) -this.hG(a.f) +this.hH(a.f) if(a.r)s.$1(r.a("/>")) else s.$1(r.a(">"))}, -fp(a){var s=this.a,r=s.$ti.c.a(A.pV(a.gR(),$.r7(),t.jt.a(t.po.a(A.uq())),null)) +fq(a){var s=this.a,r=s.$ti.c.a(A.q3(a.gR(),$.ri(),t.jt.a(t.po.a(A.uB())),null)) s.a.$1(r)}, -hG(a){var s,r,q,p,o,n,m,l -for(s=J.at(t.p6.a(a)),r=this.a,q=r.$ti.c,p=this.b;s.p();){o=s.gB() +hH(a){var s,r,q,p,o,n,m,l +for(s=J.aw(t.p6.a(a)),r=this.a,q=r.$ti.c,p=this.b;s.p();){o=s.gB() q.a(" ") n=r.a n.$1(" ") @@ -17290,103 +17438,103 @@ n.$1(q.a("=")) m=o.b o=o.c l=o.c -n.$1(q.a(l+p.i6(m,o)+l))}}, -$ifN:1} +n.$1(q.a(l+p.i7(m,o)+l))}}, +$ifP:1} A.lv.prototype={} A.lk.prototype={ -fh(a){return this.bK(new A.en(a.e,null),a)}, -fi(a){return this.bK(new A.fY(a.e,null),a)}, -fj(a){return this.bK(A.tb(this.eI(a.e)),a)}, -fk(a){return this.bK(new A.fZ(a.e,a.f,a.r,null),a)}, -fl(a){var s,r,q,p,o=this.b -if(o==null)throw A.f(A.ti(a.e,a.at$,a.Q$)) -s=o.b.gdS() +fi(a){return this.bL(new A.en(a.e,null),a)}, +fj(a){return this.bL(new A.h_(a.e,null),a)}, +fk(a){return this.bL(A.tl(this.eM(a.e)),a)}, +fl(a){return this.bL(new A.h0(a.e,a.f,a.r,null),a)}, +fm(a){var s,r,q,p,o=this.b +if(o==null)throw A.f(A.ts(a.e,a.at$,a.Q$)) +s=o.b.gdU() r=a.e q=a.at$ p=a.Q$ -if(s!==r)A.P(A.th(s,r,q,p)) +if(s!==r)A.M(A.tr(s,r,q,p)) o.a=o.w$.a.length!==0 -s=A.x_(o) +s=A.x9(o) this.b=s -if(s==null)this.bK(o,a.z$)}, -fm(a){return this.bK(new A.h4(a.e,a.f,null),a)}, -fo(a){var s,r=this,q=A.td(a.e,r.eI(a.f),B.cZ,!0) -if(a.r)r.bK(q,a) +if(s==null)this.bL(o,a.z$)}, +fn(a){return this.bL(new A.h6(a.e,a.f,null),a)}, +fp(a){var s,r=this,q=A.tn(a.e,r.eM(a.f),B.cZ,!0) +if(a.r)r.bL(q,a) else{s=r.b if(s!=null)s.w$.l(0,q) r.b=q}}, -fp(a){return this.bK(new A.es(a.gR(),null),a)}, -bK(a,b){var s,r,q,p=this.b +fq(a){return this.bL(new A.es(a.gR(),null),a)}, +bL(a,b){var s,r,q,p=this.b if(p==null){s=b==null?null:b.z$ p=t.eB r=a -for(;s!=null;s=s.z$)r=A.td(s.e,this.eI(s.f),A.i([r],p),s.r) +for(;s!=null;s=s.z$)r=A.tn(s.e,this.eM(s.f),A.i([r],p),s.r) q=this.a p=q.$ti.c.a(A.i([a],p)) q.a.$1(p)}else p.w$.l(0,a)}, -eI(a){return J.rb(t.eh.a(a),new A.p5(),t.G)}, -$ifN:1} -A.p5.prototype={ +eM(a){return J.rm(t.eh.a(a),new A.pd(),t.G)}, +$ifP:1} +A.pd.prototype={ $1(a){t.fw.a(a) -return A.nW(A.te(a.a),a.b,a.c)}, -$S:122} +return A.o2(A.to(a.a),a.b,a.c)}, +$S:83} A.lw.prototype={} -A.a1.prototype={ -j(a){return new A.kg(B.bF).bL(A.i([this],t.pp))}} +A.a2.prototype={ +j(a){return new A.kg(B.bF).bM(A.i([this],t.pp))}} A.le.prototype={} A.lf.prototype={} A.lg.prototype={} -A.c_.prototype={ -ah(a){return a.fh(this)}, -gq(a){return A.aX(B.bA,this.e,B.u,B.u)}, -v(a,b){if(b==null)return!1 -return b instanceof A.c_&&b.e===this.e}} -A.c0.prototype={ +A.c2.prototype={ ah(a){return a.fi(this)}, -gq(a){return A.aX(B.bD,this.e,B.u,B.u)}, +gq(a){return A.b1(B.bA,this.e,B.u,B.u)}, v(a,b){if(b==null)return!1 -return b instanceof A.c0&&b.e===this.e}} -A.bB.prototype={ +return b instanceof A.c2&&b.e===this.e}} +A.c3.prototype={ ah(a){return a.fj(this)}, -gq(a){return A.aX(B.cH,B.aX.Y(this.e),B.u,B.u)}, +gq(a){return A.b1(B.bD,this.e,B.u,B.u)}, v(a,b){if(b==null)return!1 -return b instanceof A.bB&&B.aX.aI(b.e,this.e)}} -A.bC.prototype={ +return b instanceof A.c3&&b.e===this.e}} +A.bB.prototype={ ah(a){return a.fk(this)}, -gq(a){return A.aX(B.cI,this.e,this.f,this.r)}, +gq(a){return A.b1(B.cH,B.aX.Y(this.e),B.u,B.u)}, v(a,b){if(b==null)return!1 -return b instanceof A.bC&&this.e===b.e&&J.N(this.f,b.f)&&this.r==b.r}} -A.bM.prototype={ +return b instanceof A.bB&&B.aX.aJ(b.e,this.e)}} +A.bC.prototype={ ah(a){return a.fl(this)}, -gq(a){return A.aX(B.aT,this.e,B.u,B.u)}, +gq(a){return A.b1(B.cI,this.e,this.f,this.r)}, v(a,b){if(b==null)return!1 -return b instanceof A.bM&&b.e===this.e}} -A.la.prototype={} -A.c2.prototype={ +return b instanceof A.bC&&this.e===b.e&&J.O(this.f,b.f)&&this.r==b.r}} +A.bN.prototype={ ah(a){return a.fm(this)}, -gq(a){return A.aX(B.bB,this.f,this.e,B.u)}, +gq(a){return A.b1(B.aT,this.e,B.u,B.u)}, v(a,b){if(b==null)return!1 -return b instanceof A.c2&&b.e===this.e&&b.f===this.f}} -A.bd.prototype={ -ah(a){return a.fo(this)}, -gq(a){return A.aX(B.aT,this.e,this.r,B.aX.Y(this.f))}, +return b instanceof A.bN&&b.e===this.e}} +A.la.prototype={} +A.c5.prototype={ +ah(a){return a.fn(this)}, +gq(a){return A.b1(B.bB,this.f,this.e,B.u)}, v(a,b){if(b==null)return!1 -return b instanceof A.bd&&b.e===this.e&&b.r===this.r&&B.aX.aI(b.f,this.f)}} +return b instanceof A.c5&&b.e===this.e&&b.f===this.f}} +A.be.prototype={ +ah(a){return a.fp(this)}, +gq(a){return A.b1(B.aT,this.e,this.r,B.aX.Y(this.f))}, +v(a,b){if(b==null)return!1 +return b instanceof A.be&&b.e===this.e&&b.r===this.r&&B.aX.aJ(b.f,this.f)}} A.ls.prototype={} A.dI.prototype={ gR(){var s,r=this,q=r.r if(q===$){s=r.f.b0(r.e) -r.r!==$&&A.dc() +r.r!==$&&A.dd() r.r=s q=s}return q}, -ah(a){return a.fp(this)}, -gq(a){return A.aX(B.bC,this.gR(),B.u,B.u)}, +ah(a){return a.fq(this)}, +gq(a){return A.b1(B.bC,this.gR(),B.u,B.u)}, v(a,b){if(b==null)return!1 return b instanceof A.dI&&b.gR()===this.gR()}, -$ih6:1} +$ih8:1} A.kh.prototype={ gF(a){var s=A.i([],t.pp),r=A.i([],t.oi) -return new A.ki($.vf().m(0,this.b),new A.nV(!0,!0,!1,!1,!1,s,r),new A.F("",this.a,0))}} +return new A.ki($.vr().m(0,this.b),new A.o1(!0,!0,!1,!1,!1,s,r),new A.F("",this.a,0))}} A.ki.prototype={ gB(){var s=this.d s.toString @@ -17396,179 +17544,179 @@ if(l!=null){s=m.a.H(l) if(s instanceof A.T){m.c=s r=s.e m.d=r -m.b.lo(r,l.a,l.b,s.b) +m.b.lq(r,l.a,l.b,s.b) return!0}else{r=l.b q=l.a -if(r"),A.U("/>")],t.ig),A.z3(),r),r,r,q,r,r),new A.oj(),r,r,q,r,r,t.l3)}, -lG(){return A.nr(new A.u(this.glp(),B.h,t.jk),0,9007199254740991,t.fw)}, -lq(){var s=this,r=t.h,q=t.N,p=t.R -return A.dz(A.c5(new A.u(s.gcD(),B.h,r),new A.u(s.gbd(),B.h,r),new A.u(s.glr(),B.h,t.g),q,q,p),new A.o7(s),q,q,p,t.fw)}, -ls(){var s=this.gcE(),r=t.h,q=t.N,p=t.R -return new A.bT(B.Mg,A.nx(A.pU(new A.u(s,B.h,r),A.U("="),new A.u(s,B.h,r),new A.u(this.gc2(),B.h,t.g),q,q,q,p),new A.o3(),q,q,q,p,p),t.bQ)}, -lu(){var s=t.g -return A.cj(A.i([new A.u(this.glv(),B.h,s),new A.u(this.glB(),B.h,s),new A.u(this.glz(),B.h,s)],t.ge),null,t.R)}, -lw(){var s=t.N -return A.dz(A.c5(A.U('"'),new A.eo('"',0),A.U('"'),s,s,s),new A.o4(),s,s,s,t.R)}, -lC(){var s=t.N -return A.dz(A.c5(A.U("'"),new A.eo("'",0),A.U("'"),s,s,s),new A.o6(),s,s,s,t.R)}, -lA(){return A.dt(new A.u(this.gbd(),B.h,t.h),new A.o5(),!1,t.N,t.R)}, -mU(){var s=t.h,r=t.N -return A.nx(A.pU(A.U(""),r,r,r,r),new A.og(),r,r,r,r,t.cW)}, -m4(){var s=A.U("" expected',new A.bj(A.U("-->"),0,9007199254740991,r,t.ln)),A.U("-->"),q,q,q),new A.oa(),q,q,q,t.lY)}, -lS(){var s=A.U("" expected',new A.bj(A.U("]]>"),0,9007199254740991,r,t.ln)),A.U("]]>"),q,q,q),new A.o8(),q,q,q,t.bf)}, -mh(){var s=t.N,r=t.p6 -return A.nx(A.pU(A.U(""),s,r,s,s),new A.ob(),s,r,s,s,t.ee)}, -nR(){var s=A.U("" expected',new A.bj(A.U("?>"),0,9007199254740991,q,t.ln)),p,p),new A.oh(),p,p,p),t.g1),A.U("?>"),p,p,p,p),new A.oi(),p,p,p,p,t.co)}, -mo(){var s=this,r=s.gcD(),q=t.h,p=s.gcE(),o=t.N -return A.wJ(new A.fK(A.U(""),t.i6),new A.of(),o,o,o,t.g0,o,t.jv,o,o,t.dH)}, -mw(){var s=t.by -return A.cj(A.i([new A.u(this.gmz(),B.h,s),new A.u(this.gmx(),B.h,s)],t.jj),null,t.hd)}, -mA(){var s=t.N,r=t.R -return A.dz(A.c5(A.U("SYSTEM"),new A.u(this.gcD(),B.h,t.h),new A.u(this.gc2(),B.h,t.g),s,s,r),new A.od(),s,s,r,t.hd)}, -my(){var s=this.gcD(),r=t.h,q=this.gc2(),p=t.g,o=t.N,n=t.R -return A.rT(A.uL(A.U("PUBLIC"),new A.u(s,B.h,r),new A.u(q,B.h,p),new A.u(s,B.h,r),new A.u(q,B.h,p),o,o,n,o,n),new A.oc(),o,o,n,o,n,t.hd)}, -mC(){var s,r=this,q=A.U("["),p=t.gy -p=A.cj(A.i([new A.u(r.gmr(),B.h,p),new A.u(r.gmp(),B.h,p),new A.u(r.gmt(),B.h,p),new A.u(r.gmE(),B.h,p),new A.u(r.giq(),B.h,t.hN),new A.u(r.ghX(),B.h,t.dE),new A.u(r.gmK(),B.h,p),A.bH(B.W,"input expected",!1)],t.a),null,t.z) +n4(){var s=this +return A.cl(A.i([new A.u(s.glX(),B.h,t.br),new A.u(s.gjr(),B.h,t.d8),new A.u(s.gmV(),B.h,t.gV),new A.u(s.ghY(),B.h,t.dE),new A.u(s.glT(),B.h,t.eM),new A.u(s.gmi(),B.h,t.cB),new A.u(s.gir(),B.h,t.hN),new A.u(s.gmp(),B.h,t.i8)],t.dy),A.zb(),t.mX)}, +lY(){return A.dt(new A.eo("<",1),new A.og(this),!1,t.N,t.hO)}, +js(){var s=t.h,r=t.N,q=t.p6 +return A.t2(A.uX(A.U("<"),new A.u(this.gbd(),B.h,s),new A.u(this.gaZ(),B.h,t.mD),new A.u(this.gcF(),B.h,s),A.cl(A.i([A.U(">"),A.U("/>")],t.ig),A.zc(),r),r,r,q,r,r),new A.oq(),r,r,q,r,r,t.l3)}, +lI(){return A.nx(new A.u(this.glr(),B.h,t.jk),0,9007199254740991,t.fw)}, +ls(){var s=this,r=t.h,q=t.N,p=t.R +return A.dz(A.c8(new A.u(s.gcE(),B.h,r),new A.u(s.gbd(),B.h,r),new A.u(s.glt(),B.h,t.g),q,q,p),new A.oe(s),q,q,p,t.fw)}, +lu(){var s=this.gcF(),r=t.h,q=t.N,p=t.R +return new A.bV(B.Mi,A.nD(A.q2(new A.u(s,B.h,r),A.U("="),new A.u(s,B.h,r),new A.u(this.gc3(),B.h,t.g),q,q,q,p),new A.oa(),q,q,q,p,p),t.bQ)}, +lw(){var s=t.g +return A.cl(A.i([new A.u(this.glx(),B.h,s),new A.u(this.glD(),B.h,s),new A.u(this.glB(),B.h,s)],t.ge),null,t.R)}, +ly(){var s=t.N +return A.dz(A.c8(A.U('"'),new A.eo('"',0),A.U('"'),s,s,s),new A.ob(),s,s,s,t.R)}, +lE(){var s=t.N +return A.dz(A.c8(A.U("'"),new A.eo("'",0),A.U("'"),s,s,s),new A.od(),s,s,s,t.R)}, +lC(){return A.dt(new A.u(this.gbd(),B.h,t.h),new A.oc(),!1,t.N,t.R)}, +mW(){var s=t.h,r=t.N +return A.nD(A.q2(A.U(""),r,r,r,r),new A.on(),r,r,r,r,t.cW)}, +m6(){var s=A.U("" expected',new A.bj(A.U("-->"),0,9007199254740991,r,t.ln)),A.U("-->"),q,q,q),new A.oh(),q,q,q,t.lY)}, +lU(){var s=A.U("" expected',new A.bj(A.U("]]>"),0,9007199254740991,r,t.ln)),A.U("]]>"),q,q,q),new A.of(),q,q,q,t.bf)}, +mj(){var s=t.N,r=t.p6 +return A.nD(A.q2(A.U(""),s,r,s,s),new A.oi(),s,r,s,s,t.ee)}, +nT(){var s=A.U("" expected',new A.bj(A.U("?>"),0,9007199254740991,q,t.ln)),p,p),new A.oo(),p,p,p),t.g1),A.U("?>"),p,p,p,p),new A.op(),p,p,p,p,t.co)}, +mq(){var s=this,r=s.gcE(),q=t.h,p=s.gcF(),o=t.N +return A.wT(new A.fM(A.U(""),t.i6),new A.om(),o,o,o,t.g0,o,t.jv,o,o,t.dH)}, +my(){var s=t.by +return A.cl(A.i([new A.u(this.gmB(),B.h,s),new A.u(this.gmz(),B.h,s)],t.jj),null,t.hd)}, +mC(){var s=t.N,r=t.R +return A.dz(A.c8(A.U("SYSTEM"),new A.u(this.gcE(),B.h,t.h),new A.u(this.gc3(),B.h,t.g),s,s,r),new A.ok(),s,s,r,t.hd)}, +mA(){var s=this.gcE(),r=t.h,q=this.gc3(),p=t.g,o=t.N,n=t.R +return A.t2(A.uX(A.U("PUBLIC"),new A.u(s,B.h,r),new A.u(q,B.h,p),new A.u(s,B.h,r),new A.u(q,B.h,p),o,o,n,o,n),new A.oj(),o,o,n,o,n,t.hd)}, +mE(){var s,r=this,q=A.U("["),p=t.gy +p=A.cl(A.i([new A.u(r.gmt(),B.h,p),new A.u(r.gmr(),B.h,p),new A.u(r.gmv(),B.h,p),new A.u(r.gmG(),B.h,p),new A.u(r.gir(),B.h,t.hN),new A.u(r.ghY(),B.h,t.dE),new A.u(r.gmM(),B.h,p),A.bI(B.W,"input expected",!1)],t.b),null,t.z) s=t.N -return A.dz(A.c5(q,new A.cp('"]" expected',new A.bj(A.U("]"),0,9007199254740991,p,t.mP)),A.U("]"),s,s,s),new A.oe(),s,s,s,s)}, -ms(){var s=A.U(""),0,9007199254740991,r,t.du),A.U(">"),q,t.ez,q)}, -mq(){var s=A.U(""),0,9007199254740991,r,t.du),A.U(">"),q,t.ez,q)}, -mu(){var s=A.U(""),0,9007199254740991,r,t.du),A.U(">"),q,t.ez,q)}, -mF(){var s=A.U(""),0,9007199254740991,r,t.du),A.U(">"),q,t.ez,q)}, -mL(){var s=t.N -return A.c5(A.U("%"),new A.u(this.gbd(),B.h,t.h),A.U(";"),s,s,s)}, -jo(){var s="whitespace expected" -return A.rU(A.bH(B.cO,s,!1),1,9007199254740991,s)}, +return A.dz(A.c8(q,new A.cr('"]" expected',new A.bj(A.U("]"),0,9007199254740991,p,t.mP)),A.U("]"),s,s,s),new A.ol(),s,s,s,s)}, +mu(){var s=A.U(""),0,9007199254740991,r,t.du),A.U(">"),q,t.ez,q)}, +ms(){var s=A.U(""),0,9007199254740991,r,t.du),A.U(">"),q,t.ez,q)}, +mw(){var s=A.U(""),0,9007199254740991,r,t.du),A.U(">"),q,t.ez,q)}, +mH(){var s=A.U(""),0,9007199254740991,r,t.du),A.U(">"),q,t.ez,q)}, +mN(){var s=t.N +return A.c8(A.U("%"),new A.u(this.gbd(),B.h,t.h),A.U(";"),s,s,s)}, jp(){var s="whitespace expected" -return A.rU(A.bH(B.cO,s,!1),0,9007199254740991,s)}, -ny(){var s=t.h,r=t.N -return new A.cp("name expected",A.uK(new A.u(this.gnw(),B.h,s),A.nr(new A.u(this.gnu(),B.h,s),0,9007199254740991,r),r,t.bF))}, -nx(){return A.uG(":A-Z_a-z\xc0-\xd6\xd8-\xf6\xf8-\u02ff\u0370-\u037d\u037f-\u1fff\u200c-\u200d\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd\ud800\udc00-\udb7f\udfff",!1,null,!0)}, -nv(){return A.uG(":A-Z_a-z\xc0-\xd6\xd8-\xf6\xf8-\u02ff\u0370-\u037d\u037f-\u1fff\u200c-\u200d\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd\ud800\udc00-\udb7f\udfff-.0-9\xb7\u0300-\u036f\u203f-\u2040",!1,null,!0)}} -A.o9.prototype={ +return A.t3(A.bI(B.cO,s,!1),1,9007199254740991,s)}, +jq(){var s="whitespace expected" +return A.t3(A.bI(B.cO,s,!1),0,9007199254740991,s)}, +nA(){var s=t.h,r=t.N +return new A.cr("name expected",A.uW(new A.u(this.gny(),B.h,s),A.nx(new A.u(this.gnw(),B.h,s),0,9007199254740991,r),r,t.bF))}, +nz(){return A.uR(":A-Z_a-z\xc0-\xd6\xd8-\xf6\xf8-\u02ff\u0370-\u037d\u037f-\u1fff\u200c-\u200d\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd\ud800\udc00-\udb7f\udfff",!1,null,!0)}, +nx(){return A.uR(":A-Z_a-z\xc0-\xd6\xd8-\xf6\xf8-\u02ff\u0370-\u037d\u037f-\u1fff\u200c-\u200d\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd\ud800\udc00-\udb7f\udfff-.0-9\xb7\u0300-\u036f\u203f-\u2040",!1,null,!0)}} +A.og.prototype={ $1(a){var s=null return new A.dI(A.q(a),this.a.a,s,s,s,s)}, -$S:97} -A.oj.prototype={ +$S:99} +A.oq.prototype={ $5(a,b,c,d,e){var s=null A.q(a) A.q(b) t.p6.a(c) A.q(d) -return new A.bd(b,c,A.q(e)==="/>",s,s,s,s)}, -$S:98} -A.o7.prototype={ +return new A.be(b,c,A.q(e)==="/>",s,s,s,s)}, +$S:100} +A.oe.prototype={ $3(a,b,c){A.q(a) A.q(b) t.R.a(c) -return new A.av(b,this.a.a.b0(c.a),c.b,null)}, -$S:99} -A.o3.prototype={ +return new A.ay(b,this.a.a.b0(c.a),c.b,null)}, +$S:101} +A.oa.prototype={ $4(a,b,c,d){A.q(a) A.q(b) A.q(c) return t.R.a(d)}, -$S:100} -A.o4.prototype={ +$S:102} +A.ob.prototype={ $3(a,b,c){A.q(a) A.q(b) A.q(c) return new A.l(b,B.cG)}, -$S:39} -A.o6.prototype={ +$S:29} +A.od.prototype={ $3(a,b,c){A.q(a) A.q(b) A.q(c) -return new A.l(b,B.MI)}, -$S:39} -A.o5.prototype={ +return new A.l(b,B.MM)}, +$S:29} +A.oc.prototype={ $1(a){return new A.l(A.q(a),B.cG)}, -$S:102} -A.og.prototype={ +$S:104} +A.on.prototype={ $4(a,b,c,d){var s=null A.q(a) A.q(b) A.q(c) A.q(d) -return new A.bM(b,s,s,s,s)}, -$S:103} -A.oa.prototype={ +return new A.bN(b,s,s,s,s)}, +$S:105} +A.oh.prototype={ $3(a,b,c){var s=null A.q(a) A.q(b) A.q(c) -return new A.c0(b,s,s,s,s)}, -$S:104} -A.o8.prototype={ +return new A.c3(b,s,s,s,s)}, +$S:106} +A.of.prototype={ $3(a,b,c){var s=null A.q(a) A.q(b) A.q(c) -return new A.c_(b,s,s,s,s)}, -$S:105} -A.ob.prototype={ +return new A.c2(b,s,s,s,s)}, +$S:107} +A.oi.prototype={ $4(a,b,c,d){var s=null A.q(a) t.p6.a(b) A.q(c) A.q(d) return new A.bB(b,s,s,s,s)}, -$S:106} -A.oh.prototype={ +$S:108} +A.oo.prototype={ $2(a,b){A.q(a) return A.q(b)}, -$S:107} -A.oi.prototype={ +$S:109} +A.op.prototype={ $4(a,b,c,d){var s=null A.q(a) A.q(b) A.q(c) A.q(d) -return new A.c2(b,c,s,s,s,s)}, -$S:108} -A.of.prototype={ +return new A.c5(b,c,s,s,s,s)}, +$S:110} +A.om.prototype={ $8(a,b,c,d,e,f,g,h){var s=null A.q(a) A.q(b) A.q(c) t.g0.a(d) A.q(e) -A.hB(f) +A.hD(f) A.q(g) A.q(h) return new A.bC(c,d,f,s,s,s,s)}, -$S:109} -A.od.prototype={ +$S:111} +A.ok.prototype={ $3(a,b,c){A.q(a) A.q(b) t.R.a(c) -return new A.aJ(null,null,c.a,c.b)}, -$S:110} -A.oc.prototype={ +return new A.aL(null,null,c.a,c.b)}, +$S:112} +A.oj.prototype={ $5(a,b,c,d,e){var s A.q(a) A.q(b) @@ -17576,328 +17724,329 @@ s=t.R s.a(c) A.q(d) s.a(e) -return new A.aJ(c.a,c.b,e.a,e.b)}, -$S:111} -A.oe.prototype={ +return new A.aL(c.a,c.b,e.a,e.b)}, +$S:113} +A.ol.prototype={ $3(a,b,c){A.q(a) A.q(b) A.q(c) return b}, -$S:112} -A.pz.prototype={ -$1(a){return A.zt(new A.u(new A.kj(t.j7.a(a)).gn1(),B.h,t.bj),t.mX)}, -$S:113} -A.dg.prototype={$ifN:1} -A.av.prototype={ -gq(a){return A.aX(this.a,this.b,this.c,B.u)}, +$S:114} +A.pH.prototype={ +$1(a){return A.zA(new A.u(new A.kj(t.j7.a(a)).gn3(),B.h,t.bj),t.mX)}, +$S:115} +A.dh.prototype={$ifP:1} +A.ay.prototype={ +gq(a){return A.b1(this.a,this.b,this.c,B.u)}, v(a,b){if(b==null)return!1 -return b instanceof A.av&&b.a===this.a&&b.b===this.b&&b.c===this.c}} +return b instanceof A.ay&&b.a===this.a&&b.b===this.b&&b.c===this.c}} A.lb.prototype={} A.lc.prototype={} -A.h_.prototype={} +A.h1.prototype={} A.dH.prototype={ -M(a){return t.mX.a(a).ah(this)}, -fh(a){}, +K(a){return t.mX.a(a).ah(this)}, fi(a){}, fj(a){}, fk(a){}, fl(a){}, fm(a){}, -fo(a){}, -fp(a){}} -A.pL.prototype={ -$1(a){var s,r=t.av.a(A.up(A.p7(a).data)).c3(0,t.N,t.X),q=r.m(0,"bytes") +fn(a){}, +fp(a){}, +fq(a){}} +A.pT.prototype={ +$1(a){var s,r=t.av.a(A.uA(A.pf(a).data)).c4(0,t.N,t.X),q=r.m(0,"bytes") if(q!=null)r.k(0,"argument",q) s=this.a -s.a=s.a.of(new A.pK(this.b,r),t.H)}, -$S:115} -A.pK.prototype={ +s.a=s.a.oi(new A.pS(this.b,r),t.H)}, +$S:117} +A.pS.prototype={ $1(a){var s=0,r=A.br(t.H),q=this,p,o var $async$$1=A.bs(function(b,c){if(b===1)return A.bo(c,r) -for(;;)switch(s){case 0:p=A.p7(v.G.self) +for(;;)switch(s){case 0:p=A.pf(v.G.self) o=B.iq s=2 -return A.c3(A.pR(q.a,q.b),$async$$1) -case 2:p.postMessage(o.mR(c,null)) +return A.bF(A.q_(q.a,q.b),$async$$1) +case 2:p.postMessage(o.mT(c,null)) return A.bp(null,r)}}) return A.bq($async$$1,r)}, -$S:116};(function aliases(){var s=J.cW.prototype -s.jI=s.j -s=A.cJ.prototype -s.jQ=s.h0 -s.jR=s.h8 -s.jS=s.hp -s=A.C.prototype -s.jJ=s.bc -s.jK=s.bb +$S:118};(function aliases(){var s=J.cY.prototype +s.jJ=s.j +s=A.cL.prototype +s.jR=s.h1 +s.jS=s.h9 +s.jT=s.hq +s=A.B.prototype +s.jK=s.bc +s.jL=s.bb s=A.h.prototype -s.jH=s.os +s.jI=s.ov s=A.dY.prototype -s.jF=s.l -s.jG=s.a1 -s=A.aa.prototype -s.jN=s.a3 -s=A.b9.prototype -s.jL=s.k -s.bW=s.l -s.fK=s.bx -s.jM=s.a1 -s=A.cb.prototype -s.fI=s.j +s.jG=s.l +s.jH=s.a1 +s=A.ac.prototype +s.jO=s.a3 +s=A.bb.prototype +s.jM=s.k +s.bX=s.l +s.fL=s.by +s.jN=s.a1 +s=A.ce.prototype +s.fJ=s.j s=A.n.prototype -s.bX=s.b8 -s.bE=s.j -s=A.ca.prototype -s.cG=s.j -s=A.au.prototype -s.fJ=s.b8 +s.bY=s.b8 +s.bF=s.j +s=A.cd.prototype +s.cH=s.j +s=A.ax.prototype +s.fK=s.b8 s=A.ek.prototype -s.jP=s.ai -s.jO=s.v})();(function installTearOffs(){var s=hunkHelpers._static_2,r=hunkHelpers._instance_1i,q=hunkHelpers.installInstanceTearOff,p=hunkHelpers._static_1,o=hunkHelpers._static_0,n=hunkHelpers._instance_1u,m=hunkHelpers._instance_2u,l=hunkHelpers._instance_0u,k=hunkHelpers.installStaticTearOff -s(J,"ya","vZ",40) +s.jQ=s.ai +s.jP=s.v})();(function installTearOffs(){var s=hunkHelpers._static_2,r=hunkHelpers._instance_1i,q=hunkHelpers.installInstanceTearOff,p=hunkHelpers._static_1,o=hunkHelpers._static_0,n=hunkHelpers._instance_1u,m=hunkHelpers._instance_2u,l=hunkHelpers._instance_0u,k=hunkHelpers.installStaticTearOff +s(J,"yk","w8",27) var j -r(j=J.y.prototype,"ghF","l",18) -r(j,"glc","a1",18) -q(J.ct.prototype,"gfF",1,1,null,["$2","$1"],["aa","U"],81,0,0) -p(A,"yF","x4",24) -p(A,"yG","x5",24) -p(A,"yH","x6",24) -o(A,"uh","yy",1) -s(A,"uk","xV",13) -p(A,"ul","xW",14) -s(A,"yK","w4",40) -p(A,"yR","xX",38) -p(A,"yU","zb",14) -s(A,"yT","za",13) -p(A,"yS","wX",33) -n(A.Y.prototype,"got","ou",18) -m(j=A.eQ.prototype,"gar","aI",13) -n(j,"gdM","Y",14) -n(j,"gnj","nk",31) -p(A,"um","a8",20) -p(A,"yO","pJ",20) -p(A,"yP","uy",20) -p(A,"yN","vt",27) -p(A,"yM","vs",26) -n(A.d0.prototype,"gfn","iF",117) -l(j=A.ff.prototype,"gE","mf",0) -l(j,"gmZ","n_",0) -l(j,"gcu","o4",0) -l(j,"glX","lY",0) -l(j,"gdT","nY",0) -l(j,"gbC","jj",0) -l(j,"gnH","nI",0) -l(j,"god","oe",0) -l(j,"gm1","m2",0) -l(j,"giA","oc",0) +r(j=J.y.prototype,"ghG","l",22) +r(j,"gle","a1",22) +q(J.cv.prototype,"gfG",1,1,null,["$2","$1"],["aa","U"],122,0,0) +p(A,"yP","xe",14) +p(A,"yQ","xf",14) +p(A,"yR","xg",14) +o(A,"ur","yI",1) +s(A,"uv","y4",17) +p(A,"uw","y5",23) +s(A,"yT","we",27) +p(A,"z_","y6",30) +p(A,"z2","zk",23) +s(A,"z1","zj",17) +p(A,"z0","x6",33) +n(A.X.prototype,"gow","ox",22) +m(j=A.eR.prototype,"gau","aJ",17) +n(j,"gdO","Y",23) +n(j,"gnl","nm",43) +p(A,"ux","a9",20) +p(A,"yX","pR",20) +p(A,"yY","uJ",20) +p(A,"yW","vE",41) +p(A,"yV","vD",31) +n(A.bY.prototype,"gfo","iG",54) +l(j=A.fh.prototype,"gE","mh",0) +l(j,"gn0","n1",0) +l(j,"gcw","o6",0) +l(j,"glZ","m_",0) +l(j,"gdW","o_",0) +l(j,"gbD","jk",0) +l(j,"gnJ","nK",0) +l(j,"gog","oh",0) +l(j,"gm3","m4",0) +l(j,"giB","of",0) +l(j,"go4","o5",0) l(j,"go2","o3",0) l(j,"go0","o1",0) -l(j,"gnZ","o_",0) +l(j,"gnY","nZ",0) l(j,"gnW","nX",0) l(j,"gnU","nV",0) -l(j,"gnS","nT",0) -l(j,"gjh","ji",0) -l(j,"gj2","j3",0) -l(j,"gj0","j1",0) -l(j,"gj6","j7",0) -l(j,"gj4","j5",0) -l(j,"gbf","jg",0) -l(j,"gj9","ja",0) -l(j,"gfu","j8",0) -l(j,"ge4","jf",0) -l(j,"gjd","je",0) -l(j,"gjb","jc",0) -l(j,"giT","iU",0) -l(j,"gbB","j_",0) -l(j,"giX","iY",0) -l(j,"giV","iW",0) -l(j,"ge3","iZ",0) -l(j,"giR","iS",0) -l(j,"gbs","lH",0) -l(j,"gbI","lt",0) -l(j,"gld","le",0) -l(j,"ghP","lI",0) -l(j,"glx","ly",0) -l(j,"glD","lE",0) -l(j,"gdE","lF",0) -l(j,"ghJ","lf",0) -l(j,"gbm","jk",0) -l(j,"geB","lP",0) -l(j,"gno","np",0) +l(j,"gji","jj",0) +l(j,"gj3","j4",0) +l(j,"gj1","j2",0) +l(j,"gj7","j8",0) +l(j,"gj5","j6",0) +l(j,"gbf","jh",0) +l(j,"gja","jb",0) +l(j,"gfv","j9",0) +l(j,"ge8","jg",0) +l(j,"gje","jf",0) +l(j,"gjc","jd",0) +l(j,"giU","iV",0) +l(j,"gbC","j0",0) +l(j,"giY","iZ",0) +l(j,"giW","iX",0) +l(j,"ge7","j_",0) +l(j,"giS","iT",0) +l(j,"gbt","lJ",0) +l(j,"gbJ","lv",0) +l(j,"glf","lg",0) +l(j,"ghQ","lK",0) +l(j,"glz","lA",0) +l(j,"glF","lG",0) +l(j,"gdG","lH",0) +l(j,"ghK","lh",0) +l(j,"gbm","jl",0) +l(j,"geF","lR",0) +l(j,"gnq","nr",0) +l(j,"gmd","me",0) l(j,"gmb","mc",0) -l(j,"gm9","ma",0) -l(j,"gbJ","md",0) -l(j,"ghY","m7",0) -l(j,"ghZ","m8",0) -l(j,"gm5","m6",0) -l(j,"gmM","mN",0) -l(j,"ghQ","lJ",0) -l(j,"geL","mD",0) -l(j,"glg","lh",0) -l(j,"glj","lk",0) -l(j,"gez","lK",0) -l(j,"gmG","mH",0) +l(j,"gbK","mf",0) +l(j,"ghZ","m9",0) +l(j,"gi_","ma",0) +l(j,"gm7","m8",0) +l(j,"gmO","mP",0) +l(j,"ghR","lL",0) +l(j,"geP","mF",0) +l(j,"gli","lj",0) +l(j,"gll","lm",0) +l(j,"geD","lM",0) l(j,"gmI","mJ",0) -l(j,"ghK","li",0) -l(j,"glM","lN",0) -l(j,"glm","ln",0) -l(j,"geA","lL",0) -l(j,"geM","mO",0) -l(j,"geN","mP",0) -l(j,"ghL","ll",0) -l(j,"gcn","lQ",0) -l(j,"glT","lU",0) -p(A,"uq","yB",15) -p(A,"yY","yw",15) -p(A,"yX","xZ",15) -l(j=A.kj.prototype,"gn1","n2",82) -l(j,"glV","lW",83) -l(j,"gjq","jr",84) -l(j,"gaZ","lG",85) -l(j,"glp","lq",86) -l(j,"glr","ls",7) -l(j,"gc2","lu",7) -l(j,"glv","lw",7) -l(j,"glB","lC",7) -l(j,"glz","lA",7) -l(j,"gmT","mU",88) -l(j,"ghX","m4",89) -l(j,"glR","lS",90) -l(j,"gmg","mh",91) -l(j,"giq","nR",92) -l(j,"gmn","mo",93) -l(j,"gmv","mw",23) -l(j,"gmz","mA",23) -l(j,"gmx","my",23) -l(j,"gmB","mC",6) -l(j,"gmr","ms",11) -l(j,"gmp","mq",11) -l(j,"gmt","mu",11) -l(j,"gmE","mF",11) -l(j,"gmK","mL",11) -l(j,"gcD","jo",6) +l(j,"gmK","mL",0) +l(j,"ghL","lk",0) +l(j,"glO","lP",0) +l(j,"glo","lp",0) +l(j,"geE","lN",0) +l(j,"geQ","mQ",0) +l(j,"geR","mR",0) +l(j,"ghM","ln",0) +l(j,"gcp","lS",0) +l(j,"glV","lW",0) +p(A,"uB","yL",21) +p(A,"z6","yG",21) +p(A,"z5","y8",21) +l(j=A.kj.prototype,"gn3","n4",84) +l(j,"glX","lY",85) +l(j,"gjr","js",86) +l(j,"gaZ","lI",87) +l(j,"glr","ls",88) +l(j,"glt","lu",11) +l(j,"gc3","lw",11) +l(j,"glx","ly",11) +l(j,"glD","lE",11) +l(j,"glB","lC",11) +l(j,"gmV","mW",90) +l(j,"ghY","m6",91) +l(j,"glT","lU",92) +l(j,"gmi","mj",93) +l(j,"gir","nT",94) +l(j,"gmp","mq",95) +l(j,"gmx","my",15) +l(j,"gmB","mC",15) +l(j,"gmz","mA",15) +l(j,"gmD","mE",6) +l(j,"gmt","mu",10) +l(j,"gmr","ms",10) +l(j,"gmv","mw",10) +l(j,"gmG","mH",10) +l(j,"gmM","mN",10) l(j,"gcE","jp",6) -l(j,"gbd","ny",6) +l(j,"gcF","jq",6) +l(j,"gbd","nA",6) +l(j,"gny","nz",6) l(j,"gnw","nx",6) -l(j,"gnu","nv",6) -n(A.dH.prototype,"giE","M",114) -k(A,"zm",2,null,["$1$2","$2"],["uB",function(a,b){return A.uB(a,b,t.cZ)}],121,1) -s(A,"z3","zv",22) -s(A,"z4","zw",22) -s(A,"z2","zu",22)})();(function inheritance(){var s=hunkHelpers.mixin,r=hunkHelpers.inherit,q=hunkHelpers.inheritMany +n(A.dH.prototype,"giF","K",116) +k(A,"zv",2,null,["$1$2","$2"],["uM",function(a,b){return A.uM(a,b,t.cZ)}],123,1) +s(A,"zc","zC",13) +s(A,"zd","zD",13) +s(A,"zb","zB",13)})();(function inheritance(){var s=hunkHelpers.mixin,r=hunkHelpers.inherit,q=hunkHelpers.inheritMany r(A.p,null) -q(A.p,[A.q4,J.iS,A.fF,J.J,A.h,A.eN,A.a9,A.b7,A.a0,A.C,A.nK,A.M,A.du,A.cF,A.fd,A.fT,A.fO,A.eX,A.bZ,A.ak,A.bL,A.cf,A.bn,A.ea,A.dW,A.cK,A.aY,A.fj,A.nQ,A.jl,A.fc,A.hq,A.oW,A.mM,A.cv,A.dr,A.fn,A.cV,A.hg,A.et,A.fS,A.kV,A.kB,A.p0,A.bU,A.kO,A.kX,A.oY,A.kx,A.bG,A.kC,A.dJ,A.aB,A.ky,A.kT,A.hz,A.hd,A.kP,A.dL,A.hv,A.hf,A.bt,A.cl,A.oy,A.oS,A.kZ,A.aq,A.dh,A.oE,A.jp,A.fQ,A.kM,A.aC,A.iR,A.b0,A.aK,A.kW,A.jJ,A.Y,A.hw,A.nS,A.bN,A.jk,A.ie,A.bQ,A.lJ,A.lH,A.ot,A.or,A.fe,A.kv,A.os,A.mD,A.oq,A.mH,A.lG,A.nm,A.nl,A.jv,A.ju,A.fA,A.nk,A.iO,A.jq,A.fR,A.cP,A.lI,A.eR,A.e2,A.cX,A.bE,A.ey,A.e9,A.eQ,A.ev,A.kR,A.I,A.nO,A.eb,A.j5,A.ns,A.R,A.k7,A.ip,A.eY,A.dj,A.bu,A.ih,A.f3,A.f2,A.cm,A.f4,A.il,A.f5,A.cS,A.cn,A.f6,A.im,A.f7,A.co,A.f8,A.ii,A.eZ,A.ij,A.dk,A.ik,A.f_,A.dl,A.f0,A.f1,A.cR,A.io,A.iq,A.fa,A.ig,A.aO,A.kQ,A.oU,A.kI,A.am,A.mB,A.aa,A.bb,A.nB,A.lS,A.lN,A.ew,A.mA,A.bl,A.jS,A.ff,A.nP,A.lV,A.f9,A.lO,A.nM,A.ni,A.jt,A.cb,A.js,A.n,A.cB,A.fs,A.ca,A.jN,A.jP,A.ek,A.me,A.aL,A.bD,A.bW,A.aJ,A.d5,A.kk,A.kl,A.ke,A.nX,A.ep,A.nY,A.d6,A.cG,A.aS,A.Z,A.op,A.aH,A.kn,A.ll,A.ka,A.lh,A.ks,A.lu,A.nV,A.ok,A.ol,A.km,A.lv,A.lw,A.le,A.ki,A.kj,A.dg,A.lb,A.h_,A.dH]) -q(J.iS,[J.iV,J.e4,J.fk,J.e6,J.e7,J.e5,J.ct]) -q(J.fk,[J.cW,J.y,A.dv,A.fu]) -q(J.cW,[J.jA,J.dF,J.cu]) -r(J.iU,A.fF) -r(J.mJ,J.y) -q(J.e5,[J.fi,J.iW]) -q(A.h,[A.eu,A.z,A.ba,A.b_,A.dn,A.dE,A.cx,A.O,A.he,A.kw,A.kU,A.bV,A.hQ,A.d3,A.kN,A.fr,A.c1,A.kh]) -r(A.de,A.eu) -r(A.hb,A.de) -q(A.a9,[A.df,A.bx,A.cJ]) -q(A.b7,[A.i5,A.iP,A.i4,A.jT,A.pF,A.pH,A.ov,A.ou,A.p9,A.oN,A.oD,A.oB,A.pS,A.pT,A.px,A.mI,A.ma,A.mc,A.lM,A.lL,A.n0,A.n1,A.n2,A.n3,A.n4,A.n5,A.mQ,A.mR,A.mS,A.mU,A.mW,A.mV,A.mX,A.mZ,A.mY,A.n_,A.n8,A.n9,A.na,A.nb,A.nc,A.nd,A.ne,A.nf,A.ng,A.nh,A.nD,A.nE,A.nF,A.lU,A.lT,A.md,A.mG,A.nI,A.nJ,A.nH,A.nG,A.pn,A.po,A.pl,A.pm,A.lX,A.m4,A.m2,A.m3,A.lY,A.lZ,A.m_,A.m0,A.m7,A.m8,A.m5,A.m6,A.lP,A.lQ,A.pg,A.pQ,A.pc,A.pd,A.pY,A.pP,A.nv,A.nw,A.ny,A.nz,A.nA,A.pW,A.pX,A.mg,A.mf,A.mh,A.mj,A.ml,A.mi,A.mz,A.p8,A.on,A.oo,A.nZ,A.o0,A.o1,A.o2,A.ps,A.pt,A.pu,A.pv,A.pw,A.om,A.p5,A.o9,A.oj,A.o7,A.o3,A.o4,A.o6,A.o5,A.og,A.oa,A.o8,A.ob,A.oi,A.of,A.od,A.oc,A.oe,A.pz,A.pL,A.pK]) -q(A.i5,[A.lK,A.nt,A.mK,A.pG,A.pa,A.ph,A.oO,A.mN,A.mO,A.oT,A.oA,A.n7,A.nU,A.lR,A.nq,A.mF,A.pB,A.pk,A.pp,A.pq,A.pr,A.lW,A.pN,A.pO,A.mk,A.oh]) -q(A.a0,[A.e8,A.jF,A.cC,A.iX,A.k0,A.jK,A.kL,A.fl,A.hU,A.bR,A.jh,A.fX,A.fW,A.dD,A.i7]) -q(A.C,[A.em,A.b9]) -q(A.em,[A.ah,A.cE]) -q(A.z,[A.G,A.eW,A.aV,A.fo,A.dq,A.hc]) -q(A.G,[A.cy,A.Q,A.X,A.fp]) -r(A.eU,A.ba) -r(A.eV,A.dE) -r(A.dZ,A.cx) -q(A.bn,[A.ez,A.eA,A.d7]) +q(A.p,[A.qf,J.iS,A.fH,J.J,A.h,A.eN,A.ab,A.b9,A.a1,A.B,A.nQ,A.N,A.du,A.cH,A.ff,A.fV,A.fQ,A.eZ,A.c1,A.ak,A.bM,A.ci,A.bn,A.ea,A.dW,A.cM,A.b2,A.fl,A.nX,A.jl,A.fe,A.hs,A.p3,A.mS,A.cx,A.dr,A.fp,A.cX,A.hi,A.et,A.fU,A.kV,A.kB,A.p8,A.bW,A.kO,A.kX,A.p5,A.kx,A.bH,A.kC,A.dJ,A.aF,A.ky,A.kT,A.hB,A.hf,A.kP,A.dL,A.hx,A.hh,A.bt,A.cn,A.oF,A.p_,A.kZ,A.as,A.di,A.oM,A.jp,A.fS,A.kM,A.aG,A.iR,A.aC,A.aN,A.kW,A.jJ,A.X,A.hy,A.nZ,A.bO,A.jk,A.ie,A.bR,A.lJ,A.lH,A.oA,A.oy,A.fg,A.kv,A.oz,A.mI,A.ox,A.mM,A.lG,A.ns,A.nr,A.jv,A.ju,A.fC,A.nq,A.iO,A.jq,A.fT,A.cR,A.lI,A.eS,A.e2,A.cZ,A.bE,A.ey,A.e9,A.eR,A.ev,A.kR,A.I,A.nU,A.eb,A.j5,A.ny,A.R,A.k7,A.ip,A.f_,A.dk,A.bu,A.ih,A.f5,A.f4,A.co,A.f6,A.il,A.f7,A.cU,A.cp,A.f8,A.im,A.f9,A.cq,A.fa,A.ii,A.f0,A.ij,A.dl,A.ik,A.f1,A.dm,A.f2,A.f3,A.cT,A.io,A.iq,A.fc,A.ig,A.aR,A.kQ,A.p1,A.kI,A.am,A.nW,A.mG,A.ac,A.bc,A.nH,A.lS,A.lN,A.ew,A.mF,A.bl,A.jS,A.fh,A.nV,A.lV,A.fb,A.lO,A.nS,A.no,A.jt,A.ce,A.js,A.n,A.cD,A.fu,A.cd,A.jN,A.jP,A.ek,A.mj,A.aO,A.bD,A.bZ,A.aL,A.d6,A.kk,A.kl,A.ke,A.o3,A.ep,A.o4,A.d7,A.cI,A.aV,A.a_,A.ow,A.aJ,A.kn,A.ll,A.ka,A.lh,A.ks,A.lu,A.o1,A.or,A.os,A.km,A.lv,A.lw,A.le,A.ki,A.kj,A.dh,A.lb,A.h1,A.dH]) +q(J.iS,[J.iV,J.e4,J.fm,J.e6,J.e7,J.e5,J.cv]) +q(J.fm,[J.cY,J.y,A.dv,A.fw]) +q(J.cY,[J.jA,J.dF,J.cw]) +r(J.iU,A.fH) +r(J.mP,J.y) +q(J.e5,[J.fk,J.iW]) +q(A.h,[A.eu,A.z,A.aM,A.aE,A.dp,A.dE,A.cz,A.P,A.hg,A.kw,A.kU,A.bX,A.hS,A.d4,A.kN,A.ft,A.c4,A.kh]) +r(A.df,A.eu) +r(A.hd,A.df) +q(A.ab,[A.dg,A.bx,A.cL]) +q(A.b9,[A.i7,A.iP,A.i6,A.jT,A.pN,A.pP,A.oC,A.oB,A.ph,A.oV,A.oL,A.oI,A.q0,A.q1,A.pF,A.mN,A.mf,A.mh,A.lM,A.lL,A.n6,A.n7,A.n8,A.n9,A.na,A.nb,A.mW,A.mX,A.mY,A.n_,A.n1,A.n0,A.n2,A.n4,A.n3,A.n5,A.ne,A.nf,A.ng,A.nh,A.ni,A.nj,A.nk,A.nl,A.nm,A.nn,A.nJ,A.nK,A.nL,A.lU,A.lT,A.mi,A.mL,A.nO,A.nP,A.nN,A.nM,A.pv,A.pw,A.pt,A.pu,A.lX,A.m4,A.m2,A.m3,A.lY,A.lZ,A.m_,A.m0,A.m7,A.m8,A.m9,A.ma,A.mb,A.mc,A.md,A.m5,A.m6,A.lP,A.lQ,A.po,A.pZ,A.pk,A.pl,A.q6,A.pX,A.nB,A.nC,A.nE,A.nF,A.nG,A.q4,A.q5,A.ml,A.mk,A.mm,A.mo,A.mq,A.mn,A.mE,A.pg,A.ou,A.ov,A.o5,A.o7,A.o8,A.o9,A.pA,A.pB,A.pC,A.pD,A.pE,A.ot,A.pd,A.og,A.oq,A.oe,A.oa,A.ob,A.od,A.oc,A.on,A.oh,A.of,A.oi,A.op,A.om,A.ok,A.oj,A.ol,A.pH,A.pT,A.pS]) +q(A.i7,[A.lK,A.nz,A.mQ,A.pO,A.pi,A.pp,A.oW,A.mT,A.mU,A.p0,A.oH,A.nd,A.o0,A.lR,A.nw,A.mK,A.pJ,A.ps,A.px,A.py,A.pz,A.lW,A.pV,A.pW,A.mp,A.oo]) +q(A.a1,[A.e8,A.jF,A.cE,A.iX,A.k0,A.jK,A.kL,A.fn,A.hW,A.bS,A.jh,A.fZ,A.fY,A.dD,A.i8]) +q(A.B,[A.em,A.bb]) +q(A.em,[A.ah,A.cG]) +q(A.z,[A.G,A.eY,A.b_,A.fq,A.bU,A.he]) +q(A.G,[A.cA,A.Q,A.Y,A.fr]) +r(A.eW,A.aM) +r(A.eX,A.dE) +r(A.dZ,A.cz) +q(A.bn,[A.ez,A.eA,A.d8]) r(A.l,A.ez) -r(A.hl,A.eA) -q(A.d7,[A.hm,A.hn,A.ho]) +r(A.hn,A.eA) +q(A.d8,[A.ho,A.hp,A.hq]) r(A.eC,A.ea) r(A.dG,A.eC) -r(A.eP,A.dG) +r(A.eQ,A.dG) q(A.dW,[A.r,A.a]) -q(A.aY,[A.dX,A.hp,A.kD]) -q(A.dX,[A.b8,A.aP]) +q(A.b2,[A.dX,A.hr,A.kD]) +q(A.dX,[A.aX,A.aS]) r(A.e0,A.iP) -r(A.fx,A.cC) +r(A.fz,A.cE) q(A.jT,[A.jR,A.dT]) -r(A.dp,A.bx) -q(A.fu,[A.j7,A.aW]) -q(A.aW,[A.hh,A.hj]) -r(A.hi,A.hh) -r(A.ft,A.hi) +r(A.dq,A.bx) +q(A.fw,[A.j7,A.b0]) +q(A.b0,[A.hj,A.hl]) r(A.hk,A.hj) -r(A.by,A.hk) -q(A.ft,[A.j8,A.j9]) -q(A.by,[A.ja,A.jb,A.jc,A.jd,A.fv,A.fw,A.dw]) +r(A.fv,A.hk) +r(A.hm,A.hl) +r(A.by,A.hm) +q(A.fv,[A.j8,A.j9]) +q(A.by,[A.ja,A.jb,A.jc,A.jd,A.fx,A.fy,A.dw]) r(A.eB,A.kL) -q(A.i4,[A.ow,A.ox,A.oZ,A.oF,A.oJ,A.oI,A.oH,A.oG,A.oM,A.oL,A.oK,A.oX,A.pf,A.p3,A.p2,A.mb,A.np,A.mE,A.mC,A.pj,A.m1,A.my,A.mm,A.mt,A.mu,A.mv,A.mw,A.mr,A.ms,A.mn,A.mo,A.mp,A.mq,A.mx,A.oP]) -r(A.h8,A.kC) -r(A.kS,A.hz) -q(A.cJ,[A.dK,A.ha]) -r(A.cL,A.hp) +q(A.i6,[A.oD,A.oE,A.p6,A.oN,A.oR,A.oQ,A.oP,A.oO,A.oU,A.oT,A.oS,A.p4,A.pn,A.pb,A.pa,A.mg,A.nv,A.mJ,A.mH,A.pr,A.m1,A.mD,A.mr,A.my,A.mz,A.mA,A.mB,A.mw,A.mx,A.ms,A.mt,A.mu,A.mv,A.mC,A.oX]) +r(A.ha,A.kC) +r(A.kS,A.hB) +q(A.cL,[A.dK,A.hc]) +r(A.cN,A.hr) q(A.bt,[A.ic,A.eL,A.iY]) -q(A.ic,[A.hS,A.k4]) -q(A.cl,[A.kY,A.hX,A.j_,A.k5,A.kg]) -r(A.hT,A.kY) -r(A.iZ,A.fl) -r(A.oR,A.oS) -q(A.bR,[A.ef,A.fh]) -r(A.kE,A.hw) -q(A.oE,[A.dV,A.h7,A.i0,A.ec,A.aT,A.cT,A.ir,A.ag,A.bm]) -q(A.fe,[A.ku,A.it]) -r(A.p6,A.oq) -q(A.nm,[A.no,A.fz]) -r(A.nn,A.nl) +q(A.ic,[A.hU,A.k4]) +q(A.cn,[A.kY,A.hZ,A.j_,A.k5,A.kg]) +r(A.hV,A.kY) +r(A.iZ,A.fn) +r(A.oZ,A.p_) +q(A.bS,[A.ef,A.fj]) +r(A.kE,A.hy) +q(A.oM,[A.dV,A.h9,A.i2,A.ec,A.aY,A.cV,A.ir,A.ag,A.bm]) +q(A.fg,[A.ku,A.it]) +r(A.pe,A.ox) +q(A.ns,[A.nu,A.fB]) +r(A.nt,A.nr) r(A.jx,A.ju) r(A.jy,A.jx) r(A.jw,A.jv) -r(A.nj,A.nk) +r(A.np,A.nq) r(A.e_,A.iO) -r(A.fy,A.jq) +r(A.fA,A.jq) r(A.ei,A.bE) r(A.dY,A.ev) r(A.iz,A.I) -r(A.jX,A.nO) -q(A.R,[A.cs,A.d4,A.jV,A.je,A.jL,A.d_,A.fL,A.bc,A.eh,A.ao]) -q(A.bc,[A.di,A.j6,A.hW,A.iy,A.i3,A.ed,A.ee,A.jf]) -r(A.fD,A.ed) +r(A.jX,A.nU) +q(A.R,[A.cu,A.d5,A.jV,A.je,A.jL,A.d1,A.fN,A.bd,A.eh,A.ap]) +q(A.bd,[A.dj,A.j6,A.hY,A.iy,A.i5,A.ed,A.ee,A.jf]) +r(A.fF,A.ed) r(A.jE,A.ee) -q(A.ao,[A.jo,A.jn,A.al]) +q(A.ap,[A.jo,A.jn,A.al]) q(A.al,[A.jm,A.bA,A.jz,A.ib,A.is,A.iv]) -q(A.bA,[A.j0,A.hN,A.jW,A.iw,A.jI,A.i1,A.jG,A.j1,A.k6]) -q(A.dj,[A.bg,A.fb]) -q(A.am,[A.kF,A.i9,A.bY,A.kJ,A.i6]) +q(A.bA,[A.j0,A.hP,A.jW,A.iw,A.jI,A.i3,A.jG,A.j1,A.k6]) +q(A.dk,[A.bh,A.fd]) +q(A.am,[A.kF,A.eV,A.c0,A.kJ,A.eP]) r(A.kG,A.kF) r(A.kH,A.kG) -r(A.eT,A.kH) +r(A.eU,A.kH) r(A.kK,A.kJ) r(A.K,A.kK) -q(A.b9,[A.ji,A.hH]) +q(A.bb,[A.ji,A.hJ]) r(A.iu,A.kN) -q(A.aa,[A.iN,A.hZ,A.hY,A.iG,A.hM,A.iA,A.jU,A.iL,A.fg,A.iB,A.iD,A.iK,A.iH,A.iC,A.iJ,A.iI,A.iE,A.hK,A.iF,A.hL,A.hI,A.hJ]) +r(A.oK,A.nW) +q(A.ac,[A.iN,A.i0,A.i_,A.iG,A.hO,A.iA,A.jU,A.iL,A.fi,A.iB,A.iD,A.iK,A.iH,A.iC,A.iJ,A.iI,A.iE,A.hM,A.iF,A.hN,A.hK,A.hL]) r(A.ia,A.kD) -r(A.d0,A.k7) -q(A.bl,[A.cA,A.bK,A.eS]) -q(A.cA,[A.d2,A.H]) -q(A.bK,[A.j,A.D,A.dC,A.dU]) -r(A.e1,A.nM) +r(A.bY,A.k7) +q(A.bl,[A.cC,A.bL,A.eT]) +q(A.cC,[A.d3,A.H]) +q(A.bL,[A.j,A.D,A.dC,A.dU]) +r(A.e1,A.nS) q(A.e1,[A.jB,A.k3,A.k9]) -r(A.eg,A.cb) +r(A.eg,A.ce) q(A.eg,[A.T,A.F]) -q(A.n,[A.u,A.au,A.ds,A.fH,A.dB,A.fI,A.fJ,A.fK,A.id,A.cQ,A.jg,A.i2,A.fC,A.jH,A.eo]) -q(A.au,[A.cp,A.fq,A.fU,A.bT,A.fP,A.dA]) -q(A.ca,[A.fM,A.ck,A.j4,A.jj,A.ab,A.k8]) +q(A.n,[A.u,A.ax,A.ds,A.fJ,A.dB,A.fK,A.fL,A.fM,A.id,A.cS,A.jg,A.i4,A.fE,A.jH,A.eo]) +q(A.ax,[A.cr,A.fs,A.fW,A.bV,A.fR,A.dA]) +q(A.cd,[A.fO,A.cm,A.j4,A.jj,A.ad,A.k8]) r(A.eO,A.ds) -q(A.i2,[A.ej,A.fV]) -r(A.hO,A.ej) -r(A.hP,A.fV) -q(A.dA,[A.fm,A.fB]) -r(A.bj,A.fm) -r(A.bh,A.jP) -q(A.ek,[A.aw,A.jQ]) -r(A.cd,A.jQ) -r(A.kd,A.d5) -q(A.kk,[A.ko,A.lr,A.lt,A.h2]) +q(A.i4,[A.ej,A.fX]) +r(A.hQ,A.ej) +r(A.hR,A.fX) +q(A.dA,[A.fo,A.fD]) +r(A.bj,A.fo) +r(A.bi,A.jP) +q(A.ek,[A.az,A.jQ]) +r(A.cg,A.jQ) +r(A.kd,A.d6) +q(A.kk,[A.ko,A.lr,A.lt,A.h4]) r(A.kq,A.lr) r(A.kr,A.lt) r(A.lm,A.ll) @@ -17908,108 +18057,108 @@ r(A.lq,A.lp) r(A.E,A.lq) q(A.E,[A.l_,A.l1,A.l2,A.l4,A.l5,A.l6]) r(A.l0,A.l_) -r(A.aR,A.l0) +r(A.aU,A.l0) r(A.kb,A.l1) -q(A.kb,[A.en,A.fY,A.h4,A.es]) +q(A.kb,[A.en,A.h_,A.h6,A.es]) r(A.l3,A.l2) r(A.kc,A.l3) -r(A.fZ,A.l4) +r(A.h0,A.l4) r(A.kf,A.l5) r(A.l7,A.l6) r(A.l8,A.l7) r(A.l9,A.l8) -r(A.aG,A.l9) +r(A.aI,A.l9) r(A.li,A.lh) r(A.lj,A.li) r(A.eq,A.lj) -r(A.h0,A.dY) -q(A.eq,[A.h3,A.h5]) +r(A.h2,A.dY) +q(A.eq,[A.h5,A.h7]) r(A.kt,A.lu) r(A.ld,A.lv) r(A.lk,A.lw) r(A.lf,A.le) r(A.lg,A.lf) -r(A.a1,A.lg) -q(A.a1,[A.c_,A.c0,A.bB,A.bC,A.la,A.c2,A.ls,A.dI]) -r(A.bM,A.la) -r(A.bd,A.ls) +r(A.a2,A.lg) +q(A.a2,[A.c2,A.c3,A.bB,A.bC,A.la,A.c5,A.ls,A.dI]) +r(A.bN,A.la) +r(A.be,A.ls) r(A.lc,A.lb) -r(A.av,A.lc) -s(A.em,A.bL) -s(A.hh,A.C) -s(A.hi,A.ak) -s(A.hj,A.C) +r(A.ay,A.lc) +s(A.em,A.bM) +s(A.hj,A.B) s(A.hk,A.ak) -s(A.eC,A.hv) +s(A.hl,A.B) +s(A.hm,A.ak) +s(A.eC,A.hx) s(A.kF,A.kQ) -s(A.kG,A.oU) +s(A.kG,A.p1) s(A.kH,A.kI) s(A.kJ,A.kQ) s(A.kK,A.kI) -s(A.kN,A.C) +s(A.kN,A.B) s(A.lr,A.kl) s(A.lt,A.kl) -s(A.l_,A.cG) -s(A.l0,A.Z) -s(A.l1,A.Z) -s(A.l2,A.Z) +s(A.l_,A.cI) +s(A.l0,A.a_) +s(A.l1,A.a_) +s(A.l2,A.a_) s(A.l3,A.ep) -s(A.l4,A.Z) -s(A.l5,A.d6) -s(A.l6,A.cG) -s(A.l7,A.Z) +s(A.l4,A.a_) +s(A.l5,A.d7) +s(A.l6,A.cI) +s(A.l7,A.a_) s(A.l8,A.ep) -s(A.l9,A.d6) -s(A.ll,A.nX) -s(A.lm,A.nY) -s(A.ln,A.aH) +s(A.l9,A.d7) +s(A.ll,A.o3) +s(A.lm,A.o4) +s(A.ln,A.aJ) s(A.lo,A.kn) -s(A.lp,A.aS) -s(A.lq,A.op) -s(A.lh,A.aH) +s(A.lp,A.aV) +s(A.lq,A.ow) +s(A.lh,A.aJ) s(A.li,A.kn) -s(A.lj,A.Z) +s(A.lj,A.a_) s(A.lu,A.ks) s(A.lv,A.dH) s(A.lw,A.dH) s(A.le,A.km) -s(A.lf,A.ol) -s(A.lg,A.ok) -s(A.la,A.h_) -s(A.ls,A.h_) -s(A.lb,A.h_) +s(A.lf,A.os) +s(A.lg,A.or) +s(A.la,A.h1) +s(A.ls,A.h1) +s(A.lb,A.h1) s(A.lc,A.km)})() -var v={G:typeof self!="undefined"?self:globalThis,typeUniverse:{eC:new Map(),tR:{},eT:{},tPV:{},sEA:[]},mangledGlobalNames:{b:"int",V:"double",b5:"num",e:"String",A:"bool",aK:"Null",m:"List",p:"Object",d:"Map",ap:"JSObject"},mangledNames:{},types:["A()","~()","~(aG)","aK()","A(e)","A(aG?)","n()","n<+(e,ag)>()","e()","A(bQ)","A(cG)","n<@>()","A(dk)","A(p?,p?)","b(p?)","e(cc)","~(@)","~(p,e)","~(p?)","b(b,d)","A(e?)","A(aL)","F(F,F)","n()","~(~())","@()","b(b)","A(b)","aK(@)","A(E)","A(am)","A(p?)","A(bu)","e(e)","b()","aR(aR)","E(E)","e(b)","@(@)","+(e,ag)(e,e,e)","b(@,@)","~(p?,p?)","~(el,@)","~(e,p?)","e(K)","A(K)","aK(@,d1)","A(d)","e(d)","~(e,d)","~(am,d)","A(cR)","~(bu)","d(bu)","~(b,@)","m>(m)","e(cS)","A(b0)","bg(b0)","aK(p,d1)","e(e?)","m(e)","ab(e)","ab(e,e,e)","~(e,@)","ab(b)","b(ab,ab)","b(b,ab)","e?()","b(bD)","e?(dl)","p(bD)","p(aL)","b(aL,aL)","m(b0>)","~(@,@)","cd()","e?(E)","aK(~())","cm(aG)","cn(aG)","A(dx[b])","n()","n
()","n()","n>()","n()","b(b,b)","n()","n()","n()","n()","n()","n()","@(@,e)","@(e)","~(K)","dI(e)","bd(e,e,m,e,e)","av(e,e,+(e,ag))","+(e,ag)(e,e,e,+(e,ag))","e(bK)","+(e,ag)(e)","bM(e,e,e,e)","c0(e,e,e)","c_(e,e,e)","bB(e,m,e,e)","e(e,e)","c2(e,e,e,e)","bC(e,e,e,aJ?,e,e?,e,e)","aJ(e,e,+(e,ag))","aJ(e,e,+(e,ag),e,+(e,ag))","e(e,e,e)","n(d5)","~(a1)","aK(ap)","cr<~>(~)","A(d_)","0&(e,b?)","p?(p?)","e(m)","0^(0^,0^)","aR(av)"],interceptorsByTag:null,leafTags:null,arrayRti:Symbol("$ti"),rttc:{"2;":(a,b)=>c=>c instanceof A.l&&a.b(c.a)&&b.b(c.b),"3;":(a,b,c)=>d=>d instanceof A.hl&&a.b(d.a)&&b.b(d.b)&&c.b(d.c),"4;":a=>b=>b instanceof A.hm&&A.r_(a,b.a),"5;":a=>b=>b instanceof A.hn&&A.r_(a,b.a),"8;":a=>b=>b instanceof A.ho&&A.r_(a,b.a)}} -A.xy(v.typeUniverse,JSON.parse('{"cu":"cW","jA":"cW","dF":"cW","zO":"dv","iV":{"A":[],"a3":[]},"e4":{"aK":[],"a3":[]},"fk":{"ap":[]},"cW":{"ap":[]},"y":{"m":["1"],"z":["1"],"ap":[],"h":["1"],"aU":["1"]},"iU":{"fF":[]},"mJ":{"y":["1"],"m":["1"],"z":["1"],"ap":[],"h":["1"],"aU":["1"]},"J":{"L":["1"]},"e5":{"V":[],"b5":[],"a6":["b5"]},"fi":{"V":[],"b":[],"b5":[],"a6":["b5"],"a3":[]},"iW":{"V":[],"b5":[],"a6":["b5"],"a3":[]},"ct":{"e":[],"a6":["e"],"dx":[],"aU":["@"],"a3":[]},"eu":{"h":["2"]},"eN":{"L":["2"]},"de":{"eu":["1","2"],"h":["2"],"h.E":"2"},"hb":{"de":["1","2"],"eu":["1","2"],"z":["2"],"h":["2"],"h.E":"2"},"df":{"a9":["3","4"],"d":["3","4"],"a9.K":"3","a9.V":"4"},"e8":{"a0":[]},"jF":{"a0":[]},"ah":{"C":["b"],"bL":["b"],"m":["b"],"z":["b"],"h":["b"],"C.E":"b","bL.E":"b"},"z":{"h":["1"]},"G":{"z":["1"],"h":["1"]},"cy":{"G":["1"],"z":["1"],"h":["1"],"h.E":"1","G.E":"1"},"M":{"L":["1"]},"ba":{"h":["2"],"h.E":"2"},"eU":{"ba":["1","2"],"z":["2"],"h":["2"],"h.E":"2"},"du":{"L":["2"]},"Q":{"G":["2"],"z":["2"],"h":["2"],"h.E":"2","G.E":"2"},"b_":{"h":["1"],"h.E":"1"},"cF":{"L":["1"]},"dn":{"h":["2"],"h.E":"2"},"fd":{"L":["2"]},"dE":{"h":["1"],"h.E":"1"},"eV":{"dE":["1"],"z":["1"],"h":["1"],"h.E":"1"},"fT":{"L":["1"]},"cx":{"h":["1"],"h.E":"1"},"dZ":{"cx":["1"],"z":["1"],"h":["1"],"h.E":"1"},"fO":{"L":["1"]},"eW":{"z":["1"],"h":["1"],"h.E":"1"},"eX":{"L":["1"]},"O":{"h":["1"],"h.E":"1"},"bZ":{"L":["1"]},"em":{"C":["1"],"bL":["1"],"m":["1"],"z":["1"],"h":["1"]},"X":{"G":["1"],"z":["1"],"h":["1"],"h.E":"1","G.E":"1"},"cf":{"el":[]},"l":{"ez":[],"bn":[]},"hl":{"eA":[],"bn":[]},"hm":{"d7":[],"bn":[]},"hn":{"d7":[],"bn":[]},"ho":{"d7":[],"bn":[]},"eP":{"dG":["1","2"],"eC":["1","2"],"ea":["1","2"],"hv":["1","2"],"d":["1","2"]},"dW":{"d":["1","2"]},"r":{"dW":["1","2"],"d":["1","2"]},"he":{"h":["1"],"h.E":"1"},"cK":{"L":["1"]},"a":{"dW":["1","2"],"d":["1","2"]},"dX":{"aY":["1"],"bk":["1"],"z":["1"],"h":["1"]},"b8":{"dX":["1"],"aY":["1"],"bk":["1"],"z":["1"],"h":["1"],"aY.E":"1"},"aP":{"dX":["1"],"aY":["1"],"bk":["1"],"z":["1"],"h":["1"],"aY.E":"1"},"iP":{"b7":[],"cq":[]},"e0":{"b7":[],"cq":[]},"fj":{"rs":[]},"fx":{"cC":[],"a0":[]},"iX":{"a0":[]},"k0":{"a0":[]},"jl":{"aj":[]},"hq":{"d1":[]},"b7":{"cq":[]},"i4":{"b7":[],"cq":[]},"i5":{"b7":[],"cq":[]},"jT":{"b7":[],"cq":[]},"jR":{"b7":[],"cq":[]},"dT":{"b7":[],"cq":[]},"jK":{"a0":[]},"bx":{"a9":["1","2"],"mL":["1","2"],"d":["1","2"],"a9.K":"1","a9.V":"2"},"aV":{"z":["1"],"h":["1"],"h.E":"1"},"cv":{"L":["1"]},"fo":{"z":["1"],"h":["1"],"h.E":"1"},"dr":{"L":["1"]},"dq":{"z":["b0<1,2>"],"h":["b0<1,2>"],"h.E":"b0<1,2>"},"fn":{"L":["b0<1,2>"]},"dp":{"bx":["1","2"],"a9":["1","2"],"mL":["1","2"],"d":["1","2"],"a9.K":"1","a9.V":"2"},"ez":{"bn":[]},"eA":{"bn":[]},"d7":{"bn":[]},"cV":{"qg":[],"dx":[]},"hg":{"fE":[],"cc":[]},"kw":{"h":["fE"],"h.E":"fE"},"et":{"L":["fE"]},"fS":{"cc":[]},"kU":{"h":["cc"],"h.E":"cc"},"kV":{"L":["cc"]},"dv":{"ap":[],"a3":[]},"fu":{"ap":[]},"j7":{"ap":[],"a3":[]},"aW":{"bw":["1"],"ap":[],"aU":["1"]},"ft":{"C":["V"],"aW":["V"],"m":["V"],"bw":["V"],"z":["V"],"ap":[],"aU":["V"],"h":["V"],"ak":["V"]},"by":{"C":["b"],"aW":["b"],"m":["b"],"bw":["b"],"z":["b"],"ap":[],"aU":["b"],"h":["b"],"ak":["b"]},"j8":{"C":["V"],"aW":["V"],"m":["V"],"bw":["V"],"z":["V"],"ap":[],"aU":["V"],"h":["V"],"ak":["V"],"a3":[],"C.E":"V","ak.E":"V"},"j9":{"C":["V"],"aW":["V"],"m":["V"],"bw":["V"],"z":["V"],"ap":[],"aU":["V"],"h":["V"],"ak":["V"],"a3":[],"C.E":"V","ak.E":"V"},"ja":{"by":[],"C":["b"],"aW":["b"],"m":["b"],"bw":["b"],"z":["b"],"ap":[],"aU":["b"],"h":["b"],"ak":["b"],"a3":[],"C.E":"b","ak.E":"b"},"jb":{"by":[],"iQ":[],"C":["b"],"aW":["b"],"m":["b"],"bw":["b"],"z":["b"],"ap":[],"aU":["b"],"h":["b"],"ak":["b"],"a3":[],"C.E":"b","ak.E":"b"},"jc":{"by":[],"C":["b"],"aW":["b"],"m":["b"],"bw":["b"],"z":["b"],"ap":[],"aU":["b"],"h":["b"],"ak":["b"],"a3":[],"C.E":"b","ak.E":"b"},"jd":{"by":[],"qn":[],"C":["b"],"aW":["b"],"m":["b"],"bw":["b"],"z":["b"],"ap":[],"aU":["b"],"h":["b"],"ak":["b"],"a3":[],"C.E":"b","ak.E":"b"},"fv":{"by":[],"qo":[],"C":["b"],"aW":["b"],"m":["b"],"bw":["b"],"z":["b"],"ap":[],"aU":["b"],"h":["b"],"ak":["b"],"a3":[],"C.E":"b","ak.E":"b"},"fw":{"by":[],"C":["b"],"aW":["b"],"m":["b"],"bw":["b"],"z":["b"],"ap":[],"aU":["b"],"h":["b"],"ak":["b"],"a3":[],"C.E":"b","ak.E":"b"},"dw":{"by":[],"jZ":[],"C":["b"],"aW":["b"],"m":["b"],"bw":["b"],"z":["b"],"ap":[],"aU":["b"],"h":["b"],"ak":["b"],"a3":[],"C.E":"b","ak.E":"b"},"kL":{"a0":[]},"eB":{"cC":[],"a0":[]},"bG":{"a0":[]},"h8":{"kC":["1"]},"aB":{"cr":["1"]},"hz":{"tj":[]},"kS":{"hz":[],"tj":[]},"cJ":{"a9":["1","2"],"d":["1","2"],"a9.K":"1","a9.V":"2"},"dK":{"cJ":["1","2"],"a9":["1","2"],"d":["1","2"],"a9.K":"1","a9.V":"2"},"ha":{"cJ":["1","2"],"a9":["1","2"],"d":["1","2"],"a9.K":"1","a9.V":"2"},"hc":{"z":["1"],"h":["1"],"h.E":"1"},"hd":{"L":["1"]},"cL":{"hp":["1"],"aY":["1"],"rB":["1"],"bk":["1"],"z":["1"],"h":["1"],"aY.E":"1"},"dL":{"L":["1"]},"cE":{"C":["1"],"bL":["1"],"m":["1"],"z":["1"],"h":["1"],"C.E":"1","bL.E":"1"},"C":{"m":["1"],"z":["1"],"h":["1"]},"a9":{"d":["1","2"]},"ea":{"d":["1","2"]},"dG":{"eC":["1","2"],"ea":["1","2"],"hv":["1","2"],"d":["1","2"]},"fp":{"wH":["1"],"G":["1"],"z":["1"],"h":["1"],"h.E":"1","G.E":"1"},"hf":{"L":["1"]},"aY":{"bk":["1"],"z":["1"],"h":["1"]},"hp":{"aY":["1"],"bk":["1"],"z":["1"],"h":["1"]},"hS":{"bt":["e","m"],"bt.S":"e"},"kY":{"cl":["m","e"]},"hT":{"cl":["m","e"]},"eL":{"bt":["m","e"],"bt.S":"m"},"hX":{"cl":["m","e"]},"ic":{"bt":["e","m"]},"fl":{"a0":[]},"iZ":{"a0":[]},"iY":{"bt":["p?","e"],"bt.S":"p?"},"j_":{"cl":["p?","e"]},"k4":{"bt":["e","m"],"bt.S":"e"},"k5":{"cl":["m","e"]},"i_":{"a6":["i_"]},"dh":{"a6":["dh"]},"V":{"b5":[],"a6":["b5"]},"b":{"b5":[],"a6":["b5"]},"m":{"z":["1"],"h":["1"]},"b5":{"a6":["b5"]},"qg":{"dx":[]},"fE":{"cc":[]},"bk":{"z":["1"],"h":["1"]},"e":{"a6":["e"],"dx":[]},"aq":{"i_":[],"a6":["i_"]},"hU":{"a0":[]},"cC":{"a0":[]},"bR":{"a0":[]},"ef":{"a0":[]},"fh":{"a0":[]},"jh":{"a0":[]},"fX":{"a0":[]},"fW":{"a0":[]},"dD":{"a0":[]},"i7":{"a0":[]},"jp":{"a0":[]},"fQ":{"a0":[]},"kM":{"aj":[]},"aC":{"aj":[]},"iR":{"aj":[],"a0":[]},"kW":{"d1":[]},"bV":{"h":["b"],"h.E":"b"},"jJ":{"L":["b"]},"Y":{"wP":[]},"hw":{"k1":[]},"bN":{"k1":[]},"kE":{"k1":[]},"jk":{"aj":[]},"vU":{"m":["b"],"z":["b"],"h":["b"]},"jZ":{"m":["b"],"z":["b"],"h":["b"]},"wT":{"m":["b"],"z":["b"],"h":["b"]},"vT":{"m":["b"],"z":["b"],"h":["b"]},"qn":{"m":["b"],"z":["b"],"h":["b"]},"iQ":{"m":["b"],"z":["b"],"h":["b"]},"qo":{"m":["b"],"z":["b"],"h":["b"]},"vM":{"m":["V"],"z":["V"],"h":["V"]},"vN":{"m":["V"],"z":["V"],"h":["V"]},"hQ":{"h":["bQ"],"h.E":"bQ"},"ku":{"fe":[]},"jv":{"rK":[]},"ju":{"qe":[]},"jx":{"qe":[]},"jy":{"qe":[]},"jw":{"rK":[]},"it":{"fe":[]},"e_":{"iO":[]},"fy":{"jq":[]},"d3":{"h":["e"],"h.E":"e"},"fR":{"L":["e"]},"eR":{"bS":["1"]},"e2":{"bS":["h<1>"]},"cX":{"bS":["m<1>"]},"bE":{"bS":["2"]},"ei":{"bE":["1","bk<1>"],"bS":["bk<1>"],"bE.E":"1","bE.T":"bk<1>"},"e9":{"bS":["d<1,2>"]},"eQ":{"bS":["@"]},"ev":{"h":["1"]},"dY":{"m":["1"],"ev":["1"],"z":["1"],"h":["1"]},"iz":{"I":[]},"d_":{"R":[]},"fL":{"R":[]},"ao":{"R":[]},"cs":{"R":[]},"d4":{"R":[]},"jV":{"R":[]},"je":{"R":[]},"jL":{"R":[]},"bc":{"R":[]},"di":{"bc":[],"R":[]},"j6":{"bc":[],"R":[]},"hW":{"bc":[],"R":[]},"iy":{"bc":[],"R":[]},"i3":{"bc":[],"R":[]},"ed":{"bc":[],"R":[]},"ee":{"bc":[],"R":[]},"fD":{"ed":[],"bc":[],"R":[]},"jE":{"ee":[],"bc":[],"R":[]},"eh":{"R":[]},"jf":{"bc":[],"R":[]},"jo":{"ao":[],"R":[]},"jn":{"ao":[],"R":[]},"al":{"ao":[],"R":[]},"jm":{"al":[],"ao":[],"R":[]},"bA":{"al":[],"ao":[],"R":[]},"j0":{"bA":[],"al":[],"ao":[],"R":[]},"jz":{"al":[],"ao":[],"R":[]},"ib":{"al":[],"ao":[],"R":[]},"is":{"al":[],"ao":[],"R":[]},"hN":{"bA":[],"al":[],"ao":[],"R":[]},"jW":{"bA":[],"al":[],"ao":[],"R":[]},"iw":{"bA":[],"al":[],"ao":[],"R":[]},"iv":{"al":[],"ao":[],"R":[]},"jI":{"bA":[],"al":[],"ao":[],"R":[]},"i1":{"bA":[],"al":[],"ao":[],"R":[]},"jG":{"bA":[],"al":[],"ao":[],"R":[]},"j1":{"bA":[],"al":[],"ao":[],"R":[]},"k6":{"bA":[],"al":[],"ao":[],"R":[]},"k7":{"ta":[]},"bg":{"dj":[]},"fb":{"dj":[]},"aO":{"a6":["p"]},"eT":{"am":[]},"K":{"am":[]},"i9":{"am":[]},"bY":{"am":[]},"i6":{"am":[]},"ji":{"b9":["am"],"C":["am"],"m":["am"],"z":["am"],"h":["am"],"C.E":"am","b9.E":"am"},"iu":{"C":["K"],"m":["K"],"z":["K"],"h":["K"],"C.E":"K","h.E":"K"},"bb":{"aj":[]},"iN":{"aa":[]},"hZ":{"aa":[]},"hY":{"aa":[]},"iG":{"aa":[]},"hM":{"aa":[]},"iA":{"aa":[]},"jU":{"aa":[]},"iL":{"aa":[]},"fg":{"aa":[]},"iB":{"aa":[]},"iD":{"aa":[]},"iK":{"aa":[]},"iH":{"aa":[]},"iC":{"aa":[]},"iJ":{"aa":[]},"iI":{"aa":[]},"iE":{"aa":[]},"hK":{"aa":[]},"iF":{"aa":[]},"hL":{"aa":[]},"hI":{"aa":[]},"hJ":{"aa":[]},"ia":{"aY":["e"],"bk":["e"],"z":["e"],"h":["e"],"aY.E":"e"},"kD":{"aY":["e"],"bk":["e"],"z":["e"],"h":["e"]},"ew":{"aj":[]},"b9":{"C":["1"],"m":["1"],"z":["1"],"h":["1"]},"d0":{"ta":[]},"bK":{"bl":[]},"cA":{"bl":[]},"d2":{"cA":[],"bl":[]},"H":{"cA":[],"bl":[]},"j":{"bK":[],"bl":[]},"D":{"bK":[],"bl":[]},"dC":{"bK":[],"bl":[]},"dU":{"bK":[],"bl":[]},"eS":{"bl":[]},"ff":{"L":["bl"]},"hH":{"b9":["K?"],"C":["K?"],"m":["K?"],"z":["K?"],"h":["K?"],"C.E":"K?","b9.E":"K?"},"f9":{"aj":[]},"jt":{"aj":[]},"jB":{"e1":[]},"k3":{"e1":[]},"k9":{"e1":[]},"js":{"aC":[],"aj":[]},"F":{"eg":["0&"],"cb":[]},"eg":{"cb":[]},"T":{"eg":["1"],"cb":[]},"u":{"nC":["1"],"n":["1"]},"fr":{"h":["1"],"h.E":"1"},"fs":{"L":["1"]},"cp":{"au":["~","e"],"n":["e"],"au.T":"~"},"fq":{"au":["1","2"],"n":["2"],"au.T":"1"},"fU":{"au":["1","cB<1>"],"n":["cB<1>"],"au.T":"1"},"fM":{"ca":[]},"ck":{"ca":[]},"j4":{"ca":[]},"jj":{"ca":[]},"ab":{"ca":[]},"k8":{"ca":[]},"eO":{"ds":["1","1"],"n":["1"],"ds.R":"1"},"au":{"n":["2"]},"fH":{"n":["+(1,2)"]},"dB":{"n":["+(1,2,3)"]},"fI":{"n":["+(1,2,3,4)"]},"fJ":{"n":["+(1,2,3,4,5)"]},"fK":{"n":["+(1,2,3,4,5,6,7,8)"]},"ds":{"n":["2"]},"bT":{"au":["1","1"],"n":["1"],"au.T":"1"},"fP":{"au":["1","1"],"n":["1"],"au.T":"1"},"id":{"n":["~"]},"cQ":{"n":["1"]},"jg":{"n":["e"]},"i2":{"n":["e"]},"fC":{"n":["e"]},"ej":{"n":["e"]},"hO":{"n":["e"]},"fV":{"n":["e"]},"hP":{"n":["e"]},"jH":{"n":["e"]},"bj":{"fm":["1"],"dA":["1","m<1>"],"au":["1","m<1>"],"n":["m<1>"],"au.T":"1"},"fm":{"dA":["1","m<1>"],"au":["1","m<1>"],"n":["m<1>"]},"fB":{"dA":["1","m<1>"],"au":["1","m<1>"],"n":["m<1>"],"au.T":"1"},"dA":{"au":["1","2"],"n":["2"]},"rq":{"cd":[],"bJ":[],"a6":["bJ"]},"bh":{"bW":[],"a6":["bW"]},"aw":{"rq":[],"cd":[],"bJ":[],"a6":["bJ"]},"bW":{"a6":["bW"]},"jP":{"bW":[],"a6":["bW"]},"bJ":{"a6":["bJ"]},"jQ":{"bJ":[],"a6":["bJ"]},"ek":{"bJ":[],"a6":["bJ"]},"cd":{"bJ":[],"a6":["bJ"]},"kd":{"d5":[]},"kk":{"aj":[]},"ko":{"aj":[]},"kq":{"aC":[],"aj":[]},"kr":{"aC":[],"aj":[]},"h2":{"aj":[]},"c1":{"h":["E"],"h.E":"E"},"ke":{"L":["E"]},"aR":{"E":[],"Z":["E"],"aH":[],"aS":[],"cG":[],"Z.T":"E"},"en":{"E":[],"Z":["E"],"aH":[],"aS":[],"Z.T":"E"},"fY":{"E":[],"Z":["E"],"aH":[],"aS":[],"Z.T":"E"},"kb":{"E":[],"Z":["E"],"aH":[],"aS":[]},"kc":{"ep":[],"E":[],"Z":["E"],"aH":[],"aS":[],"Z.T":"E"},"fZ":{"E":[],"Z":["E"],"aH":[],"aS":[],"Z.T":"E"},"kf":{"E":[],"d6":["E"],"aH":[],"aS":[],"d6.T":"E"},"aG":{"ep":[],"E":[],"Z":["E"],"d6":["E"],"aH":[],"aS":[],"cG":[],"d6.T":"E","Z.T":"E"},"E":{"aH":[],"aS":[]},"h4":{"E":[],"Z":["E"],"aH":[],"aS":[],"Z.T":"E"},"es":{"E":[],"Z":["E"],"aH":[],"aS":[],"Z.T":"E"},"eo":{"n":["e"]},"eq":{"Z":["E"],"aH":[],"aS":[]},"h0":{"dY":["1"],"m":["1"],"ev":["1"],"z":["1"],"h":["1"]},"h3":{"eq":[],"Z":["E"],"aH":[],"aS":[],"Z.T":"E"},"h5":{"eq":[],"Z":["E"],"aH":[],"aS":[],"Z.T":"E"},"kt":{"ks":[]},"kg":{"cl":["m","e"]},"ld":{"dH":[],"fN":["m"]},"lk":{"dH":[],"fN":["m"]},"c_":{"a1":[]},"c0":{"a1":[]},"bB":{"a1":[]},"bC":{"a1":[]},"bM":{"a1":[]},"c2":{"a1":[]},"bd":{"a1":[]},"h6":{"a1":[]},"dI":{"h6":[],"a1":[]},"kh":{"h":["a1"],"h.E":"a1"},"ki":{"L":["a1"]},"dg":{"fN":["1"]},"nC":{"n":["1"]}}')) -A.xx(v.typeUniverse,JSON.parse('{"em":1,"aW":1}')) +var v={G:typeof self!="undefined"?self:globalThis,typeUniverse:{eC:new Map(),tR:{},eT:{},tPV:{},sEA:[]},mangledGlobalNames:{b:"int",V:"double",b7:"num",e:"String",A:"bool",aN:"Null",m:"List",p:"Object",d:"Map",ar:"JSObject"},mangledNames:{},types:["A()","~()","~(aI)","aN()","A(e)","A(aI?)","n()","A(cI)","e()","A(bR)","n<@>()","n<+(e,ag)>()","A(dl)","F(F,F)","~(~())","n()","~(@)","A(p?,p?)","b(b,d)","A(aO)","A(e?)","e(cf)","~(p?)","b(p?)","~(p,e)","E(E)","aU(aU)","b(@,@)","b()","+(e,ag)(e,e,e)","@(@)","b(b)","A(K)","e(e)","aN(@)","A(E)","@()","e(aC)","A(aC)","A(bu)","A(am)","A(b)","~(p?,p?)","A(p?)","e(b)","e(K)","~(e,p?)","A(d)","e(d)","~(e,d)","~(am,d)","A(cT)","~(bu)","d(bu)","A(d1)","m>(m)","e(cU)","e(bL)","~(K)","A(aC)","bh(aC)","@(e)","~(el,@)","m(e)","ad(e)","ad(e,e,e)","cp(aI)","ad(b)","b(ad,ad)","b(b,ad)","e?()","b(bD)","co(aI)","p(bD)","p(aO)","b(aO,aO)","m(aC>)","e?(dm)","cg()","e?(E)","@(@,e)","e(m)","p?(p?)","aU(ay)","n()","n()","n()","n>()","n()","0&(e,b?)","n()","n()","n()","n()","n()","n()","b(b,b)","aN(~())","~(@,@)","dI(e)","be(e,e,m,e,e)","ay(e,e,+(e,ag))","+(e,ag)(e,e,e,+(e,ag))","aN(p,d2)","+(e,ag)(e)","bN(e,e,e,e)","c3(e,e,e)","c2(e,e,e)","bB(e,m,e,e)","e(e,e)","c5(e,e,e,e)","bC(e,e,e,aL?,e,e?,e,e)","aL(e,e,+(e,ag))","aL(e,e,+(e,ag),e,+(e,ag))","e(e,e,e)","n(d6)","~(a2)","aN(ar)","ct<~>(~)","~(b,@)","aN(@,d2)","~(e,@)","A(dx[b])","0^(0^,0^)","e(e?)"],interceptorsByTag:null,leafTags:null,arrayRti:Symbol("$ti"),rttc:{"2;":(a,b)=>c=>c instanceof A.l&&a.b(c.a)&&b.b(c.b),"3;":(a,b,c)=>d=>d instanceof A.hn&&a.b(d.a)&&b.b(d.b)&&c.b(d.c),"4;":a=>b=>b instanceof A.ho&&A.ra(a,b.a),"5;":a=>b=>b instanceof A.hp&&A.ra(a,b.a),"8;":a=>b=>b instanceof A.hq&&A.ra(a,b.a)}} +A.xI(v.typeUniverse,JSON.parse('{"cw":"cY","jA":"cY","dF":"cY","zW":"dv","iV":{"A":[],"a4":[]},"e4":{"aN":[],"a4":[]},"fm":{"ar":[]},"cY":{"ar":[]},"y":{"m":["1"],"z":["1"],"ar":[],"h":["1"],"aZ":["1"]},"iU":{"fH":[]},"mP":{"y":["1"],"m":["1"],"z":["1"],"ar":[],"h":["1"],"aZ":["1"]},"J":{"L":["1"]},"e5":{"V":[],"b7":[],"a7":["b7"]},"fk":{"V":[],"b":[],"b7":[],"a7":["b7"],"a4":[]},"iW":{"V":[],"b7":[],"a7":["b7"],"a4":[]},"cv":{"e":[],"a7":["e"],"dx":[],"aZ":["@"],"a4":[]},"eu":{"h":["2"]},"eN":{"L":["2"]},"df":{"eu":["1","2"],"h":["2"],"h.E":"2"},"hd":{"df":["1","2"],"eu":["1","2"],"z":["2"],"h":["2"],"h.E":"2"},"dg":{"ab":["3","4"],"d":["3","4"],"ab.K":"3","ab.V":"4"},"e8":{"a1":[]},"jF":{"a1":[]},"ah":{"B":["b"],"bM":["b"],"m":["b"],"z":["b"],"h":["b"],"B.E":"b","bM.E":"b"},"z":{"h":["1"]},"G":{"z":["1"],"h":["1"]},"cA":{"G":["1"],"z":["1"],"h":["1"],"h.E":"1","G.E":"1"},"N":{"L":["1"]},"aM":{"h":["2"],"h.E":"2"},"eW":{"aM":["1","2"],"z":["2"],"h":["2"],"h.E":"2"},"du":{"L":["2"]},"Q":{"G":["2"],"z":["2"],"h":["2"],"h.E":"2","G.E":"2"},"aE":{"h":["1"],"h.E":"1"},"cH":{"L":["1"]},"dp":{"h":["2"],"h.E":"2"},"ff":{"L":["2"]},"dE":{"h":["1"],"h.E":"1"},"eX":{"dE":["1"],"z":["1"],"h":["1"],"h.E":"1"},"fV":{"L":["1"]},"cz":{"h":["1"],"h.E":"1"},"dZ":{"cz":["1"],"z":["1"],"h":["1"],"h.E":"1"},"fQ":{"L":["1"]},"eY":{"z":["1"],"h":["1"],"h.E":"1"},"eZ":{"L":["1"]},"P":{"h":["1"],"h.E":"1"},"c1":{"L":["1"]},"em":{"B":["1"],"bM":["1"],"m":["1"],"z":["1"],"h":["1"]},"Y":{"G":["1"],"z":["1"],"h":["1"],"h.E":"1","G.E":"1"},"ci":{"el":[]},"l":{"ez":[],"bn":[]},"hn":{"eA":[],"bn":[]},"ho":{"d8":[],"bn":[]},"hp":{"d8":[],"bn":[]},"hq":{"d8":[],"bn":[]},"eQ":{"dG":["1","2"],"eC":["1","2"],"ea":["1","2"],"hx":["1","2"],"d":["1","2"]},"dW":{"d":["1","2"]},"r":{"dW":["1","2"],"d":["1","2"]},"hg":{"h":["1"],"h.E":"1"},"cM":{"L":["1"]},"a":{"dW":["1","2"],"d":["1","2"]},"dX":{"b2":["1"],"bk":["1"],"z":["1"],"h":["1"]},"aX":{"dX":["1"],"b2":["1"],"bk":["1"],"z":["1"],"h":["1"],"b2.E":"1"},"aS":{"dX":["1"],"b2":["1"],"bk":["1"],"z":["1"],"h":["1"],"b2.E":"1"},"iP":{"b9":[],"cs":[]},"e0":{"b9":[],"cs":[]},"fl":{"rD":[]},"fz":{"cE":[],"a1":[]},"iX":{"a1":[]},"k0":{"a1":[]},"jl":{"aj":[]},"hs":{"d2":[]},"b9":{"cs":[]},"i6":{"b9":[],"cs":[]},"i7":{"b9":[],"cs":[]},"jT":{"b9":[],"cs":[]},"jR":{"b9":[],"cs":[]},"dT":{"b9":[],"cs":[]},"jK":{"a1":[]},"bx":{"ab":["1","2"],"mR":["1","2"],"d":["1","2"],"ab.K":"1","ab.V":"2"},"b_":{"z":["1"],"h":["1"],"h.E":"1"},"cx":{"L":["1"]},"fq":{"z":["1"],"h":["1"],"h.E":"1"},"dr":{"L":["1"]},"bU":{"z":["aC<1,2>"],"h":["aC<1,2>"],"h.E":"aC<1,2>"},"fp":{"L":["aC<1,2>"]},"dq":{"bx":["1","2"],"ab":["1","2"],"mR":["1","2"],"d":["1","2"],"ab.K":"1","ab.V":"2"},"ez":{"bn":[]},"eA":{"bn":[]},"d8":{"bn":[]},"cX":{"qr":[],"dx":[]},"hi":{"fG":[],"cf":[]},"kw":{"h":["fG"],"h.E":"fG"},"et":{"L":["fG"]},"fU":{"cf":[]},"kU":{"h":["cf"],"h.E":"cf"},"kV":{"L":["cf"]},"dv":{"ar":[],"a4":[]},"fw":{"ar":[]},"j7":{"ar":[],"a4":[]},"b0":{"bw":["1"],"ar":[],"aZ":["1"]},"fv":{"B":["V"],"b0":["V"],"m":["V"],"bw":["V"],"z":["V"],"ar":[],"aZ":["V"],"h":["V"],"ak":["V"]},"by":{"B":["b"],"b0":["b"],"m":["b"],"bw":["b"],"z":["b"],"ar":[],"aZ":["b"],"h":["b"],"ak":["b"]},"j8":{"B":["V"],"b0":["V"],"m":["V"],"bw":["V"],"z":["V"],"ar":[],"aZ":["V"],"h":["V"],"ak":["V"],"a4":[],"B.E":"V","ak.E":"V"},"j9":{"B":["V"],"b0":["V"],"m":["V"],"bw":["V"],"z":["V"],"ar":[],"aZ":["V"],"h":["V"],"ak":["V"],"a4":[],"B.E":"V","ak.E":"V"},"ja":{"by":[],"B":["b"],"b0":["b"],"m":["b"],"bw":["b"],"z":["b"],"ar":[],"aZ":["b"],"h":["b"],"ak":["b"],"a4":[],"B.E":"b","ak.E":"b"},"jb":{"by":[],"iQ":[],"B":["b"],"b0":["b"],"m":["b"],"bw":["b"],"z":["b"],"ar":[],"aZ":["b"],"h":["b"],"ak":["b"],"a4":[],"B.E":"b","ak.E":"b"},"jc":{"by":[],"B":["b"],"b0":["b"],"m":["b"],"bw":["b"],"z":["b"],"ar":[],"aZ":["b"],"h":["b"],"ak":["b"],"a4":[],"B.E":"b","ak.E":"b"},"jd":{"by":[],"qy":[],"B":["b"],"b0":["b"],"m":["b"],"bw":["b"],"z":["b"],"ar":[],"aZ":["b"],"h":["b"],"ak":["b"],"a4":[],"B.E":"b","ak.E":"b"},"fx":{"by":[],"qz":[],"B":["b"],"b0":["b"],"m":["b"],"bw":["b"],"z":["b"],"ar":[],"aZ":["b"],"h":["b"],"ak":["b"],"a4":[],"B.E":"b","ak.E":"b"},"fy":{"by":[],"B":["b"],"b0":["b"],"m":["b"],"bw":["b"],"z":["b"],"ar":[],"aZ":["b"],"h":["b"],"ak":["b"],"a4":[],"B.E":"b","ak.E":"b"},"dw":{"by":[],"jZ":[],"B":["b"],"b0":["b"],"m":["b"],"bw":["b"],"z":["b"],"ar":[],"aZ":["b"],"h":["b"],"ak":["b"],"a4":[],"B.E":"b","ak.E":"b"},"kL":{"a1":[]},"eB":{"cE":[],"a1":[]},"bH":{"a1":[]},"ha":{"kC":["1"]},"aF":{"ct":["1"]},"hB":{"tt":[]},"kS":{"hB":[],"tt":[]},"cL":{"ab":["1","2"],"d":["1","2"],"ab.K":"1","ab.V":"2"},"dK":{"cL":["1","2"],"ab":["1","2"],"d":["1","2"],"ab.K":"1","ab.V":"2"},"hc":{"cL":["1","2"],"ab":["1","2"],"d":["1","2"],"ab.K":"1","ab.V":"2"},"he":{"z":["1"],"h":["1"],"h.E":"1"},"hf":{"L":["1"]},"cN":{"hr":["1"],"b2":["1"],"rL":["1"],"bk":["1"],"z":["1"],"h":["1"],"b2.E":"1"},"dL":{"L":["1"]},"cG":{"B":["1"],"bM":["1"],"m":["1"],"z":["1"],"h":["1"],"B.E":"1","bM.E":"1"},"B":{"m":["1"],"z":["1"],"h":["1"]},"ab":{"d":["1","2"]},"ea":{"d":["1","2"]},"dG":{"eC":["1","2"],"ea":["1","2"],"hx":["1","2"],"d":["1","2"]},"fr":{"wR":["1"],"G":["1"],"z":["1"],"h":["1"],"h.E":"1","G.E":"1"},"hh":{"L":["1"]},"b2":{"bk":["1"],"z":["1"],"h":["1"]},"hr":{"b2":["1"],"bk":["1"],"z":["1"],"h":["1"]},"hU":{"bt":["e","m"],"bt.S":"e"},"kY":{"cn":["m","e"]},"hV":{"cn":["m","e"]},"eL":{"bt":["m","e"],"bt.S":"m"},"hZ":{"cn":["m","e"]},"ic":{"bt":["e","m"]},"fn":{"a1":[]},"iZ":{"a1":[]},"iY":{"bt":["p?","e"],"bt.S":"p?"},"j_":{"cn":["p?","e"]},"k4":{"bt":["e","m"],"bt.S":"e"},"k5":{"cn":["m","e"]},"i1":{"a7":["i1"]},"di":{"a7":["di"]},"V":{"b7":[],"a7":["b7"]},"b":{"b7":[],"a7":["b7"]},"m":{"z":["1"],"h":["1"]},"b7":{"a7":["b7"]},"qr":{"dx":[]},"fG":{"cf":[]},"bk":{"z":["1"],"h":["1"]},"e":{"a7":["e"],"dx":[]},"as":{"i1":[],"a7":["i1"]},"hW":{"a1":[]},"cE":{"a1":[]},"bS":{"a1":[]},"ef":{"a1":[]},"fj":{"a1":[]},"jh":{"a1":[]},"fZ":{"a1":[]},"fY":{"a1":[]},"dD":{"a1":[]},"i8":{"a1":[]},"jp":{"a1":[]},"fS":{"a1":[]},"kM":{"aj":[]},"aG":{"aj":[]},"iR":{"aj":[],"a1":[]},"kW":{"d2":[]},"bX":{"h":["b"],"h.E":"b"},"jJ":{"L":["b"]},"X":{"wZ":[]},"hy":{"k1":[]},"bO":{"k1":[]},"kE":{"k1":[]},"jk":{"aj":[]},"w4":{"m":["b"],"z":["b"],"h":["b"]},"jZ":{"m":["b"],"z":["b"],"h":["b"]},"x2":{"m":["b"],"z":["b"],"h":["b"]},"w3":{"m":["b"],"z":["b"],"h":["b"]},"qy":{"m":["b"],"z":["b"],"h":["b"]},"iQ":{"m":["b"],"z":["b"],"h":["b"]},"qz":{"m":["b"],"z":["b"],"h":["b"]},"vX":{"m":["V"],"z":["V"],"h":["V"]},"vY":{"m":["V"],"z":["V"],"h":["V"]},"hS":{"h":["bR"],"h.E":"bR"},"ku":{"fg":[]},"jv":{"rU":[]},"ju":{"qp":[]},"jx":{"qp":[]},"jy":{"qp":[]},"jw":{"rU":[]},"it":{"fg":[]},"e_":{"iO":[]},"fA":{"jq":[]},"d4":{"h":["e"],"h.E":"e"},"fT":{"L":["e"]},"eS":{"bT":["1"]},"e2":{"bT":["h<1>"]},"cZ":{"bT":["m<1>"]},"bE":{"bT":["2"]},"ei":{"bE":["1","bk<1>"],"bT":["bk<1>"],"bE.E":"1","bE.T":"bk<1>"},"e9":{"bT":["d<1,2>"]},"eR":{"bT":["@"]},"ev":{"h":["1"]},"dY":{"m":["1"],"ev":["1"],"z":["1"],"h":["1"]},"iz":{"I":[]},"d1":{"R":[]},"fN":{"R":[]},"ap":{"R":[]},"cu":{"R":[]},"d5":{"R":[]},"jV":{"R":[]},"je":{"R":[]},"jL":{"R":[]},"bd":{"R":[]},"dj":{"bd":[],"R":[]},"j6":{"bd":[],"R":[]},"hY":{"bd":[],"R":[]},"iy":{"bd":[],"R":[]},"i5":{"bd":[],"R":[]},"ed":{"bd":[],"R":[]},"ee":{"bd":[],"R":[]},"fF":{"ed":[],"bd":[],"R":[]},"jE":{"ee":[],"bd":[],"R":[]},"eh":{"R":[]},"jf":{"bd":[],"R":[]},"jo":{"ap":[],"R":[]},"jn":{"ap":[],"R":[]},"al":{"ap":[],"R":[]},"jm":{"al":[],"ap":[],"R":[]},"bA":{"al":[],"ap":[],"R":[]},"j0":{"bA":[],"al":[],"ap":[],"R":[]},"jz":{"al":[],"ap":[],"R":[]},"ib":{"al":[],"ap":[],"R":[]},"is":{"al":[],"ap":[],"R":[]},"hP":{"bA":[],"al":[],"ap":[],"R":[]},"jW":{"bA":[],"al":[],"ap":[],"R":[]},"iw":{"bA":[],"al":[],"ap":[],"R":[]},"iv":{"al":[],"ap":[],"R":[]},"jI":{"bA":[],"al":[],"ap":[],"R":[]},"i3":{"bA":[],"al":[],"ap":[],"R":[]},"jG":{"bA":[],"al":[],"ap":[],"R":[]},"j1":{"bA":[],"al":[],"ap":[],"R":[]},"k6":{"bA":[],"al":[],"ap":[],"R":[]},"k7":{"tk":[]},"bh":{"dk":[]},"fd":{"dk":[]},"aR":{"a7":["p"]},"eU":{"am":[]},"K":{"am":[]},"eV":{"am":[]},"c0":{"am":[]},"eP":{"am":[]},"ji":{"bb":["am"],"B":["am"],"m":["am"],"z":["am"],"h":["am"],"B.E":"am","bb.E":"am"},"iu":{"B":["K"],"m":["K"],"z":["K"],"h":["K"],"B.E":"K","h.E":"K"},"bc":{"aj":[]},"iN":{"ac":[]},"i0":{"ac":[]},"i_":{"ac":[]},"iG":{"ac":[]},"hO":{"ac":[]},"iA":{"ac":[]},"jU":{"ac":[]},"iL":{"ac":[]},"fi":{"ac":[]},"iB":{"ac":[]},"iD":{"ac":[]},"iK":{"ac":[]},"iH":{"ac":[]},"iC":{"ac":[]},"iJ":{"ac":[]},"iI":{"ac":[]},"iE":{"ac":[]},"hM":{"ac":[]},"iF":{"ac":[]},"hN":{"ac":[]},"hK":{"ac":[]},"hL":{"ac":[]},"ia":{"b2":["e"],"bk":["e"],"z":["e"],"h":["e"],"b2.E":"e"},"kD":{"b2":["e"],"bk":["e"],"z":["e"],"h":["e"]},"ew":{"aj":[]},"bb":{"B":["1"],"m":["1"],"z":["1"],"h":["1"]},"bY":{"tk":[]},"bL":{"bl":[]},"cC":{"bl":[]},"d3":{"cC":[],"bl":[]},"H":{"cC":[],"bl":[]},"j":{"bL":[],"bl":[]},"D":{"bL":[],"bl":[]},"dC":{"bL":[],"bl":[]},"dU":{"bL":[],"bl":[]},"eT":{"bl":[]},"fh":{"L":["bl"]},"hJ":{"bb":["K?"],"B":["K?"],"m":["K?"],"z":["K?"],"h":["K?"],"B.E":"K?","bb.E":"K?"},"fb":{"aj":[]},"jt":{"aj":[]},"jB":{"e1":[]},"k3":{"e1":[]},"k9":{"e1":[]},"js":{"aG":[],"aj":[]},"F":{"eg":["0&"],"ce":[]},"eg":{"ce":[]},"T":{"eg":["1"],"ce":[]},"u":{"nI":["1"],"n":["1"]},"ft":{"h":["1"],"h.E":"1"},"fu":{"L":["1"]},"cr":{"ax":["~","e"],"n":["e"],"ax.T":"~"},"fs":{"ax":["1","2"],"n":["2"],"ax.T":"1"},"fW":{"ax":["1","cD<1>"],"n":["cD<1>"],"ax.T":"1"},"fO":{"cd":[]},"cm":{"cd":[]},"j4":{"cd":[]},"jj":{"cd":[]},"ad":{"cd":[]},"k8":{"cd":[]},"eO":{"ds":["1","1"],"n":["1"],"ds.R":"1"},"ax":{"n":["2"]},"fJ":{"n":["+(1,2)"]},"dB":{"n":["+(1,2,3)"]},"fK":{"n":["+(1,2,3,4)"]},"fL":{"n":["+(1,2,3,4,5)"]},"fM":{"n":["+(1,2,3,4,5,6,7,8)"]},"ds":{"n":["2"]},"bV":{"ax":["1","1"],"n":["1"],"ax.T":"1"},"fR":{"ax":["1","1"],"n":["1"],"ax.T":"1"},"id":{"n":["~"]},"cS":{"n":["1"]},"jg":{"n":["e"]},"i4":{"n":["e"]},"fE":{"n":["e"]},"ej":{"n":["e"]},"hQ":{"n":["e"]},"fX":{"n":["e"]},"hR":{"n":["e"]},"jH":{"n":["e"]},"bj":{"fo":["1"],"dA":["1","m<1>"],"ax":["1","m<1>"],"n":["m<1>"],"ax.T":"1"},"fo":{"dA":["1","m<1>"],"ax":["1","m<1>"],"n":["m<1>"]},"fD":{"dA":["1","m<1>"],"ax":["1","m<1>"],"n":["m<1>"],"ax.T":"1"},"dA":{"ax":["1","2"],"n":["2"]},"rB":{"cg":[],"bK":[],"a7":["bK"]},"bi":{"bZ":[],"a7":["bZ"]},"az":{"rB":[],"cg":[],"bK":[],"a7":["bK"]},"bZ":{"a7":["bZ"]},"jP":{"bZ":[],"a7":["bZ"]},"bK":{"a7":["bK"]},"jQ":{"bK":[],"a7":["bK"]},"ek":{"bK":[],"a7":["bK"]},"cg":{"bK":[],"a7":["bK"]},"kd":{"d6":[]},"kk":{"aj":[]},"ko":{"aj":[]},"kq":{"aG":[],"aj":[]},"kr":{"aG":[],"aj":[]},"h4":{"aj":[]},"c4":{"h":["E"],"h.E":"E"},"ke":{"L":["E"]},"aU":{"E":[],"a_":["E"],"aJ":[],"aV":[],"cI":[],"a_.T":"E"},"en":{"E":[],"a_":["E"],"aJ":[],"aV":[],"a_.T":"E"},"h_":{"E":[],"a_":["E"],"aJ":[],"aV":[],"a_.T":"E"},"kb":{"E":[],"a_":["E"],"aJ":[],"aV":[]},"kc":{"ep":[],"E":[],"a_":["E"],"aJ":[],"aV":[],"a_.T":"E"},"h0":{"E":[],"a_":["E"],"aJ":[],"aV":[],"a_.T":"E"},"kf":{"E":[],"d7":["E"],"aJ":[],"aV":[],"d7.T":"E"},"aI":{"ep":[],"E":[],"a_":["E"],"d7":["E"],"aJ":[],"aV":[],"cI":[],"d7.T":"E","a_.T":"E"},"E":{"aJ":[],"aV":[]},"h6":{"E":[],"a_":["E"],"aJ":[],"aV":[],"a_.T":"E"},"es":{"E":[],"a_":["E"],"aJ":[],"aV":[],"a_.T":"E"},"eo":{"n":["e"]},"eq":{"a_":["E"],"aJ":[],"aV":[]},"h2":{"dY":["1"],"m":["1"],"ev":["1"],"z":["1"],"h":["1"]},"h5":{"eq":[],"a_":["E"],"aJ":[],"aV":[],"a_.T":"E"},"h7":{"eq":[],"a_":["E"],"aJ":[],"aV":[],"a_.T":"E"},"kt":{"ks":[]},"kg":{"cn":["m","e"]},"ld":{"dH":[],"fP":["m"]},"lk":{"dH":[],"fP":["m"]},"c2":{"a2":[]},"c3":{"a2":[]},"bB":{"a2":[]},"bC":{"a2":[]},"bN":{"a2":[]},"c5":{"a2":[]},"be":{"a2":[]},"h8":{"a2":[]},"dI":{"h8":[],"a2":[]},"kh":{"h":["a2"],"h.E":"a2"},"ki":{"L":["a2"]},"dh":{"fP":["1"]},"nI":{"n":["1"]}}')) +A.xH(v.typeUniverse,JSON.parse('{"em":1,"b0":1}')) var u={S:"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u03f6\x00\u0404\u03f4 \u03f4\u03f6\u01f6\u01f6\u03f6\u03fc\u01f4\u03ff\u03ff\u0584\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u05d4\u01f4\x00\u01f4\x00\u0504\u05c4\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u0400\x00\u0400\u0200\u03f7\u0200\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u0200\u0200\u0200\u03f7\x00",t:"\x01\x01)==\xb5\x8d\x15)QeyQQ\xc9===\xf1\xf0\x00\x01)==\xb5\x8d\x15)QeyQQ\xc9===\xf1\xf0\x01\x01)==\xb5\x8d\x15(QeyQQ\xc9===\xf1\xf0\x01\x01(<<\xb4\x8c\x15(PdxPP\xc8<<<\xf1\xf0\x01\x01)==\xb5\x8d\x15(PeyQQ\xc9===\xf1\xf0\x01\x01)==\xb5\x8d\x15(PdyPQ\xc9===\xf1\xf0\x01\x01)==\xb5\x8d\x15(QdxPP\xc9===\xf1\xf0\x01\x01)==\xb5\x8d\x15(QeyQQ\xc9\u011a==\xf1\xf0\xf0\xf0\xf0\xf0\xf0\xdc\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\x01\x01)==\u0156\x8d\x15(QeyQQ\xc9===\xf1\xf0\x01\x01)==\xb5\x8d\x15(QeyQQ\xc9\u012e\u012e\u0142\xf1\xf0\x01\x01)==\xa1\x8d\x15(QeyQQ\xc9===\xf1\xf0\x00\x00(<<\xb4\x8c\x14(PdxPP\xc8<<<\xf0\xf0\x01\x01)==\xb5\x8d\x15)QeyQQ\xc9===\xf0\xf0??)\u0118=\xb5\x8c?)QeyQQ\xc9=\u0118\u0118?\xf0??)==\xb5\x8d?)QeyQQ\xc9\u012c\u012c\u0140?\xf0??)==\xb5\x8d?)QeyQQ\xc8\u0140\u0140\u0140?\xf0\xdc\xdc\xdc\xdc\xdc\u0168\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\x00\xa1\xa1\xa1\xa1\xa1\u0154\xa1\xa1\xa1\xa1\xa1\xa1\xa1\xa1\xa1\xa1\xa1\xa1\xa1\x00",e:"\x10\x10\b\x04\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x04\x04\x10\x10\x10\x10\x10\x02\x02\x02\x04\x04\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x02\x01\x01\x01\x01\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x02\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x02\x0e\x02\x02\x02\x0e\x0e\x0e\x0e\x02\x02\x10\x02\x10\x04\x10\x04\x04\x02\x10\x10\x10\x02\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x04\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x02\x02\x06\x02\x02\x02\x02\x06\x02\x06\x02\x02\x02\x02\x06\x06\x06\x02\x06\x02\x02\x02\x02\x02\x02\x02\x02\x04\x10\x10\x10\x10\x02\x02\x04\x04\x02\x02\x04\x04\x11\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x02\x02\x02\x0e\x0e\x02\x0e\x10\x04\x04\x04\x04\x02\x10\x10\x10\x02\x10\x10\x10\x11\x02\x02\x02\x02\x02\x02\x02\x10\x10\x02\x0e\x0e\x0e\x02\x02\x02\x02\x02\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x0e\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x04\x10\x10\x10\x10\x10\x10\x02\x10\x10\x04\x04\x10\x10\x02\x10\x02\x02\x10\x10\x10\x10\x10\x10\x10\x10\x04\x04\x04\x04\x04\x04\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x02\x02\x10\x10\x02\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x04\x10\x10\x10\x10\x10\x10\x10\x04\x04\x04\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x02\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x02\x02\x10\x02\x10\x10\x10\x02\x10\x10\x02\x02\x02\x02\x02\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x02\x02\x02\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x04\x04\x10\x02\x02\x02\x02\x04\x10\x10\x10\x10\x10\x10\x10\x10\x04\x04\x04\x04\x11\x04\x04\x02\x10\x10\x10\x10\x10\x10\x10\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\f\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\f\r\r\r\r\r\r\r\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\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\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\x02\x02\x02\x02\x04\x10\x10\x10\x10\x02\x04\x04\x04\x02\x04\x04\x04\x11\b\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x04\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x01\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x02\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x02\x10\x10\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x02\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x02\x02\x10\x10\x10\x10\x10\x10\x10\x02\x10\x10\x02\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x02\x02\x02\x10\x10\x10\x10\x10\x10\x01\x01\x01\x01\x01\x01\x01\x01\x10\x10\x10\x10\x10\x10\x10\x10\x02\x02\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x02\x02\x02\x02\x02\x02\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x0e\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x02\x02\x02\x02\x06\x06\x06\x02\x02\x02\x02\x02\x10\x04\x04\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x04\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\x02\x02\x02\x04\x04\x10\x04\x04\x10\x04\x04\x02\x04\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x02\x02\x02\x02\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x06\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x06\x02\x02\x02\x10\x04\x04\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x02\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x02\x0e\x0e\x02\x0e\x0e\x0e\x0e\x0e\x02\x02\x10\x02\x10\x10\x04\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x02\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x02\x0e\x0e\x02\x0e\x0e\x0e\x0e\x0e\x02\x02\x10\x02\x04\x04\x10\x10\x10\x10\x02\x02\x04\x04\x02\x02\x04\x04\x11\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x02\x02\x02\x02\x0e\x0e\x02\x0e\n\n\n\n\n\n\n\x02\x02\x02\x02\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\v\x10\x10\b\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x02\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x04\x10\x10\x10\x10\x10\x10\x10\x02\x10\x10\x10\x10\x10\x10\x04\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x02\x04\x10\x10\x10\x10\x10\x10\x10\x04\x10\x10\x04\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x02\x02\x02\x10\x02\x10\x10\x02\x10\x10\x10\x10\x10\x10\x10\b\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x04\x04\x04\x04\x04\x02\x10\x10\x02\x04\x04\x10\x04\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x04\x04\x04\x04\x04\x02\x04\x04\x02\x02\x10\x10\x10\x10\b\x04\b\x04\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x04\x04\x04\x10\x10\x10\x10\x02\x02\x10\x10\x04\x04\x04\x04\x10\x02\x02\x02\x04\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x06\x06\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x06\x06\x06\x06\x06\x06\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x06\x06\x06\x06\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x06\x06\x06\x06\x06\x06\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x02\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x02\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x02\x02\x06\x06\x06\x06\x06\x06\x06\x06\x06\x02\x06\x06\x06\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x02\x02\x02\x02\x02\x02\x02\x02\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x07\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x02\x02\x02\x02\x04\x04\x10\x10\x04\x02\x02\x02\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x10\b\x02\x10\x10\x10\x10\x02\x10\x10\x10\x02\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x04\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x04\x10\x04\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x02\x10\x02\x02\x02\x02\x02\x02\x10\x02\x02\x04\x10\x10\x02\x02\x02\x02\x02\x02\x10\x04\x10\x10\x04\x04\x04\x10\x04\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x01\x03\x0f\x01\x01\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x02\x02\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x04\x04\x10\x10\x04\x04\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x01\x01\x01\x01\x01\x01\x01\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x02\x02\x02\x01\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x10\x10\x10\x02\x02\x10\x10\x02\x02\x02\x02\x02\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x0e\x0e\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x04\x10\x10\x02\x02\x02\x02\x02\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x02\x02\x02\x10\x04\x04\x10\x10\x10\x02\x10\x02\x04\x04\x04\x04\x04\x04\x04\x10\x04\x04\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x02\x04\x10\x10\x10\x10\x04\x04\x10\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x04\x10\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x04\x04\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x04\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x04\x04\x04\x10\x10\x10\x10\x10\x10\x10\x10\x10\x04\x10\x02\b\b\x02\x02\x02\x02\x02\x10\x10\x10\x10\x02\x04\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x04\x04\x04\x10\x10\x10\x10\x10\x10\x10\x10\x04\x04\x10\x04\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x04\x10\x04\x04\x10\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x04\x04\x04\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x04\x04\x04\x10\x10\x10\x10\x10\x10\x10\x10\x10\x04\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\b\b\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x02\x02\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x04\x04\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x10\x10\x02\x10\x04\x04\x02\x02\x02\x04\x04\x04\x02\x04\x04\x04\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x10\x04\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x04\x04\x10\x10\x10\x10\x04\x04\x10\x10\x04\x04\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x02\x10\x04\x10\x04\x04\x04\x04\x02\x02\x04\x04\x02\x02\x04\x04\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x04\x04\x02\x02\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x04\x04\x10\x10\x10\x10\x10\x10\x02\x10\x02\x02\x10\x02\x10\x10\x10\x04\x02\x04\x04\x10\x10\x10\b\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x04\x04\x10\x10\x02\x02\x02\x02\x10\x10\x02\x02\x10\x10\x10\x02\x02\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\b\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x02\x02\x10\x02\x02\x02\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x04\x04\x04\x04\x10\x10\x04\x04\x04\x02\x02\x02\x02\x04\x04\x10\x04\x04\x04\x04\x04\x04\x10\x10\x10\x02\x02\x02\x02\x10\x10\x10\x04\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x10\x04\x10\x02\x04\x04\x10\x04\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x02\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x04\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x04\x04\x04\x10\x10\x10\x10\x04\x04\x10\x10\x02\x02\b\x02\x02\x02\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\b\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x10\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x04\x04\x10\x10\x10\x10\x02\x02\x04\x04\x04\x04\x10\x10\x04\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x04\x10\x02\x02\x10\x10\x10\x10\x04\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x04\x04\x04\x10\x10\x10\x10\x10\x10\x10\x10\x04\x04\x10\x10\x10\x04\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x04\x04\x10\x10\x10\x10\x10\x10\x04\x10\x04\x04\x10\x04\x10\x10\x04\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x04\x04\x04\x10\x10\x10\x04\x04\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x10\x02\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x04\x04\x04\x10\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x06\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x06\x06\x06\x06\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x02\x02\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\b\b\b\b\b\b\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x02\x01\x02\x02\x02\x10\x10\x02\x10\x10\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x02\x06\x02\x02\x02\x02\x02\x02\x06\x06\x06\x06\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x02\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x04\b\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x04\x04\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\b\b\b\b\b\b\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x04\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\n\x02\x02\x02\n\n\n\n\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x02\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x02\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x02\x02\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x02\x06\x02\x06\x02\x02\x02\x02\x02\x02\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x06\x06\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x10\x02\x10\x02\x02\x02\x02\x04\x04\x04\x04\x04\x04\x04\x04\x10\x10\x10\x10\x10\x10\x10\x10\x04\x04\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x10\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x10\x02\x04\x10\x10\x10\x10\x10\x10\x10\x10\x10\x02\x02\x02\x04\x10\x10\x10\x10\x10\x02\x10\x10\x04\x02\x04\x04\x11\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x04\x04\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x04\x10\x10\x04\x04\x02\x02\x02\x02\x02\x04\x10\x02\x02\x02\x02\x02\x02\x02\x02\x02",U:"\x15\x01)))\xb5\x8d\x01=Qeyey\xc9)))\xf1\xf0\x15\x01)))\xb5\x8d\x00=Qeyey\xc9)))\xf1\xf0\x15\x01)((\xb5\x8d\x01=Qeyey\xc9(((\xf1\xf0\x15\x01(((\xb4\x8c\x01"),i9:s("eP"),M:s("r"),o:s("r"),b:s("b8"),k0:s("dg>"),nP:s("dg"),cs:s("dh"),W:s("eS"),dA:s("eT"),hd:s("aJ"),gt:s("z<@>"),Q:s("K"),ia:s("H"),m9:s("ig"),pf:s("cQ"),cC:s("cQ<~>"),gw:s("eY"),ht:s("bg"),k5:s("bu"),mg:s("dj"),aN:s("ih"),fc:s("ii"),iA:s("eZ"),pd:s("ij"),A:s("dk"),mz:s("ik"),ib:s("f_"),fj:s("dl"),fW:s("f0"),mv:s("f1"),az:s("cR"),kZ:s("f2"),j1:s("f3"),ck:s("cm"),f5:s("f4"),aw:s("il"),eo:s("f5"),gK:s("cS"),c9:s("cn"),ni:s("f6"),eH:s("im"),on:s("f7"),iV:s("co"),p7:s("f8"),hl:s("io"),gF:s("ip"),oe:s("iq"),ad:s("fa"),am:s("fb"),fz:s("a0"),mA:s("aj"),nq:s("F"),lW:s("aC"),gY:s("cq"),ha:s("a"),mj:s("a"),j:s("a>"),r:s("a>>"),e:s("a>>>"),t:s("a>>>>"),V:s("a>>>>>"),i:s("a>>>>>>"),J:s("a>>>>>>>"),O:s("a>>>>>>>>"),l:s("a>>>>>>>>>"),x:s("a>>>>>>>>>>"),Y:s("a>>>>>>>>>>>"),k:s("a>>>>>>>>>>>>"),_:s("a>>>>>>>>>>>>>"),T:s("a>>>>>>>>>>>>>>"),E:s("a>>>>>>>>>>>>>>>"),kg:s("a>>>>>>>>>>>>>>>>"),oJ:s("a>>>>>>>>>>>>>>>>>"),m:s("aP<+(e,e)>"),fr:s("aP"),gx:s("cs"),aB:s("fg"),jL:s("iQ"),bg:s("rs"),nZ:s("e2<@>"),fY:s("h"),bq:s("h"),bO:s("h"),eh:s("h"),b7:s("h"),e7:s("h<@>"),fm:s("h"),c_:s("y"),aa:s("y"),il:s("y"),lv:s("y"),mE:s("y"),bz:s("y"),l6:s("y"),bS:s("y
"),oc:s("y"),oj:s("y"),ik:s("y"),hJ:s("y"),lu:s("y"),mt:s("y"),nS:s("y"),cJ:s("y"),jA:s("y"),oQ:s("y"),ic:s("y>"),ke:s("y>"),kU:s("y"),cx:s("y"),bD:s("y"),jj:s("y>"),bX:s("y>"),fa:s("y>"),ge:s("y>"),ig:s("y>"),dy:s("y>"),a:s("y>"),gg:s("y"),lU:s("y"),im:s("y"),fG:s("y"),iM:s("y"),s:s("y"),ks:s("y"),kG:s("y"),pp:s("y"),eB:s("y"),oi:s("y"),iJ:s("y"),g7:s("y"),dg:s("y"),dG:s("y<@>"),Z:s("y"),lB:s("y"),hg:s("y"),mf:s("y"),iy:s("aU<@>"),bE:s("e4"),bp:s("ap"),dY:s("cu"),dX:s("bw<@>"),jO:s("bx"),du:s("bj

"),ln:s("bj"),mP:s("bj<@>"),oP:s("mL"),hI:s("cX<@>"),jB:s("m"),nw:s("m"),kn:s("m"),eP:s("m>"),ez:s("m

"),aI:s("m"),bF:s("m"),lR:s("m"),aE:s("m"),iF:s("m"),p6:s("m"),p:s("m<@>"),L:s("m"),eU:s("m"),mH:s("al"),kY:s("b0"),lO:s("b0>"),a3:s("e9<@,@>"),av:s("d<@,@>"),f:s("d"),gQ:s("Q"),iZ:s("Q"),f1:s("fr>"),aj:s("by"),hD:s("dw"),fh:s("am"),d:s("aK"),K:s("p"),bQ:s("bT<+(e,ag)>"),g1:s("bT"),eK:s("bT"),kT:s("bT"),jK:s("j"),n4:s("n<@>"),m4:s("dx"),dl:s("fA"),eN:s("ab"),lZ:s("zP"),aK:s("+()"),R:s("+(e,ag)"),by:s("u"),mD:s("u>"),g:s("u<+(e,ag)>"),h:s("u"),eM:s("u"),dE:s("u"),cB:s("u"),i8:s("u"),gV:s("u"),bj:s("u"),jk:s("u"),hN:s("u"),d8:s("u"),br:s("u

"),gy:s("u<@>"),mi:s("u<~>"),lg:s("fE"),ob:s("nC<@>"),hF:s("X"),mO:s("bV"),dT:s("d_"),b9:s("eh"),bT:s("dB"),i6:s("fK"),cu:s("ei<@>"),i2:s("bk"),hj:s("bk<@>"),nO:s("bk"),i3:s("fN"),hq:s("bW"),hs:s("bJ"),ol:s("cd"),fp:s("dC"),F:s("d1"),ny:s("d2"),N:s("e"),v:s("bK"),po:s("e(cc)"),gL:s("e(e)"),y:s("T"),k2:s("T<~>"),bR:s("el"),fn:s("cA"),oI:s("bY"),n9:s("fU"),in:s("R"),aJ:s("a3"),do:s("cC"),ev:s("jZ"),mK:s("dF"),bW:s("cE"),jJ:s("k1"),w:s("O"),lS:s("O"),nk:s("O"),os:s("O"),C:s("O"),lH:s("O"),pl:s("bZ"),k7:s("bZ"),G:s("aR"),bf:s("c_"),lY:s("c0"),ee:s("bB"),n8:s("c1"),dH:s("bC"),P:s("aG"),cW:s("bM"),j7:s("d5"),mX:s("a1"),fw:s("av"),jN:s("cG"),ax:s("aH"),I:s("E"),co:s("c2"),l3:s("bd"),hO:s("h6"),f9:s("aq"),j_:s("aB<@>"),cU:s("aB<~>"),D:s("aL"),mp:s("dK"),nR:s("bD"),fA:s("ey"),k4:s("A"),c:s("A()"),cT:s("A(K)"),iW:s("A(p)"),dB:s("A(e)"),aP:s("A(aL)"),dx:s("V"),z:s("@"),mY:s("@()"),mq:s("@(p)"),ng:s("@(p,d1)"),f6:s("@(e)"),S:s("b"),g0:s("aJ?"),mV:s("K?"),cX:s("cr?"),mU:s("ap?"),n:s("d?"),X:s("p?"),g9:s("bc?"),jv:s("e?"),jt:s("e(cc)?"),nU:s("bl?"),q:s("aG?"),np:s("dJ<@,@>?"),dd:s("aL?"),nF:s("kP?"),fU:s("A?"),pi:s("A(e)?"),jX:s("V?"),aV:s("b?"),dU:s("b(K,K)?"),jh:s("b5?"),cZ:s("b5"),H:s("~"),U:s("~()"),p9:s("~(K)"),f0:s("~(h)"),m3:s("~(eb)")}})();(function constants(){var s=hunkHelpers.makeConstList +var t=(function rtii(){var s=A.a0 +return{u:s("bR"),B:s("bH"),lx:s("eL"),g4:s("D"),gS:s("ah"),hK:s("eP"),cw:s("dU"),bP:s("a7<@>"),i9:s("eQ"),M:s("r"),o:s("r"),a:s("aX"),k0:s("dh>"),nP:s("dh"),cs:s("di"),W:s("eT"),dA:s("eU"),lG:s("zT"),cc:s("eV"),hd:s("aL"),gt:s("z<@>"),Q:s("K"),ia:s("H"),m9:s("ig"),pf:s("cS"),cC:s("cS<~>"),gw:s("f_"),ht:s("bh"),k5:s("bu"),mg:s("dk"),aN:s("ih"),fc:s("ii"),iA:s("f0"),pd:s("ij"),A:s("dl"),mz:s("ik"),ib:s("f1"),fj:s("dm"),fW:s("f2"),mv:s("f3"),az:s("cT"),kZ:s("f4"),j1:s("f5"),ck:s("co"),f5:s("f6"),aw:s("il"),eo:s("f7"),gK:s("cU"),c9:s("cp"),ni:s("f8"),eH:s("im"),on:s("f9"),iV:s("cq"),p7:s("fa"),hl:s("io"),gF:s("ip"),oe:s("iq"),ad:s("fc"),am:s("fd"),fz:s("a1"),mA:s("aj"),nq:s("F"),lW:s("aG"),gY:s("cs"),ha:s("a"),mj:s("a"),j:s("a>"),r:s("a>>"),e:s("a>>>"),t:s("a>>>>"),V:s("a>>>>>"),i:s("a>>>>>>"),J:s("a>>>>>>>"),O:s("a>>>>>>>>"),l:s("a>>>>>>>>>"),x:s("a>>>>>>>>>>"),Y:s("a>>>>>>>>>>>"),k:s("a>>>>>>>>>>>>"),_:s("a>>>>>>>>>>>>>"),T:s("a>>>>>>>>>>>>>>"),E:s("a>>>>>>>>>>>>>>>"),kg:s("a>>>>>>>>>>>>>>>>"),oJ:s("a>>>>>>>>>>>>>>>>>"),m:s("aS<+(e,e)>"),fr:s("aS"),gx:s("cu"),aB:s("fi"),jL:s("iQ"),bg:s("rD"),nZ:s("e2<@>"),fY:s("h"),bq:s("h"),bO:s("h"),eh:s("h"),b7:s("h"),e7:s("h<@>"),fm:s("h"),c_:s("y
"),aa:s("y"),il:s("y"),lv:s("y"),mE:s("y"),bz:s("y
"),l6:s("y"),bS:s("y"),oc:s("y"),oj:s("y"),ik:s("y"),hJ:s("y"),lu:s("y"),mt:s("y"),nS:s("y"),cJ:s("y"),jA:s("y"),oQ:s("y"),ic:s("y>"),ke:s("y>"),kU:s("y"),cx:s("y"),bD:s("y"),jj:s("y>"),bX:s("y>"),fa:s("y>"),ge:s("y>"),ig:s("y>"),dy:s("y>"),b:s("y>"),gg:s("y"),lU:s("y"),im:s("y"),fG:s("y"),iM:s("y"),s:s("y"),ks:s("y"),kG:s("y"),pp:s("y"),eB:s("y"),oi:s("y"),iJ:s("y"),g7:s("y"),dg:s("y"),dG:s("y<@>"),Z:s("y"),lB:s("y"),hg:s("y"),mf:s("y"),iy:s("aZ<@>"),bE:s("e4"),bp:s("ar"),dY:s("cw"),dX:s("bw<@>"),jO:s("bx"),du:s("bj

"),ln:s("bj"),mP:s("bj<@>"),oP:s("mR"),hI:s("cZ<@>"),jB:s("m"),nw:s("m"),kn:s("m"),eP:s("m>"),ez:s("m

"),aI:s("m"),bF:s("m"),lR:s("m"),aE:s("m"),iF:s("m"),p6:s("m"),p:s("m<@>"),L:s("m"),eU:s("m"),mH:s("al"),mY:s("aC"),kY:s("aC"),lO:s("aC>"),a3:s("e9<@,@>"),av:s("d<@,@>"),f:s("d"),gQ:s("Q"),iZ:s("Q"),f1:s("ft>"),aj:s("by"),hD:s("dw"),fh:s("am"),d:s("aN"),K:s("p"),bQ:s("bV<+(e,ag)>"),g1:s("bV"),eK:s("bV"),kT:s("bV"),jK:s("j"),n4:s("n<@>"),m4:s("dx"),dl:s("fC"),eN:s("ad"),lZ:s("zX"),aK:s("+()"),R:s("+(e,ag)"),by:s("u"),mD:s("u>"),g:s("u<+(e,ag)>"),h:s("u"),eM:s("u"),dE:s("u"),cB:s("u"),i8:s("u"),gV:s("u"),bj:s("u"),jk:s("u"),hN:s("u"),d8:s("u"),br:s("u"),gy:s("u<@>"),mi:s("u<~>"),lg:s("fG"),ob:s("nI<@>"),hF:s("Y"),mO:s("bX"),dT:s("d1"),b9:s("eh"),bT:s("dB"),i6:s("fM"),cu:s("ei<@>"),i2:s("bk"),hj:s("bk<@>"),nO:s("bk"),i3:s("fP"),hq:s("bZ"),hs:s("bK"),ol:s("cg"),fp:s("dC"),F:s("d2"),ny:s("d3"),N:s("e"),v:s("bL"),po:s("e(cf)"),gL:s("e(e)"),y:s("T"),k2:s("T<~>"),bR:s("el"),fn:s("cC"),oI:s("c0"),n9:s("fW"),in:s("R"),aJ:s("a4"),do:s("cE"),ev:s("jZ"),mK:s("dF"),bW:s("cG
"),jJ:s("k1"),w:s("P"),lS:s("P"),nk:s("P"),os:s("P"),C:s("P"),lH:s("P"),pl:s("c1"),k7:s("c1"),G:s("aU"),bf:s("c2"),lY:s("c3"),ee:s("bB"),n8:s("c4"),dH:s("bC"),P:s("aI"),cW:s("bN"),j7:s("d6"),mX:s("a2"),fw:s("ay"),jN:s("cI"),ax:s("aJ"),I:s("E"),co:s("c5"),l3:s("be"),hO:s("h8"),f9:s("as"),j_:s("aF<@>"),cU:s("aF<~>"),D:s("aO"),mp:s("dK"),nR:s("bD"),fA:s("ey"),k4:s("A"),c:s("A()"),cT:s("A(K)"),iW:s("A(p)"),dB:s("A(e)"),aP:s("A(aO)"),dx:s("V"),z:s("@"),de:s("@()"),mq:s("@(p)"),ng:s("@(p,d2)"),f6:s("@(e)"),S:s("b"),g0:s("aL?"),mV:s("K?"),cX:s("ct?"),mU:s("ar?"),n:s("d?"),X:s("p?"),g9:s("bd?"),jv:s("e?"),jt:s("e(cf)?"),nU:s("bl?"),q:s("aI?"),np:s("dJ<@,@>?"),dd:s("aO?"),nF:s("kP?"),fU:s("A?"),pi:s("A(e)?"),jX:s("V?"),aV:s("b?"),dU:s("b(K,K)?"),jh:s("b7?"),cZ:s("b7"),H:s("~"),U:s("~()"),p9:s("~(K)"),f0:s("~(h)"),m3:s("~(eb)")}})();(function constants(){var s=hunkHelpers.makeConstList B.iO=J.iS.prototype B.a=J.y.prototype -B.f=J.fi.prototype +B.f=J.fk.prototype B.cU=J.e4.prototype B.cV=J.e5.prototype -B.b=J.ct.prototype -B.iP=J.cu.prototype -B.iQ=J.fk.prototype -B.aA=A.fv.prototype +B.b=J.cv.prototype +B.iP=J.cw.prototype +B.iQ=J.fm.prototype +B.aA=A.fx.prototype B.k=A.dw.prototype B.hw=J.jA.prototype B.cF=J.dF.prototype -B.i_=new A.hT(!1,127) -B.F=new A.i0(0,"littleEndian") -B.aU=new A.i0(1,"bigEndian") -B.ic=new A.e0(A.zm(),A.a_("e0")) -B.id=new A.hS() -B.ie=new A.hX() +B.i_=new A.hV(!1,127) +B.F=new A.i2(0,"littleEndian") +B.aU=new A.i2(1,"bigEndian") +B.ic=new A.e0(A.zv(),A.a0("e0")) +B.id=new A.hU() +B.ie=new A.hZ() B.cJ=new A.eL() -B.ig=new A.eR(A.a_("eR<0&>")) -B.l=new A.eQ() -B.cK=new A.eX(A.a_("eX<0&>")) +B.ig=new A.eS(A.a0("eS<0&>")) +B.l=new A.eR() +B.cK=new A.eZ(A.a0("eZ<0&>")) B.cL=new A.ie() B.bE=new A.ie() -B.ih=new A.f9() +B.ih=new A.fb() B.ii=new A.iR() B.cM=function getTagFallback(o) { var s = Object.prototype.toString.call(o); @@ -18138,42 +18287,42 @@ B.cN=function(hooks) { return hooks; } B.iq=new A.iY() B.ir=new A.jp() -B.u=new A.nK() +B.u=new A.nQ() B.E=new A.k4() B.cO=new A.k8() -B.L3={amp:0,apos:1,gt:2,lt:3,quot:4} -B.qL=new A.r(B.L3,["&","'",">","<",'"'],t.o) +B.L4={amp:0,apos:1,gt:2,lt:3,quot:4} +B.qL=new A.r(B.L4,["&","'",">","<",'"'],t.o) B.bF=new A.kd() -B.cP=new A.oW() +B.cP=new A.p3() B.a3=new A.kS() B.aV=new A.kW() -B.cQ=new A.p6() +B.cQ=new A.pe() B.aW=new A.dV(0,"none") B.cR=new A.dV(1,"deflate") B.cS=new A.dV(2,"bzip2") -B.is=new A.ck(!1) -B.W=new A.ck(!0) -B.it=new A.aT(0,"xhtml11") -B.iu=new A.aT(1,"dtbook") -B.iv=new A.aT(10,"imageSVG") -B.iw=new A.aT(11,"imageBMP") -B.ix=new A.aT(12,"fontTrueType") -B.iy=new A.aT(13,"fontOpenType") -B.iz=new A.aT(14,"other") -B.iA=new A.aT(2,"dtbookNCX") -B.iB=new A.aT(3,"oeb1Document") -B.iC=new A.aT(4,"xml") -B.iD=new A.aT(5,"css") -B.iE=new A.aT(6,"oeb1CSS") -B.iF=new A.aT(7,"imageGIF") -B.iG=new A.aT(8,"imageJPEG") -B.iH=new A.aT(9,"imagePNG") +B.is=new A.cm(!1) +B.W=new A.cm(!0) +B.it=new A.aY(0,"xhtml11") +B.iu=new A.aY(1,"dtbook") +B.iv=new A.aY(10,"imageSVG") +B.iw=new A.aY(11,"imageBMP") +B.ix=new A.aY(12,"fontTrueType") +B.iy=new A.aY(13,"fontOpenType") +B.iz=new A.aY(14,"other") +B.iA=new A.aY(2,"dtbookNCX") +B.iB=new A.aY(3,"oeb1Document") +B.iC=new A.aY(4,"xml") +B.iD=new A.aY(5,"css") +B.iE=new A.aY(6,"oeb1CSS") +B.iF=new A.aY(7,"imageGIF") +B.iG=new A.aY(8,"imageJPEG") +B.iH=new A.aY(9,"imagePNG") B.bG=new A.ir(0,"epub2") B.cT=new A.ir(1,"epub3") -B.iM=new A.aC("Chapter is outside the EPUB spine.",null,null) -B.iN=new A.aC("The EPUB has no readable spine.",null,null) +B.iM=new A.aG("Chapter is outside the EPUB spine.",null,null) +B.iN=new A.aG("The EPUB has no readable spine.",null,null) B.iR=new A.j_(null) -B.aX=new A.cX(B.ig,A.a_("cX")) +B.aX=new A.cZ(B.ig,A.a0("cZ")) B.af=s([82,9,106,213,48,54,165,56,191,64,163,158,129,243,215,251,124,227,57,130,155,47,255,135,52,142,67,68,196,222,233,203,84,123,148,50,166,194,35,61,238,76,149,11,66,250,195,78,8,46,161,102,40,217,36,178,118,91,162,73,109,139,209,37,114,248,246,100,134,104,152,22,212,164,92,204,93,101,182,146,108,112,72,80,253,237,185,218,94,21,70,87,167,141,157,132,144,216,171,0,140,188,211,10,247,228,88,5,184,179,69,6,208,44,30,143,202,63,15,2,193,175,189,3,1,19,138,107,58,145,17,65,79,103,220,234,151,242,207,206,240,180,230,115,150,172,116,34,231,173,53,133,226,249,55,232,28,117,223,110,71,241,26,113,29,41,197,137,111,183,98,14,170,24,190,27,252,86,62,75,198,210,121,32,154,219,192,254,120,205,90,244,31,221,168,51,136,7,199,49,177,18,16,89,39,128,236,95,96,81,127,169,25,181,74,13,45,229,122,159,147,201,156,239,160,224,59,77,174,42,245,176,200,235,187,60,131,83,153,97,23,43,4,126,186,119,214,38,225,105,20,99,85,33,12,125],t.Z) B.iS=s(["table","tbody","tfoot","thead","tr"],t.s) B.iT=s([0,0],t.Z) @@ -18237,18 +18386,18 @@ B.j5=s(["b","big","blockquote","body","br","center","code","dd","div","dl","dt", B.j=s([2774754246,2222750968,2574743534,2373680118,234025727,3177933782,2976870366,1422247313,1345335392,50397442,2842126286,2099981142,436141799,1658312629,3870010189,2591454956,1170918031,2642575903,1086966153,2273148410,368769775,3948501426,3376891790,200339707,3970805057,1742001331,4255294047,3937382213,3214711843,4154762323,2524082916,1539358875,3266819957,486407649,2928907069,1780885068,1513502316,1094664062,49805301,1338821763,1546925160,4104496465,887481809,150073849,2473685474,1943591083,1395732834,1058346282,201589768,1388824469,1696801606,1589887901,672667696,2711000631,251987210,3046808111,151455502,907153956,2608889883,1038279391,652995533,1764173646,3451040383,2675275242,453576978,2659418909,1949051992,773462580,756751158,2993581788,3998898868,4221608027,4132590244,1295727478,1641469623,3467883389,2066295122,1055122397,1898917726,2542044179,4115878822,1758581177,0,753790401,1612718144,536673507,3367088505,3982187446,3194645204,1187761037,3653156455,1262041458,3729410708,3561770136,3898103984,1255133061,1808847035,720367557,3853167183,385612781,3309519750,3612167578,1429418854,2491778321,3477423498,284817897,100794884,2172616702,4031795360,1144798328,3131023141,3819481163,4082192802,4272137053,3225436288,2324664069,2912064063,3164445985,1211644016,83228145,3753688163,3249976951,1977277103,1663115586,806359072,452984805,250868733,1842533055,1288555905,336333848,890442534,804056259,3781124030,2727843637,3427026056,957814574,1472513171,4071073621,2189328124,1195195770,2892260552,3881655738,723065138,2507371494,2690670784,2558624025,3511635870,2145180835,1713513028,2116692564,2878378043,2206763019,3393603212,703524551,3552098411,1007948840,2044649127,3797835452,487262998,1994120109,1004593371,1446130276,1312438900,503974420,3679013266,168166924,1814307912,3831258296,1573044895,1859376061,4021070915,2791465668,2828112185,2761266481,937747667,2339994098,854058965,1137232011,1496790894,3077402074,2358086913,1691735473,3528347292,3769215305,3027004632,4199962284,133494003,636152527,2942657994,2390391540,3920539207,403179536,3585784431,2289596656,1864705354,1915629148,605822008,4054230615,3350508659,1371981463,602466507,2094914977,2624877800,555687742,3712699286,3703422305,2257292045,2240449039,2423288032,1111375484,3300242801,2858837708,3628615824,84083462,32962295,302911004,2741068226,1597322602,4183250862,3501832553,2441512471,1489093017,656219450,3114180135,954327513,335083755,3013122091,856756514,3144247762,1893325225,2307821063,2811532339,3063651117,572399164,2458355477,552200649,1238290055,4283782570,2015897680,2061492133,2408352771,4171342169,2156497161,386731290,3669999461,837215959,3326231172,3093850320,3275833730,2962856233,1999449434,286199582,3417354363,4233385128,3602627437,974525996],t.Z) B.cY=s(["h1","h2","h3","h4","h5","h6"],t.s) B.bI=s([],t.lv) -B.j7=s([],A.a_("y")) -B.j8=s([],A.a_("y")) -B.ja=s([],t.a) +B.j7=s([],A.a0("y")) +B.j8=s([],A.a0("y")) +B.ja=s([],t.b) B.j6=s([],t.s) -B.j9=s([],A.a_("y")) +B.j9=s([],A.a0("y")) B.cZ=s([],t.eB) B.h=s([],t.dG) -B.iI=new A.cT(0,"undefined") -B.iJ=new A.cT(1,"front") -B.iK=new A.cT(2,"normal") -B.iL=new A.cT(3,"special") -B.jb=s([B.iI,B.iJ,B.iK,B.iL],A.a_("y")) +B.iI=new A.cV(0,"undefined") +B.iJ=new A.cV(1,"front") +B.iK=new A.cV(2,"normal") +B.iL=new A.cV(3,"special") +B.jb=s([B.iI,B.iJ,B.iK,B.iL],A.a0("y")) B.jc=s([0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117],t.Z) B.aY=s([0,1,3,7,15,31,63,127,255],t.Z) B.je=s([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],t.Z) @@ -18295,9 +18444,9 @@ B.jm=s([8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, B.d2=s([1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648],t.Z) B.jn=s([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0],t.Z) B.jo=s([49,65,89,38,83,89],t.Z) -B.dn=new A.a([0,B.aW,8,B.cR,12,B.cS],A.a_("a")) +B.dn=new A.a([0,B.aW,8,B.cR,12,B.cS],A.a0("a")) B.aS={} -B.d=new A.r(B.aS,[],A.a_("r")) +B.d=new A.r(B.aS,[],A.a0("r")) B.c=new A.a([59,B.d],t.j) B.R=new A.a([103,B.c],t.r) B.c3=new A.a([105,B.R],t.e) @@ -18442,10 +18591,10 @@ B.J0=new A.a([110,B.CZ],t.T) B.dc=new A.a([111,B.J0],t.E) B.mJ=new A.a([67,B.dc],t.kg) B.mj=new A.a([101,B.mJ],t.oJ) -B.z7=new A.a([115,B.mj],A.a_("a>>>>>>>>>>>>>>>>>>")) -B.uk=new A.a([105,B.z7],A.a_("a>>>>>>>>>>>>>>>>>>>")) -B.EQ=new A.a([119,B.uk],A.a_("a>>>>>>>>>>>>>>>>>>>>")) -B.he=new A.a([107,B.EQ],A.a_("a>>>>>>>>>>>>>>>>>>>>>")) +B.z7=new A.a([115,B.mj],A.a0("a>>>>>>>>>>>>>>>>>>")) +B.uk=new A.a([105,B.z7],A.a0("a>>>>>>>>>>>>>>>>>>>")) +B.EQ=new A.a([119,B.uk],A.a0("a>>>>>>>>>>>>>>>>>>>>")) +B.he=new A.a([107,B.EQ],A.a0("a>>>>>>>>>>>>>>>>>>>>>")) B.jG=new A.a([111,B.aO],t.t) B.h6=new A.a([117,B.jG],t.V) B.EH=new A.a([81,B.h6],t.i) @@ -18475,14 +18624,14 @@ B.h8=new A.a([117,B.AM],t.t) B.Kg=new A.a([100,B.h8],t.V) B.ke=new A.a([111,B.Kg],t.i) B.Ab=new A.a([102,B.c,114,B.ke],t.r) -B.AE=new A.a([99,B.he],A.a_("a>>>>>>>>>>>>>>>>>>>>>>")) -B.jD=new A.a([111,B.AE],A.a_("a>>>>>>>>>>>>>>>>>>>>>>>")) -B.BE=new A.a([108,B.jD],A.a_("a>>>>>>>>>>>>>>>>>>>>>>>>")) -B.mH=new A.a([67,B.BE],A.a_("a>>>>>>>>>>>>>>>>>>>>>>>>>")) -B.o0=new A.a([114,B.mH],A.a_("a>>>>>>>>>>>>>>>>>>>>>>>>>>")) -B.mf=new A.a([101,B.o0],A.a_("a>>>>>>>>>>>>>>>>>>>>>>>>>>>")) -B.CF=new A.a([116,B.mf],A.a_("a>>>>>>>>>>>>>>>>>>>>>>>>>>>>")) -B.Jp=new A.a([110,B.CF],A.a_("a>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")) +B.AE=new A.a([99,B.he],A.a0("a>>>>>>>>>>>>>>>>>>>>>>")) +B.jD=new A.a([111,B.AE],A.a0("a>>>>>>>>>>>>>>>>>>>>>>>")) +B.BE=new A.a([108,B.jD],A.a0("a>>>>>>>>>>>>>>>>>>>>>>>>")) +B.mH=new A.a([67,B.BE],A.a0("a>>>>>>>>>>>>>>>>>>>>>>>>>")) +B.o0=new A.a([114,B.mH],A.a0("a>>>>>>>>>>>>>>>>>>>>>>>>>>")) +B.mf=new A.a([101,B.o0],A.a0("a>>>>>>>>>>>>>>>>>>>>>>>>>>>")) +B.CF=new A.a([116,B.mf],A.a0("a>>>>>>>>>>>>>>>>>>>>>>>>>>>>")) +B.Jp=new A.a([110,B.CF],A.a0("a>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")) B.xI=new A.a([108,B.jz,110,B.F4,112,B.Ab,117,B.Jp],t.e) B.cd=new A.a([115,B.B],t.e) B.dh=new A.a([111,B.cd],t.t) @@ -20278,127 +20427,129 @@ B.hv=new A.ec(1,"warning") B.hu=new A.ec(0,"info") B.pd=new A.a([B.by,"error",B.hv,"warning",B.hu,"info"],t.ha) B.dZ=new A.a([B.by,"\x1b[31m",B.hv,"\x1b[35m",B.hu,"\x1b[32m"],t.ha) -B.KY={li:0,dt:1,dd:2} +B.KZ={li:0,dt:1,dd:2} B.jd=s(["li"],t.s) B.cX=s(["dt","dd"],t.s) -B.qF=new A.r(B.KY,[B.jd,B.cX,B.cX],A.a_("r>")) +B.qF=new A.r(B.KZ,[B.jd,B.cX,B.cX],A.a0("r>")) B.ra=new A.a([0,"\ufffd",13,"\r",128,"\u20ac",129,"\x81",130,"\u201a",131,"\u0192",132,"\u201e",133,"\u2026",134,"\u2020",135,"\u2021",136,"\u02c6",137,"\u2030",138,"\u0160",139,"\u2039",140,"\u0152",141,"\x8d",142,"\u017d",143,"\x8f",144,"\x90",145,"\u2018",146,"\u2019",147,"\u201c",148,"\u201d",149,"\u2022",150,"\u2013",151,"\u2014",152,"\u02dc",153,"\u2122",154,"\u0161",155,"\u203a",156,"\u0153",157,"\x9d",158,"\u017e",159,"\u0178"],t.mj) B.rn=new A.a([8,"\\b",9,"\\t",10,"\\n",11,"\\v",12,"\\f",13,"\\r",34,'\\"',39,"\\'",92,"\\\\"],t.mj) -B.L0={altglyph:0,altglyphdef:1,altglyphitem:2,animatecolor:3,animatemotion:4,animatetransform:5,clippath:6,feblend:7,fecolormatrix:8,fecomponenttransfer:9,fecomposite:10,feconvolvematrix:11,fediffuselighting:12,fedisplacementmap:13,fedistantlight:14,feflood:15,fefunca:16,fefuncb:17,fefuncg:18,fefuncr:19,fegaussianblur:20,feimage:21,femerge:22,femergenode:23,femorphology:24,feoffset:25,fepointlight:26,fespecularlighting:27,fespotlight:28,fetile:29,feturbulence:30,foreignobject:31,glyphref:32,lineargradient:33,radialgradient:34,textpath:35} -B.rp=new A.r(B.L0,["altGlyph","altGlyphDef","altGlyphItem","animateColor","animateMotion","animateTransform","clipPath","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","foreignObject","glyphRef","linearGradient","radialGradient","textPath"],t.o) -B.L9={"xlink:actuate":0,"xlink:arcrole":1,"xlink:href":2,"xlink:role":3,"xlink:show":4,"xlink:title":5,"xlink:type":6,"xml:base":7,"xml:lang":8,"xml:space":9,xmlns:10,"xmlns:xlink":11} -B.ib=new A.aO("xlink","actuate","http://www.w3.org/1999/xlink") -B.i5=new A.aO("xlink","arcrole","http://www.w3.org/1999/xlink") -B.i2=new A.aO("xlink","href","http://www.w3.org/1999/xlink") -B.i8=new A.aO("xlink","role","http://www.w3.org/1999/xlink") -B.i3=new A.aO("xlink","show","http://www.w3.org/1999/xlink") -B.i9=new A.aO("xlink","title","http://www.w3.org/1999/xlink") -B.ia=new A.aO("xlink","type","http://www.w3.org/1999/xlink") -B.i1=new A.aO("xml","base","http://www.w3.org/XML/1998/namespace") -B.i4=new A.aO("xml","lang","http://www.w3.org/XML/1998/namespace") -B.i0=new A.aO("xml","space","http://www.w3.org/XML/1998/namespace") -B.i6=new A.aO(null,"xmlns","http://www.w3.org/2000/xmlns/") -B.i7=new A.aO("xmlns","xlink","http://www.w3.org/2000/xmlns/") -B.vG=new A.r(B.L9,[B.ib,B.i5,B.i2,B.i8,B.i3,B.i9,B.ia,B.i1,B.i4,B.i0,B.i6,B.i7],A.a_("r")) -B.L8={"437":0,"850":1,"852":2,"855":3,"857":4,"860":5,"861":6,"862":7,"863":8,"865":9,"866":10,"869":11,ansix341968:12,ansix341986:13,arabic:14,ascii:15,asmo708:16,big5:17,big5hkscs:18,chinese:19,cp037:20,cp1026:21,cp154:22,cp367:23,cp424:24,cp437:25,cp500:26,cp775:27,cp819:28,cp850:29,cp852:30,cp855:31,cp857:32,cp860:33,cp861:34,cp862:35,cp863:36,cp864:37,cp865:38,cp866:39,cp869:40,cp936:41,cpgr:42,cpis:43,csascii:44,csbig5:45,cseuckr:46,cseucpkdfmtjapanese:47,csgb2312:48,cshproman8:49,csibm037:50,csibm1026:51,csibm424:52,csibm500:53,csibm855:54,csibm857:55,csibm860:56,csibm861:57,csibm863:58,csibm864:59,csibm865:60,csibm866:61,csibm869:62,csiso2022jp:63,csiso2022jp2:64,csiso2022kr:65,csiso58gb231280:66,csisolatin1:67,csisolatin2:68,csisolatin3:69,csisolatin4:70,csisolatin5:71,csisolatin6:72,csisolatinarabic:73,csisolatincyrillic:74,csisolatingreek:75,csisolatinhebrew:76,cskoi8r:77,csksc56011987:78,cspc775baltic:79,cspc850multilingual:80,cspc862latinhebrew:81,cspc8codepage437:82,cspcp852:83,csptcp154:84,csshiftjis:85,csunicode11utf7:86,cyrillic:87,cyrillicasian:88,ebcdiccpbe:89,ebcdiccpca:90,ebcdiccpch:91,ebcdiccphe:92,ebcdiccpnl:93,ebcdiccpus:94,ebcdiccpwt:95,ecma114:96,ecma118:97,elot928:98,eucjp:99,euckr:100,extendedunixcodepackedformatforjapanese:101,gb18030:102,gb2312:103,gb231280:104,gbk:105,greek:106,greek8:107,hebrew:108,hproman8:109,hzgb2312:110,ibm037:111,ibm1026:112,ibm367:113,ibm424:114,ibm437:115,ibm500:116,ibm775:117,ibm819:118,ibm850:119,ibm852:120,ibm855:121,ibm857:122,ibm860:123,ibm861:124,ibm862:125,ibm863:126,ibm864:127,ibm865:128,ibm866:129,ibm869:130,iso2022jp:131,iso2022jp2:132,iso2022kr:133,iso646irv1991:134,iso646us:135,iso88591:136,iso885910:137,iso8859101992:138,iso885911987:139,iso885913:140,iso885914:141,iso8859141998:142,iso885915:143,iso885916:144,iso8859162001:145,iso88592:146,iso885921987:147,iso88593:148,iso885931988:149,iso88594:150,iso885941988:151,iso88595:152,iso885951988:153,iso88596:154,iso885961987:155,iso88597:156,iso885971987:157,iso88598:158,iso885981988:159,iso88599:160,iso885991989:161,isoceltic:162,isoir100:163,isoir101:164,isoir109:165,isoir110:166,isoir126:167,isoir127:168,isoir138:169,isoir144:170,isoir148:171,isoir149:172,isoir157:173,isoir199:174,isoir226:175,isoir58:176,isoir6:177,koi8r:178,koi8u:179,korean:180,ksc5601:181,ksc56011987:182,ksc56011989:183,l1:184,l10:185,l2:186,l3:187,l4:188,l5:189,l6:190,l8:191,latin1:192,latin10:193,latin2:194,latin3:195,latin4:196,latin5:197,latin6:198,latin8:199,latin9:200,ms936:201,mskanji:202,pt154:203,ptcp154:204,r8:205,roman8:206,shiftjis:207,tis620:208,unicode11utf7:209,us:210,usascii:211,utf16:212,utf16be:213,utf16le:214,utf8:215,windows1250:216,windows1251:217,windows1252:218,windows1253:219,windows1254:220,windows1255:221,windows1256:222,windows1257:223,windows1258:224,windows936:225,"x-x-big5":226} -B.vX=new A.r(B.L8,["cp437","cp850","cp852","cp855","cp857","cp860","cp861","cp862","cp863","cp865","cp866","cp869","ascii","ascii","iso8859-6","ascii","iso8859-6","big5","big5hkscs","gbk","cp037","cp1026","ptcp154","ascii","cp424","cp437","cp500","cp775","windows-1252","cp850","cp852","cp855","cp857","cp860","cp861","cp862","cp863","cp864","cp865","cp866","cp869","gbk","cp869","cp861","ascii","big5","cp949","euc_jp","gbk","hp-roman8","cp037","cp1026","cp424","cp500","cp855","cp857","cp860","cp861","cp863","cp864","cp865","cp866","cp869","iso2022_jp","iso2022_jp_2","iso2022_kr","gbk","windows-1252","iso8859-2","iso8859-3","iso8859-4","windows-1254","iso8859-10","iso8859-6","iso8859-5","iso8859-7","iso8859-8","koi8-r","cp949","cp775","cp850","cp862","cp437","cp852","ptcp154","shift_jis","utf-7","iso8859-5","ptcp154","cp500","cp037","cp500","cp424","cp037","cp037","cp037","iso8859-6","iso8859-7","iso8859-7","euc_jp","cp949","euc_jp","gb18030","gbk","gbk","gbk","iso8859-7","iso8859-7","iso8859-8","hp-roman8","hz","cp037","cp1026","ascii","cp424","cp437","cp500","cp775","windows-1252","cp850","cp852","cp855","cp857","cp860","cp861","cp862","cp863","cp864","cp865","cp866","cp869","iso2022_jp","iso2022_jp_2","iso2022_kr","ascii","ascii","windows-1252","iso8859-10","iso8859-10","windows-1252","iso8859-13","iso8859-14","iso8859-14","iso8859-15","iso8859-16","iso8859-16","iso8859-2","iso8859-2","iso8859-3","iso8859-3","iso8859-4","iso8859-4","iso8859-5","iso8859-5","iso8859-6","iso8859-6","iso8859-7","iso8859-7","iso8859-8","iso8859-8","windows-1254","windows-1254","iso8859-14","windows-1252","iso8859-2","iso8859-3","iso8859-4","iso8859-7","iso8859-6","iso8859-8","iso8859-5","windows-1254","cp949","iso8859-10","iso8859-14","iso8859-16","gbk","ascii","koi8-r","koi8-u","cp949","cp949","cp949","cp949","windows-1252","iso8859-16","iso8859-2","iso8859-3","iso8859-4","windows-1254","iso8859-10","iso8859-14","windows-1252","iso8859-16","iso8859-2","iso8859-3","iso8859-4","windows-1254","iso8859-10","iso8859-14","iso8859-15","gbk","shift_jis","ptcp154","ptcp154","hp-roman8","hp-roman8","shift_jis","cp874","utf-7","ascii","ascii","utf-16","utf-16-be","utf-16-le","utf-8","cp1250","cp1251","cp1252","cp1253","cp1254","cp1255","cp1256","cp1257","cp1258","gbk","big5"],t.o) +B.L1={altglyph:0,altglyphdef:1,altglyphitem:2,animatecolor:3,animatemotion:4,animatetransform:5,clippath:6,feblend:7,fecolormatrix:8,fecomponenttransfer:9,fecomposite:10,feconvolvematrix:11,fediffuselighting:12,fedisplacementmap:13,fedistantlight:14,feflood:15,fefunca:16,fefuncb:17,fefuncg:18,fefuncr:19,fegaussianblur:20,feimage:21,femerge:22,femergenode:23,femorphology:24,feoffset:25,fepointlight:26,fespecularlighting:27,fespotlight:28,fetile:29,feturbulence:30,foreignobject:31,glyphref:32,lineargradient:33,radialgradient:34,textpath:35} +B.rp=new A.r(B.L1,["altGlyph","altGlyphDef","altGlyphItem","animateColor","animateMotion","animateTransform","clipPath","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","foreignObject","glyphRef","linearGradient","radialGradient","textPath"],t.o) +B.Lc={"xlink:actuate":0,"xlink:arcrole":1,"xlink:href":2,"xlink:role":3,"xlink:show":4,"xlink:title":5,"xlink:type":6,"xml:base":7,"xml:lang":8,"xml:space":9,xmlns:10,"xmlns:xlink":11} +B.ib=new A.aR("xlink","actuate","http://www.w3.org/1999/xlink") +B.i5=new A.aR("xlink","arcrole","http://www.w3.org/1999/xlink") +B.i2=new A.aR("xlink","href","http://www.w3.org/1999/xlink") +B.i8=new A.aR("xlink","role","http://www.w3.org/1999/xlink") +B.i3=new A.aR("xlink","show","http://www.w3.org/1999/xlink") +B.i9=new A.aR("xlink","title","http://www.w3.org/1999/xlink") +B.ia=new A.aR("xlink","type","http://www.w3.org/1999/xlink") +B.i1=new A.aR("xml","base","http://www.w3.org/XML/1998/namespace") +B.i4=new A.aR("xml","lang","http://www.w3.org/XML/1998/namespace") +B.i0=new A.aR("xml","space","http://www.w3.org/XML/1998/namespace") +B.i6=new A.aR(null,"xmlns","http://www.w3.org/2000/xmlns/") +B.i7=new A.aR("xmlns","xlink","http://www.w3.org/2000/xmlns/") +B.vG=new A.r(B.Lc,[B.ib,B.i5,B.i2,B.i8,B.i3,B.i9,B.ia,B.i1,B.i4,B.i0,B.i6,B.i7],A.a0("r")) +B.Lb={"437":0,"850":1,"852":2,"855":3,"857":4,"860":5,"861":6,"862":7,"863":8,"865":9,"866":10,"869":11,ansix341968:12,ansix341986:13,arabic:14,ascii:15,asmo708:16,big5:17,big5hkscs:18,chinese:19,cp037:20,cp1026:21,cp154:22,cp367:23,cp424:24,cp437:25,cp500:26,cp775:27,cp819:28,cp850:29,cp852:30,cp855:31,cp857:32,cp860:33,cp861:34,cp862:35,cp863:36,cp864:37,cp865:38,cp866:39,cp869:40,cp936:41,cpgr:42,cpis:43,csascii:44,csbig5:45,cseuckr:46,cseucpkdfmtjapanese:47,csgb2312:48,cshproman8:49,csibm037:50,csibm1026:51,csibm424:52,csibm500:53,csibm855:54,csibm857:55,csibm860:56,csibm861:57,csibm863:58,csibm864:59,csibm865:60,csibm866:61,csibm869:62,csiso2022jp:63,csiso2022jp2:64,csiso2022kr:65,csiso58gb231280:66,csisolatin1:67,csisolatin2:68,csisolatin3:69,csisolatin4:70,csisolatin5:71,csisolatin6:72,csisolatinarabic:73,csisolatincyrillic:74,csisolatingreek:75,csisolatinhebrew:76,cskoi8r:77,csksc56011987:78,cspc775baltic:79,cspc850multilingual:80,cspc862latinhebrew:81,cspc8codepage437:82,cspcp852:83,csptcp154:84,csshiftjis:85,csunicode11utf7:86,cyrillic:87,cyrillicasian:88,ebcdiccpbe:89,ebcdiccpca:90,ebcdiccpch:91,ebcdiccphe:92,ebcdiccpnl:93,ebcdiccpus:94,ebcdiccpwt:95,ecma114:96,ecma118:97,elot928:98,eucjp:99,euckr:100,extendedunixcodepackedformatforjapanese:101,gb18030:102,gb2312:103,gb231280:104,gbk:105,greek:106,greek8:107,hebrew:108,hproman8:109,hzgb2312:110,ibm037:111,ibm1026:112,ibm367:113,ibm424:114,ibm437:115,ibm500:116,ibm775:117,ibm819:118,ibm850:119,ibm852:120,ibm855:121,ibm857:122,ibm860:123,ibm861:124,ibm862:125,ibm863:126,ibm864:127,ibm865:128,ibm866:129,ibm869:130,iso2022jp:131,iso2022jp2:132,iso2022kr:133,iso646irv1991:134,iso646us:135,iso88591:136,iso885910:137,iso8859101992:138,iso885911987:139,iso885913:140,iso885914:141,iso8859141998:142,iso885915:143,iso885916:144,iso8859162001:145,iso88592:146,iso885921987:147,iso88593:148,iso885931988:149,iso88594:150,iso885941988:151,iso88595:152,iso885951988:153,iso88596:154,iso885961987:155,iso88597:156,iso885971987:157,iso88598:158,iso885981988:159,iso88599:160,iso885991989:161,isoceltic:162,isoir100:163,isoir101:164,isoir109:165,isoir110:166,isoir126:167,isoir127:168,isoir138:169,isoir144:170,isoir148:171,isoir149:172,isoir157:173,isoir199:174,isoir226:175,isoir58:176,isoir6:177,koi8r:178,koi8u:179,korean:180,ksc5601:181,ksc56011987:182,ksc56011989:183,l1:184,l10:185,l2:186,l3:187,l4:188,l5:189,l6:190,l8:191,latin1:192,latin10:193,latin2:194,latin3:195,latin4:196,latin5:197,latin6:198,latin8:199,latin9:200,ms936:201,mskanji:202,pt154:203,ptcp154:204,r8:205,roman8:206,shiftjis:207,tis620:208,unicode11utf7:209,us:210,usascii:211,utf16:212,utf16be:213,utf16le:214,utf8:215,windows1250:216,windows1251:217,windows1252:218,windows1253:219,windows1254:220,windows1255:221,windows1256:222,windows1257:223,windows1258:224,windows936:225,"x-x-big5":226} +B.vX=new A.r(B.Lb,["cp437","cp850","cp852","cp855","cp857","cp860","cp861","cp862","cp863","cp865","cp866","cp869","ascii","ascii","iso8859-6","ascii","iso8859-6","big5","big5hkscs","gbk","cp037","cp1026","ptcp154","ascii","cp424","cp437","cp500","cp775","windows-1252","cp850","cp852","cp855","cp857","cp860","cp861","cp862","cp863","cp864","cp865","cp866","cp869","gbk","cp869","cp861","ascii","big5","cp949","euc_jp","gbk","hp-roman8","cp037","cp1026","cp424","cp500","cp855","cp857","cp860","cp861","cp863","cp864","cp865","cp866","cp869","iso2022_jp","iso2022_jp_2","iso2022_kr","gbk","windows-1252","iso8859-2","iso8859-3","iso8859-4","windows-1254","iso8859-10","iso8859-6","iso8859-5","iso8859-7","iso8859-8","koi8-r","cp949","cp775","cp850","cp862","cp437","cp852","ptcp154","shift_jis","utf-7","iso8859-5","ptcp154","cp500","cp037","cp500","cp424","cp037","cp037","cp037","iso8859-6","iso8859-7","iso8859-7","euc_jp","cp949","euc_jp","gb18030","gbk","gbk","gbk","iso8859-7","iso8859-7","iso8859-8","hp-roman8","hz","cp037","cp1026","ascii","cp424","cp437","cp500","cp775","windows-1252","cp850","cp852","cp855","cp857","cp860","cp861","cp862","cp863","cp864","cp865","cp866","cp869","iso2022_jp","iso2022_jp_2","iso2022_kr","ascii","ascii","windows-1252","iso8859-10","iso8859-10","windows-1252","iso8859-13","iso8859-14","iso8859-14","iso8859-15","iso8859-16","iso8859-16","iso8859-2","iso8859-2","iso8859-3","iso8859-3","iso8859-4","iso8859-4","iso8859-5","iso8859-5","iso8859-6","iso8859-6","iso8859-7","iso8859-7","iso8859-8","iso8859-8","windows-1254","windows-1254","iso8859-14","windows-1252","iso8859-2","iso8859-3","iso8859-4","iso8859-7","iso8859-6","iso8859-8","iso8859-5","windows-1254","cp949","iso8859-10","iso8859-14","iso8859-16","gbk","ascii","koi8-r","koi8-u","cp949","cp949","cp949","cp949","windows-1252","iso8859-16","iso8859-2","iso8859-3","iso8859-4","windows-1254","iso8859-10","iso8859-14","windows-1252","iso8859-16","iso8859-2","iso8859-3","iso8859-4","windows-1254","iso8859-10","iso8859-14","iso8859-15","gbk","shift_jis","ptcp154","ptcp154","hp-roman8","hp-roman8","shift_jis","cp874","utf-7","ascii","ascii","utf-16","utf-16-be","utf-16-le","utf-8","cp1250","cp1251","cp1252","cp1253","cp1254","cp1255","cp1256","cp1257","cp1258","gbk","big5"],t.o) B.Ac=new A.r(B.aS,[],t.o) -B.bi=new A.r(B.aS,[],A.a_("r")) -B.fa=new A.r(B.aS,[],A.a_("r")) -B.KW={AElig:0,"AElig;":1,AMP:2,"AMP;":3,Aacute:4,"Aacute;":5,"Abreve;":6,Acirc:7,"Acirc;":8,"Acy;":9,"Afr;":10,Agrave:11,"Agrave;":12,"Alpha;":13,"Amacr;":14,"And;":15,"Aogon;":16,"Aopf;":17,"ApplyFunction;":18,Aring:19,"Aring;":20,"Ascr;":21,"Assign;":22,Atilde:23,"Atilde;":24,Auml:25,"Auml;":26,"Backslash;":27,"Barv;":28,"Barwed;":29,"Bcy;":30,"Because;":31,"Bernoullis;":32,"Beta;":33,"Bfr;":34,"Bopf;":35,"Breve;":36,"Bscr;":37,"Bumpeq;":38,"CHcy;":39,COPY:40,"COPY;":41,"Cacute;":42,"Cap;":43,"CapitalDifferentialD;":44,"Cayleys;":45,"Ccaron;":46,Ccedil:47,"Ccedil;":48,"Ccirc;":49,"Cconint;":50,"Cdot;":51,"Cedilla;":52,"CenterDot;":53,"Cfr;":54,"Chi;":55,"CircleDot;":56,"CircleMinus;":57,"CirclePlus;":58,"CircleTimes;":59,"ClockwiseContourIntegral;":60,"CloseCurlyDoubleQuote;":61,"CloseCurlyQuote;":62,"Colon;":63,"Colone;":64,"Congruent;":65,"Conint;":66,"ContourIntegral;":67,"Copf;":68,"Coproduct;":69,"CounterClockwiseContourIntegral;":70,"Cross;":71,"Cscr;":72,"Cup;":73,"CupCap;":74,"DD;":75,"DDotrahd;":76,"DJcy;":77,"DScy;":78,"DZcy;":79,"Dagger;":80,"Darr;":81,"Dashv;":82,"Dcaron;":83,"Dcy;":84,"Del;":85,"Delta;":86,"Dfr;":87,"DiacriticalAcute;":88,"DiacriticalDot;":89,"DiacriticalDoubleAcute;":90,"DiacriticalGrave;":91,"DiacriticalTilde;":92,"Diamond;":93,"DifferentialD;":94,"Dopf;":95,"Dot;":96,"DotDot;":97,"DotEqual;":98,"DoubleContourIntegral;":99,"DoubleDot;":100,"DoubleDownArrow;":101,"DoubleLeftArrow;":102,"DoubleLeftRightArrow;":103,"DoubleLeftTee;":104,"DoubleLongLeftArrow;":105,"DoubleLongLeftRightArrow;":106,"DoubleLongRightArrow;":107,"DoubleRightArrow;":108,"DoubleRightTee;":109,"DoubleUpArrow;":110,"DoubleUpDownArrow;":111,"DoubleVerticalBar;":112,"DownArrow;":113,"DownArrowBar;":114,"DownArrowUpArrow;":115,"DownBreve;":116,"DownLeftRightVector;":117,"DownLeftTeeVector;":118,"DownLeftVector;":119,"DownLeftVectorBar;":120,"DownRightTeeVector;":121,"DownRightVector;":122,"DownRightVectorBar;":123,"DownTee;":124,"DownTeeArrow;":125,"Downarrow;":126,"Dscr;":127,"Dstrok;":128,"ENG;":129,ETH:130,"ETH;":131,Eacute:132,"Eacute;":133,"Ecaron;":134,Ecirc:135,"Ecirc;":136,"Ecy;":137,"Edot;":138,"Efr;":139,Egrave:140,"Egrave;":141,"Element;":142,"Emacr;":143,"EmptySmallSquare;":144,"EmptyVerySmallSquare;":145,"Eogon;":146,"Eopf;":147,"Epsilon;":148,"Equal;":149,"EqualTilde;":150,"Equilibrium;":151,"Escr;":152,"Esim;":153,"Eta;":154,Euml:155,"Euml;":156,"Exists;":157,"ExponentialE;":158,"Fcy;":159,"Ffr;":160,"FilledSmallSquare;":161,"FilledVerySmallSquare;":162,"Fopf;":163,"ForAll;":164,"Fouriertrf;":165,"Fscr;":166,"GJcy;":167,GT:168,"GT;":169,"Gamma;":170,"Gammad;":171,"Gbreve;":172,"Gcedil;":173,"Gcirc;":174,"Gcy;":175,"Gdot;":176,"Gfr;":177,"Gg;":178,"Gopf;":179,"GreaterEqual;":180,"GreaterEqualLess;":181,"GreaterFullEqual;":182,"GreaterGreater;":183,"GreaterLess;":184,"GreaterSlantEqual;":185,"GreaterTilde;":186,"Gscr;":187,"Gt;":188,"HARDcy;":189,"Hacek;":190,"Hat;":191,"Hcirc;":192,"Hfr;":193,"HilbertSpace;":194,"Hopf;":195,"HorizontalLine;":196,"Hscr;":197,"Hstrok;":198,"HumpDownHump;":199,"HumpEqual;":200,"IEcy;":201,"IJlig;":202,"IOcy;":203,Iacute:204,"Iacute;":205,Icirc:206,"Icirc;":207,"Icy;":208,"Idot;":209,"Ifr;":210,Igrave:211,"Igrave;":212,"Im;":213,"Imacr;":214,"ImaginaryI;":215,"Implies;":216,"Int;":217,"Integral;":218,"Intersection;":219,"InvisibleComma;":220,"InvisibleTimes;":221,"Iogon;":222,"Iopf;":223,"Iota;":224,"Iscr;":225,"Itilde;":226,"Iukcy;":227,Iuml:228,"Iuml;":229,"Jcirc;":230,"Jcy;":231,"Jfr;":232,"Jopf;":233,"Jscr;":234,"Jsercy;":235,"Jukcy;":236,"KHcy;":237,"KJcy;":238,"Kappa;":239,"Kcedil;":240,"Kcy;":241,"Kfr;":242,"Kopf;":243,"Kscr;":244,"LJcy;":245,LT:246,"LT;":247,"Lacute;":248,"Lambda;":249,"Lang;":250,"Laplacetrf;":251,"Larr;":252,"Lcaron;":253,"Lcedil;":254,"Lcy;":255,"LeftAngleBracket;":256,"LeftArrow;":257,"LeftArrowBar;":258,"LeftArrowRightArrow;":259,"LeftCeiling;":260,"LeftDoubleBracket;":261,"LeftDownTeeVector;":262,"LeftDownVector;":263,"LeftDownVectorBar;":264,"LeftFloor;":265,"LeftRightArrow;":266,"LeftRightVector;":267,"LeftTee;":268,"LeftTeeArrow;":269,"LeftTeeVector;":270,"LeftTriangle;":271,"LeftTriangleBar;":272,"LeftTriangleEqual;":273,"LeftUpDownVector;":274,"LeftUpTeeVector;":275,"LeftUpVector;":276,"LeftUpVectorBar;":277,"LeftVector;":278,"LeftVectorBar;":279,"Leftarrow;":280,"Leftrightarrow;":281,"LessEqualGreater;":282,"LessFullEqual;":283,"LessGreater;":284,"LessLess;":285,"LessSlantEqual;":286,"LessTilde;":287,"Lfr;":288,"Ll;":289,"Lleftarrow;":290,"Lmidot;":291,"LongLeftArrow;":292,"LongLeftRightArrow;":293,"LongRightArrow;":294,"Longleftarrow;":295,"Longleftrightarrow;":296,"Longrightarrow;":297,"Lopf;":298,"LowerLeftArrow;":299,"LowerRightArrow;":300,"Lscr;":301,"Lsh;":302,"Lstrok;":303,"Lt;":304,"Map;":305,"Mcy;":306,"MediumSpace;":307,"Mellintrf;":308,"Mfr;":309,"MinusPlus;":310,"Mopf;":311,"Mscr;":312,"Mu;":313,"NJcy;":314,"Nacute;":315,"Ncaron;":316,"Ncedil;":317,"Ncy;":318,"NegativeMediumSpace;":319,"NegativeThickSpace;":320,"NegativeThinSpace;":321,"NegativeVeryThinSpace;":322,"NestedGreaterGreater;":323,"NestedLessLess;":324,"NewLine;":325,"Nfr;":326,"NoBreak;":327,"NonBreakingSpace;":328,"Nopf;":329,"Not;":330,"NotCongruent;":331,"NotCupCap;":332,"NotDoubleVerticalBar;":333,"NotElement;":334,"NotEqual;":335,"NotEqualTilde;":336,"NotExists;":337,"NotGreater;":338,"NotGreaterEqual;":339,"NotGreaterFullEqual;":340,"NotGreaterGreater;":341,"NotGreaterLess;":342,"NotGreaterSlantEqual;":343,"NotGreaterTilde;":344,"NotHumpDownHump;":345,"NotHumpEqual;":346,"NotLeftTriangle;":347,"NotLeftTriangleBar;":348,"NotLeftTriangleEqual;":349,"NotLess;":350,"NotLessEqual;":351,"NotLessGreater;":352,"NotLessLess;":353,"NotLessSlantEqual;":354,"NotLessTilde;":355,"NotNestedGreaterGreater;":356,"NotNestedLessLess;":357,"NotPrecedes;":358,"NotPrecedesEqual;":359,"NotPrecedesSlantEqual;":360,"NotReverseElement;":361,"NotRightTriangle;":362,"NotRightTriangleBar;":363,"NotRightTriangleEqual;":364,"NotSquareSubset;":365,"NotSquareSubsetEqual;":366,"NotSquareSuperset;":367,"NotSquareSupersetEqual;":368,"NotSubset;":369,"NotSubsetEqual;":370,"NotSucceeds;":371,"NotSucceedsEqual;":372,"NotSucceedsSlantEqual;":373,"NotSucceedsTilde;":374,"NotSuperset;":375,"NotSupersetEqual;":376,"NotTilde;":377,"NotTildeEqual;":378,"NotTildeFullEqual;":379,"NotTildeTilde;":380,"NotVerticalBar;":381,"Nscr;":382,Ntilde:383,"Ntilde;":384,"Nu;":385,"OElig;":386,Oacute:387,"Oacute;":388,Ocirc:389,"Ocirc;":390,"Ocy;":391,"Odblac;":392,"Ofr;":393,Ograve:394,"Ograve;":395,"Omacr;":396,"Omega;":397,"Omicron;":398,"Oopf;":399,"OpenCurlyDoubleQuote;":400,"OpenCurlyQuote;":401,"Or;":402,"Oscr;":403,Oslash:404,"Oslash;":405,Otilde:406,"Otilde;":407,"Otimes;":408,Ouml:409,"Ouml;":410,"OverBar;":411,"OverBrace;":412,"OverBracket;":413,"OverParenthesis;":414,"PartialD;":415,"Pcy;":416,"Pfr;":417,"Phi;":418,"Pi;":419,"PlusMinus;":420,"Poincareplane;":421,"Popf;":422,"Pr;":423,"Precedes;":424,"PrecedesEqual;":425,"PrecedesSlantEqual;":426,"PrecedesTilde;":427,"Prime;":428,"Product;":429,"Proportion;":430,"Proportional;":431,"Pscr;":432,"Psi;":433,QUOT:434,"QUOT;":435,"Qfr;":436,"Qopf;":437,"Qscr;":438,"RBarr;":439,REG:440,"REG;":441,"Racute;":442,"Rang;":443,"Rarr;":444,"Rarrtl;":445,"Rcaron;":446,"Rcedil;":447,"Rcy;":448,"Re;":449,"ReverseElement;":450,"ReverseEquilibrium;":451,"ReverseUpEquilibrium;":452,"Rfr;":453,"Rho;":454,"RightAngleBracket;":455,"RightArrow;":456,"RightArrowBar;":457,"RightArrowLeftArrow;":458,"RightCeiling;":459,"RightDoubleBracket;":460,"RightDownTeeVector;":461,"RightDownVector;":462,"RightDownVectorBar;":463,"RightFloor;":464,"RightTee;":465,"RightTeeArrow;":466,"RightTeeVector;":467,"RightTriangle;":468,"RightTriangleBar;":469,"RightTriangleEqual;":470,"RightUpDownVector;":471,"RightUpTeeVector;":472,"RightUpVector;":473,"RightUpVectorBar;":474,"RightVector;":475,"RightVectorBar;":476,"Rightarrow;":477,"Ropf;":478,"RoundImplies;":479,"Rrightarrow;":480,"Rscr;":481,"Rsh;":482,"RuleDelayed;":483,"SHCHcy;":484,"SHcy;":485,"SOFTcy;":486,"Sacute;":487,"Sc;":488,"Scaron;":489,"Scedil;":490,"Scirc;":491,"Scy;":492,"Sfr;":493,"ShortDownArrow;":494,"ShortLeftArrow;":495,"ShortRightArrow;":496,"ShortUpArrow;":497,"Sigma;":498,"SmallCircle;":499,"Sopf;":500,"Sqrt;":501,"Square;":502,"SquareIntersection;":503,"SquareSubset;":504,"SquareSubsetEqual;":505,"SquareSuperset;":506,"SquareSupersetEqual;":507,"SquareUnion;":508,"Sscr;":509,"Star;":510,"Sub;":511,"Subset;":512,"SubsetEqual;":513,"Succeeds;":514,"SucceedsEqual;":515,"SucceedsSlantEqual;":516,"SucceedsTilde;":517,"SuchThat;":518,"Sum;":519,"Sup;":520,"Superset;":521,"SupersetEqual;":522,"Supset;":523,THORN:524,"THORN;":525,"TRADE;":526,"TSHcy;":527,"TScy;":528,"Tab;":529,"Tau;":530,"Tcaron;":531,"Tcedil;":532,"Tcy;":533,"Tfr;":534,"Therefore;":535,"Theta;":536,"ThickSpace;":537,"ThinSpace;":538,"Tilde;":539,"TildeEqual;":540,"TildeFullEqual;":541,"TildeTilde;":542,"Topf;":543,"TripleDot;":544,"Tscr;":545,"Tstrok;":546,Uacute:547,"Uacute;":548,"Uarr;":549,"Uarrocir;":550,"Ubrcy;":551,"Ubreve;":552,Ucirc:553,"Ucirc;":554,"Ucy;":555,"Udblac;":556,"Ufr;":557,Ugrave:558,"Ugrave;":559,"Umacr;":560,"UnderBar;":561,"UnderBrace;":562,"UnderBracket;":563,"UnderParenthesis;":564,"Union;":565,"UnionPlus;":566,"Uogon;":567,"Uopf;":568,"UpArrow;":569,"UpArrowBar;":570,"UpArrowDownArrow;":571,"UpDownArrow;":572,"UpEquilibrium;":573,"UpTee;":574,"UpTeeArrow;":575,"Uparrow;":576,"Updownarrow;":577,"UpperLeftArrow;":578,"UpperRightArrow;":579,"Upsi;":580,"Upsilon;":581,"Uring;":582,"Uscr;":583,"Utilde;":584,Uuml:585,"Uuml;":586,"VDash;":587,"Vbar;":588,"Vcy;":589,"Vdash;":590,"Vdashl;":591,"Vee;":592,"Verbar;":593,"Vert;":594,"VerticalBar;":595,"VerticalLine;":596,"VerticalSeparator;":597,"VerticalTilde;":598,"VeryThinSpace;":599,"Vfr;":600,"Vopf;":601,"Vscr;":602,"Vvdash;":603,"Wcirc;":604,"Wedge;":605,"Wfr;":606,"Wopf;":607,"Wscr;":608,"Xfr;":609,"Xi;":610,"Xopf;":611,"Xscr;":612,"YAcy;":613,"YIcy;":614,"YUcy;":615,Yacute:616,"Yacute;":617,"Ycirc;":618,"Ycy;":619,"Yfr;":620,"Yopf;":621,"Yscr;":622,"Yuml;":623,"ZHcy;":624,"Zacute;":625,"Zcaron;":626,"Zcy;":627,"Zdot;":628,"ZeroWidthSpace;":629,"Zeta;":630,"Zfr;":631,"Zopf;":632,"Zscr;":633,aacute:634,"aacute;":635,"abreve;":636,"ac;":637,"acE;":638,"acd;":639,acirc:640,"acirc;":641,acute:642,"acute;":643,"acy;":644,aelig:645,"aelig;":646,"af;":647,"afr;":648,agrave:649,"agrave;":650,"alefsym;":651,"aleph;":652,"alpha;":653,"amacr;":654,"amalg;":655,amp:656,"amp;":657,"and;":658,"andand;":659,"andd;":660,"andslope;":661,"andv;":662,"ang;":663,"ange;":664,"angle;":665,"angmsd;":666,"angmsdaa;":667,"angmsdab;":668,"angmsdac;":669,"angmsdad;":670,"angmsdae;":671,"angmsdaf;":672,"angmsdag;":673,"angmsdah;":674,"angrt;":675,"angrtvb;":676,"angrtvbd;":677,"angsph;":678,"angst;":679,"angzarr;":680,"aogon;":681,"aopf;":682,"ap;":683,"apE;":684,"apacir;":685,"ape;":686,"apid;":687,"apos;":688,"approx;":689,"approxeq;":690,aring:691,"aring;":692,"ascr;":693,"ast;":694,"asymp;":695,"asympeq;":696,atilde:697,"atilde;":698,auml:699,"auml;":700,"awconint;":701,"awint;":702,"bNot;":703,"backcong;":704,"backepsilon;":705,"backprime;":706,"backsim;":707,"backsimeq;":708,"barvee;":709,"barwed;":710,"barwedge;":711,"bbrk;":712,"bbrktbrk;":713,"bcong;":714,"bcy;":715,"bdquo;":716,"becaus;":717,"because;":718,"bemptyv;":719,"bepsi;":720,"bernou;":721,"beta;":722,"beth;":723,"between;":724,"bfr;":725,"bigcap;":726,"bigcirc;":727,"bigcup;":728,"bigodot;":729,"bigoplus;":730,"bigotimes;":731,"bigsqcup;":732,"bigstar;":733,"bigtriangledown;":734,"bigtriangleup;":735,"biguplus;":736,"bigvee;":737,"bigwedge;":738,"bkarow;":739,"blacklozenge;":740,"blacksquare;":741,"blacktriangle;":742,"blacktriangledown;":743,"blacktriangleleft;":744,"blacktriangleright;":745,"blank;":746,"blk12;":747,"blk14;":748,"blk34;":749,"block;":750,"bne;":751,"bnequiv;":752,"bnot;":753,"bopf;":754,"bot;":755,"bottom;":756,"bowtie;":757,"boxDL;":758,"boxDR;":759,"boxDl;":760,"boxDr;":761,"boxH;":762,"boxHD;":763,"boxHU;":764,"boxHd;":765,"boxHu;":766,"boxUL;":767,"boxUR;":768,"boxUl;":769,"boxUr;":770,"boxV;":771,"boxVH;":772,"boxVL;":773,"boxVR;":774,"boxVh;":775,"boxVl;":776,"boxVr;":777,"boxbox;":778,"boxdL;":779,"boxdR;":780,"boxdl;":781,"boxdr;":782,"boxh;":783,"boxhD;":784,"boxhU;":785,"boxhd;":786,"boxhu;":787,"boxminus;":788,"boxplus;":789,"boxtimes;":790,"boxuL;":791,"boxuR;":792,"boxul;":793,"boxur;":794,"boxv;":795,"boxvH;":796,"boxvL;":797,"boxvR;":798,"boxvh;":799,"boxvl;":800,"boxvr;":801,"bprime;":802,"breve;":803,brvbar:804,"brvbar;":805,"bscr;":806,"bsemi;":807,"bsim;":808,"bsime;":809,"bsol;":810,"bsolb;":811,"bsolhsub;":812,"bull;":813,"bullet;":814,"bump;":815,"bumpE;":816,"bumpe;":817,"bumpeq;":818,"cacute;":819,"cap;":820,"capand;":821,"capbrcup;":822,"capcap;":823,"capcup;":824,"capdot;":825,"caps;":826,"caret;":827,"caron;":828,"ccaps;":829,"ccaron;":830,ccedil:831,"ccedil;":832,"ccirc;":833,"ccups;":834,"ccupssm;":835,"cdot;":836,cedil:837,"cedil;":838,"cemptyv;":839,cent:840,"cent;":841,"centerdot;":842,"cfr;":843,"chcy;":844,"check;":845,"checkmark;":846,"chi;":847,"cir;":848,"cirE;":849,"circ;":850,"circeq;":851,"circlearrowleft;":852,"circlearrowright;":853,"circledR;":854,"circledS;":855,"circledast;":856,"circledcirc;":857,"circleddash;":858,"cire;":859,"cirfnint;":860,"cirmid;":861,"cirscir;":862,"clubs;":863,"clubsuit;":864,"colon;":865,"colone;":866,"coloneq;":867,"comma;":868,"commat;":869,"comp;":870,"compfn;":871,"complement;":872,"complexes;":873,"cong;":874,"congdot;":875,"conint;":876,"copf;":877,"coprod;":878,copy:879,"copy;":880,"copysr;":881,"crarr;":882,"cross;":883,"cscr;":884,"csub;":885,"csube;":886,"csup;":887,"csupe;":888,"ctdot;":889,"cudarrl;":890,"cudarrr;":891,"cuepr;":892,"cuesc;":893,"cularr;":894,"cularrp;":895,"cup;":896,"cupbrcap;":897,"cupcap;":898,"cupcup;":899,"cupdot;":900,"cupor;":901,"cups;":902,"curarr;":903,"curarrm;":904,"curlyeqprec;":905,"curlyeqsucc;":906,"curlyvee;":907,"curlywedge;":908,curren:909,"curren;":910,"curvearrowleft;":911,"curvearrowright;":912,"cuvee;":913,"cuwed;":914,"cwconint;":915,"cwint;":916,"cylcty;":917,"dArr;":918,"dHar;":919,"dagger;":920,"daleth;":921,"darr;":922,"dash;":923,"dashv;":924,"dbkarow;":925,"dblac;":926,"dcaron;":927,"dcy;":928,"dd;":929,"ddagger;":930,"ddarr;":931,"ddotseq;":932,deg:933,"deg;":934,"delta;":935,"demptyv;":936,"dfisht;":937,"dfr;":938,"dharl;":939,"dharr;":940,"diam;":941,"diamond;":942,"diamondsuit;":943,"diams;":944,"die;":945,"digamma;":946,"disin;":947,"div;":948,divide:949,"divide;":950,"divideontimes;":951,"divonx;":952,"djcy;":953,"dlcorn;":954,"dlcrop;":955,"dollar;":956,"dopf;":957,"dot;":958,"doteq;":959,"doteqdot;":960,"dotminus;":961,"dotplus;":962,"dotsquare;":963,"doublebarwedge;":964,"downarrow;":965,"downdownarrows;":966,"downharpoonleft;":967,"downharpoonright;":968,"drbkarow;":969,"drcorn;":970,"drcrop;":971,"dscr;":972,"dscy;":973,"dsol;":974,"dstrok;":975,"dtdot;":976,"dtri;":977,"dtrif;":978,"duarr;":979,"duhar;":980,"dwangle;":981,"dzcy;":982,"dzigrarr;":983,"eDDot;":984,"eDot;":985,eacute:986,"eacute;":987,"easter;":988,"ecaron;":989,"ecir;":990,ecirc:991,"ecirc;":992,"ecolon;":993,"ecy;":994,"edot;":995,"ee;":996,"efDot;":997,"efr;":998,"eg;":999,egrave:1000,"egrave;":1001,"egs;":1002,"egsdot;":1003,"el;":1004,"elinters;":1005,"ell;":1006,"els;":1007,"elsdot;":1008,"emacr;":1009,"empty;":1010,"emptyset;":1011,"emptyv;":1012,"emsp13;":1013,"emsp14;":1014,"emsp;":1015,"eng;":1016,"ensp;":1017,"eogon;":1018,"eopf;":1019,"epar;":1020,"eparsl;":1021,"eplus;":1022,"epsi;":1023,"epsilon;":1024,"epsiv;":1025,"eqcirc;":1026,"eqcolon;":1027,"eqsim;":1028,"eqslantgtr;":1029,"eqslantless;":1030,"equals;":1031,"equest;":1032,"equiv;":1033,"equivDD;":1034,"eqvparsl;":1035,"erDot;":1036,"erarr;":1037,"escr;":1038,"esdot;":1039,"esim;":1040,"eta;":1041,eth:1042,"eth;":1043,euml:1044,"euml;":1045,"euro;":1046,"excl;":1047,"exist;":1048,"expectation;":1049,"exponentiale;":1050,"fallingdotseq;":1051,"fcy;":1052,"female;":1053,"ffilig;":1054,"fflig;":1055,"ffllig;":1056,"ffr;":1057,"filig;":1058,"fjlig;":1059,"flat;":1060,"fllig;":1061,"fltns;":1062,"fnof;":1063,"fopf;":1064,"forall;":1065,"fork;":1066,"forkv;":1067,"fpartint;":1068,frac12:1069,"frac12;":1070,"frac13;":1071,frac14:1072,"frac14;":1073,"frac15;":1074,"frac16;":1075,"frac18;":1076,"frac23;":1077,"frac25;":1078,frac34:1079,"frac34;":1080,"frac35;":1081,"frac38;":1082,"frac45;":1083,"frac56;":1084,"frac58;":1085,"frac78;":1086,"frasl;":1087,"frown;":1088,"fscr;":1089,"gE;":1090,"gEl;":1091,"gacute;":1092,"gamma;":1093,"gammad;":1094,"gap;":1095,"gbreve;":1096,"gcirc;":1097,"gcy;":1098,"gdot;":1099,"ge;":1100,"gel;":1101,"geq;":1102,"geqq;":1103,"geqslant;":1104,"ges;":1105,"gescc;":1106,"gesdot;":1107,"gesdoto;":1108,"gesdotol;":1109,"gesl;":1110,"gesles;":1111,"gfr;":1112,"gg;":1113,"ggg;":1114,"gimel;":1115,"gjcy;":1116,"gl;":1117,"glE;":1118,"gla;":1119,"glj;":1120,"gnE;":1121,"gnap;":1122,"gnapprox;":1123,"gne;":1124,"gneq;":1125,"gneqq;":1126,"gnsim;":1127,"gopf;":1128,"grave;":1129,"gscr;":1130,"gsim;":1131,"gsime;":1132,"gsiml;":1133,gt:1134,"gt;":1135,"gtcc;":1136,"gtcir;":1137,"gtdot;":1138,"gtlPar;":1139,"gtquest;":1140,"gtrapprox;":1141,"gtrarr;":1142,"gtrdot;":1143,"gtreqless;":1144,"gtreqqless;":1145,"gtrless;":1146,"gtrsim;":1147,"gvertneqq;":1148,"gvnE;":1149,"hArr;":1150,"hairsp;":1151,"half;":1152,"hamilt;":1153,"hardcy;":1154,"harr;":1155,"harrcir;":1156,"harrw;":1157,"hbar;":1158,"hcirc;":1159,"hearts;":1160,"heartsuit;":1161,"hellip;":1162,"hercon;":1163,"hfr;":1164,"hksearow;":1165,"hkswarow;":1166,"hoarr;":1167,"homtht;":1168,"hookleftarrow;":1169,"hookrightarrow;":1170,"hopf;":1171,"horbar;":1172,"hscr;":1173,"hslash;":1174,"hstrok;":1175,"hybull;":1176,"hyphen;":1177,iacute:1178,"iacute;":1179,"ic;":1180,icirc:1181,"icirc;":1182,"icy;":1183,"iecy;":1184,iexcl:1185,"iexcl;":1186,"iff;":1187,"ifr;":1188,igrave:1189,"igrave;":1190,"ii;":1191,"iiiint;":1192,"iiint;":1193,"iinfin;":1194,"iiota;":1195,"ijlig;":1196,"imacr;":1197,"image;":1198,"imagline;":1199,"imagpart;":1200,"imath;":1201,"imof;":1202,"imped;":1203,"in;":1204,"incare;":1205,"infin;":1206,"infintie;":1207,"inodot;":1208,"int;":1209,"intcal;":1210,"integers;":1211,"intercal;":1212,"intlarhk;":1213,"intprod;":1214,"iocy;":1215,"iogon;":1216,"iopf;":1217,"iota;":1218,"iprod;":1219,iquest:1220,"iquest;":1221,"iscr;":1222,"isin;":1223,"isinE;":1224,"isindot;":1225,"isins;":1226,"isinsv;":1227,"isinv;":1228,"it;":1229,"itilde;":1230,"iukcy;":1231,iuml:1232,"iuml;":1233,"jcirc;":1234,"jcy;":1235,"jfr;":1236,"jmath;":1237,"jopf;":1238,"jscr;":1239,"jsercy;":1240,"jukcy;":1241,"kappa;":1242,"kappav;":1243,"kcedil;":1244,"kcy;":1245,"kfr;":1246,"kgreen;":1247,"khcy;":1248,"kjcy;":1249,"kopf;":1250,"kscr;":1251,"lAarr;":1252,"lArr;":1253,"lAtail;":1254,"lBarr;":1255,"lE;":1256,"lEg;":1257,"lHar;":1258,"lacute;":1259,"laemptyv;":1260,"lagran;":1261,"lambda;":1262,"lang;":1263,"langd;":1264,"langle;":1265,"lap;":1266,laquo:1267,"laquo;":1268,"larr;":1269,"larrb;":1270,"larrbfs;":1271,"larrfs;":1272,"larrhk;":1273,"larrlp;":1274,"larrpl;":1275,"larrsim;":1276,"larrtl;":1277,"lat;":1278,"latail;":1279,"late;":1280,"lates;":1281,"lbarr;":1282,"lbbrk;":1283,"lbrace;":1284,"lbrack;":1285,"lbrke;":1286,"lbrksld;":1287,"lbrkslu;":1288,"lcaron;":1289,"lcedil;":1290,"lceil;":1291,"lcub;":1292,"lcy;":1293,"ldca;":1294,"ldquo;":1295,"ldquor;":1296,"ldrdhar;":1297,"ldrushar;":1298,"ldsh;":1299,"le;":1300,"leftarrow;":1301,"leftarrowtail;":1302,"leftharpoondown;":1303,"leftharpoonup;":1304,"leftleftarrows;":1305,"leftrightarrow;":1306,"leftrightarrows;":1307,"leftrightharpoons;":1308,"leftrightsquigarrow;":1309,"leftthreetimes;":1310,"leg;":1311,"leq;":1312,"leqq;":1313,"leqslant;":1314,"les;":1315,"lescc;":1316,"lesdot;":1317,"lesdoto;":1318,"lesdotor;":1319,"lesg;":1320,"lesges;":1321,"lessapprox;":1322,"lessdot;":1323,"lesseqgtr;":1324,"lesseqqgtr;":1325,"lessgtr;":1326,"lesssim;":1327,"lfisht;":1328,"lfloor;":1329,"lfr;":1330,"lg;":1331,"lgE;":1332,"lhard;":1333,"lharu;":1334,"lharul;":1335,"lhblk;":1336,"ljcy;":1337,"ll;":1338,"llarr;":1339,"llcorner;":1340,"llhard;":1341,"lltri;":1342,"lmidot;":1343,"lmoust;":1344,"lmoustache;":1345,"lnE;":1346,"lnap;":1347,"lnapprox;":1348,"lne;":1349,"lneq;":1350,"lneqq;":1351,"lnsim;":1352,"loang;":1353,"loarr;":1354,"lobrk;":1355,"longleftarrow;":1356,"longleftrightarrow;":1357,"longmapsto;":1358,"longrightarrow;":1359,"looparrowleft;":1360,"looparrowright;":1361,"lopar;":1362,"lopf;":1363,"loplus;":1364,"lotimes;":1365,"lowast;":1366,"lowbar;":1367,"loz;":1368,"lozenge;":1369,"lozf;":1370,"lpar;":1371,"lparlt;":1372,"lrarr;":1373,"lrcorner;":1374,"lrhar;":1375,"lrhard;":1376,"lrm;":1377,"lrtri;":1378,"lsaquo;":1379,"lscr;":1380,"lsh;":1381,"lsim;":1382,"lsime;":1383,"lsimg;":1384,"lsqb;":1385,"lsquo;":1386,"lsquor;":1387,"lstrok;":1388,lt:1389,"lt;":1390,"ltcc;":1391,"ltcir;":1392,"ltdot;":1393,"lthree;":1394,"ltimes;":1395,"ltlarr;":1396,"ltquest;":1397,"ltrPar;":1398,"ltri;":1399,"ltrie;":1400,"ltrif;":1401,"lurdshar;":1402,"luruhar;":1403,"lvertneqq;":1404,"lvnE;":1405,"mDDot;":1406,macr:1407,"macr;":1408,"male;":1409,"malt;":1410,"maltese;":1411,"map;":1412,"mapsto;":1413,"mapstodown;":1414,"mapstoleft;":1415,"mapstoup;":1416,"marker;":1417,"mcomma;":1418,"mcy;":1419,"mdash;":1420,"measuredangle;":1421,"mfr;":1422,"mho;":1423,micro:1424,"micro;":1425,"mid;":1426,"midast;":1427,"midcir;":1428,middot:1429,"middot;":1430,"minus;":1431,"minusb;":1432,"minusd;":1433,"minusdu;":1434,"mlcp;":1435,"mldr;":1436,"mnplus;":1437,"models;":1438,"mopf;":1439,"mp;":1440,"mscr;":1441,"mstpos;":1442,"mu;":1443,"multimap;":1444,"mumap;":1445,"nGg;":1446,"nGt;":1447,"nGtv;":1448,"nLeftarrow;":1449,"nLeftrightarrow;":1450,"nLl;":1451,"nLt;":1452,"nLtv;":1453,"nRightarrow;":1454,"nVDash;":1455,"nVdash;":1456,"nabla;":1457,"nacute;":1458,"nang;":1459,"nap;":1460,"napE;":1461,"napid;":1462,"napos;":1463,"napprox;":1464,"natur;":1465,"natural;":1466,"naturals;":1467,nbsp:1468,"nbsp;":1469,"nbump;":1470,"nbumpe;":1471,"ncap;":1472,"ncaron;":1473,"ncedil;":1474,"ncong;":1475,"ncongdot;":1476,"ncup;":1477,"ncy;":1478,"ndash;":1479,"ne;":1480,"neArr;":1481,"nearhk;":1482,"nearr;":1483,"nearrow;":1484,"nedot;":1485,"nequiv;":1486,"nesear;":1487,"nesim;":1488,"nexist;":1489,"nexists;":1490,"nfr;":1491,"ngE;":1492,"nge;":1493,"ngeq;":1494,"ngeqq;":1495,"ngeqslant;":1496,"nges;":1497,"ngsim;":1498,"ngt;":1499,"ngtr;":1500,"nhArr;":1501,"nharr;":1502,"nhpar;":1503,"ni;":1504,"nis;":1505,"nisd;":1506,"niv;":1507,"njcy;":1508,"nlArr;":1509,"nlE;":1510,"nlarr;":1511,"nldr;":1512,"nle;":1513,"nleftarrow;":1514,"nleftrightarrow;":1515,"nleq;":1516,"nleqq;":1517,"nleqslant;":1518,"nles;":1519,"nless;":1520,"nlsim;":1521,"nlt;":1522,"nltri;":1523,"nltrie;":1524,"nmid;":1525,"nopf;":1526,not:1527,"not;":1528,"notin;":1529,"notinE;":1530,"notindot;":1531,"notinva;":1532,"notinvb;":1533,"notinvc;":1534,"notni;":1535,"notniva;":1536,"notnivb;":1537,"notnivc;":1538,"npar;":1539,"nparallel;":1540,"nparsl;":1541,"npart;":1542,"npolint;":1543,"npr;":1544,"nprcue;":1545,"npre;":1546,"nprec;":1547,"npreceq;":1548,"nrArr;":1549,"nrarr;":1550,"nrarrc;":1551,"nrarrw;":1552,"nrightarrow;":1553,"nrtri;":1554,"nrtrie;":1555,"nsc;":1556,"nsccue;":1557,"nsce;":1558,"nscr;":1559,"nshortmid;":1560,"nshortparallel;":1561,"nsim;":1562,"nsime;":1563,"nsimeq;":1564,"nsmid;":1565,"nspar;":1566,"nsqsube;":1567,"nsqsupe;":1568,"nsub;":1569,"nsubE;":1570,"nsube;":1571,"nsubset;":1572,"nsubseteq;":1573,"nsubseteqq;":1574,"nsucc;":1575,"nsucceq;":1576,"nsup;":1577,"nsupE;":1578,"nsupe;":1579,"nsupset;":1580,"nsupseteq;":1581,"nsupseteqq;":1582,"ntgl;":1583,ntilde:1584,"ntilde;":1585,"ntlg;":1586,"ntriangleleft;":1587,"ntrianglelefteq;":1588,"ntriangleright;":1589,"ntrianglerighteq;":1590,"nu;":1591,"num;":1592,"numero;":1593,"numsp;":1594,"nvDash;":1595,"nvHarr;":1596,"nvap;":1597,"nvdash;":1598,"nvge;":1599,"nvgt;":1600,"nvinfin;":1601,"nvlArr;":1602,"nvle;":1603,"nvlt;":1604,"nvltrie;":1605,"nvrArr;":1606,"nvrtrie;":1607,"nvsim;":1608,"nwArr;":1609,"nwarhk;":1610,"nwarr;":1611,"nwarrow;":1612,"nwnear;":1613,"oS;":1614,oacute:1615,"oacute;":1616,"oast;":1617,"ocir;":1618,ocirc:1619,"ocirc;":1620,"ocy;":1621,"odash;":1622,"odblac;":1623,"odiv;":1624,"odot;":1625,"odsold;":1626,"oelig;":1627,"ofcir;":1628,"ofr;":1629,"ogon;":1630,ograve:1631,"ograve;":1632,"ogt;":1633,"ohbar;":1634,"ohm;":1635,"oint;":1636,"olarr;":1637,"olcir;":1638,"olcross;":1639,"oline;":1640,"olt;":1641,"omacr;":1642,"omega;":1643,"omicron;":1644,"omid;":1645,"ominus;":1646,"oopf;":1647,"opar;":1648,"operp;":1649,"oplus;":1650,"or;":1651,"orarr;":1652,"ord;":1653,"order;":1654,"orderof;":1655,ordf:1656,"ordf;":1657,ordm:1658,"ordm;":1659,"origof;":1660,"oror;":1661,"orslope;":1662,"orv;":1663,"oscr;":1664,oslash:1665,"oslash;":1666,"osol;":1667,otilde:1668,"otilde;":1669,"otimes;":1670,"otimesas;":1671,ouml:1672,"ouml;":1673,"ovbar;":1674,"par;":1675,para:1676,"para;":1677,"parallel;":1678,"parsim;":1679,"parsl;":1680,"part;":1681,"pcy;":1682,"percnt;":1683,"period;":1684,"permil;":1685,"perp;":1686,"pertenk;":1687,"pfr;":1688,"phi;":1689,"phiv;":1690,"phmmat;":1691,"phone;":1692,"pi;":1693,"pitchfork;":1694,"piv;":1695,"planck;":1696,"planckh;":1697,"plankv;":1698,"plus;":1699,"plusacir;":1700,"plusb;":1701,"pluscir;":1702,"plusdo;":1703,"plusdu;":1704,"pluse;":1705,plusmn:1706,"plusmn;":1707,"plussim;":1708,"plustwo;":1709,"pm;":1710,"pointint;":1711,"popf;":1712,pound:1713,"pound;":1714,"pr;":1715,"prE;":1716,"prap;":1717,"prcue;":1718,"pre;":1719,"prec;":1720,"precapprox;":1721,"preccurlyeq;":1722,"preceq;":1723,"precnapprox;":1724,"precneqq;":1725,"precnsim;":1726,"precsim;":1727,"prime;":1728,"primes;":1729,"prnE;":1730,"prnap;":1731,"prnsim;":1732,"prod;":1733,"profalar;":1734,"profline;":1735,"profsurf;":1736,"prop;":1737,"propto;":1738,"prsim;":1739,"prurel;":1740,"pscr;":1741,"psi;":1742,"puncsp;":1743,"qfr;":1744,"qint;":1745,"qopf;":1746,"qprime;":1747,"qscr;":1748,"quaternions;":1749,"quatint;":1750,"quest;":1751,"questeq;":1752,quot:1753,"quot;":1754,"rAarr;":1755,"rArr;":1756,"rAtail;":1757,"rBarr;":1758,"rHar;":1759,"race;":1760,"racute;":1761,"radic;":1762,"raemptyv;":1763,"rang;":1764,"rangd;":1765,"range;":1766,"rangle;":1767,raquo:1768,"raquo;":1769,"rarr;":1770,"rarrap;":1771,"rarrb;":1772,"rarrbfs;":1773,"rarrc;":1774,"rarrfs;":1775,"rarrhk;":1776,"rarrlp;":1777,"rarrpl;":1778,"rarrsim;":1779,"rarrtl;":1780,"rarrw;":1781,"ratail;":1782,"ratio;":1783,"rationals;":1784,"rbarr;":1785,"rbbrk;":1786,"rbrace;":1787,"rbrack;":1788,"rbrke;":1789,"rbrksld;":1790,"rbrkslu;":1791,"rcaron;":1792,"rcedil;":1793,"rceil;":1794,"rcub;":1795,"rcy;":1796,"rdca;":1797,"rdldhar;":1798,"rdquo;":1799,"rdquor;":1800,"rdsh;":1801,"real;":1802,"realine;":1803,"realpart;":1804,"reals;":1805,"rect;":1806,reg:1807,"reg;":1808,"rfisht;":1809,"rfloor;":1810,"rfr;":1811,"rhard;":1812,"rharu;":1813,"rharul;":1814,"rho;":1815,"rhov;":1816,"rightarrow;":1817,"rightarrowtail;":1818,"rightharpoondown;":1819,"rightharpoonup;":1820,"rightleftarrows;":1821,"rightleftharpoons;":1822,"rightrightarrows;":1823,"rightsquigarrow;":1824,"rightthreetimes;":1825,"ring;":1826,"risingdotseq;":1827,"rlarr;":1828,"rlhar;":1829,"rlm;":1830,"rmoust;":1831,"rmoustache;":1832,"rnmid;":1833,"roang;":1834,"roarr;":1835,"robrk;":1836,"ropar;":1837,"ropf;":1838,"roplus;":1839,"rotimes;":1840,"rpar;":1841,"rpargt;":1842,"rppolint;":1843,"rrarr;":1844,"rsaquo;":1845,"rscr;":1846,"rsh;":1847,"rsqb;":1848,"rsquo;":1849,"rsquor;":1850,"rthree;":1851,"rtimes;":1852,"rtri;":1853,"rtrie;":1854,"rtrif;":1855,"rtriltri;":1856,"ruluhar;":1857,"rx;":1858,"sacute;":1859,"sbquo;":1860,"sc;":1861,"scE;":1862,"scap;":1863,"scaron;":1864,"sccue;":1865,"sce;":1866,"scedil;":1867,"scirc;":1868,"scnE;":1869,"scnap;":1870,"scnsim;":1871,"scpolint;":1872,"scsim;":1873,"scy;":1874,"sdot;":1875,"sdotb;":1876,"sdote;":1877,"seArr;":1878,"searhk;":1879,"searr;":1880,"searrow;":1881,sect:1882,"sect;":1883,"semi;":1884,"seswar;":1885,"setminus;":1886,"setmn;":1887,"sext;":1888,"sfr;":1889,"sfrown;":1890,"sharp;":1891,"shchcy;":1892,"shcy;":1893,"shortmid;":1894,"shortparallel;":1895,shy:1896,"shy;":1897,"sigma;":1898,"sigmaf;":1899,"sigmav;":1900,"sim;":1901,"simdot;":1902,"sime;":1903,"simeq;":1904,"simg;":1905,"simgE;":1906,"siml;":1907,"simlE;":1908,"simne;":1909,"simplus;":1910,"simrarr;":1911,"slarr;":1912,"smallsetminus;":1913,"smashp;":1914,"smeparsl;":1915,"smid;":1916,"smile;":1917,"smt;":1918,"smte;":1919,"smtes;":1920,"softcy;":1921,"sol;":1922,"solb;":1923,"solbar;":1924,"sopf;":1925,"spades;":1926,"spadesuit;":1927,"spar;":1928,"sqcap;":1929,"sqcaps;":1930,"sqcup;":1931,"sqcups;":1932,"sqsub;":1933,"sqsube;":1934,"sqsubset;":1935,"sqsubseteq;":1936,"sqsup;":1937,"sqsupe;":1938,"sqsupset;":1939,"sqsupseteq;":1940,"squ;":1941,"square;":1942,"squarf;":1943,"squf;":1944,"srarr;":1945,"sscr;":1946,"ssetmn;":1947,"ssmile;":1948,"sstarf;":1949,"star;":1950,"starf;":1951,"straightepsilon;":1952,"straightphi;":1953,"strns;":1954,"sub;":1955,"subE;":1956,"subdot;":1957,"sube;":1958,"subedot;":1959,"submult;":1960,"subnE;":1961,"subne;":1962,"subplus;":1963,"subrarr;":1964,"subset;":1965,"subseteq;":1966,"subseteqq;":1967,"subsetneq;":1968,"subsetneqq;":1969,"subsim;":1970,"subsub;":1971,"subsup;":1972,"succ;":1973,"succapprox;":1974,"succcurlyeq;":1975,"succeq;":1976,"succnapprox;":1977,"succneqq;":1978,"succnsim;":1979,"succsim;":1980,"sum;":1981,"sung;":1982,sup1:1983,"sup1;":1984,sup2:1985,"sup2;":1986,sup3:1987,"sup3;":1988,"sup;":1989,"supE;":1990,"supdot;":1991,"supdsub;":1992,"supe;":1993,"supedot;":1994,"suphsol;":1995,"suphsub;":1996,"suplarr;":1997,"supmult;":1998,"supnE;":1999,"supne;":2000,"supplus;":2001,"supset;":2002,"supseteq;":2003,"supseteqq;":2004,"supsetneq;":2005,"supsetneqq;":2006,"supsim;":2007,"supsub;":2008,"supsup;":2009,"swArr;":2010,"swarhk;":2011,"swarr;":2012,"swarrow;":2013,"swnwar;":2014,szlig:2015,"szlig;":2016,"target;":2017,"tau;":2018,"tbrk;":2019,"tcaron;":2020,"tcedil;":2021,"tcy;":2022,"tdot;":2023,"telrec;":2024,"tfr;":2025,"there4;":2026,"therefore;":2027,"theta;":2028,"thetasym;":2029,"thetav;":2030,"thickapprox;":2031,"thicksim;":2032,"thinsp;":2033,"thkap;":2034,"thksim;":2035,thorn:2036,"thorn;":2037,"tilde;":2038,times:2039,"times;":2040,"timesb;":2041,"timesbar;":2042,"timesd;":2043,"tint;":2044,"toea;":2045,"top;":2046,"topbot;":2047,"topcir;":2048,"topf;":2049,"topfork;":2050,"tosa;":2051,"tprime;":2052,"trade;":2053,"triangle;":2054,"triangledown;":2055,"triangleleft;":2056,"trianglelefteq;":2057,"triangleq;":2058,"triangleright;":2059,"trianglerighteq;":2060,"tridot;":2061,"trie;":2062,"triminus;":2063,"triplus;":2064,"trisb;":2065,"tritime;":2066,"trpezium;":2067,"tscr;":2068,"tscy;":2069,"tshcy;":2070,"tstrok;":2071,"twixt;":2072,"twoheadleftarrow;":2073,"twoheadrightarrow;":2074,"uArr;":2075,"uHar;":2076,uacute:2077,"uacute;":2078,"uarr;":2079,"ubrcy;":2080,"ubreve;":2081,ucirc:2082,"ucirc;":2083,"ucy;":2084,"udarr;":2085,"udblac;":2086,"udhar;":2087,"ufisht;":2088,"ufr;":2089,ugrave:2090,"ugrave;":2091,"uharl;":2092,"uharr;":2093,"uhblk;":2094,"ulcorn;":2095,"ulcorner;":2096,"ulcrop;":2097,"ultri;":2098,"umacr;":2099,uml:2100,"uml;":2101,"uogon;":2102,"uopf;":2103,"uparrow;":2104,"updownarrow;":2105,"upharpoonleft;":2106,"upharpoonright;":2107,"uplus;":2108,"upsi;":2109,"upsih;":2110,"upsilon;":2111,"upuparrows;":2112,"urcorn;":2113,"urcorner;":2114,"urcrop;":2115,"uring;":2116,"urtri;":2117,"uscr;":2118,"utdot;":2119,"utilde;":2120,"utri;":2121,"utrif;":2122,"uuarr;":2123,uuml:2124,"uuml;":2125,"uwangle;":2126,"vArr;":2127,"vBar;":2128,"vBarv;":2129,"vDash;":2130,"vangrt;":2131,"varepsilon;":2132,"varkappa;":2133,"varnothing;":2134,"varphi;":2135,"varpi;":2136,"varpropto;":2137,"varr;":2138,"varrho;":2139,"varsigma;":2140,"varsubsetneq;":2141,"varsubsetneqq;":2142,"varsupsetneq;":2143,"varsupsetneqq;":2144,"vartheta;":2145,"vartriangleleft;":2146,"vartriangleright;":2147,"vcy;":2148,"vdash;":2149,"vee;":2150,"veebar;":2151,"veeeq;":2152,"vellip;":2153,"verbar;":2154,"vert;":2155,"vfr;":2156,"vltri;":2157,"vnsub;":2158,"vnsup;":2159,"vopf;":2160,"vprop;":2161,"vrtri;":2162,"vscr;":2163,"vsubnE;":2164,"vsubne;":2165,"vsupnE;":2166,"vsupne;":2167,"vzigzag;":2168,"wcirc;":2169,"wedbar;":2170,"wedge;":2171,"wedgeq;":2172,"weierp;":2173,"wfr;":2174,"wopf;":2175,"wp;":2176,"wr;":2177,"wreath;":2178,"wscr;":2179,"xcap;":2180,"xcirc;":2181,"xcup;":2182,"xdtri;":2183,"xfr;":2184,"xhArr;":2185,"xharr;":2186,"xi;":2187,"xlArr;":2188,"xlarr;":2189,"xmap;":2190,"xnis;":2191,"xodot;":2192,"xopf;":2193,"xoplus;":2194,"xotime;":2195,"xrArr;":2196,"xrarr;":2197,"xscr;":2198,"xsqcup;":2199,"xuplus;":2200,"xutri;":2201,"xvee;":2202,"xwedge;":2203,yacute:2204,"yacute;":2205,"yacy;":2206,"ycirc;":2207,"ycy;":2208,yen:2209,"yen;":2210,"yfr;":2211,"yicy;":2212,"yopf;":2213,"yscr;":2214,"yucy;":2215,yuml:2216,"yuml;":2217,"zacute;":2218,"zcaron;":2219,"zcy;":2220,"zdot;":2221,"zeetrf;":2222,"zeta;":2223,"zfr;":2224,"zhcy;":2225,"zigrarr;":2226,"zopf;":2227,"zscr;":2228,"zwj;":2229,"zwnj;":2230} -B.fs=new A.r(B.KW,["\xc6","\xc6","&","&","\xc1","\xc1","\u0102","\xc2","\xc2","\u0410","\ud835\udd04","\xc0","\xc0","\u0391","\u0100","\u2a53","\u0104","\ud835\udd38","\u2061","\xc5","\xc5","\ud835\udc9c","\u2254","\xc3","\xc3","\xc4","\xc4","\u2216","\u2ae7","\u2306","\u0411","\u2235","\u212c","\u0392","\ud835\udd05","\ud835\udd39","\u02d8","\u212c","\u224e","\u0427","\xa9","\xa9","\u0106","\u22d2","\u2145","\u212d","\u010c","\xc7","\xc7","\u0108","\u2230","\u010a","\xb8","\xb7","\u212d","\u03a7","\u2299","\u2296","\u2295","\u2297","\u2232","\u201d","\u2019","\u2237","\u2a74","\u2261","\u222f","\u222e","\u2102","\u2210","\u2233","\u2a2f","\ud835\udc9e","\u22d3","\u224d","\u2145","\u2911","\u0402","\u0405","\u040f","\u2021","\u21a1","\u2ae4","\u010e","\u0414","\u2207","\u0394","\ud835\udd07","\xb4","\u02d9","\u02dd","`","\u02dc","\u22c4","\u2146","\ud835\udd3b","\xa8","\u20dc","\u2250","\u222f","\xa8","\u21d3","\u21d0","\u21d4","\u2ae4","\u27f8","\u27fa","\u27f9","\u21d2","\u22a8","\u21d1","\u21d5","\u2225","\u2193","\u2913","\u21f5","\u0311","\u2950","\u295e","\u21bd","\u2956","\u295f","\u21c1","\u2957","\u22a4","\u21a7","\u21d3","\ud835\udc9f","\u0110","\u014a","\xd0","\xd0","\xc9","\xc9","\u011a","\xca","\xca","\u042d","\u0116","\ud835\udd08","\xc8","\xc8","\u2208","\u0112","\u25fb","\u25ab","\u0118","\ud835\udd3c","\u0395","\u2a75","\u2242","\u21cc","\u2130","\u2a73","\u0397","\xcb","\xcb","\u2203","\u2147","\u0424","\ud835\udd09","\u25fc","\u25aa","\ud835\udd3d","\u2200","\u2131","\u2131","\u0403",">",">","\u0393","\u03dc","\u011e","\u0122","\u011c","\u0413","\u0120","\ud835\udd0a","\u22d9","\ud835\udd3e","\u2265","\u22db","\u2267","\u2aa2","\u2277","\u2a7e","\u2273","\ud835\udca2","\u226b","\u042a","\u02c7","^","\u0124","\u210c","\u210b","\u210d","\u2500","\u210b","\u0126","\u224e","\u224f","\u0415","\u0132","\u0401","\xcd","\xcd","\xce","\xce","\u0418","\u0130","\u2111","\xcc","\xcc","\u2111","\u012a","\u2148","\u21d2","\u222c","\u222b","\u22c2","\u2063","\u2062","\u012e","\ud835\udd40","\u0399","\u2110","\u0128","\u0406","\xcf","\xcf","\u0134","\u0419","\ud835\udd0d","\ud835\udd41","\ud835\udca5","\u0408","\u0404","\u0425","\u040c","\u039a","\u0136","\u041a","\ud835\udd0e","\ud835\udd42","\ud835\udca6","\u0409","<","<","\u0139","\u039b","\u27ea","\u2112","\u219e","\u013d","\u013b","\u041b","\u27e8","\u2190","\u21e4","\u21c6","\u2308","\u27e6","\u2961","\u21c3","\u2959","\u230a","\u2194","\u294e","\u22a3","\u21a4","\u295a","\u22b2","\u29cf","\u22b4","\u2951","\u2960","\u21bf","\u2958","\u21bc","\u2952","\u21d0","\u21d4","\u22da","\u2266","\u2276","\u2aa1","\u2a7d","\u2272","\ud835\udd0f","\u22d8","\u21da","\u013f","\u27f5","\u27f7","\u27f6","\u27f8","\u27fa","\u27f9","\ud835\udd43","\u2199","\u2198","\u2112","\u21b0","\u0141","\u226a","\u2905","\u041c","\u205f","\u2133","\ud835\udd10","\u2213","\ud835\udd44","\u2133","\u039c","\u040a","\u0143","\u0147","\u0145","\u041d","\u200b","\u200b","\u200b","\u200b","\u226b","\u226a","\n","\ud835\udd11","\u2060","\xa0","\u2115","\u2aec","\u2262","\u226d","\u2226","\u2209","\u2260","\u2242\u0338","\u2204","\u226f","\u2271","\u2267\u0338","\u226b\u0338","\u2279","\u2a7e\u0338","\u2275","\u224e\u0338","\u224f\u0338","\u22ea","\u29cf\u0338","\u22ec","\u226e","\u2270","\u2278","\u226a\u0338","\u2a7d\u0338","\u2274","\u2aa2\u0338","\u2aa1\u0338","\u2280","\u2aaf\u0338","\u22e0","\u220c","\u22eb","\u29d0\u0338","\u22ed","\u228f\u0338","\u22e2","\u2290\u0338","\u22e3","\u2282\u20d2","\u2288","\u2281","\u2ab0\u0338","\u22e1","\u227f\u0338","\u2283\u20d2","\u2289","\u2241","\u2244","\u2247","\u2249","\u2224","\ud835\udca9","\xd1","\xd1","\u039d","\u0152","\xd3","\xd3","\xd4","\xd4","\u041e","\u0150","\ud835\udd12","\xd2","\xd2","\u014c","\u03a9","\u039f","\ud835\udd46","\u201c","\u2018","\u2a54","\ud835\udcaa","\xd8","\xd8","\xd5","\xd5","\u2a37","\xd6","\xd6","\u203e","\u23de","\u23b4","\u23dc","\u2202","\u041f","\ud835\udd13","\u03a6","\u03a0","\xb1","\u210c","\u2119","\u2abb","\u227a","\u2aaf","\u227c","\u227e","\u2033","\u220f","\u2237","\u221d","\ud835\udcab","\u03a8",'"','"',"\ud835\udd14","\u211a","\ud835\udcac","\u2910","\xae","\xae","\u0154","\u27eb","\u21a0","\u2916","\u0158","\u0156","\u0420","\u211c","\u220b","\u21cb","\u296f","\u211c","\u03a1","\u27e9","\u2192","\u21e5","\u21c4","\u2309","\u27e7","\u295d","\u21c2","\u2955","\u230b","\u22a2","\u21a6","\u295b","\u22b3","\u29d0","\u22b5","\u294f","\u295c","\u21be","\u2954","\u21c0","\u2953","\u21d2","\u211d","\u2970","\u21db","\u211b","\u21b1","\u29f4","\u0429","\u0428","\u042c","\u015a","\u2abc","\u0160","\u015e","\u015c","\u0421","\ud835\udd16","\u2193","\u2190","\u2192","\u2191","\u03a3","\u2218","\ud835\udd4a","\u221a","\u25a1","\u2293","\u228f","\u2291","\u2290","\u2292","\u2294","\ud835\udcae","\u22c6","\u22d0","\u22d0","\u2286","\u227b","\u2ab0","\u227d","\u227f","\u220b","\u2211","\u22d1","\u2283","\u2287","\u22d1","\xde","\xde","\u2122","\u040b","\u0426","\t","\u03a4","\u0164","\u0162","\u0422","\ud835\udd17","\u2234","\u0398","\u205f\u200a","\u2009","\u223c","\u2243","\u2245","\u2248","\ud835\udd4b","\u20db","\ud835\udcaf","\u0166","\xda","\xda","\u219f","\u2949","\u040e","\u016c","\xdb","\xdb","\u0423","\u0170","\ud835\udd18","\xd9","\xd9","\u016a","_","\u23df","\u23b5","\u23dd","\u22c3","\u228e","\u0172","\ud835\udd4c","\u2191","\u2912","\u21c5","\u2195","\u296e","\u22a5","\u21a5","\u21d1","\u21d5","\u2196","\u2197","\u03d2","\u03a5","\u016e","\ud835\udcb0","\u0168","\xdc","\xdc","\u22ab","\u2aeb","\u0412","\u22a9","\u2ae6","\u22c1","\u2016","\u2016","\u2223","|","\u2758","\u2240","\u200a","\ud835\udd19","\ud835\udd4d","\ud835\udcb1","\u22aa","\u0174","\u22c0","\ud835\udd1a","\ud835\udd4e","\ud835\udcb2","\ud835\udd1b","\u039e","\ud835\udd4f","\ud835\udcb3","\u042f","\u0407","\u042e","\xdd","\xdd","\u0176","\u042b","\ud835\udd1c","\ud835\udd50","\ud835\udcb4","\u0178","\u0416","\u0179","\u017d","\u0417","\u017b","\u200b","\u0396","\u2128","\u2124","\ud835\udcb5","\xe1","\xe1","\u0103","\u223e","\u223e\u0333","\u223f","\xe2","\xe2","\xb4","\xb4","\u0430","\xe6","\xe6","\u2061","\ud835\udd1e","\xe0","\xe0","\u2135","\u2135","\u03b1","\u0101","\u2a3f","&","&","\u2227","\u2a55","\u2a5c","\u2a58","\u2a5a","\u2220","\u29a4","\u2220","\u2221","\u29a8","\u29a9","\u29aa","\u29ab","\u29ac","\u29ad","\u29ae","\u29af","\u221f","\u22be","\u299d","\u2222","\xc5","\u237c","\u0105","\ud835\udd52","\u2248","\u2a70","\u2a6f","\u224a","\u224b","'","\u2248","\u224a","\xe5","\xe5","\ud835\udcb6","*","\u2248","\u224d","\xe3","\xe3","\xe4","\xe4","\u2233","\u2a11","\u2aed","\u224c","\u03f6","\u2035","\u223d","\u22cd","\u22bd","\u2305","\u2305","\u23b5","\u23b6","\u224c","\u0431","\u201e","\u2235","\u2235","\u29b0","\u03f6","\u212c","\u03b2","\u2136","\u226c","\ud835\udd1f","\u22c2","\u25ef","\u22c3","\u2a00","\u2a01","\u2a02","\u2a06","\u2605","\u25bd","\u25b3","\u2a04","\u22c1","\u22c0","\u290d","\u29eb","\u25aa","\u25b4","\u25be","\u25c2","\u25b8","\u2423","\u2592","\u2591","\u2593","\u2588","=\u20e5","\u2261\u20e5","\u2310","\ud835\udd53","\u22a5","\u22a5","\u22c8","\u2557","\u2554","\u2556","\u2553","\u2550","\u2566","\u2569","\u2564","\u2567","\u255d","\u255a","\u255c","\u2559","\u2551","\u256c","\u2563","\u2560","\u256b","\u2562","\u255f","\u29c9","\u2555","\u2552","\u2510","\u250c","\u2500","\u2565","\u2568","\u252c","\u2534","\u229f","\u229e","\u22a0","\u255b","\u2558","\u2518","\u2514","\u2502","\u256a","\u2561","\u255e","\u253c","\u2524","\u251c","\u2035","\u02d8","\xa6","\xa6","\ud835\udcb7","\u204f","\u223d","\u22cd","\\","\u29c5","\u27c8","\u2022","\u2022","\u224e","\u2aae","\u224f","\u224f","\u0107","\u2229","\u2a44","\u2a49","\u2a4b","\u2a47","\u2a40","\u2229\ufe00","\u2041","\u02c7","\u2a4d","\u010d","\xe7","\xe7","\u0109","\u2a4c","\u2a50","\u010b","\xb8","\xb8","\u29b2","\xa2","\xa2","\xb7","\ud835\udd20","\u0447","\u2713","\u2713","\u03c7","\u25cb","\u29c3","\u02c6","\u2257","\u21ba","\u21bb","\xae","\u24c8","\u229b","\u229a","\u229d","\u2257","\u2a10","\u2aef","\u29c2","\u2663","\u2663",":","\u2254","\u2254",",","@","\u2201","\u2218","\u2201","\u2102","\u2245","\u2a6d","\u222e","\ud835\udd54","\u2210","\xa9","\xa9","\u2117","\u21b5","\u2717","\ud835\udcb8","\u2acf","\u2ad1","\u2ad0","\u2ad2","\u22ef","\u2938","\u2935","\u22de","\u22df","\u21b6","\u293d","\u222a","\u2a48","\u2a46","\u2a4a","\u228d","\u2a45","\u222a\ufe00","\u21b7","\u293c","\u22de","\u22df","\u22ce","\u22cf","\xa4","\xa4","\u21b6","\u21b7","\u22ce","\u22cf","\u2232","\u2231","\u232d","\u21d3","\u2965","\u2020","\u2138","\u2193","\u2010","\u22a3","\u290f","\u02dd","\u010f","\u0434","\u2146","\u2021","\u21ca","\u2a77","\xb0","\xb0","\u03b4","\u29b1","\u297f","\ud835\udd21","\u21c3","\u21c2","\u22c4","\u22c4","\u2666","\u2666","\xa8","\u03dd","\u22f2","\xf7","\xf7","\xf7","\u22c7","\u22c7","\u0452","\u231e","\u230d","$","\ud835\udd55","\u02d9","\u2250","\u2251","\u2238","\u2214","\u22a1","\u2306","\u2193","\u21ca","\u21c3","\u21c2","\u2910","\u231f","\u230c","\ud835\udcb9","\u0455","\u29f6","\u0111","\u22f1","\u25bf","\u25be","\u21f5","\u296f","\u29a6","\u045f","\u27ff","\u2a77","\u2251","\xe9","\xe9","\u2a6e","\u011b","\u2256","\xea","\xea","\u2255","\u044d","\u0117","\u2147","\u2252","\ud835\udd22","\u2a9a","\xe8","\xe8","\u2a96","\u2a98","\u2a99","\u23e7","\u2113","\u2a95","\u2a97","\u0113","\u2205","\u2205","\u2205","\u2004","\u2005","\u2003","\u014b","\u2002","\u0119","\ud835\udd56","\u22d5","\u29e3","\u2a71","\u03b5","\u03b5","\u03f5","\u2256","\u2255","\u2242","\u2a96","\u2a95","=","\u225f","\u2261","\u2a78","\u29e5","\u2253","\u2971","\u212f","\u2250","\u2242","\u03b7","\xf0","\xf0","\xeb","\xeb","\u20ac","!","\u2203","\u2130","\u2147","\u2252","\u0444","\u2640","\ufb03","\ufb00","\ufb04","\ud835\udd23","\ufb01","fj","\u266d","\ufb02","\u25b1","\u0192","\ud835\udd57","\u2200","\u22d4","\u2ad9","\u2a0d","\xbd","\xbd","\u2153","\xbc","\xbc","\u2155","\u2159","\u215b","\u2154","\u2156","\xbe","\xbe","\u2157","\u215c","\u2158","\u215a","\u215d","\u215e","\u2044","\u2322","\ud835\udcbb","\u2267","\u2a8c","\u01f5","\u03b3","\u03dd","\u2a86","\u011f","\u011d","\u0433","\u0121","\u2265","\u22db","\u2265","\u2267","\u2a7e","\u2a7e","\u2aa9","\u2a80","\u2a82","\u2a84","\u22db\ufe00","\u2a94","\ud835\udd24","\u226b","\u22d9","\u2137","\u0453","\u2277","\u2a92","\u2aa5","\u2aa4","\u2269","\u2a8a","\u2a8a","\u2a88","\u2a88","\u2269","\u22e7","\ud835\udd58","`","\u210a","\u2273","\u2a8e","\u2a90",">",">","\u2aa7","\u2a7a","\u22d7","\u2995","\u2a7c","\u2a86","\u2978","\u22d7","\u22db","\u2a8c","\u2277","\u2273","\u2269\ufe00","\u2269\ufe00","\u21d4","\u200a","\xbd","\u210b","\u044a","\u2194","\u2948","\u21ad","\u210f","\u0125","\u2665","\u2665","\u2026","\u22b9","\ud835\udd25","\u2925","\u2926","\u21ff","\u223b","\u21a9","\u21aa","\ud835\udd59","\u2015","\ud835\udcbd","\u210f","\u0127","\u2043","\u2010","\xed","\xed","\u2063","\xee","\xee","\u0438","\u0435","\xa1","\xa1","\u21d4","\ud835\udd26","\xec","\xec","\u2148","\u2a0c","\u222d","\u29dc","\u2129","\u0133","\u012b","\u2111","\u2110","\u2111","\u0131","\u22b7","\u01b5","\u2208","\u2105","\u221e","\u29dd","\u0131","\u222b","\u22ba","\u2124","\u22ba","\u2a17","\u2a3c","\u0451","\u012f","\ud835\udd5a","\u03b9","\u2a3c","\xbf","\xbf","\ud835\udcbe","\u2208","\u22f9","\u22f5","\u22f4","\u22f3","\u2208","\u2062","\u0129","\u0456","\xef","\xef","\u0135","\u0439","\ud835\udd27","\u0237","\ud835\udd5b","\ud835\udcbf","\u0458","\u0454","\u03ba","\u03f0","\u0137","\u043a","\ud835\udd28","\u0138","\u0445","\u045c","\ud835\udd5c","\ud835\udcc0","\u21da","\u21d0","\u291b","\u290e","\u2266","\u2a8b","\u2962","\u013a","\u29b4","\u2112","\u03bb","\u27e8","\u2991","\u27e8","\u2a85","\xab","\xab","\u2190","\u21e4","\u291f","\u291d","\u21a9","\u21ab","\u2939","\u2973","\u21a2","\u2aab","\u2919","\u2aad","\u2aad\ufe00","\u290c","\u2772","{","[","\u298b","\u298f","\u298d","\u013e","\u013c","\u2308","{","\u043b","\u2936","\u201c","\u201e","\u2967","\u294b","\u21b2","\u2264","\u2190","\u21a2","\u21bd","\u21bc","\u21c7","\u2194","\u21c6","\u21cb","\u21ad","\u22cb","\u22da","\u2264","\u2266","\u2a7d","\u2a7d","\u2aa8","\u2a7f","\u2a81","\u2a83","\u22da\ufe00","\u2a93","\u2a85","\u22d6","\u22da","\u2a8b","\u2276","\u2272","\u297c","\u230a","\ud835\udd29","\u2276","\u2a91","\u21bd","\u21bc","\u296a","\u2584","\u0459","\u226a","\u21c7","\u231e","\u296b","\u25fa","\u0140","\u23b0","\u23b0","\u2268","\u2a89","\u2a89","\u2a87","\u2a87","\u2268","\u22e6","\u27ec","\u21fd","\u27e6","\u27f5","\u27f7","\u27fc","\u27f6","\u21ab","\u21ac","\u2985","\ud835\udd5d","\u2a2d","\u2a34","\u2217","_","\u25ca","\u25ca","\u29eb","(","\u2993","\u21c6","\u231f","\u21cb","\u296d","\u200e","\u22bf","\u2039","\ud835\udcc1","\u21b0","\u2272","\u2a8d","\u2a8f","[","\u2018","\u201a","\u0142","<","<","\u2aa6","\u2a79","\u22d6","\u22cb","\u22c9","\u2976","\u2a7b","\u2996","\u25c3","\u22b4","\u25c2","\u294a","\u2966","\u2268\ufe00","\u2268\ufe00","\u223a","\xaf","\xaf","\u2642","\u2720","\u2720","\u21a6","\u21a6","\u21a7","\u21a4","\u21a5","\u25ae","\u2a29","\u043c","\u2014","\u2221","\ud835\udd2a","\u2127","\xb5","\xb5","\u2223","*","\u2af0","\xb7","\xb7","\u2212","\u229f","\u2238","\u2a2a","\u2adb","\u2026","\u2213","\u22a7","\ud835\udd5e","\u2213","\ud835\udcc2","\u223e","\u03bc","\u22b8","\u22b8","\u22d9\u0338","\u226b\u20d2","\u226b\u0338","\u21cd","\u21ce","\u22d8\u0338","\u226a\u20d2","\u226a\u0338","\u21cf","\u22af","\u22ae","\u2207","\u0144","\u2220\u20d2","\u2249","\u2a70\u0338","\u224b\u0338","\u0149","\u2249","\u266e","\u266e","\u2115","\xa0","\xa0","\u224e\u0338","\u224f\u0338","\u2a43","\u0148","\u0146","\u2247","\u2a6d\u0338","\u2a42","\u043d","\u2013","\u2260","\u21d7","\u2924","\u2197","\u2197","\u2250\u0338","\u2262","\u2928","\u2242\u0338","\u2204","\u2204","\ud835\udd2b","\u2267\u0338","\u2271","\u2271","\u2267\u0338","\u2a7e\u0338","\u2a7e\u0338","\u2275","\u226f","\u226f","\u21ce","\u21ae","\u2af2","\u220b","\u22fc","\u22fa","\u220b","\u045a","\u21cd","\u2266\u0338","\u219a","\u2025","\u2270","\u219a","\u21ae","\u2270","\u2266\u0338","\u2a7d\u0338","\u2a7d\u0338","\u226e","\u2274","\u226e","\u22ea","\u22ec","\u2224","\ud835\udd5f","\xac","\xac","\u2209","\u22f9\u0338","\u22f5\u0338","\u2209","\u22f7","\u22f6","\u220c","\u220c","\u22fe","\u22fd","\u2226","\u2226","\u2afd\u20e5","\u2202\u0338","\u2a14","\u2280","\u22e0","\u2aaf\u0338","\u2280","\u2aaf\u0338","\u21cf","\u219b","\u2933\u0338","\u219d\u0338","\u219b","\u22eb","\u22ed","\u2281","\u22e1","\u2ab0\u0338","\ud835\udcc3","\u2224","\u2226","\u2241","\u2244","\u2244","\u2224","\u2226","\u22e2","\u22e3","\u2284","\u2ac5\u0338","\u2288","\u2282\u20d2","\u2288","\u2ac5\u0338","\u2281","\u2ab0\u0338","\u2285","\u2ac6\u0338","\u2289","\u2283\u20d2","\u2289","\u2ac6\u0338","\u2279","\xf1","\xf1","\u2278","\u22ea","\u22ec","\u22eb","\u22ed","\u03bd","#","\u2116","\u2007","\u22ad","\u2904","\u224d\u20d2","\u22ac","\u2265\u20d2",">\u20d2","\u29de","\u2902","\u2264\u20d2","<\u20d2","\u22b4\u20d2","\u2903","\u22b5\u20d2","\u223c\u20d2","\u21d6","\u2923","\u2196","\u2196","\u2927","\u24c8","\xf3","\xf3","\u229b","\u229a","\xf4","\xf4","\u043e","\u229d","\u0151","\u2a38","\u2299","\u29bc","\u0153","\u29bf","\ud835\udd2c","\u02db","\xf2","\xf2","\u29c1","\u29b5","\u03a9","\u222e","\u21ba","\u29be","\u29bb","\u203e","\u29c0","\u014d","\u03c9","\u03bf","\u29b6","\u2296","\ud835\udd60","\u29b7","\u29b9","\u2295","\u2228","\u21bb","\u2a5d","\u2134","\u2134","\xaa","\xaa","\xba","\xba","\u22b6","\u2a56","\u2a57","\u2a5b","\u2134","\xf8","\xf8","\u2298","\xf5","\xf5","\u2297","\u2a36","\xf6","\xf6","\u233d","\u2225","\xb6","\xb6","\u2225","\u2af3","\u2afd","\u2202","\u043f","%",".","\u2030","\u22a5","\u2031","\ud835\udd2d","\u03c6","\u03d5","\u2133","\u260e","\u03c0","\u22d4","\u03d6","\u210f","\u210e","\u210f","+","\u2a23","\u229e","\u2a22","\u2214","\u2a25","\u2a72","\xb1","\xb1","\u2a26","\u2a27","\xb1","\u2a15","\ud835\udd61","\xa3","\xa3","\u227a","\u2ab3","\u2ab7","\u227c","\u2aaf","\u227a","\u2ab7","\u227c","\u2aaf","\u2ab9","\u2ab5","\u22e8","\u227e","\u2032","\u2119","\u2ab5","\u2ab9","\u22e8","\u220f","\u232e","\u2312","\u2313","\u221d","\u221d","\u227e","\u22b0","\ud835\udcc5","\u03c8","\u2008","\ud835\udd2e","\u2a0c","\ud835\udd62","\u2057","\ud835\udcc6","\u210d","\u2a16","?","\u225f",'"','"',"\u21db","\u21d2","\u291c","\u290f","\u2964","\u223d\u0331","\u0155","\u221a","\u29b3","\u27e9","\u2992","\u29a5","\u27e9","\xbb","\xbb","\u2192","\u2975","\u21e5","\u2920","\u2933","\u291e","\u21aa","\u21ac","\u2945","\u2974","\u21a3","\u219d","\u291a","\u2236","\u211a","\u290d","\u2773","}","]","\u298c","\u298e","\u2990","\u0159","\u0157","\u2309","}","\u0440","\u2937","\u2969","\u201d","\u201d","\u21b3","\u211c","\u211b","\u211c","\u211d","\u25ad","\xae","\xae","\u297d","\u230b","\ud835\udd2f","\u21c1","\u21c0","\u296c","\u03c1","\u03f1","\u2192","\u21a3","\u21c1","\u21c0","\u21c4","\u21cc","\u21c9","\u219d","\u22cc","\u02da","\u2253","\u21c4","\u21cc","\u200f","\u23b1","\u23b1","\u2aee","\u27ed","\u21fe","\u27e7","\u2986","\ud835\udd63","\u2a2e","\u2a35",")","\u2994","\u2a12","\u21c9","\u203a","\ud835\udcc7","\u21b1","]","\u2019","\u2019","\u22cc","\u22ca","\u25b9","\u22b5","\u25b8","\u29ce","\u2968","\u211e","\u015b","\u201a","\u227b","\u2ab4","\u2ab8","\u0161","\u227d","\u2ab0","\u015f","\u015d","\u2ab6","\u2aba","\u22e9","\u2a13","\u227f","\u0441","\u22c5","\u22a1","\u2a66","\u21d8","\u2925","\u2198","\u2198","\xa7","\xa7",";","\u2929","\u2216","\u2216","\u2736","\ud835\udd30","\u2322","\u266f","\u0449","\u0448","\u2223","\u2225","\xad","\xad","\u03c3","\u03c2","\u03c2","\u223c","\u2a6a","\u2243","\u2243","\u2a9e","\u2aa0","\u2a9d","\u2a9f","\u2246","\u2a24","\u2972","\u2190","\u2216","\u2a33","\u29e4","\u2223","\u2323","\u2aaa","\u2aac","\u2aac\ufe00","\u044c","/","\u29c4","\u233f","\ud835\udd64","\u2660","\u2660","\u2225","\u2293","\u2293\ufe00","\u2294","\u2294\ufe00","\u228f","\u2291","\u228f","\u2291","\u2290","\u2292","\u2290","\u2292","\u25a1","\u25a1","\u25aa","\u25aa","\u2192","\ud835\udcc8","\u2216","\u2323","\u22c6","\u2606","\u2605","\u03f5","\u03d5","\xaf","\u2282","\u2ac5","\u2abd","\u2286","\u2ac3","\u2ac1","\u2acb","\u228a","\u2abf","\u2979","\u2282","\u2286","\u2ac5","\u228a","\u2acb","\u2ac7","\u2ad5","\u2ad3","\u227b","\u2ab8","\u227d","\u2ab0","\u2aba","\u2ab6","\u22e9","\u227f","\u2211","\u266a","\xb9","\xb9","\xb2","\xb2","\xb3","\xb3","\u2283","\u2ac6","\u2abe","\u2ad8","\u2287","\u2ac4","\u27c9","\u2ad7","\u297b","\u2ac2","\u2acc","\u228b","\u2ac0","\u2283","\u2287","\u2ac6","\u228b","\u2acc","\u2ac8","\u2ad4","\u2ad6","\u21d9","\u2926","\u2199","\u2199","\u292a","\xdf","\xdf","\u2316","\u03c4","\u23b4","\u0165","\u0163","\u0442","\u20db","\u2315","\ud835\udd31","\u2234","\u2234","\u03b8","\u03d1","\u03d1","\u2248","\u223c","\u2009","\u2248","\u223c","\xfe","\xfe","\u02dc","\xd7","\xd7","\u22a0","\u2a31","\u2a30","\u222d","\u2928","\u22a4","\u2336","\u2af1","\ud835\udd65","\u2ada","\u2929","\u2034","\u2122","\u25b5","\u25bf","\u25c3","\u22b4","\u225c","\u25b9","\u22b5","\u25ec","\u225c","\u2a3a","\u2a39","\u29cd","\u2a3b","\u23e2","\ud835\udcc9","\u0446","\u045b","\u0167","\u226c","\u219e","\u21a0","\u21d1","\u2963","\xfa","\xfa","\u2191","\u045e","\u016d","\xfb","\xfb","\u0443","\u21c5","\u0171","\u296e","\u297e","\ud835\udd32","\xf9","\xf9","\u21bf","\u21be","\u2580","\u231c","\u231c","\u230f","\u25f8","\u016b","\xa8","\xa8","\u0173","\ud835\udd66","\u2191","\u2195","\u21bf","\u21be","\u228e","\u03c5","\u03d2","\u03c5","\u21c8","\u231d","\u231d","\u230e","\u016f","\u25f9","\ud835\udcca","\u22f0","\u0169","\u25b5","\u25b4","\u21c8","\xfc","\xfc","\u29a7","\u21d5","\u2ae8","\u2ae9","\u22a8","\u299c","\u03f5","\u03f0","\u2205","\u03d5","\u03d6","\u221d","\u2195","\u03f1","\u03c2","\u228a\ufe00","\u2acb\ufe00","\u228b\ufe00","\u2acc\ufe00","\u03d1","\u22b2","\u22b3","\u0432","\u22a2","\u2228","\u22bb","\u225a","\u22ee","|","|","\ud835\udd33","\u22b2","\u2282\u20d2","\u2283\u20d2","\ud835\udd67","\u221d","\u22b3","\ud835\udccb","\u2acb\ufe00","\u228a\ufe00","\u2acc\ufe00","\u228b\ufe00","\u299a","\u0175","\u2a5f","\u2227","\u2259","\u2118","\ud835\udd34","\ud835\udd68","\u2118","\u2240","\u2240","\ud835\udccc","\u22c2","\u25ef","\u22c3","\u25bd","\ud835\udd35","\u27fa","\u27f7","\u03be","\u27f8","\u27f5","\u27fc","\u22fb","\u2a00","\ud835\udd69","\u2a01","\u2a02","\u27f9","\u27f6","\ud835\udccd","\u2a06","\u2a04","\u25b3","\u22c1","\u22c0","\xfd","\xfd","\u044f","\u0177","\u044b","\xa5","\xa5","\ud835\udd36","\u0457","\ud835\udd6a","\ud835\udcce","\u044e","\xff","\xff","\u017a","\u017e","\u0437","\u017c","\u2128","\u03b6","\ud835\udd37","\u0436","\u21dd","\ud835\udd6b","\ud835\udccf","\u200d","\u200c"],t.o) -B.L_={attributename:0,attributetype:1,basefrequency:2,baseprofile:3,calcmode:4,clippathunits:5,contentscripttype:6,contentstyletype:7,diffuseconstant:8,edgemode:9,externalresourcesrequired:10,filterres:11,filterunits:12,glyphref:13,gradienttransform:14,gradientunits:15,kernelmatrix:16,kernelunitlength:17,keypoints:18,keysplines:19,keytimes:20,lengthadjust:21,limitingconeangle:22,markerheight:23,markerunits:24,markerwidth:25,maskcontentunits:26,maskunits:27,numoctaves:28,pathlength:29,patterncontentunits:30,patterntransform:31,patternunits:32,pointsatx:33,pointsaty:34,pointsatz:35,preservealpha:36,preserveaspectratio:37,primitiveunits:38,refx:39,refy:40,repeatcount:41,repeatdur:42,requiredextensions:43,requiredfeatures:44,specularconstant:45,specularexponent:46,spreadmethod:47,startoffset:48,stddeviation:49,stitchtiles:50,surfacescale:51,systemlanguage:52,tablevalues:53,targetx:54,targety:55,textlength:56,viewbox:57,viewtarget:58,xchannelselector:59,ychannelselector:60,zoomandpan:61} -B.DI=new A.r(B.L_,["attributeName","attributeType","baseFrequency","baseProfile","calcMode","clipPathUnits","contentScriptType","contentStyleType","diffuseConstant","edgeMode","externalResourcesRequired","filterRes","filterUnits","glyphRef","gradientTransform","gradientUnits","kernelMatrix","kernelUnitLength","keyPoints","keySplines","keyTimes","lengthAdjust","limitingConeAngle","markerHeight","markerUnits","markerWidth","maskContentUnits","maskUnits","numOctaves","pathLength","patternContentUnits","patternTransform","patternUnits","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","preserveAspectRatio","primitiveUnits","refX","refY","repeatCount","repeatDur","requiredExtensions","requiredFeatures","specularConstant","specularExponent","spreadMethod","startOffset","stdDeviation","stitchTiles","surfaceScale","systemLanguage","tableValues","targetX","targetY","textLength","viewBox","viewTarget","xChannelSelector","yChannelSelector","zoomAndPan"],t.o) -B.L1={"null-character":0,"invalid-codepoint":1,"incorrectly-placed-solidus":2,"incorrect-cr-newline-entity":3,"illegal-windows-1252-entity":4,"cant-convert-numeric-entity":5,"illegal-codepoint-for-numeric-entity":6,"numeric-entity-without-semicolon":7,"expected-numeric-entity-but-got-eof":8,"expected-numeric-entity":9,"named-entity-without-semicolon":10,"expected-named-entity":11,"attributes-in-end-tag":12,"self-closing-flag-on-end-tag":13,"expected-tag-name-but-got-right-bracket":14,"expected-tag-name-but-got-question-mark":15,"expected-tag-name":16,[u.g]:17,"expected-closing-tag-but-got-eof":18,"expected-closing-tag-but-got-char":19,"eof-in-tag-name":20,"expected-attribute-name-but-got-eof":21,"eof-in-attribute-name":22,"invalid-character-in-attribute-name":23,"duplicate-attribute":24,"expected-end-of-tag-name-but-got-eof":25,"expected-attribute-value-but-got-eof":26,[u.F]:27,"equals-in-unquoted-attribute-value":28,[u.V]:29,"invalid-character-after-attribute-name":30,[u.H]:31,"eof-in-attribute-value-double-quote":32,"eof-in-attribute-value-single-quote":33,"eof-in-attribute-value-no-quotes":34,"unexpected-EOF-after-solidus-in-tag":35,[u.B]:36,"expected-dashes-or-doctype":37,[u.x]:38,"unexpected-space-after-double-dash-in-comment":39,"incorrect-comment":40,"eof-in-comment":41,"eof-in-comment-end-dash":42,[u.K]:43,"eof-in-comment-double-dash":44,"eof-in-comment-end-space-state":45,"eof-in-comment-end-bang-state":46,"unexpected-char-in-comment":47,"need-space-after-doctype":48,[u.f]:49,"expected-doctype-name-but-got-eof":50,"eof-in-doctype-name":51,"eof-in-doctype":52,[u.p]:53,"unexpected-end-of-doctype":54,"unexpected-char-in-doctype":55,"eof-in-innerhtml":56,"unexpected-doctype":57,"non-html-root":58,"expected-doctype-but-got-eof":59,"unknown-doctype":60,"expected-doctype-but-got-chars":61,"expected-doctype-but-got-start-tag":62,"expected-doctype-but-got-end-tag":63,"end-tag-after-implied-root":64,"expected-named-closing-tag-but-got-eof":65,"two-heads-are-not-better-than-one":66,"unexpected-end-tag":67,"unexpected-start-tag-out-of-my-head":68,"unexpected-start-tag":69,"missing-end-tag":70,"missing-end-tags":71,"unexpected-start-tag-implies-end-tag":72,"unexpected-start-tag-treated-as":73,"deprecated-tag":74,"unexpected-start-tag-ignored":75,"expected-one-end-tag-but-got-another":76,"end-tag-too-early":77,"end-tag-too-early-named":78,"end-tag-too-early-ignored":79,"adoption-agency-1.1":80,"adoption-agency-1.2":81,"adoption-agency-1.3":82,"unexpected-end-tag-treated-as":83,"no-end-tag":84,"unexpected-implied-end-tag-in-table":85,"unexpected-implied-end-tag-in-table-body":86,"unexpected-char-implies-table-voodoo":87,"unexpected-hidden-input-in-table":88,"unexpected-form-in-table":89,[u.M]:90,"unexpected-end-tag-implies-table-voodoo":91,"unexpected-cell-in-table-body":92,"unexpected-cell-end-tag":93,"unexpected-end-tag-in-table-body":94,"unexpected-implied-end-tag-in-table-row":95,"unexpected-end-tag-in-table-row":96,"unexpected-select-in-select":97,"unexpected-input-in-select":98,"unexpected-start-tag-in-select":99,"unexpected-end-tag-in-select":100,[u.a]:101,[u.r]:102,"unexpected-char-after-body":103,"unexpected-start-tag-after-body":104,"unexpected-end-tag-after-body":105,"unexpected-char-in-frameset":106,"unexpected-start-tag-in-frameset":107,[u.q]:108,"unexpected-end-tag-in-frameset":109,"unexpected-char-after-frameset":110,"unexpected-start-tag-after-frameset":111,"unexpected-end-tag-after-frameset":112,"unexpected-end-tag-after-body-innerhtml":113,"expected-eof-but-got-char":114,"expected-eof-but-got-start-tag":115,"expected-eof-but-got-end-tag":116,"eof-in-table":117,"eof-in-select":118,"eof-in-frameset":119,"eof-in-script-in-script":120,"eof-in-foreign-lands":121,"non-void-element-with-trailing-solidus":122,[u.G]:123,"unexpected-end-tag-before-html":124,"undefined-error":125} -B.fX=new A.r(B.L1,["Null character in input stream, replaced with U+FFFD.","Invalid codepoint in stream.","Solidus (/) incorrectly placed in tag.","Incorrect CR newline entity, replaced with LF.","Entity used with illegal number (windows-1252 reference).","Numeric entity couldn't be converted to character (codepoint U+%(charAsInt)08x).","Numeric entity represents an illegal codepoint: U+%(charAsInt)08x.","Numeric entity didn't end with ';'.","Numeric entity expected. Got end of file instead.","Numeric entity expected but none found.","Named entity didn't end with ';'.","Named entity expected. Got none.","End tag contains unexpected attributes.","End tag contains unexpected self-closing flag.","Expected tag name. Got '>' instead.","Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.)","Expected tag name. Got something else instead","Expected closing tag. Got '>' instead. Ignoring ''.","Expected closing tag. Unexpected end of file.","Expected closing tag. Unexpected character '%(data)s' found.","Unexpected end of file in the tag name.","Unexpected end of file. Expected attribute name instead.","Unexpected end of file in attribute name.","Invalid character in attribute name","Dropped duplicate attribute on tag.","Unexpected end of file. Expected = or end of tag.","Unexpected end of file. Expected attribute value.","Expected attribute value. Got '>' instead.","Unexpected = in unquoted attribute","Unexpected character in unquoted attribute","Unexpected character after attribute name.","Unexpected character after attribute value.",'Unexpected end of file in attribute value (".',"Unexpected end of file in attribute value (').","Unexpected end of file in attribute value.","Unexpected end of file in tag. Expected >","Unexpected character after / in tag. Expected >","Expected '--' or 'DOCTYPE'. Not found.","Unexpected ! after -- in comment","Unexpected space after -- in comment","Incorrect comment.","Unexpected end of file in comment.","Unexpected end of file in comment (-)","Unexpected '-' after '--' found in comment.","Unexpected end of file in comment (--).","Unexpected end of file in comment.","Unexpected end of file in comment.","Unexpected character in comment found.","No space after literal string 'DOCTYPE'.","Unexpected > character. Expected DOCTYPE name.","Unexpected end of file. Expected DOCTYPE name.","Unexpected end of file in DOCTYPE name.","Unexpected end of file in DOCTYPE.","Expected space or '>'. Got '%(data)s'","Unexpected end of DOCTYPE.","Unexpected character in DOCTYPE.","XXX innerHTML EOF","Unexpected DOCTYPE. Ignored.","html needs to be the first start tag.","Unexpected End of file. Expected DOCTYPE.","Erroneous DOCTYPE.","Unexpected non-space characters. Expected DOCTYPE.","Unexpected start tag (%(name)s). Expected DOCTYPE.","Unexpected end tag (%(name)s). Expected DOCTYPE.","Unexpected end tag (%(name)s) after the (implied) root element.","Unexpected end of file. Expected end tag (%(name)s).","Unexpected start tag head in existing head. Ignored.","Unexpected end tag (%(name)s). Ignored.","Unexpected start tag (%(name)s) that can be in head. Moved.","Unexpected start tag (%(name)s).","Missing end tag (%(name)s).","Missing end tags (%(name)s).","Unexpected start tag (%(startName)s) implies end tag (%(endName)s).","Unexpected start tag (%(originalName)s). Treated as %(newName)s.","Unexpected start tag %(name)s. Don't use it!","Unexpected start tag %(name)s. Ignored.","Unexpected end tag (%(gotName)s). Missing end tag (%(expectedName)s).","End tag (%(name)s) seen too early. Expected other end tag.","Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).","End tag (%(name)s) seen too early. Ignored.","End tag (%(name)s) violates step 1, paragraph 1 of the adoption agency algorithm.","End tag (%(name)s) violates step 1, paragraph 2 of the adoption agency algorithm.","End tag (%(name)s) violates step 1, paragraph 3 of the adoption agency algorithm.","Unexpected end tag (%(originalName)s). Treated as %(newName)s.","This element (%(name)s) has no end tag.","Unexpected implied end tag (%(name)s) in the table phase.","Unexpected implied end tag (%(name)s) in the table body phase.","Unexpected non-space characters in table context caused voodoo mode.","Unexpected input with type hidden in table context.","Unexpected form in table context.","Unexpected start tag (%(name)s) in table context caused voodoo mode.","Unexpected end tag (%(name)s) in table context caused voodoo mode.","Unexpected table cell start tag (%(name)s) in the table body phase.","Got table cell end tag (%(name)s) while required end tags are missing.","Unexpected end tag (%(name)s) in the table body phase. Ignored.","Unexpected implied end tag (%(name)s) in the table row phase.","Unexpected end tag (%(name)s) in the table row phase. Ignored.","Unexpected select start tag in the select phase treated as select end tag.","Unexpected input start tag in the select phase.","Unexpected start tag token (%(name)s in the select phase. Ignored.","Unexpected end tag (%(name)s) in the select phase. Ignored.","Unexpected table element start tag (%(name)s) in the select in table phase.","Unexpected table element end tag (%(name)s) in the select in table phase.","Unexpected non-space characters in the after body phase.","Unexpected start tag token (%(name)s) in the after body phase.","Unexpected end tag token (%(name)s) in the after body phase.","Unexpected characters in the frameset phase. Characters ignored.","Unexpected start tag token (%(name)s) in the frameset phase. Ignored.","Unexpected end tag token (frameset) in the frameset phase (innerHTML).","Unexpected end tag token (%(name)s) in the frameset phase. Ignored.","Unexpected non-space characters in the after frameset phase. Ignored.","Unexpected start tag (%(name)s) in the after frameset phase. Ignored.","Unexpected end tag (%(name)s) in the after frameset phase. Ignored.","Unexpected end tag after body(innerHtml)","Unexpected non-space characters. Expected end of file.","Unexpected start tag (%(name)s). Expected end of file.","Unexpected end tag (%(name)s). Expected end of file.","Unexpected end of file. Expected table content.","Unexpected end of file. Expected select content.","Unexpected end of file. Expected frameset content.","Unexpected end of file. Expected script content.","Unexpected end of file. Expected foreign content","Trailing solidus not allowed on element %(name)s","Element %(name)s not allowed in a non-html context","Unexpected end tag (%(name)s) before html.","Undefined error (this sucks and should be fixed)"],t.o) -B.hx=new A.ns(!1) +B.bi=new A.r(B.aS,[],A.a0("r")) +B.fa=new A.r(B.aS,[],A.a0("r")) +B.KX={AElig:0,"AElig;":1,AMP:2,"AMP;":3,Aacute:4,"Aacute;":5,"Abreve;":6,Acirc:7,"Acirc;":8,"Acy;":9,"Afr;":10,Agrave:11,"Agrave;":12,"Alpha;":13,"Amacr;":14,"And;":15,"Aogon;":16,"Aopf;":17,"ApplyFunction;":18,Aring:19,"Aring;":20,"Ascr;":21,"Assign;":22,Atilde:23,"Atilde;":24,Auml:25,"Auml;":26,"Backslash;":27,"Barv;":28,"Barwed;":29,"Bcy;":30,"Because;":31,"Bernoullis;":32,"Beta;":33,"Bfr;":34,"Bopf;":35,"Breve;":36,"Bscr;":37,"Bumpeq;":38,"CHcy;":39,COPY:40,"COPY;":41,"Cacute;":42,"Cap;":43,"CapitalDifferentialD;":44,"Cayleys;":45,"Ccaron;":46,Ccedil:47,"Ccedil;":48,"Ccirc;":49,"Cconint;":50,"Cdot;":51,"Cedilla;":52,"CenterDot;":53,"Cfr;":54,"Chi;":55,"CircleDot;":56,"CircleMinus;":57,"CirclePlus;":58,"CircleTimes;":59,"ClockwiseContourIntegral;":60,"CloseCurlyDoubleQuote;":61,"CloseCurlyQuote;":62,"Colon;":63,"Colone;":64,"Congruent;":65,"Conint;":66,"ContourIntegral;":67,"Copf;":68,"Coproduct;":69,"CounterClockwiseContourIntegral;":70,"Cross;":71,"Cscr;":72,"Cup;":73,"CupCap;":74,"DD;":75,"DDotrahd;":76,"DJcy;":77,"DScy;":78,"DZcy;":79,"Dagger;":80,"Darr;":81,"Dashv;":82,"Dcaron;":83,"Dcy;":84,"Del;":85,"Delta;":86,"Dfr;":87,"DiacriticalAcute;":88,"DiacriticalDot;":89,"DiacriticalDoubleAcute;":90,"DiacriticalGrave;":91,"DiacriticalTilde;":92,"Diamond;":93,"DifferentialD;":94,"Dopf;":95,"Dot;":96,"DotDot;":97,"DotEqual;":98,"DoubleContourIntegral;":99,"DoubleDot;":100,"DoubleDownArrow;":101,"DoubleLeftArrow;":102,"DoubleLeftRightArrow;":103,"DoubleLeftTee;":104,"DoubleLongLeftArrow;":105,"DoubleLongLeftRightArrow;":106,"DoubleLongRightArrow;":107,"DoubleRightArrow;":108,"DoubleRightTee;":109,"DoubleUpArrow;":110,"DoubleUpDownArrow;":111,"DoubleVerticalBar;":112,"DownArrow;":113,"DownArrowBar;":114,"DownArrowUpArrow;":115,"DownBreve;":116,"DownLeftRightVector;":117,"DownLeftTeeVector;":118,"DownLeftVector;":119,"DownLeftVectorBar;":120,"DownRightTeeVector;":121,"DownRightVector;":122,"DownRightVectorBar;":123,"DownTee;":124,"DownTeeArrow;":125,"Downarrow;":126,"Dscr;":127,"Dstrok;":128,"ENG;":129,ETH:130,"ETH;":131,Eacute:132,"Eacute;":133,"Ecaron;":134,Ecirc:135,"Ecirc;":136,"Ecy;":137,"Edot;":138,"Efr;":139,Egrave:140,"Egrave;":141,"Element;":142,"Emacr;":143,"EmptySmallSquare;":144,"EmptyVerySmallSquare;":145,"Eogon;":146,"Eopf;":147,"Epsilon;":148,"Equal;":149,"EqualTilde;":150,"Equilibrium;":151,"Escr;":152,"Esim;":153,"Eta;":154,Euml:155,"Euml;":156,"Exists;":157,"ExponentialE;":158,"Fcy;":159,"Ffr;":160,"FilledSmallSquare;":161,"FilledVerySmallSquare;":162,"Fopf;":163,"ForAll;":164,"Fouriertrf;":165,"Fscr;":166,"GJcy;":167,GT:168,"GT;":169,"Gamma;":170,"Gammad;":171,"Gbreve;":172,"Gcedil;":173,"Gcirc;":174,"Gcy;":175,"Gdot;":176,"Gfr;":177,"Gg;":178,"Gopf;":179,"GreaterEqual;":180,"GreaterEqualLess;":181,"GreaterFullEqual;":182,"GreaterGreater;":183,"GreaterLess;":184,"GreaterSlantEqual;":185,"GreaterTilde;":186,"Gscr;":187,"Gt;":188,"HARDcy;":189,"Hacek;":190,"Hat;":191,"Hcirc;":192,"Hfr;":193,"HilbertSpace;":194,"Hopf;":195,"HorizontalLine;":196,"Hscr;":197,"Hstrok;":198,"HumpDownHump;":199,"HumpEqual;":200,"IEcy;":201,"IJlig;":202,"IOcy;":203,Iacute:204,"Iacute;":205,Icirc:206,"Icirc;":207,"Icy;":208,"Idot;":209,"Ifr;":210,Igrave:211,"Igrave;":212,"Im;":213,"Imacr;":214,"ImaginaryI;":215,"Implies;":216,"Int;":217,"Integral;":218,"Intersection;":219,"InvisibleComma;":220,"InvisibleTimes;":221,"Iogon;":222,"Iopf;":223,"Iota;":224,"Iscr;":225,"Itilde;":226,"Iukcy;":227,Iuml:228,"Iuml;":229,"Jcirc;":230,"Jcy;":231,"Jfr;":232,"Jopf;":233,"Jscr;":234,"Jsercy;":235,"Jukcy;":236,"KHcy;":237,"KJcy;":238,"Kappa;":239,"Kcedil;":240,"Kcy;":241,"Kfr;":242,"Kopf;":243,"Kscr;":244,"LJcy;":245,LT:246,"LT;":247,"Lacute;":248,"Lambda;":249,"Lang;":250,"Laplacetrf;":251,"Larr;":252,"Lcaron;":253,"Lcedil;":254,"Lcy;":255,"LeftAngleBracket;":256,"LeftArrow;":257,"LeftArrowBar;":258,"LeftArrowRightArrow;":259,"LeftCeiling;":260,"LeftDoubleBracket;":261,"LeftDownTeeVector;":262,"LeftDownVector;":263,"LeftDownVectorBar;":264,"LeftFloor;":265,"LeftRightArrow;":266,"LeftRightVector;":267,"LeftTee;":268,"LeftTeeArrow;":269,"LeftTeeVector;":270,"LeftTriangle;":271,"LeftTriangleBar;":272,"LeftTriangleEqual;":273,"LeftUpDownVector;":274,"LeftUpTeeVector;":275,"LeftUpVector;":276,"LeftUpVectorBar;":277,"LeftVector;":278,"LeftVectorBar;":279,"Leftarrow;":280,"Leftrightarrow;":281,"LessEqualGreater;":282,"LessFullEqual;":283,"LessGreater;":284,"LessLess;":285,"LessSlantEqual;":286,"LessTilde;":287,"Lfr;":288,"Ll;":289,"Lleftarrow;":290,"Lmidot;":291,"LongLeftArrow;":292,"LongLeftRightArrow;":293,"LongRightArrow;":294,"Longleftarrow;":295,"Longleftrightarrow;":296,"Longrightarrow;":297,"Lopf;":298,"LowerLeftArrow;":299,"LowerRightArrow;":300,"Lscr;":301,"Lsh;":302,"Lstrok;":303,"Lt;":304,"Map;":305,"Mcy;":306,"MediumSpace;":307,"Mellintrf;":308,"Mfr;":309,"MinusPlus;":310,"Mopf;":311,"Mscr;":312,"Mu;":313,"NJcy;":314,"Nacute;":315,"Ncaron;":316,"Ncedil;":317,"Ncy;":318,"NegativeMediumSpace;":319,"NegativeThickSpace;":320,"NegativeThinSpace;":321,"NegativeVeryThinSpace;":322,"NestedGreaterGreater;":323,"NestedLessLess;":324,"NewLine;":325,"Nfr;":326,"NoBreak;":327,"NonBreakingSpace;":328,"Nopf;":329,"Not;":330,"NotCongruent;":331,"NotCupCap;":332,"NotDoubleVerticalBar;":333,"NotElement;":334,"NotEqual;":335,"NotEqualTilde;":336,"NotExists;":337,"NotGreater;":338,"NotGreaterEqual;":339,"NotGreaterFullEqual;":340,"NotGreaterGreater;":341,"NotGreaterLess;":342,"NotGreaterSlantEqual;":343,"NotGreaterTilde;":344,"NotHumpDownHump;":345,"NotHumpEqual;":346,"NotLeftTriangle;":347,"NotLeftTriangleBar;":348,"NotLeftTriangleEqual;":349,"NotLess;":350,"NotLessEqual;":351,"NotLessGreater;":352,"NotLessLess;":353,"NotLessSlantEqual;":354,"NotLessTilde;":355,"NotNestedGreaterGreater;":356,"NotNestedLessLess;":357,"NotPrecedes;":358,"NotPrecedesEqual;":359,"NotPrecedesSlantEqual;":360,"NotReverseElement;":361,"NotRightTriangle;":362,"NotRightTriangleBar;":363,"NotRightTriangleEqual;":364,"NotSquareSubset;":365,"NotSquareSubsetEqual;":366,"NotSquareSuperset;":367,"NotSquareSupersetEqual;":368,"NotSubset;":369,"NotSubsetEqual;":370,"NotSucceeds;":371,"NotSucceedsEqual;":372,"NotSucceedsSlantEqual;":373,"NotSucceedsTilde;":374,"NotSuperset;":375,"NotSupersetEqual;":376,"NotTilde;":377,"NotTildeEqual;":378,"NotTildeFullEqual;":379,"NotTildeTilde;":380,"NotVerticalBar;":381,"Nscr;":382,Ntilde:383,"Ntilde;":384,"Nu;":385,"OElig;":386,Oacute:387,"Oacute;":388,Ocirc:389,"Ocirc;":390,"Ocy;":391,"Odblac;":392,"Ofr;":393,Ograve:394,"Ograve;":395,"Omacr;":396,"Omega;":397,"Omicron;":398,"Oopf;":399,"OpenCurlyDoubleQuote;":400,"OpenCurlyQuote;":401,"Or;":402,"Oscr;":403,Oslash:404,"Oslash;":405,Otilde:406,"Otilde;":407,"Otimes;":408,Ouml:409,"Ouml;":410,"OverBar;":411,"OverBrace;":412,"OverBracket;":413,"OverParenthesis;":414,"PartialD;":415,"Pcy;":416,"Pfr;":417,"Phi;":418,"Pi;":419,"PlusMinus;":420,"Poincareplane;":421,"Popf;":422,"Pr;":423,"Precedes;":424,"PrecedesEqual;":425,"PrecedesSlantEqual;":426,"PrecedesTilde;":427,"Prime;":428,"Product;":429,"Proportion;":430,"Proportional;":431,"Pscr;":432,"Psi;":433,QUOT:434,"QUOT;":435,"Qfr;":436,"Qopf;":437,"Qscr;":438,"RBarr;":439,REG:440,"REG;":441,"Racute;":442,"Rang;":443,"Rarr;":444,"Rarrtl;":445,"Rcaron;":446,"Rcedil;":447,"Rcy;":448,"Re;":449,"ReverseElement;":450,"ReverseEquilibrium;":451,"ReverseUpEquilibrium;":452,"Rfr;":453,"Rho;":454,"RightAngleBracket;":455,"RightArrow;":456,"RightArrowBar;":457,"RightArrowLeftArrow;":458,"RightCeiling;":459,"RightDoubleBracket;":460,"RightDownTeeVector;":461,"RightDownVector;":462,"RightDownVectorBar;":463,"RightFloor;":464,"RightTee;":465,"RightTeeArrow;":466,"RightTeeVector;":467,"RightTriangle;":468,"RightTriangleBar;":469,"RightTriangleEqual;":470,"RightUpDownVector;":471,"RightUpTeeVector;":472,"RightUpVector;":473,"RightUpVectorBar;":474,"RightVector;":475,"RightVectorBar;":476,"Rightarrow;":477,"Ropf;":478,"RoundImplies;":479,"Rrightarrow;":480,"Rscr;":481,"Rsh;":482,"RuleDelayed;":483,"SHCHcy;":484,"SHcy;":485,"SOFTcy;":486,"Sacute;":487,"Sc;":488,"Scaron;":489,"Scedil;":490,"Scirc;":491,"Scy;":492,"Sfr;":493,"ShortDownArrow;":494,"ShortLeftArrow;":495,"ShortRightArrow;":496,"ShortUpArrow;":497,"Sigma;":498,"SmallCircle;":499,"Sopf;":500,"Sqrt;":501,"Square;":502,"SquareIntersection;":503,"SquareSubset;":504,"SquareSubsetEqual;":505,"SquareSuperset;":506,"SquareSupersetEqual;":507,"SquareUnion;":508,"Sscr;":509,"Star;":510,"Sub;":511,"Subset;":512,"SubsetEqual;":513,"Succeeds;":514,"SucceedsEqual;":515,"SucceedsSlantEqual;":516,"SucceedsTilde;":517,"SuchThat;":518,"Sum;":519,"Sup;":520,"Superset;":521,"SupersetEqual;":522,"Supset;":523,THORN:524,"THORN;":525,"TRADE;":526,"TSHcy;":527,"TScy;":528,"Tab;":529,"Tau;":530,"Tcaron;":531,"Tcedil;":532,"Tcy;":533,"Tfr;":534,"Therefore;":535,"Theta;":536,"ThickSpace;":537,"ThinSpace;":538,"Tilde;":539,"TildeEqual;":540,"TildeFullEqual;":541,"TildeTilde;":542,"Topf;":543,"TripleDot;":544,"Tscr;":545,"Tstrok;":546,Uacute:547,"Uacute;":548,"Uarr;":549,"Uarrocir;":550,"Ubrcy;":551,"Ubreve;":552,Ucirc:553,"Ucirc;":554,"Ucy;":555,"Udblac;":556,"Ufr;":557,Ugrave:558,"Ugrave;":559,"Umacr;":560,"UnderBar;":561,"UnderBrace;":562,"UnderBracket;":563,"UnderParenthesis;":564,"Union;":565,"UnionPlus;":566,"Uogon;":567,"Uopf;":568,"UpArrow;":569,"UpArrowBar;":570,"UpArrowDownArrow;":571,"UpDownArrow;":572,"UpEquilibrium;":573,"UpTee;":574,"UpTeeArrow;":575,"Uparrow;":576,"Updownarrow;":577,"UpperLeftArrow;":578,"UpperRightArrow;":579,"Upsi;":580,"Upsilon;":581,"Uring;":582,"Uscr;":583,"Utilde;":584,Uuml:585,"Uuml;":586,"VDash;":587,"Vbar;":588,"Vcy;":589,"Vdash;":590,"Vdashl;":591,"Vee;":592,"Verbar;":593,"Vert;":594,"VerticalBar;":595,"VerticalLine;":596,"VerticalSeparator;":597,"VerticalTilde;":598,"VeryThinSpace;":599,"Vfr;":600,"Vopf;":601,"Vscr;":602,"Vvdash;":603,"Wcirc;":604,"Wedge;":605,"Wfr;":606,"Wopf;":607,"Wscr;":608,"Xfr;":609,"Xi;":610,"Xopf;":611,"Xscr;":612,"YAcy;":613,"YIcy;":614,"YUcy;":615,Yacute:616,"Yacute;":617,"Ycirc;":618,"Ycy;":619,"Yfr;":620,"Yopf;":621,"Yscr;":622,"Yuml;":623,"ZHcy;":624,"Zacute;":625,"Zcaron;":626,"Zcy;":627,"Zdot;":628,"ZeroWidthSpace;":629,"Zeta;":630,"Zfr;":631,"Zopf;":632,"Zscr;":633,aacute:634,"aacute;":635,"abreve;":636,"ac;":637,"acE;":638,"acd;":639,acirc:640,"acirc;":641,acute:642,"acute;":643,"acy;":644,aelig:645,"aelig;":646,"af;":647,"afr;":648,agrave:649,"agrave;":650,"alefsym;":651,"aleph;":652,"alpha;":653,"amacr;":654,"amalg;":655,amp:656,"amp;":657,"and;":658,"andand;":659,"andd;":660,"andslope;":661,"andv;":662,"ang;":663,"ange;":664,"angle;":665,"angmsd;":666,"angmsdaa;":667,"angmsdab;":668,"angmsdac;":669,"angmsdad;":670,"angmsdae;":671,"angmsdaf;":672,"angmsdag;":673,"angmsdah;":674,"angrt;":675,"angrtvb;":676,"angrtvbd;":677,"angsph;":678,"angst;":679,"angzarr;":680,"aogon;":681,"aopf;":682,"ap;":683,"apE;":684,"apacir;":685,"ape;":686,"apid;":687,"apos;":688,"approx;":689,"approxeq;":690,aring:691,"aring;":692,"ascr;":693,"ast;":694,"asymp;":695,"asympeq;":696,atilde:697,"atilde;":698,auml:699,"auml;":700,"awconint;":701,"awint;":702,"bNot;":703,"backcong;":704,"backepsilon;":705,"backprime;":706,"backsim;":707,"backsimeq;":708,"barvee;":709,"barwed;":710,"barwedge;":711,"bbrk;":712,"bbrktbrk;":713,"bcong;":714,"bcy;":715,"bdquo;":716,"becaus;":717,"because;":718,"bemptyv;":719,"bepsi;":720,"bernou;":721,"beta;":722,"beth;":723,"between;":724,"bfr;":725,"bigcap;":726,"bigcirc;":727,"bigcup;":728,"bigodot;":729,"bigoplus;":730,"bigotimes;":731,"bigsqcup;":732,"bigstar;":733,"bigtriangledown;":734,"bigtriangleup;":735,"biguplus;":736,"bigvee;":737,"bigwedge;":738,"bkarow;":739,"blacklozenge;":740,"blacksquare;":741,"blacktriangle;":742,"blacktriangledown;":743,"blacktriangleleft;":744,"blacktriangleright;":745,"blank;":746,"blk12;":747,"blk14;":748,"blk34;":749,"block;":750,"bne;":751,"bnequiv;":752,"bnot;":753,"bopf;":754,"bot;":755,"bottom;":756,"bowtie;":757,"boxDL;":758,"boxDR;":759,"boxDl;":760,"boxDr;":761,"boxH;":762,"boxHD;":763,"boxHU;":764,"boxHd;":765,"boxHu;":766,"boxUL;":767,"boxUR;":768,"boxUl;":769,"boxUr;":770,"boxV;":771,"boxVH;":772,"boxVL;":773,"boxVR;":774,"boxVh;":775,"boxVl;":776,"boxVr;":777,"boxbox;":778,"boxdL;":779,"boxdR;":780,"boxdl;":781,"boxdr;":782,"boxh;":783,"boxhD;":784,"boxhU;":785,"boxhd;":786,"boxhu;":787,"boxminus;":788,"boxplus;":789,"boxtimes;":790,"boxuL;":791,"boxuR;":792,"boxul;":793,"boxur;":794,"boxv;":795,"boxvH;":796,"boxvL;":797,"boxvR;":798,"boxvh;":799,"boxvl;":800,"boxvr;":801,"bprime;":802,"breve;":803,brvbar:804,"brvbar;":805,"bscr;":806,"bsemi;":807,"bsim;":808,"bsime;":809,"bsol;":810,"bsolb;":811,"bsolhsub;":812,"bull;":813,"bullet;":814,"bump;":815,"bumpE;":816,"bumpe;":817,"bumpeq;":818,"cacute;":819,"cap;":820,"capand;":821,"capbrcup;":822,"capcap;":823,"capcup;":824,"capdot;":825,"caps;":826,"caret;":827,"caron;":828,"ccaps;":829,"ccaron;":830,ccedil:831,"ccedil;":832,"ccirc;":833,"ccups;":834,"ccupssm;":835,"cdot;":836,cedil:837,"cedil;":838,"cemptyv;":839,cent:840,"cent;":841,"centerdot;":842,"cfr;":843,"chcy;":844,"check;":845,"checkmark;":846,"chi;":847,"cir;":848,"cirE;":849,"circ;":850,"circeq;":851,"circlearrowleft;":852,"circlearrowright;":853,"circledR;":854,"circledS;":855,"circledast;":856,"circledcirc;":857,"circleddash;":858,"cire;":859,"cirfnint;":860,"cirmid;":861,"cirscir;":862,"clubs;":863,"clubsuit;":864,"colon;":865,"colone;":866,"coloneq;":867,"comma;":868,"commat;":869,"comp;":870,"compfn;":871,"complement;":872,"complexes;":873,"cong;":874,"congdot;":875,"conint;":876,"copf;":877,"coprod;":878,copy:879,"copy;":880,"copysr;":881,"crarr;":882,"cross;":883,"cscr;":884,"csub;":885,"csube;":886,"csup;":887,"csupe;":888,"ctdot;":889,"cudarrl;":890,"cudarrr;":891,"cuepr;":892,"cuesc;":893,"cularr;":894,"cularrp;":895,"cup;":896,"cupbrcap;":897,"cupcap;":898,"cupcup;":899,"cupdot;":900,"cupor;":901,"cups;":902,"curarr;":903,"curarrm;":904,"curlyeqprec;":905,"curlyeqsucc;":906,"curlyvee;":907,"curlywedge;":908,curren:909,"curren;":910,"curvearrowleft;":911,"curvearrowright;":912,"cuvee;":913,"cuwed;":914,"cwconint;":915,"cwint;":916,"cylcty;":917,"dArr;":918,"dHar;":919,"dagger;":920,"daleth;":921,"darr;":922,"dash;":923,"dashv;":924,"dbkarow;":925,"dblac;":926,"dcaron;":927,"dcy;":928,"dd;":929,"ddagger;":930,"ddarr;":931,"ddotseq;":932,deg:933,"deg;":934,"delta;":935,"demptyv;":936,"dfisht;":937,"dfr;":938,"dharl;":939,"dharr;":940,"diam;":941,"diamond;":942,"diamondsuit;":943,"diams;":944,"die;":945,"digamma;":946,"disin;":947,"div;":948,divide:949,"divide;":950,"divideontimes;":951,"divonx;":952,"djcy;":953,"dlcorn;":954,"dlcrop;":955,"dollar;":956,"dopf;":957,"dot;":958,"doteq;":959,"doteqdot;":960,"dotminus;":961,"dotplus;":962,"dotsquare;":963,"doublebarwedge;":964,"downarrow;":965,"downdownarrows;":966,"downharpoonleft;":967,"downharpoonright;":968,"drbkarow;":969,"drcorn;":970,"drcrop;":971,"dscr;":972,"dscy;":973,"dsol;":974,"dstrok;":975,"dtdot;":976,"dtri;":977,"dtrif;":978,"duarr;":979,"duhar;":980,"dwangle;":981,"dzcy;":982,"dzigrarr;":983,"eDDot;":984,"eDot;":985,eacute:986,"eacute;":987,"easter;":988,"ecaron;":989,"ecir;":990,ecirc:991,"ecirc;":992,"ecolon;":993,"ecy;":994,"edot;":995,"ee;":996,"efDot;":997,"efr;":998,"eg;":999,egrave:1000,"egrave;":1001,"egs;":1002,"egsdot;":1003,"el;":1004,"elinters;":1005,"ell;":1006,"els;":1007,"elsdot;":1008,"emacr;":1009,"empty;":1010,"emptyset;":1011,"emptyv;":1012,"emsp13;":1013,"emsp14;":1014,"emsp;":1015,"eng;":1016,"ensp;":1017,"eogon;":1018,"eopf;":1019,"epar;":1020,"eparsl;":1021,"eplus;":1022,"epsi;":1023,"epsilon;":1024,"epsiv;":1025,"eqcirc;":1026,"eqcolon;":1027,"eqsim;":1028,"eqslantgtr;":1029,"eqslantless;":1030,"equals;":1031,"equest;":1032,"equiv;":1033,"equivDD;":1034,"eqvparsl;":1035,"erDot;":1036,"erarr;":1037,"escr;":1038,"esdot;":1039,"esim;":1040,"eta;":1041,eth:1042,"eth;":1043,euml:1044,"euml;":1045,"euro;":1046,"excl;":1047,"exist;":1048,"expectation;":1049,"exponentiale;":1050,"fallingdotseq;":1051,"fcy;":1052,"female;":1053,"ffilig;":1054,"fflig;":1055,"ffllig;":1056,"ffr;":1057,"filig;":1058,"fjlig;":1059,"flat;":1060,"fllig;":1061,"fltns;":1062,"fnof;":1063,"fopf;":1064,"forall;":1065,"fork;":1066,"forkv;":1067,"fpartint;":1068,frac12:1069,"frac12;":1070,"frac13;":1071,frac14:1072,"frac14;":1073,"frac15;":1074,"frac16;":1075,"frac18;":1076,"frac23;":1077,"frac25;":1078,frac34:1079,"frac34;":1080,"frac35;":1081,"frac38;":1082,"frac45;":1083,"frac56;":1084,"frac58;":1085,"frac78;":1086,"frasl;":1087,"frown;":1088,"fscr;":1089,"gE;":1090,"gEl;":1091,"gacute;":1092,"gamma;":1093,"gammad;":1094,"gap;":1095,"gbreve;":1096,"gcirc;":1097,"gcy;":1098,"gdot;":1099,"ge;":1100,"gel;":1101,"geq;":1102,"geqq;":1103,"geqslant;":1104,"ges;":1105,"gescc;":1106,"gesdot;":1107,"gesdoto;":1108,"gesdotol;":1109,"gesl;":1110,"gesles;":1111,"gfr;":1112,"gg;":1113,"ggg;":1114,"gimel;":1115,"gjcy;":1116,"gl;":1117,"glE;":1118,"gla;":1119,"glj;":1120,"gnE;":1121,"gnap;":1122,"gnapprox;":1123,"gne;":1124,"gneq;":1125,"gneqq;":1126,"gnsim;":1127,"gopf;":1128,"grave;":1129,"gscr;":1130,"gsim;":1131,"gsime;":1132,"gsiml;":1133,gt:1134,"gt;":1135,"gtcc;":1136,"gtcir;":1137,"gtdot;":1138,"gtlPar;":1139,"gtquest;":1140,"gtrapprox;":1141,"gtrarr;":1142,"gtrdot;":1143,"gtreqless;":1144,"gtreqqless;":1145,"gtrless;":1146,"gtrsim;":1147,"gvertneqq;":1148,"gvnE;":1149,"hArr;":1150,"hairsp;":1151,"half;":1152,"hamilt;":1153,"hardcy;":1154,"harr;":1155,"harrcir;":1156,"harrw;":1157,"hbar;":1158,"hcirc;":1159,"hearts;":1160,"heartsuit;":1161,"hellip;":1162,"hercon;":1163,"hfr;":1164,"hksearow;":1165,"hkswarow;":1166,"hoarr;":1167,"homtht;":1168,"hookleftarrow;":1169,"hookrightarrow;":1170,"hopf;":1171,"horbar;":1172,"hscr;":1173,"hslash;":1174,"hstrok;":1175,"hybull;":1176,"hyphen;":1177,iacute:1178,"iacute;":1179,"ic;":1180,icirc:1181,"icirc;":1182,"icy;":1183,"iecy;":1184,iexcl:1185,"iexcl;":1186,"iff;":1187,"ifr;":1188,igrave:1189,"igrave;":1190,"ii;":1191,"iiiint;":1192,"iiint;":1193,"iinfin;":1194,"iiota;":1195,"ijlig;":1196,"imacr;":1197,"image;":1198,"imagline;":1199,"imagpart;":1200,"imath;":1201,"imof;":1202,"imped;":1203,"in;":1204,"incare;":1205,"infin;":1206,"infintie;":1207,"inodot;":1208,"int;":1209,"intcal;":1210,"integers;":1211,"intercal;":1212,"intlarhk;":1213,"intprod;":1214,"iocy;":1215,"iogon;":1216,"iopf;":1217,"iota;":1218,"iprod;":1219,iquest:1220,"iquest;":1221,"iscr;":1222,"isin;":1223,"isinE;":1224,"isindot;":1225,"isins;":1226,"isinsv;":1227,"isinv;":1228,"it;":1229,"itilde;":1230,"iukcy;":1231,iuml:1232,"iuml;":1233,"jcirc;":1234,"jcy;":1235,"jfr;":1236,"jmath;":1237,"jopf;":1238,"jscr;":1239,"jsercy;":1240,"jukcy;":1241,"kappa;":1242,"kappav;":1243,"kcedil;":1244,"kcy;":1245,"kfr;":1246,"kgreen;":1247,"khcy;":1248,"kjcy;":1249,"kopf;":1250,"kscr;":1251,"lAarr;":1252,"lArr;":1253,"lAtail;":1254,"lBarr;":1255,"lE;":1256,"lEg;":1257,"lHar;":1258,"lacute;":1259,"laemptyv;":1260,"lagran;":1261,"lambda;":1262,"lang;":1263,"langd;":1264,"langle;":1265,"lap;":1266,laquo:1267,"laquo;":1268,"larr;":1269,"larrb;":1270,"larrbfs;":1271,"larrfs;":1272,"larrhk;":1273,"larrlp;":1274,"larrpl;":1275,"larrsim;":1276,"larrtl;":1277,"lat;":1278,"latail;":1279,"late;":1280,"lates;":1281,"lbarr;":1282,"lbbrk;":1283,"lbrace;":1284,"lbrack;":1285,"lbrke;":1286,"lbrksld;":1287,"lbrkslu;":1288,"lcaron;":1289,"lcedil;":1290,"lceil;":1291,"lcub;":1292,"lcy;":1293,"ldca;":1294,"ldquo;":1295,"ldquor;":1296,"ldrdhar;":1297,"ldrushar;":1298,"ldsh;":1299,"le;":1300,"leftarrow;":1301,"leftarrowtail;":1302,"leftharpoondown;":1303,"leftharpoonup;":1304,"leftleftarrows;":1305,"leftrightarrow;":1306,"leftrightarrows;":1307,"leftrightharpoons;":1308,"leftrightsquigarrow;":1309,"leftthreetimes;":1310,"leg;":1311,"leq;":1312,"leqq;":1313,"leqslant;":1314,"les;":1315,"lescc;":1316,"lesdot;":1317,"lesdoto;":1318,"lesdotor;":1319,"lesg;":1320,"lesges;":1321,"lessapprox;":1322,"lessdot;":1323,"lesseqgtr;":1324,"lesseqqgtr;":1325,"lessgtr;":1326,"lesssim;":1327,"lfisht;":1328,"lfloor;":1329,"lfr;":1330,"lg;":1331,"lgE;":1332,"lhard;":1333,"lharu;":1334,"lharul;":1335,"lhblk;":1336,"ljcy;":1337,"ll;":1338,"llarr;":1339,"llcorner;":1340,"llhard;":1341,"lltri;":1342,"lmidot;":1343,"lmoust;":1344,"lmoustache;":1345,"lnE;":1346,"lnap;":1347,"lnapprox;":1348,"lne;":1349,"lneq;":1350,"lneqq;":1351,"lnsim;":1352,"loang;":1353,"loarr;":1354,"lobrk;":1355,"longleftarrow;":1356,"longleftrightarrow;":1357,"longmapsto;":1358,"longrightarrow;":1359,"looparrowleft;":1360,"looparrowright;":1361,"lopar;":1362,"lopf;":1363,"loplus;":1364,"lotimes;":1365,"lowast;":1366,"lowbar;":1367,"loz;":1368,"lozenge;":1369,"lozf;":1370,"lpar;":1371,"lparlt;":1372,"lrarr;":1373,"lrcorner;":1374,"lrhar;":1375,"lrhard;":1376,"lrm;":1377,"lrtri;":1378,"lsaquo;":1379,"lscr;":1380,"lsh;":1381,"lsim;":1382,"lsime;":1383,"lsimg;":1384,"lsqb;":1385,"lsquo;":1386,"lsquor;":1387,"lstrok;":1388,lt:1389,"lt;":1390,"ltcc;":1391,"ltcir;":1392,"ltdot;":1393,"lthree;":1394,"ltimes;":1395,"ltlarr;":1396,"ltquest;":1397,"ltrPar;":1398,"ltri;":1399,"ltrie;":1400,"ltrif;":1401,"lurdshar;":1402,"luruhar;":1403,"lvertneqq;":1404,"lvnE;":1405,"mDDot;":1406,macr:1407,"macr;":1408,"male;":1409,"malt;":1410,"maltese;":1411,"map;":1412,"mapsto;":1413,"mapstodown;":1414,"mapstoleft;":1415,"mapstoup;":1416,"marker;":1417,"mcomma;":1418,"mcy;":1419,"mdash;":1420,"measuredangle;":1421,"mfr;":1422,"mho;":1423,micro:1424,"micro;":1425,"mid;":1426,"midast;":1427,"midcir;":1428,middot:1429,"middot;":1430,"minus;":1431,"minusb;":1432,"minusd;":1433,"minusdu;":1434,"mlcp;":1435,"mldr;":1436,"mnplus;":1437,"models;":1438,"mopf;":1439,"mp;":1440,"mscr;":1441,"mstpos;":1442,"mu;":1443,"multimap;":1444,"mumap;":1445,"nGg;":1446,"nGt;":1447,"nGtv;":1448,"nLeftarrow;":1449,"nLeftrightarrow;":1450,"nLl;":1451,"nLt;":1452,"nLtv;":1453,"nRightarrow;":1454,"nVDash;":1455,"nVdash;":1456,"nabla;":1457,"nacute;":1458,"nang;":1459,"nap;":1460,"napE;":1461,"napid;":1462,"napos;":1463,"napprox;":1464,"natur;":1465,"natural;":1466,"naturals;":1467,nbsp:1468,"nbsp;":1469,"nbump;":1470,"nbumpe;":1471,"ncap;":1472,"ncaron;":1473,"ncedil;":1474,"ncong;":1475,"ncongdot;":1476,"ncup;":1477,"ncy;":1478,"ndash;":1479,"ne;":1480,"neArr;":1481,"nearhk;":1482,"nearr;":1483,"nearrow;":1484,"nedot;":1485,"nequiv;":1486,"nesear;":1487,"nesim;":1488,"nexist;":1489,"nexists;":1490,"nfr;":1491,"ngE;":1492,"nge;":1493,"ngeq;":1494,"ngeqq;":1495,"ngeqslant;":1496,"nges;":1497,"ngsim;":1498,"ngt;":1499,"ngtr;":1500,"nhArr;":1501,"nharr;":1502,"nhpar;":1503,"ni;":1504,"nis;":1505,"nisd;":1506,"niv;":1507,"njcy;":1508,"nlArr;":1509,"nlE;":1510,"nlarr;":1511,"nldr;":1512,"nle;":1513,"nleftarrow;":1514,"nleftrightarrow;":1515,"nleq;":1516,"nleqq;":1517,"nleqslant;":1518,"nles;":1519,"nless;":1520,"nlsim;":1521,"nlt;":1522,"nltri;":1523,"nltrie;":1524,"nmid;":1525,"nopf;":1526,not:1527,"not;":1528,"notin;":1529,"notinE;":1530,"notindot;":1531,"notinva;":1532,"notinvb;":1533,"notinvc;":1534,"notni;":1535,"notniva;":1536,"notnivb;":1537,"notnivc;":1538,"npar;":1539,"nparallel;":1540,"nparsl;":1541,"npart;":1542,"npolint;":1543,"npr;":1544,"nprcue;":1545,"npre;":1546,"nprec;":1547,"npreceq;":1548,"nrArr;":1549,"nrarr;":1550,"nrarrc;":1551,"nrarrw;":1552,"nrightarrow;":1553,"nrtri;":1554,"nrtrie;":1555,"nsc;":1556,"nsccue;":1557,"nsce;":1558,"nscr;":1559,"nshortmid;":1560,"nshortparallel;":1561,"nsim;":1562,"nsime;":1563,"nsimeq;":1564,"nsmid;":1565,"nspar;":1566,"nsqsube;":1567,"nsqsupe;":1568,"nsub;":1569,"nsubE;":1570,"nsube;":1571,"nsubset;":1572,"nsubseteq;":1573,"nsubseteqq;":1574,"nsucc;":1575,"nsucceq;":1576,"nsup;":1577,"nsupE;":1578,"nsupe;":1579,"nsupset;":1580,"nsupseteq;":1581,"nsupseteqq;":1582,"ntgl;":1583,ntilde:1584,"ntilde;":1585,"ntlg;":1586,"ntriangleleft;":1587,"ntrianglelefteq;":1588,"ntriangleright;":1589,"ntrianglerighteq;":1590,"nu;":1591,"num;":1592,"numero;":1593,"numsp;":1594,"nvDash;":1595,"nvHarr;":1596,"nvap;":1597,"nvdash;":1598,"nvge;":1599,"nvgt;":1600,"nvinfin;":1601,"nvlArr;":1602,"nvle;":1603,"nvlt;":1604,"nvltrie;":1605,"nvrArr;":1606,"nvrtrie;":1607,"nvsim;":1608,"nwArr;":1609,"nwarhk;":1610,"nwarr;":1611,"nwarrow;":1612,"nwnear;":1613,"oS;":1614,oacute:1615,"oacute;":1616,"oast;":1617,"ocir;":1618,ocirc:1619,"ocirc;":1620,"ocy;":1621,"odash;":1622,"odblac;":1623,"odiv;":1624,"odot;":1625,"odsold;":1626,"oelig;":1627,"ofcir;":1628,"ofr;":1629,"ogon;":1630,ograve:1631,"ograve;":1632,"ogt;":1633,"ohbar;":1634,"ohm;":1635,"oint;":1636,"olarr;":1637,"olcir;":1638,"olcross;":1639,"oline;":1640,"olt;":1641,"omacr;":1642,"omega;":1643,"omicron;":1644,"omid;":1645,"ominus;":1646,"oopf;":1647,"opar;":1648,"operp;":1649,"oplus;":1650,"or;":1651,"orarr;":1652,"ord;":1653,"order;":1654,"orderof;":1655,ordf:1656,"ordf;":1657,ordm:1658,"ordm;":1659,"origof;":1660,"oror;":1661,"orslope;":1662,"orv;":1663,"oscr;":1664,oslash:1665,"oslash;":1666,"osol;":1667,otilde:1668,"otilde;":1669,"otimes;":1670,"otimesas;":1671,ouml:1672,"ouml;":1673,"ovbar;":1674,"par;":1675,para:1676,"para;":1677,"parallel;":1678,"parsim;":1679,"parsl;":1680,"part;":1681,"pcy;":1682,"percnt;":1683,"period;":1684,"permil;":1685,"perp;":1686,"pertenk;":1687,"pfr;":1688,"phi;":1689,"phiv;":1690,"phmmat;":1691,"phone;":1692,"pi;":1693,"pitchfork;":1694,"piv;":1695,"planck;":1696,"planckh;":1697,"plankv;":1698,"plus;":1699,"plusacir;":1700,"plusb;":1701,"pluscir;":1702,"plusdo;":1703,"plusdu;":1704,"pluse;":1705,plusmn:1706,"plusmn;":1707,"plussim;":1708,"plustwo;":1709,"pm;":1710,"pointint;":1711,"popf;":1712,pound:1713,"pound;":1714,"pr;":1715,"prE;":1716,"prap;":1717,"prcue;":1718,"pre;":1719,"prec;":1720,"precapprox;":1721,"preccurlyeq;":1722,"preceq;":1723,"precnapprox;":1724,"precneqq;":1725,"precnsim;":1726,"precsim;":1727,"prime;":1728,"primes;":1729,"prnE;":1730,"prnap;":1731,"prnsim;":1732,"prod;":1733,"profalar;":1734,"profline;":1735,"profsurf;":1736,"prop;":1737,"propto;":1738,"prsim;":1739,"prurel;":1740,"pscr;":1741,"psi;":1742,"puncsp;":1743,"qfr;":1744,"qint;":1745,"qopf;":1746,"qprime;":1747,"qscr;":1748,"quaternions;":1749,"quatint;":1750,"quest;":1751,"questeq;":1752,quot:1753,"quot;":1754,"rAarr;":1755,"rArr;":1756,"rAtail;":1757,"rBarr;":1758,"rHar;":1759,"race;":1760,"racute;":1761,"radic;":1762,"raemptyv;":1763,"rang;":1764,"rangd;":1765,"range;":1766,"rangle;":1767,raquo:1768,"raquo;":1769,"rarr;":1770,"rarrap;":1771,"rarrb;":1772,"rarrbfs;":1773,"rarrc;":1774,"rarrfs;":1775,"rarrhk;":1776,"rarrlp;":1777,"rarrpl;":1778,"rarrsim;":1779,"rarrtl;":1780,"rarrw;":1781,"ratail;":1782,"ratio;":1783,"rationals;":1784,"rbarr;":1785,"rbbrk;":1786,"rbrace;":1787,"rbrack;":1788,"rbrke;":1789,"rbrksld;":1790,"rbrkslu;":1791,"rcaron;":1792,"rcedil;":1793,"rceil;":1794,"rcub;":1795,"rcy;":1796,"rdca;":1797,"rdldhar;":1798,"rdquo;":1799,"rdquor;":1800,"rdsh;":1801,"real;":1802,"realine;":1803,"realpart;":1804,"reals;":1805,"rect;":1806,reg:1807,"reg;":1808,"rfisht;":1809,"rfloor;":1810,"rfr;":1811,"rhard;":1812,"rharu;":1813,"rharul;":1814,"rho;":1815,"rhov;":1816,"rightarrow;":1817,"rightarrowtail;":1818,"rightharpoondown;":1819,"rightharpoonup;":1820,"rightleftarrows;":1821,"rightleftharpoons;":1822,"rightrightarrows;":1823,"rightsquigarrow;":1824,"rightthreetimes;":1825,"ring;":1826,"risingdotseq;":1827,"rlarr;":1828,"rlhar;":1829,"rlm;":1830,"rmoust;":1831,"rmoustache;":1832,"rnmid;":1833,"roang;":1834,"roarr;":1835,"robrk;":1836,"ropar;":1837,"ropf;":1838,"roplus;":1839,"rotimes;":1840,"rpar;":1841,"rpargt;":1842,"rppolint;":1843,"rrarr;":1844,"rsaquo;":1845,"rscr;":1846,"rsh;":1847,"rsqb;":1848,"rsquo;":1849,"rsquor;":1850,"rthree;":1851,"rtimes;":1852,"rtri;":1853,"rtrie;":1854,"rtrif;":1855,"rtriltri;":1856,"ruluhar;":1857,"rx;":1858,"sacute;":1859,"sbquo;":1860,"sc;":1861,"scE;":1862,"scap;":1863,"scaron;":1864,"sccue;":1865,"sce;":1866,"scedil;":1867,"scirc;":1868,"scnE;":1869,"scnap;":1870,"scnsim;":1871,"scpolint;":1872,"scsim;":1873,"scy;":1874,"sdot;":1875,"sdotb;":1876,"sdote;":1877,"seArr;":1878,"searhk;":1879,"searr;":1880,"searrow;":1881,sect:1882,"sect;":1883,"semi;":1884,"seswar;":1885,"setminus;":1886,"setmn;":1887,"sext;":1888,"sfr;":1889,"sfrown;":1890,"sharp;":1891,"shchcy;":1892,"shcy;":1893,"shortmid;":1894,"shortparallel;":1895,shy:1896,"shy;":1897,"sigma;":1898,"sigmaf;":1899,"sigmav;":1900,"sim;":1901,"simdot;":1902,"sime;":1903,"simeq;":1904,"simg;":1905,"simgE;":1906,"siml;":1907,"simlE;":1908,"simne;":1909,"simplus;":1910,"simrarr;":1911,"slarr;":1912,"smallsetminus;":1913,"smashp;":1914,"smeparsl;":1915,"smid;":1916,"smile;":1917,"smt;":1918,"smte;":1919,"smtes;":1920,"softcy;":1921,"sol;":1922,"solb;":1923,"solbar;":1924,"sopf;":1925,"spades;":1926,"spadesuit;":1927,"spar;":1928,"sqcap;":1929,"sqcaps;":1930,"sqcup;":1931,"sqcups;":1932,"sqsub;":1933,"sqsube;":1934,"sqsubset;":1935,"sqsubseteq;":1936,"sqsup;":1937,"sqsupe;":1938,"sqsupset;":1939,"sqsupseteq;":1940,"squ;":1941,"square;":1942,"squarf;":1943,"squf;":1944,"srarr;":1945,"sscr;":1946,"ssetmn;":1947,"ssmile;":1948,"sstarf;":1949,"star;":1950,"starf;":1951,"straightepsilon;":1952,"straightphi;":1953,"strns;":1954,"sub;":1955,"subE;":1956,"subdot;":1957,"sube;":1958,"subedot;":1959,"submult;":1960,"subnE;":1961,"subne;":1962,"subplus;":1963,"subrarr;":1964,"subset;":1965,"subseteq;":1966,"subseteqq;":1967,"subsetneq;":1968,"subsetneqq;":1969,"subsim;":1970,"subsub;":1971,"subsup;":1972,"succ;":1973,"succapprox;":1974,"succcurlyeq;":1975,"succeq;":1976,"succnapprox;":1977,"succneqq;":1978,"succnsim;":1979,"succsim;":1980,"sum;":1981,"sung;":1982,sup1:1983,"sup1;":1984,sup2:1985,"sup2;":1986,sup3:1987,"sup3;":1988,"sup;":1989,"supE;":1990,"supdot;":1991,"supdsub;":1992,"supe;":1993,"supedot;":1994,"suphsol;":1995,"suphsub;":1996,"suplarr;":1997,"supmult;":1998,"supnE;":1999,"supne;":2000,"supplus;":2001,"supset;":2002,"supseteq;":2003,"supseteqq;":2004,"supsetneq;":2005,"supsetneqq;":2006,"supsim;":2007,"supsub;":2008,"supsup;":2009,"swArr;":2010,"swarhk;":2011,"swarr;":2012,"swarrow;":2013,"swnwar;":2014,szlig:2015,"szlig;":2016,"target;":2017,"tau;":2018,"tbrk;":2019,"tcaron;":2020,"tcedil;":2021,"tcy;":2022,"tdot;":2023,"telrec;":2024,"tfr;":2025,"there4;":2026,"therefore;":2027,"theta;":2028,"thetasym;":2029,"thetav;":2030,"thickapprox;":2031,"thicksim;":2032,"thinsp;":2033,"thkap;":2034,"thksim;":2035,thorn:2036,"thorn;":2037,"tilde;":2038,times:2039,"times;":2040,"timesb;":2041,"timesbar;":2042,"timesd;":2043,"tint;":2044,"toea;":2045,"top;":2046,"topbot;":2047,"topcir;":2048,"topf;":2049,"topfork;":2050,"tosa;":2051,"tprime;":2052,"trade;":2053,"triangle;":2054,"triangledown;":2055,"triangleleft;":2056,"trianglelefteq;":2057,"triangleq;":2058,"triangleright;":2059,"trianglerighteq;":2060,"tridot;":2061,"trie;":2062,"triminus;":2063,"triplus;":2064,"trisb;":2065,"tritime;":2066,"trpezium;":2067,"tscr;":2068,"tscy;":2069,"tshcy;":2070,"tstrok;":2071,"twixt;":2072,"twoheadleftarrow;":2073,"twoheadrightarrow;":2074,"uArr;":2075,"uHar;":2076,uacute:2077,"uacute;":2078,"uarr;":2079,"ubrcy;":2080,"ubreve;":2081,ucirc:2082,"ucirc;":2083,"ucy;":2084,"udarr;":2085,"udblac;":2086,"udhar;":2087,"ufisht;":2088,"ufr;":2089,ugrave:2090,"ugrave;":2091,"uharl;":2092,"uharr;":2093,"uhblk;":2094,"ulcorn;":2095,"ulcorner;":2096,"ulcrop;":2097,"ultri;":2098,"umacr;":2099,uml:2100,"uml;":2101,"uogon;":2102,"uopf;":2103,"uparrow;":2104,"updownarrow;":2105,"upharpoonleft;":2106,"upharpoonright;":2107,"uplus;":2108,"upsi;":2109,"upsih;":2110,"upsilon;":2111,"upuparrows;":2112,"urcorn;":2113,"urcorner;":2114,"urcrop;":2115,"uring;":2116,"urtri;":2117,"uscr;":2118,"utdot;":2119,"utilde;":2120,"utri;":2121,"utrif;":2122,"uuarr;":2123,uuml:2124,"uuml;":2125,"uwangle;":2126,"vArr;":2127,"vBar;":2128,"vBarv;":2129,"vDash;":2130,"vangrt;":2131,"varepsilon;":2132,"varkappa;":2133,"varnothing;":2134,"varphi;":2135,"varpi;":2136,"varpropto;":2137,"varr;":2138,"varrho;":2139,"varsigma;":2140,"varsubsetneq;":2141,"varsubsetneqq;":2142,"varsupsetneq;":2143,"varsupsetneqq;":2144,"vartheta;":2145,"vartriangleleft;":2146,"vartriangleright;":2147,"vcy;":2148,"vdash;":2149,"vee;":2150,"veebar;":2151,"veeeq;":2152,"vellip;":2153,"verbar;":2154,"vert;":2155,"vfr;":2156,"vltri;":2157,"vnsub;":2158,"vnsup;":2159,"vopf;":2160,"vprop;":2161,"vrtri;":2162,"vscr;":2163,"vsubnE;":2164,"vsubne;":2165,"vsupnE;":2166,"vsupne;":2167,"vzigzag;":2168,"wcirc;":2169,"wedbar;":2170,"wedge;":2171,"wedgeq;":2172,"weierp;":2173,"wfr;":2174,"wopf;":2175,"wp;":2176,"wr;":2177,"wreath;":2178,"wscr;":2179,"xcap;":2180,"xcirc;":2181,"xcup;":2182,"xdtri;":2183,"xfr;":2184,"xhArr;":2185,"xharr;":2186,"xi;":2187,"xlArr;":2188,"xlarr;":2189,"xmap;":2190,"xnis;":2191,"xodot;":2192,"xopf;":2193,"xoplus;":2194,"xotime;":2195,"xrArr;":2196,"xrarr;":2197,"xscr;":2198,"xsqcup;":2199,"xuplus;":2200,"xutri;":2201,"xvee;":2202,"xwedge;":2203,yacute:2204,"yacute;":2205,"yacy;":2206,"ycirc;":2207,"ycy;":2208,yen:2209,"yen;":2210,"yfr;":2211,"yicy;":2212,"yopf;":2213,"yscr;":2214,"yucy;":2215,yuml:2216,"yuml;":2217,"zacute;":2218,"zcaron;":2219,"zcy;":2220,"zdot;":2221,"zeetrf;":2222,"zeta;":2223,"zfr;":2224,"zhcy;":2225,"zigrarr;":2226,"zopf;":2227,"zscr;":2228,"zwj;":2229,"zwnj;":2230} +B.fs=new A.r(B.KX,["\xc6","\xc6","&","&","\xc1","\xc1","\u0102","\xc2","\xc2","\u0410","\ud835\udd04","\xc0","\xc0","\u0391","\u0100","\u2a53","\u0104","\ud835\udd38","\u2061","\xc5","\xc5","\ud835\udc9c","\u2254","\xc3","\xc3","\xc4","\xc4","\u2216","\u2ae7","\u2306","\u0411","\u2235","\u212c","\u0392","\ud835\udd05","\ud835\udd39","\u02d8","\u212c","\u224e","\u0427","\xa9","\xa9","\u0106","\u22d2","\u2145","\u212d","\u010c","\xc7","\xc7","\u0108","\u2230","\u010a","\xb8","\xb7","\u212d","\u03a7","\u2299","\u2296","\u2295","\u2297","\u2232","\u201d","\u2019","\u2237","\u2a74","\u2261","\u222f","\u222e","\u2102","\u2210","\u2233","\u2a2f","\ud835\udc9e","\u22d3","\u224d","\u2145","\u2911","\u0402","\u0405","\u040f","\u2021","\u21a1","\u2ae4","\u010e","\u0414","\u2207","\u0394","\ud835\udd07","\xb4","\u02d9","\u02dd","`","\u02dc","\u22c4","\u2146","\ud835\udd3b","\xa8","\u20dc","\u2250","\u222f","\xa8","\u21d3","\u21d0","\u21d4","\u2ae4","\u27f8","\u27fa","\u27f9","\u21d2","\u22a8","\u21d1","\u21d5","\u2225","\u2193","\u2913","\u21f5","\u0311","\u2950","\u295e","\u21bd","\u2956","\u295f","\u21c1","\u2957","\u22a4","\u21a7","\u21d3","\ud835\udc9f","\u0110","\u014a","\xd0","\xd0","\xc9","\xc9","\u011a","\xca","\xca","\u042d","\u0116","\ud835\udd08","\xc8","\xc8","\u2208","\u0112","\u25fb","\u25ab","\u0118","\ud835\udd3c","\u0395","\u2a75","\u2242","\u21cc","\u2130","\u2a73","\u0397","\xcb","\xcb","\u2203","\u2147","\u0424","\ud835\udd09","\u25fc","\u25aa","\ud835\udd3d","\u2200","\u2131","\u2131","\u0403",">",">","\u0393","\u03dc","\u011e","\u0122","\u011c","\u0413","\u0120","\ud835\udd0a","\u22d9","\ud835\udd3e","\u2265","\u22db","\u2267","\u2aa2","\u2277","\u2a7e","\u2273","\ud835\udca2","\u226b","\u042a","\u02c7","^","\u0124","\u210c","\u210b","\u210d","\u2500","\u210b","\u0126","\u224e","\u224f","\u0415","\u0132","\u0401","\xcd","\xcd","\xce","\xce","\u0418","\u0130","\u2111","\xcc","\xcc","\u2111","\u012a","\u2148","\u21d2","\u222c","\u222b","\u22c2","\u2063","\u2062","\u012e","\ud835\udd40","\u0399","\u2110","\u0128","\u0406","\xcf","\xcf","\u0134","\u0419","\ud835\udd0d","\ud835\udd41","\ud835\udca5","\u0408","\u0404","\u0425","\u040c","\u039a","\u0136","\u041a","\ud835\udd0e","\ud835\udd42","\ud835\udca6","\u0409","<","<","\u0139","\u039b","\u27ea","\u2112","\u219e","\u013d","\u013b","\u041b","\u27e8","\u2190","\u21e4","\u21c6","\u2308","\u27e6","\u2961","\u21c3","\u2959","\u230a","\u2194","\u294e","\u22a3","\u21a4","\u295a","\u22b2","\u29cf","\u22b4","\u2951","\u2960","\u21bf","\u2958","\u21bc","\u2952","\u21d0","\u21d4","\u22da","\u2266","\u2276","\u2aa1","\u2a7d","\u2272","\ud835\udd0f","\u22d8","\u21da","\u013f","\u27f5","\u27f7","\u27f6","\u27f8","\u27fa","\u27f9","\ud835\udd43","\u2199","\u2198","\u2112","\u21b0","\u0141","\u226a","\u2905","\u041c","\u205f","\u2133","\ud835\udd10","\u2213","\ud835\udd44","\u2133","\u039c","\u040a","\u0143","\u0147","\u0145","\u041d","\u200b","\u200b","\u200b","\u200b","\u226b","\u226a","\n","\ud835\udd11","\u2060","\xa0","\u2115","\u2aec","\u2262","\u226d","\u2226","\u2209","\u2260","\u2242\u0338","\u2204","\u226f","\u2271","\u2267\u0338","\u226b\u0338","\u2279","\u2a7e\u0338","\u2275","\u224e\u0338","\u224f\u0338","\u22ea","\u29cf\u0338","\u22ec","\u226e","\u2270","\u2278","\u226a\u0338","\u2a7d\u0338","\u2274","\u2aa2\u0338","\u2aa1\u0338","\u2280","\u2aaf\u0338","\u22e0","\u220c","\u22eb","\u29d0\u0338","\u22ed","\u228f\u0338","\u22e2","\u2290\u0338","\u22e3","\u2282\u20d2","\u2288","\u2281","\u2ab0\u0338","\u22e1","\u227f\u0338","\u2283\u20d2","\u2289","\u2241","\u2244","\u2247","\u2249","\u2224","\ud835\udca9","\xd1","\xd1","\u039d","\u0152","\xd3","\xd3","\xd4","\xd4","\u041e","\u0150","\ud835\udd12","\xd2","\xd2","\u014c","\u03a9","\u039f","\ud835\udd46","\u201c","\u2018","\u2a54","\ud835\udcaa","\xd8","\xd8","\xd5","\xd5","\u2a37","\xd6","\xd6","\u203e","\u23de","\u23b4","\u23dc","\u2202","\u041f","\ud835\udd13","\u03a6","\u03a0","\xb1","\u210c","\u2119","\u2abb","\u227a","\u2aaf","\u227c","\u227e","\u2033","\u220f","\u2237","\u221d","\ud835\udcab","\u03a8",'"','"',"\ud835\udd14","\u211a","\ud835\udcac","\u2910","\xae","\xae","\u0154","\u27eb","\u21a0","\u2916","\u0158","\u0156","\u0420","\u211c","\u220b","\u21cb","\u296f","\u211c","\u03a1","\u27e9","\u2192","\u21e5","\u21c4","\u2309","\u27e7","\u295d","\u21c2","\u2955","\u230b","\u22a2","\u21a6","\u295b","\u22b3","\u29d0","\u22b5","\u294f","\u295c","\u21be","\u2954","\u21c0","\u2953","\u21d2","\u211d","\u2970","\u21db","\u211b","\u21b1","\u29f4","\u0429","\u0428","\u042c","\u015a","\u2abc","\u0160","\u015e","\u015c","\u0421","\ud835\udd16","\u2193","\u2190","\u2192","\u2191","\u03a3","\u2218","\ud835\udd4a","\u221a","\u25a1","\u2293","\u228f","\u2291","\u2290","\u2292","\u2294","\ud835\udcae","\u22c6","\u22d0","\u22d0","\u2286","\u227b","\u2ab0","\u227d","\u227f","\u220b","\u2211","\u22d1","\u2283","\u2287","\u22d1","\xde","\xde","\u2122","\u040b","\u0426","\t","\u03a4","\u0164","\u0162","\u0422","\ud835\udd17","\u2234","\u0398","\u205f\u200a","\u2009","\u223c","\u2243","\u2245","\u2248","\ud835\udd4b","\u20db","\ud835\udcaf","\u0166","\xda","\xda","\u219f","\u2949","\u040e","\u016c","\xdb","\xdb","\u0423","\u0170","\ud835\udd18","\xd9","\xd9","\u016a","_","\u23df","\u23b5","\u23dd","\u22c3","\u228e","\u0172","\ud835\udd4c","\u2191","\u2912","\u21c5","\u2195","\u296e","\u22a5","\u21a5","\u21d1","\u21d5","\u2196","\u2197","\u03d2","\u03a5","\u016e","\ud835\udcb0","\u0168","\xdc","\xdc","\u22ab","\u2aeb","\u0412","\u22a9","\u2ae6","\u22c1","\u2016","\u2016","\u2223","|","\u2758","\u2240","\u200a","\ud835\udd19","\ud835\udd4d","\ud835\udcb1","\u22aa","\u0174","\u22c0","\ud835\udd1a","\ud835\udd4e","\ud835\udcb2","\ud835\udd1b","\u039e","\ud835\udd4f","\ud835\udcb3","\u042f","\u0407","\u042e","\xdd","\xdd","\u0176","\u042b","\ud835\udd1c","\ud835\udd50","\ud835\udcb4","\u0178","\u0416","\u0179","\u017d","\u0417","\u017b","\u200b","\u0396","\u2128","\u2124","\ud835\udcb5","\xe1","\xe1","\u0103","\u223e","\u223e\u0333","\u223f","\xe2","\xe2","\xb4","\xb4","\u0430","\xe6","\xe6","\u2061","\ud835\udd1e","\xe0","\xe0","\u2135","\u2135","\u03b1","\u0101","\u2a3f","&","&","\u2227","\u2a55","\u2a5c","\u2a58","\u2a5a","\u2220","\u29a4","\u2220","\u2221","\u29a8","\u29a9","\u29aa","\u29ab","\u29ac","\u29ad","\u29ae","\u29af","\u221f","\u22be","\u299d","\u2222","\xc5","\u237c","\u0105","\ud835\udd52","\u2248","\u2a70","\u2a6f","\u224a","\u224b","'","\u2248","\u224a","\xe5","\xe5","\ud835\udcb6","*","\u2248","\u224d","\xe3","\xe3","\xe4","\xe4","\u2233","\u2a11","\u2aed","\u224c","\u03f6","\u2035","\u223d","\u22cd","\u22bd","\u2305","\u2305","\u23b5","\u23b6","\u224c","\u0431","\u201e","\u2235","\u2235","\u29b0","\u03f6","\u212c","\u03b2","\u2136","\u226c","\ud835\udd1f","\u22c2","\u25ef","\u22c3","\u2a00","\u2a01","\u2a02","\u2a06","\u2605","\u25bd","\u25b3","\u2a04","\u22c1","\u22c0","\u290d","\u29eb","\u25aa","\u25b4","\u25be","\u25c2","\u25b8","\u2423","\u2592","\u2591","\u2593","\u2588","=\u20e5","\u2261\u20e5","\u2310","\ud835\udd53","\u22a5","\u22a5","\u22c8","\u2557","\u2554","\u2556","\u2553","\u2550","\u2566","\u2569","\u2564","\u2567","\u255d","\u255a","\u255c","\u2559","\u2551","\u256c","\u2563","\u2560","\u256b","\u2562","\u255f","\u29c9","\u2555","\u2552","\u2510","\u250c","\u2500","\u2565","\u2568","\u252c","\u2534","\u229f","\u229e","\u22a0","\u255b","\u2558","\u2518","\u2514","\u2502","\u256a","\u2561","\u255e","\u253c","\u2524","\u251c","\u2035","\u02d8","\xa6","\xa6","\ud835\udcb7","\u204f","\u223d","\u22cd","\\","\u29c5","\u27c8","\u2022","\u2022","\u224e","\u2aae","\u224f","\u224f","\u0107","\u2229","\u2a44","\u2a49","\u2a4b","\u2a47","\u2a40","\u2229\ufe00","\u2041","\u02c7","\u2a4d","\u010d","\xe7","\xe7","\u0109","\u2a4c","\u2a50","\u010b","\xb8","\xb8","\u29b2","\xa2","\xa2","\xb7","\ud835\udd20","\u0447","\u2713","\u2713","\u03c7","\u25cb","\u29c3","\u02c6","\u2257","\u21ba","\u21bb","\xae","\u24c8","\u229b","\u229a","\u229d","\u2257","\u2a10","\u2aef","\u29c2","\u2663","\u2663",":","\u2254","\u2254",",","@","\u2201","\u2218","\u2201","\u2102","\u2245","\u2a6d","\u222e","\ud835\udd54","\u2210","\xa9","\xa9","\u2117","\u21b5","\u2717","\ud835\udcb8","\u2acf","\u2ad1","\u2ad0","\u2ad2","\u22ef","\u2938","\u2935","\u22de","\u22df","\u21b6","\u293d","\u222a","\u2a48","\u2a46","\u2a4a","\u228d","\u2a45","\u222a\ufe00","\u21b7","\u293c","\u22de","\u22df","\u22ce","\u22cf","\xa4","\xa4","\u21b6","\u21b7","\u22ce","\u22cf","\u2232","\u2231","\u232d","\u21d3","\u2965","\u2020","\u2138","\u2193","\u2010","\u22a3","\u290f","\u02dd","\u010f","\u0434","\u2146","\u2021","\u21ca","\u2a77","\xb0","\xb0","\u03b4","\u29b1","\u297f","\ud835\udd21","\u21c3","\u21c2","\u22c4","\u22c4","\u2666","\u2666","\xa8","\u03dd","\u22f2","\xf7","\xf7","\xf7","\u22c7","\u22c7","\u0452","\u231e","\u230d","$","\ud835\udd55","\u02d9","\u2250","\u2251","\u2238","\u2214","\u22a1","\u2306","\u2193","\u21ca","\u21c3","\u21c2","\u2910","\u231f","\u230c","\ud835\udcb9","\u0455","\u29f6","\u0111","\u22f1","\u25bf","\u25be","\u21f5","\u296f","\u29a6","\u045f","\u27ff","\u2a77","\u2251","\xe9","\xe9","\u2a6e","\u011b","\u2256","\xea","\xea","\u2255","\u044d","\u0117","\u2147","\u2252","\ud835\udd22","\u2a9a","\xe8","\xe8","\u2a96","\u2a98","\u2a99","\u23e7","\u2113","\u2a95","\u2a97","\u0113","\u2205","\u2205","\u2205","\u2004","\u2005","\u2003","\u014b","\u2002","\u0119","\ud835\udd56","\u22d5","\u29e3","\u2a71","\u03b5","\u03b5","\u03f5","\u2256","\u2255","\u2242","\u2a96","\u2a95","=","\u225f","\u2261","\u2a78","\u29e5","\u2253","\u2971","\u212f","\u2250","\u2242","\u03b7","\xf0","\xf0","\xeb","\xeb","\u20ac","!","\u2203","\u2130","\u2147","\u2252","\u0444","\u2640","\ufb03","\ufb00","\ufb04","\ud835\udd23","\ufb01","fj","\u266d","\ufb02","\u25b1","\u0192","\ud835\udd57","\u2200","\u22d4","\u2ad9","\u2a0d","\xbd","\xbd","\u2153","\xbc","\xbc","\u2155","\u2159","\u215b","\u2154","\u2156","\xbe","\xbe","\u2157","\u215c","\u2158","\u215a","\u215d","\u215e","\u2044","\u2322","\ud835\udcbb","\u2267","\u2a8c","\u01f5","\u03b3","\u03dd","\u2a86","\u011f","\u011d","\u0433","\u0121","\u2265","\u22db","\u2265","\u2267","\u2a7e","\u2a7e","\u2aa9","\u2a80","\u2a82","\u2a84","\u22db\ufe00","\u2a94","\ud835\udd24","\u226b","\u22d9","\u2137","\u0453","\u2277","\u2a92","\u2aa5","\u2aa4","\u2269","\u2a8a","\u2a8a","\u2a88","\u2a88","\u2269","\u22e7","\ud835\udd58","`","\u210a","\u2273","\u2a8e","\u2a90",">",">","\u2aa7","\u2a7a","\u22d7","\u2995","\u2a7c","\u2a86","\u2978","\u22d7","\u22db","\u2a8c","\u2277","\u2273","\u2269\ufe00","\u2269\ufe00","\u21d4","\u200a","\xbd","\u210b","\u044a","\u2194","\u2948","\u21ad","\u210f","\u0125","\u2665","\u2665","\u2026","\u22b9","\ud835\udd25","\u2925","\u2926","\u21ff","\u223b","\u21a9","\u21aa","\ud835\udd59","\u2015","\ud835\udcbd","\u210f","\u0127","\u2043","\u2010","\xed","\xed","\u2063","\xee","\xee","\u0438","\u0435","\xa1","\xa1","\u21d4","\ud835\udd26","\xec","\xec","\u2148","\u2a0c","\u222d","\u29dc","\u2129","\u0133","\u012b","\u2111","\u2110","\u2111","\u0131","\u22b7","\u01b5","\u2208","\u2105","\u221e","\u29dd","\u0131","\u222b","\u22ba","\u2124","\u22ba","\u2a17","\u2a3c","\u0451","\u012f","\ud835\udd5a","\u03b9","\u2a3c","\xbf","\xbf","\ud835\udcbe","\u2208","\u22f9","\u22f5","\u22f4","\u22f3","\u2208","\u2062","\u0129","\u0456","\xef","\xef","\u0135","\u0439","\ud835\udd27","\u0237","\ud835\udd5b","\ud835\udcbf","\u0458","\u0454","\u03ba","\u03f0","\u0137","\u043a","\ud835\udd28","\u0138","\u0445","\u045c","\ud835\udd5c","\ud835\udcc0","\u21da","\u21d0","\u291b","\u290e","\u2266","\u2a8b","\u2962","\u013a","\u29b4","\u2112","\u03bb","\u27e8","\u2991","\u27e8","\u2a85","\xab","\xab","\u2190","\u21e4","\u291f","\u291d","\u21a9","\u21ab","\u2939","\u2973","\u21a2","\u2aab","\u2919","\u2aad","\u2aad\ufe00","\u290c","\u2772","{","[","\u298b","\u298f","\u298d","\u013e","\u013c","\u2308","{","\u043b","\u2936","\u201c","\u201e","\u2967","\u294b","\u21b2","\u2264","\u2190","\u21a2","\u21bd","\u21bc","\u21c7","\u2194","\u21c6","\u21cb","\u21ad","\u22cb","\u22da","\u2264","\u2266","\u2a7d","\u2a7d","\u2aa8","\u2a7f","\u2a81","\u2a83","\u22da\ufe00","\u2a93","\u2a85","\u22d6","\u22da","\u2a8b","\u2276","\u2272","\u297c","\u230a","\ud835\udd29","\u2276","\u2a91","\u21bd","\u21bc","\u296a","\u2584","\u0459","\u226a","\u21c7","\u231e","\u296b","\u25fa","\u0140","\u23b0","\u23b0","\u2268","\u2a89","\u2a89","\u2a87","\u2a87","\u2268","\u22e6","\u27ec","\u21fd","\u27e6","\u27f5","\u27f7","\u27fc","\u27f6","\u21ab","\u21ac","\u2985","\ud835\udd5d","\u2a2d","\u2a34","\u2217","_","\u25ca","\u25ca","\u29eb","(","\u2993","\u21c6","\u231f","\u21cb","\u296d","\u200e","\u22bf","\u2039","\ud835\udcc1","\u21b0","\u2272","\u2a8d","\u2a8f","[","\u2018","\u201a","\u0142","<","<","\u2aa6","\u2a79","\u22d6","\u22cb","\u22c9","\u2976","\u2a7b","\u2996","\u25c3","\u22b4","\u25c2","\u294a","\u2966","\u2268\ufe00","\u2268\ufe00","\u223a","\xaf","\xaf","\u2642","\u2720","\u2720","\u21a6","\u21a6","\u21a7","\u21a4","\u21a5","\u25ae","\u2a29","\u043c","\u2014","\u2221","\ud835\udd2a","\u2127","\xb5","\xb5","\u2223","*","\u2af0","\xb7","\xb7","\u2212","\u229f","\u2238","\u2a2a","\u2adb","\u2026","\u2213","\u22a7","\ud835\udd5e","\u2213","\ud835\udcc2","\u223e","\u03bc","\u22b8","\u22b8","\u22d9\u0338","\u226b\u20d2","\u226b\u0338","\u21cd","\u21ce","\u22d8\u0338","\u226a\u20d2","\u226a\u0338","\u21cf","\u22af","\u22ae","\u2207","\u0144","\u2220\u20d2","\u2249","\u2a70\u0338","\u224b\u0338","\u0149","\u2249","\u266e","\u266e","\u2115","\xa0","\xa0","\u224e\u0338","\u224f\u0338","\u2a43","\u0148","\u0146","\u2247","\u2a6d\u0338","\u2a42","\u043d","\u2013","\u2260","\u21d7","\u2924","\u2197","\u2197","\u2250\u0338","\u2262","\u2928","\u2242\u0338","\u2204","\u2204","\ud835\udd2b","\u2267\u0338","\u2271","\u2271","\u2267\u0338","\u2a7e\u0338","\u2a7e\u0338","\u2275","\u226f","\u226f","\u21ce","\u21ae","\u2af2","\u220b","\u22fc","\u22fa","\u220b","\u045a","\u21cd","\u2266\u0338","\u219a","\u2025","\u2270","\u219a","\u21ae","\u2270","\u2266\u0338","\u2a7d\u0338","\u2a7d\u0338","\u226e","\u2274","\u226e","\u22ea","\u22ec","\u2224","\ud835\udd5f","\xac","\xac","\u2209","\u22f9\u0338","\u22f5\u0338","\u2209","\u22f7","\u22f6","\u220c","\u220c","\u22fe","\u22fd","\u2226","\u2226","\u2afd\u20e5","\u2202\u0338","\u2a14","\u2280","\u22e0","\u2aaf\u0338","\u2280","\u2aaf\u0338","\u21cf","\u219b","\u2933\u0338","\u219d\u0338","\u219b","\u22eb","\u22ed","\u2281","\u22e1","\u2ab0\u0338","\ud835\udcc3","\u2224","\u2226","\u2241","\u2244","\u2244","\u2224","\u2226","\u22e2","\u22e3","\u2284","\u2ac5\u0338","\u2288","\u2282\u20d2","\u2288","\u2ac5\u0338","\u2281","\u2ab0\u0338","\u2285","\u2ac6\u0338","\u2289","\u2283\u20d2","\u2289","\u2ac6\u0338","\u2279","\xf1","\xf1","\u2278","\u22ea","\u22ec","\u22eb","\u22ed","\u03bd","#","\u2116","\u2007","\u22ad","\u2904","\u224d\u20d2","\u22ac","\u2265\u20d2",">\u20d2","\u29de","\u2902","\u2264\u20d2","<\u20d2","\u22b4\u20d2","\u2903","\u22b5\u20d2","\u223c\u20d2","\u21d6","\u2923","\u2196","\u2196","\u2927","\u24c8","\xf3","\xf3","\u229b","\u229a","\xf4","\xf4","\u043e","\u229d","\u0151","\u2a38","\u2299","\u29bc","\u0153","\u29bf","\ud835\udd2c","\u02db","\xf2","\xf2","\u29c1","\u29b5","\u03a9","\u222e","\u21ba","\u29be","\u29bb","\u203e","\u29c0","\u014d","\u03c9","\u03bf","\u29b6","\u2296","\ud835\udd60","\u29b7","\u29b9","\u2295","\u2228","\u21bb","\u2a5d","\u2134","\u2134","\xaa","\xaa","\xba","\xba","\u22b6","\u2a56","\u2a57","\u2a5b","\u2134","\xf8","\xf8","\u2298","\xf5","\xf5","\u2297","\u2a36","\xf6","\xf6","\u233d","\u2225","\xb6","\xb6","\u2225","\u2af3","\u2afd","\u2202","\u043f","%",".","\u2030","\u22a5","\u2031","\ud835\udd2d","\u03c6","\u03d5","\u2133","\u260e","\u03c0","\u22d4","\u03d6","\u210f","\u210e","\u210f","+","\u2a23","\u229e","\u2a22","\u2214","\u2a25","\u2a72","\xb1","\xb1","\u2a26","\u2a27","\xb1","\u2a15","\ud835\udd61","\xa3","\xa3","\u227a","\u2ab3","\u2ab7","\u227c","\u2aaf","\u227a","\u2ab7","\u227c","\u2aaf","\u2ab9","\u2ab5","\u22e8","\u227e","\u2032","\u2119","\u2ab5","\u2ab9","\u22e8","\u220f","\u232e","\u2312","\u2313","\u221d","\u221d","\u227e","\u22b0","\ud835\udcc5","\u03c8","\u2008","\ud835\udd2e","\u2a0c","\ud835\udd62","\u2057","\ud835\udcc6","\u210d","\u2a16","?","\u225f",'"','"',"\u21db","\u21d2","\u291c","\u290f","\u2964","\u223d\u0331","\u0155","\u221a","\u29b3","\u27e9","\u2992","\u29a5","\u27e9","\xbb","\xbb","\u2192","\u2975","\u21e5","\u2920","\u2933","\u291e","\u21aa","\u21ac","\u2945","\u2974","\u21a3","\u219d","\u291a","\u2236","\u211a","\u290d","\u2773","}","]","\u298c","\u298e","\u2990","\u0159","\u0157","\u2309","}","\u0440","\u2937","\u2969","\u201d","\u201d","\u21b3","\u211c","\u211b","\u211c","\u211d","\u25ad","\xae","\xae","\u297d","\u230b","\ud835\udd2f","\u21c1","\u21c0","\u296c","\u03c1","\u03f1","\u2192","\u21a3","\u21c1","\u21c0","\u21c4","\u21cc","\u21c9","\u219d","\u22cc","\u02da","\u2253","\u21c4","\u21cc","\u200f","\u23b1","\u23b1","\u2aee","\u27ed","\u21fe","\u27e7","\u2986","\ud835\udd63","\u2a2e","\u2a35",")","\u2994","\u2a12","\u21c9","\u203a","\ud835\udcc7","\u21b1","]","\u2019","\u2019","\u22cc","\u22ca","\u25b9","\u22b5","\u25b8","\u29ce","\u2968","\u211e","\u015b","\u201a","\u227b","\u2ab4","\u2ab8","\u0161","\u227d","\u2ab0","\u015f","\u015d","\u2ab6","\u2aba","\u22e9","\u2a13","\u227f","\u0441","\u22c5","\u22a1","\u2a66","\u21d8","\u2925","\u2198","\u2198","\xa7","\xa7",";","\u2929","\u2216","\u2216","\u2736","\ud835\udd30","\u2322","\u266f","\u0449","\u0448","\u2223","\u2225","\xad","\xad","\u03c3","\u03c2","\u03c2","\u223c","\u2a6a","\u2243","\u2243","\u2a9e","\u2aa0","\u2a9d","\u2a9f","\u2246","\u2a24","\u2972","\u2190","\u2216","\u2a33","\u29e4","\u2223","\u2323","\u2aaa","\u2aac","\u2aac\ufe00","\u044c","/","\u29c4","\u233f","\ud835\udd64","\u2660","\u2660","\u2225","\u2293","\u2293\ufe00","\u2294","\u2294\ufe00","\u228f","\u2291","\u228f","\u2291","\u2290","\u2292","\u2290","\u2292","\u25a1","\u25a1","\u25aa","\u25aa","\u2192","\ud835\udcc8","\u2216","\u2323","\u22c6","\u2606","\u2605","\u03f5","\u03d5","\xaf","\u2282","\u2ac5","\u2abd","\u2286","\u2ac3","\u2ac1","\u2acb","\u228a","\u2abf","\u2979","\u2282","\u2286","\u2ac5","\u228a","\u2acb","\u2ac7","\u2ad5","\u2ad3","\u227b","\u2ab8","\u227d","\u2ab0","\u2aba","\u2ab6","\u22e9","\u227f","\u2211","\u266a","\xb9","\xb9","\xb2","\xb2","\xb3","\xb3","\u2283","\u2ac6","\u2abe","\u2ad8","\u2287","\u2ac4","\u27c9","\u2ad7","\u297b","\u2ac2","\u2acc","\u228b","\u2ac0","\u2283","\u2287","\u2ac6","\u228b","\u2acc","\u2ac8","\u2ad4","\u2ad6","\u21d9","\u2926","\u2199","\u2199","\u292a","\xdf","\xdf","\u2316","\u03c4","\u23b4","\u0165","\u0163","\u0442","\u20db","\u2315","\ud835\udd31","\u2234","\u2234","\u03b8","\u03d1","\u03d1","\u2248","\u223c","\u2009","\u2248","\u223c","\xfe","\xfe","\u02dc","\xd7","\xd7","\u22a0","\u2a31","\u2a30","\u222d","\u2928","\u22a4","\u2336","\u2af1","\ud835\udd65","\u2ada","\u2929","\u2034","\u2122","\u25b5","\u25bf","\u25c3","\u22b4","\u225c","\u25b9","\u22b5","\u25ec","\u225c","\u2a3a","\u2a39","\u29cd","\u2a3b","\u23e2","\ud835\udcc9","\u0446","\u045b","\u0167","\u226c","\u219e","\u21a0","\u21d1","\u2963","\xfa","\xfa","\u2191","\u045e","\u016d","\xfb","\xfb","\u0443","\u21c5","\u0171","\u296e","\u297e","\ud835\udd32","\xf9","\xf9","\u21bf","\u21be","\u2580","\u231c","\u231c","\u230f","\u25f8","\u016b","\xa8","\xa8","\u0173","\ud835\udd66","\u2191","\u2195","\u21bf","\u21be","\u228e","\u03c5","\u03d2","\u03c5","\u21c8","\u231d","\u231d","\u230e","\u016f","\u25f9","\ud835\udcca","\u22f0","\u0169","\u25b5","\u25b4","\u21c8","\xfc","\xfc","\u29a7","\u21d5","\u2ae8","\u2ae9","\u22a8","\u299c","\u03f5","\u03f0","\u2205","\u03d5","\u03d6","\u221d","\u2195","\u03f1","\u03c2","\u228a\ufe00","\u2acb\ufe00","\u228b\ufe00","\u2acc\ufe00","\u03d1","\u22b2","\u22b3","\u0432","\u22a2","\u2228","\u22bb","\u225a","\u22ee","|","|","\ud835\udd33","\u22b2","\u2282\u20d2","\u2283\u20d2","\ud835\udd67","\u221d","\u22b3","\ud835\udccb","\u2acb\ufe00","\u228a\ufe00","\u2acc\ufe00","\u228b\ufe00","\u299a","\u0175","\u2a5f","\u2227","\u2259","\u2118","\ud835\udd34","\ud835\udd68","\u2118","\u2240","\u2240","\ud835\udccc","\u22c2","\u25ef","\u22c3","\u25bd","\ud835\udd35","\u27fa","\u27f7","\u03be","\u27f8","\u27f5","\u27fc","\u22fb","\u2a00","\ud835\udd69","\u2a01","\u2a02","\u27f9","\u27f6","\ud835\udccd","\u2a06","\u2a04","\u25b3","\u22c1","\u22c0","\xfd","\xfd","\u044f","\u0177","\u044b","\xa5","\xa5","\ud835\udd36","\u0457","\ud835\udd6a","\ud835\udcce","\u044e","\xff","\xff","\u017a","\u017e","\u0437","\u017c","\u2128","\u03b6","\ud835\udd37","\u0436","\u21dd","\ud835\udd6b","\ud835\udccf","\u200d","\u200c"],t.o) +B.L0={attributename:0,attributetype:1,basefrequency:2,baseprofile:3,calcmode:4,clippathunits:5,contentscripttype:6,contentstyletype:7,diffuseconstant:8,edgemode:9,externalresourcesrequired:10,filterres:11,filterunits:12,glyphref:13,gradienttransform:14,gradientunits:15,kernelmatrix:16,kernelunitlength:17,keypoints:18,keysplines:19,keytimes:20,lengthadjust:21,limitingconeangle:22,markerheight:23,markerunits:24,markerwidth:25,maskcontentunits:26,maskunits:27,numoctaves:28,pathlength:29,patterncontentunits:30,patterntransform:31,patternunits:32,pointsatx:33,pointsaty:34,pointsatz:35,preservealpha:36,preserveaspectratio:37,primitiveunits:38,refx:39,refy:40,repeatcount:41,repeatdur:42,requiredextensions:43,requiredfeatures:44,specularconstant:45,specularexponent:46,spreadmethod:47,startoffset:48,stddeviation:49,stitchtiles:50,surfacescale:51,systemlanguage:52,tablevalues:53,targetx:54,targety:55,textlength:56,viewbox:57,viewtarget:58,xchannelselector:59,ychannelselector:60,zoomandpan:61} +B.DI=new A.r(B.L0,["attributeName","attributeType","baseFrequency","baseProfile","calcMode","clipPathUnits","contentScriptType","contentStyleType","diffuseConstant","edgeMode","externalResourcesRequired","filterRes","filterUnits","glyphRef","gradientTransform","gradientUnits","kernelMatrix","kernelUnitLength","keyPoints","keySplines","keyTimes","lengthAdjust","limitingConeAngle","markerHeight","markerUnits","markerWidth","maskContentUnits","maskUnits","numOctaves","pathLength","patternContentUnits","patternTransform","patternUnits","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","preserveAspectRatio","primitiveUnits","refX","refY","repeatCount","repeatDur","requiredExtensions","requiredFeatures","specularConstant","specularExponent","spreadMethod","startOffset","stdDeviation","stitchTiles","surfaceScale","systemLanguage","tableValues","targetX","targetY","textLength","viewBox","viewTarget","xChannelSelector","yChannelSelector","zoomAndPan"],t.o) +B.L2={"null-character":0,"invalid-codepoint":1,"incorrectly-placed-solidus":2,"incorrect-cr-newline-entity":3,"illegal-windows-1252-entity":4,"cant-convert-numeric-entity":5,"illegal-codepoint-for-numeric-entity":6,"numeric-entity-without-semicolon":7,"expected-numeric-entity-but-got-eof":8,"expected-numeric-entity":9,"named-entity-without-semicolon":10,"expected-named-entity":11,"attributes-in-end-tag":12,"self-closing-flag-on-end-tag":13,"expected-tag-name-but-got-right-bracket":14,"expected-tag-name-but-got-question-mark":15,"expected-tag-name":16,[u.g]:17,"expected-closing-tag-but-got-eof":18,"expected-closing-tag-but-got-char":19,"eof-in-tag-name":20,"expected-attribute-name-but-got-eof":21,"eof-in-attribute-name":22,"invalid-character-in-attribute-name":23,"duplicate-attribute":24,"expected-end-of-tag-name-but-got-eof":25,"expected-attribute-value-but-got-eof":26,[u.F]:27,"equals-in-unquoted-attribute-value":28,[u.V]:29,"invalid-character-after-attribute-name":30,[u.H]:31,"eof-in-attribute-value-double-quote":32,"eof-in-attribute-value-single-quote":33,"eof-in-attribute-value-no-quotes":34,"unexpected-EOF-after-solidus-in-tag":35,[u.B]:36,"expected-dashes-or-doctype":37,[u.x]:38,"unexpected-space-after-double-dash-in-comment":39,"incorrect-comment":40,"eof-in-comment":41,"eof-in-comment-end-dash":42,[u.K]:43,"eof-in-comment-double-dash":44,"eof-in-comment-end-space-state":45,"eof-in-comment-end-bang-state":46,"unexpected-char-in-comment":47,"need-space-after-doctype":48,[u.f]:49,"expected-doctype-name-but-got-eof":50,"eof-in-doctype-name":51,"eof-in-doctype":52,[u.p]:53,"unexpected-end-of-doctype":54,"unexpected-char-in-doctype":55,"eof-in-innerhtml":56,"unexpected-doctype":57,"non-html-root":58,"expected-doctype-but-got-eof":59,"unknown-doctype":60,"expected-doctype-but-got-chars":61,"expected-doctype-but-got-start-tag":62,"expected-doctype-but-got-end-tag":63,"end-tag-after-implied-root":64,"expected-named-closing-tag-but-got-eof":65,"two-heads-are-not-better-than-one":66,"unexpected-end-tag":67,"unexpected-start-tag-out-of-my-head":68,"unexpected-start-tag":69,"missing-end-tag":70,"missing-end-tags":71,"unexpected-start-tag-implies-end-tag":72,"unexpected-start-tag-treated-as":73,"deprecated-tag":74,"unexpected-start-tag-ignored":75,"expected-one-end-tag-but-got-another":76,"end-tag-too-early":77,"end-tag-too-early-named":78,"end-tag-too-early-ignored":79,"adoption-agency-1.1":80,"adoption-agency-1.2":81,"adoption-agency-1.3":82,"unexpected-end-tag-treated-as":83,"no-end-tag":84,"unexpected-implied-end-tag-in-table":85,"unexpected-implied-end-tag-in-table-body":86,"unexpected-char-implies-table-voodoo":87,"unexpected-hidden-input-in-table":88,"unexpected-form-in-table":89,[u.M]:90,"unexpected-end-tag-implies-table-voodoo":91,"unexpected-cell-in-table-body":92,"unexpected-cell-end-tag":93,"unexpected-end-tag-in-table-body":94,"unexpected-implied-end-tag-in-table-row":95,"unexpected-end-tag-in-table-row":96,"unexpected-select-in-select":97,"unexpected-input-in-select":98,"unexpected-start-tag-in-select":99,"unexpected-end-tag-in-select":100,[u.a]:101,[u.r]:102,"unexpected-char-after-body":103,"unexpected-start-tag-after-body":104,"unexpected-end-tag-after-body":105,"unexpected-char-in-frameset":106,"unexpected-start-tag-in-frameset":107,[u.q]:108,"unexpected-end-tag-in-frameset":109,"unexpected-char-after-frameset":110,"unexpected-start-tag-after-frameset":111,"unexpected-end-tag-after-frameset":112,"unexpected-end-tag-after-body-innerhtml":113,"expected-eof-but-got-char":114,"expected-eof-but-got-start-tag":115,"expected-eof-but-got-end-tag":116,"eof-in-table":117,"eof-in-select":118,"eof-in-frameset":119,"eof-in-script-in-script":120,"eof-in-foreign-lands":121,"non-void-element-with-trailing-solidus":122,[u.G]:123,"unexpected-end-tag-before-html":124,"undefined-error":125} +B.fX=new A.r(B.L2,["Null character in input stream, replaced with U+FFFD.","Invalid codepoint in stream.","Solidus (/) incorrectly placed in tag.","Incorrect CR newline entity, replaced with LF.","Entity used with illegal number (windows-1252 reference).","Numeric entity couldn't be converted to character (codepoint U+%(charAsInt)08x).","Numeric entity represents an illegal codepoint: U+%(charAsInt)08x.","Numeric entity didn't end with ';'.","Numeric entity expected. Got end of file instead.","Numeric entity expected but none found.","Named entity didn't end with ';'.","Named entity expected. Got none.","End tag contains unexpected attributes.","End tag contains unexpected self-closing flag.","Expected tag name. Got '>' instead.","Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.)","Expected tag name. Got something else instead","Expected closing tag. Got '>' instead. Ignoring ''.","Expected closing tag. Unexpected end of file.","Expected closing tag. Unexpected character '%(data)s' found.","Unexpected end of file in the tag name.","Unexpected end of file. Expected attribute name instead.","Unexpected end of file in attribute name.","Invalid character in attribute name","Dropped duplicate attribute on tag.","Unexpected end of file. Expected = or end of tag.","Unexpected end of file. Expected attribute value.","Expected attribute value. Got '>' instead.","Unexpected = in unquoted attribute","Unexpected character in unquoted attribute","Unexpected character after attribute name.","Unexpected character after attribute value.",'Unexpected end of file in attribute value (".',"Unexpected end of file in attribute value (').","Unexpected end of file in attribute value.","Unexpected end of file in tag. Expected >","Unexpected character after / in tag. Expected >","Expected '--' or 'DOCTYPE'. Not found.","Unexpected ! after -- in comment","Unexpected space after -- in comment","Incorrect comment.","Unexpected end of file in comment.","Unexpected end of file in comment (-)","Unexpected '-' after '--' found in comment.","Unexpected end of file in comment (--).","Unexpected end of file in comment.","Unexpected end of file in comment.","Unexpected character in comment found.","No space after literal string 'DOCTYPE'.","Unexpected > character. Expected DOCTYPE name.","Unexpected end of file. Expected DOCTYPE name.","Unexpected end of file in DOCTYPE name.","Unexpected end of file in DOCTYPE.","Expected space or '>'. Got '%(data)s'","Unexpected end of DOCTYPE.","Unexpected character in DOCTYPE.","XXX innerHTML EOF","Unexpected DOCTYPE. Ignored.","html needs to be the first start tag.","Unexpected End of file. Expected DOCTYPE.","Erroneous DOCTYPE.","Unexpected non-space characters. Expected DOCTYPE.","Unexpected start tag (%(name)s). Expected DOCTYPE.","Unexpected end tag (%(name)s). Expected DOCTYPE.","Unexpected end tag (%(name)s) after the (implied) root element.","Unexpected end of file. Expected end tag (%(name)s).","Unexpected start tag head in existing head. Ignored.","Unexpected end tag (%(name)s). Ignored.","Unexpected start tag (%(name)s) that can be in head. Moved.","Unexpected start tag (%(name)s).","Missing end tag (%(name)s).","Missing end tags (%(name)s).","Unexpected start tag (%(startName)s) implies end tag (%(endName)s).","Unexpected start tag (%(originalName)s). Treated as %(newName)s.","Unexpected start tag %(name)s. Don't use it!","Unexpected start tag %(name)s. Ignored.","Unexpected end tag (%(gotName)s). Missing end tag (%(expectedName)s).","End tag (%(name)s) seen too early. Expected other end tag.","Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).","End tag (%(name)s) seen too early. Ignored.","End tag (%(name)s) violates step 1, paragraph 1 of the adoption agency algorithm.","End tag (%(name)s) violates step 1, paragraph 2 of the adoption agency algorithm.","End tag (%(name)s) violates step 1, paragraph 3 of the adoption agency algorithm.","Unexpected end tag (%(originalName)s). Treated as %(newName)s.","This element (%(name)s) has no end tag.","Unexpected implied end tag (%(name)s) in the table phase.","Unexpected implied end tag (%(name)s) in the table body phase.","Unexpected non-space characters in table context caused voodoo mode.","Unexpected input with type hidden in table context.","Unexpected form in table context.","Unexpected start tag (%(name)s) in table context caused voodoo mode.","Unexpected end tag (%(name)s) in table context caused voodoo mode.","Unexpected table cell start tag (%(name)s) in the table body phase.","Got table cell end tag (%(name)s) while required end tags are missing.","Unexpected end tag (%(name)s) in the table body phase. Ignored.","Unexpected implied end tag (%(name)s) in the table row phase.","Unexpected end tag (%(name)s) in the table row phase. Ignored.","Unexpected select start tag in the select phase treated as select end tag.","Unexpected input start tag in the select phase.","Unexpected start tag token (%(name)s in the select phase. Ignored.","Unexpected end tag (%(name)s) in the select phase. Ignored.","Unexpected table element start tag (%(name)s) in the select in table phase.","Unexpected table element end tag (%(name)s) in the select in table phase.","Unexpected non-space characters in the after body phase.","Unexpected start tag token (%(name)s) in the after body phase.","Unexpected end tag token (%(name)s) in the after body phase.","Unexpected characters in the frameset phase. Characters ignored.","Unexpected start tag token (%(name)s) in the frameset phase. Ignored.","Unexpected end tag token (frameset) in the frameset phase (innerHTML).","Unexpected end tag token (%(name)s) in the frameset phase. Ignored.","Unexpected non-space characters in the after frameset phase. Ignored.","Unexpected start tag (%(name)s) in the after frameset phase. Ignored.","Unexpected end tag (%(name)s) in the after frameset phase. Ignored.","Unexpected end tag after body(innerHtml)","Unexpected non-space characters. Expected end of file.","Unexpected start tag (%(name)s). Expected end of file.","Unexpected end tag (%(name)s). Expected end of file.","Unexpected end of file. Expected table content.","Unexpected end of file. Expected select content.","Unexpected end of file. Expected frameset content.","Unexpected end of file. Expected script content.","Unexpected end of file. Expected foreign content","Trailing solidus not allowed on element %(name)s","Element %(name)s not allowed in a non-html context","Unexpected end tag (%(name)s) before html.","Undefined error (this sucks and should be fixed)"],t.o) +B.hx=new A.ny(!1) B.cG=new A.ag('"',1,"DOUBLE_QUOTE") -B.Mg=new A.l("",B.cG) -B.LQ=new A.l("http://www.w3.org/1999/xhtml","address") +B.Mi=new A.l("",B.cG) +B.LS=new A.l("http://www.w3.org/1999/xhtml","address") B.hI=new A.l("http://www.w3.org/1999/xhtml","applet") -B.LK=new A.l("http://www.w3.org/1999/xhtml","area") -B.Mf=new A.l("http://www.w3.org/1999/xhtml","article") -B.LW=new A.l("http://www.w3.org/1999/xhtml","aside") -B.LR=new A.l("http://www.w3.org/1999/xhtml","base") -B.LA=new A.l("http://www.w3.org/1999/xhtml","basefont") -B.Lv=new A.l("http://www.w3.org/1999/xhtml","bgsound") -B.Li=new A.l("http://www.w3.org/1999/xhtml","blockquote") -B.LB=new A.l("http://www.w3.org/1999/xhtml","body") -B.Lo=new A.l("http://www.w3.org/1999/xhtml","br") +B.LM=new A.l("http://www.w3.org/1999/xhtml","area") +B.Mh=new A.l("http://www.w3.org/1999/xhtml","article") +B.LY=new A.l("http://www.w3.org/1999/xhtml","aside") +B.LT=new A.l("http://www.w3.org/1999/xhtml","base") +B.LC=new A.l("http://www.w3.org/1999/xhtml","basefont") +B.Lx=new A.l("http://www.w3.org/1999/xhtml","bgsound") +B.Lk=new A.l("http://www.w3.org/1999/xhtml","blockquote") +B.LD=new A.l("http://www.w3.org/1999/xhtml","body") +B.Lq=new A.l("http://www.w3.org/1999/xhtml","br") B.hF=new A.l("http://www.w3.org/1999/xhtml","button") B.hE=new A.l("http://www.w3.org/1999/xhtml","caption") -B.M8=new A.l("http://www.w3.org/1999/xhtml","center") -B.M7=new A.l("http://www.w3.org/1999/xhtml","col") -B.Le=new A.l("http://www.w3.org/1999/xhtml","colgroup") -B.Mc=new A.l("http://www.w3.org/1999/xhtml","command") -B.LM=new A.l("http://www.w3.org/1999/xhtml","dd") -B.LT=new A.l("http://www.w3.org/1999/xhtml","details") -B.Lf=new A.l("http://www.w3.org/1999/xhtml","dir") -B.Ln=new A.l("http://www.w3.org/1999/xhtml","div") -B.LS=new A.l("http://www.w3.org/1999/xhtml","dl") -B.Lc=new A.l("http://www.w3.org/1999/xhtml","dt") -B.Lp=new A.l("http://www.w3.org/1999/xhtml","embed") -B.Ma=new A.l("http://www.w3.org/1999/xhtml","fieldset") -B.Lb=new A.l("http://www.w3.org/1999/xhtml","figure") -B.M9=new A.l("http://www.w3.org/1999/xhtml","footer") -B.M1=new A.l("http://www.w3.org/1999/xhtml","form") -B.Lg=new A.l("http://www.w3.org/1999/xhtml","frame") -B.LP=new A.l("http://www.w3.org/1999/xhtml","frameset") -B.M0=new A.l("http://www.w3.org/1999/xhtml","h1") -B.Lh=new A.l("http://www.w3.org/1999/xhtml","h2") -B.Ll=new A.l("http://www.w3.org/1999/xhtml","h3") -B.LN=new A.l("http://www.w3.org/1999/xhtml","h4") -B.LO=new A.l("http://www.w3.org/1999/xhtml","h5") -B.LV=new A.l("http://www.w3.org/1999/xhtml","h6") -B.M6=new A.l("http://www.w3.org/1999/xhtml","head") -B.LI=new A.l("http://www.w3.org/1999/xhtml","header") -B.M4=new A.l("http://www.w3.org/1999/xhtml","hr") +B.Ma=new A.l("http://www.w3.org/1999/xhtml","center") +B.M9=new A.l("http://www.w3.org/1999/xhtml","col") +B.Lg=new A.l("http://www.w3.org/1999/xhtml","colgroup") +B.Me=new A.l("http://www.w3.org/1999/xhtml","command") +B.LO=new A.l("http://www.w3.org/1999/xhtml","dd") +B.LV=new A.l("http://www.w3.org/1999/xhtml","details") +B.Lh=new A.l("http://www.w3.org/1999/xhtml","dir") +B.Lp=new A.l("http://www.w3.org/1999/xhtml","div") +B.LU=new A.l("http://www.w3.org/1999/xhtml","dl") +B.Le=new A.l("http://www.w3.org/1999/xhtml","dt") +B.Lr=new A.l("http://www.w3.org/1999/xhtml","embed") +B.Mc=new A.l("http://www.w3.org/1999/xhtml","fieldset") +B.Ld=new A.l("http://www.w3.org/1999/xhtml","figure") +B.Mb=new A.l("http://www.w3.org/1999/xhtml","footer") +B.M3=new A.l("http://www.w3.org/1999/xhtml","form") +B.Li=new A.l("http://www.w3.org/1999/xhtml","frame") +B.LR=new A.l("http://www.w3.org/1999/xhtml","frameset") +B.M2=new A.l("http://www.w3.org/1999/xhtml","h1") +B.Lj=new A.l("http://www.w3.org/1999/xhtml","h2") +B.Ln=new A.l("http://www.w3.org/1999/xhtml","h3") +B.LP=new A.l("http://www.w3.org/1999/xhtml","h4") +B.LQ=new A.l("http://www.w3.org/1999/xhtml","h5") +B.LX=new A.l("http://www.w3.org/1999/xhtml","h6") +B.M8=new A.l("http://www.w3.org/1999/xhtml","head") +B.LK=new A.l("http://www.w3.org/1999/xhtml","header") +B.M6=new A.l("http://www.w3.org/1999/xhtml","hr") B.cA=new A.l("http://www.w3.org/1999/xhtml","html") -B.Lj=new A.l("http://www.w3.org/1999/xhtml","iframe") -B.LH=new A.l("http://www.w3.org/1999/xhtml","image") -B.Ld=new A.l("http://www.w3.org/1999/xhtml","img") -B.Mh=new A.l("http://www.w3.org/1999/xhtml","input") -B.Lm=new A.l("http://www.w3.org/1999/xhtml","isindex") -B.M5=new A.l("http://www.w3.org/1999/xhtml","li") -B.LC=new A.l("http://www.w3.org/1999/xhtml","link") -B.Lz=new A.l("http://www.w3.org/1999/xhtml","listing") +B.Ll=new A.l("http://www.w3.org/1999/xhtml","iframe") +B.LJ=new A.l("http://www.w3.org/1999/xhtml","image") +B.Lf=new A.l("http://www.w3.org/1999/xhtml","img") +B.Mj=new A.l("http://www.w3.org/1999/xhtml","input") +B.Lo=new A.l("http://www.w3.org/1999/xhtml","isindex") +B.M7=new A.l("http://www.w3.org/1999/xhtml","li") +B.LE=new A.l("http://www.w3.org/1999/xhtml","link") +B.LB=new A.l("http://www.w3.org/1999/xhtml","listing") B.hD=new A.l("http://www.w3.org/1999/xhtml","marquee") -B.M3=new A.l("http://www.w3.org/1999/xhtml","men") -B.Lk=new A.l("http://www.w3.org/1999/xhtml","meta") -B.LU=new A.l("http://www.w3.org/1999/xhtml","nav") -B.Md=new A.l("http://www.w3.org/1999/xhtml","noembed") -B.LJ=new A.l("http://www.w3.org/1999/xhtml","noframes") -B.Lr=new A.l("http://www.w3.org/1999/xhtml","noscript") +B.M5=new A.l("http://www.w3.org/1999/xhtml","men") +B.Lm=new A.l("http://www.w3.org/1999/xhtml","meta") +B.LW=new A.l("http://www.w3.org/1999/xhtml","nav") +B.Mf=new A.l("http://www.w3.org/1999/xhtml","noembed") +B.LL=new A.l("http://www.w3.org/1999/xhtml","noframes") +B.Lt=new A.l("http://www.w3.org/1999/xhtml","noscript") B.hy=new A.l("http://www.w3.org/1999/xhtml","object") B.hN=new A.l("http://www.w3.org/1999/xhtml","ol") -B.Ls=new A.l("http://www.w3.org/1999/xhtml","p") -B.LL=new A.l("http://www.w3.org/1999/xhtml","param") -B.Lx=new A.l("http://www.w3.org/1999/xhtml","plaintext") -B.Ly=new A.l("http://www.w3.org/1999/xhtml","pre") -B.LZ=new A.l("http://www.w3.org/1999/xhtml","script") -B.Lq=new A.l("http://www.w3.org/1999/xhtml","section") -B.Lt=new A.l("http://www.w3.org/1999/xhtml","select") -B.M2=new A.l("http://www.w3.org/1999/xhtml","style") +B.Lu=new A.l("http://www.w3.org/1999/xhtml","p") +B.LN=new A.l("http://www.w3.org/1999/xhtml","param") +B.Lz=new A.l("http://www.w3.org/1999/xhtml","plaintext") +B.LA=new A.l("http://www.w3.org/1999/xhtml","pre") +B.M0=new A.l("http://www.w3.org/1999/xhtml","script") +B.Ls=new A.l("http://www.w3.org/1999/xhtml","section") +B.Lv=new A.l("http://www.w3.org/1999/xhtml","select") +B.M4=new A.l("http://www.w3.org/1999/xhtml","style") B.cz=new A.l("http://www.w3.org/1999/xhtml","table") -B.Lu=new A.l("http://www.w3.org/1999/xhtml","tbody") +B.Lw=new A.l("http://www.w3.org/1999/xhtml","tbody") B.hB=new A.l("http://www.w3.org/1999/xhtml","td") -B.Mi=new A.l("http://www.w3.org/1999/xhtml","textarea") -B.LG=new A.l("http://www.w3.org/1999/xhtml","tfoot") +B.Mk=new A.l("http://www.w3.org/1999/xhtml","textarea") +B.LI=new A.l("http://www.w3.org/1999/xhtml","tfoot") B.hJ=new A.l("http://www.w3.org/1999/xhtml","th") -B.Me=new A.l("http://www.w3.org/1999/xhtml","thead") -B.LD=new A.l("http://www.w3.org/1999/xhtml","title") -B.LF=new A.l("http://www.w3.org/1999/xhtml","tr") +B.Mg=new A.l("http://www.w3.org/1999/xhtml","thead") +B.LF=new A.l("http://www.w3.org/1999/xhtml","title") +B.LH=new A.l("http://www.w3.org/1999/xhtml","tr") B.hC=new A.l("http://www.w3.org/1999/xhtml","ul") -B.LY=new A.l("http://www.w3.org/1999/xhtml","wbr") -B.LX=new A.l("http://www.w3.org/1999/xhtml","xmp") +B.M_=new A.l("http://www.w3.org/1999/xhtml","wbr") +B.LZ=new A.l("http://www.w3.org/1999/xhtml","xmp") B.cB=new A.l("http://www.w3.org/2000/svg","foreignObject") -B.cC=new A.aP([B.LQ,B.hI,B.LK,B.Mf,B.LW,B.LR,B.LA,B.Lv,B.Li,B.LB,B.Lo,B.hF,B.hE,B.M8,B.M7,B.Le,B.Mc,B.LM,B.LT,B.Lf,B.Ln,B.LS,B.Lc,B.Lp,B.Ma,B.Lb,B.M9,B.M1,B.Lg,B.LP,B.M0,B.Lh,B.Ll,B.LN,B.LO,B.LV,B.M6,B.LI,B.M4,B.cA,B.Lj,B.LH,B.Ld,B.Mh,B.Lm,B.M5,B.LC,B.Lz,B.hD,B.M3,B.Lk,B.LU,B.Md,B.LJ,B.Lr,B.hy,B.hN,B.Ls,B.LL,B.Lx,B.Ly,B.LZ,B.Lq,B.Lt,B.M2,B.cz,B.Lu,B.hB,B.Mi,B.LG,B.hJ,B.Me,B.LD,B.LF,B.hC,B.LY,B.LX,B.cB],t.m) -B.Mj=new A.aP([B.hF],t.m) -B.L7={h1:0,h2:1,h3:2,h4:3,h5:4,h6:5,p:6,div:7,li:8,blockquote:9,pre:10,tr:11,figure:12} -B.Mk=new A.b8(B.L7,13,t.b) -B.Ml=new A.aP([38,62,34,39,61,60,96,32,10,13,9,12],A.a_("aP")) +B.cC=new A.aS([B.LS,B.hI,B.LM,B.Mh,B.LY,B.LT,B.LC,B.Lx,B.Lk,B.LD,B.Lq,B.hF,B.hE,B.Ma,B.M9,B.Lg,B.Me,B.LO,B.LV,B.Lh,B.Lp,B.LU,B.Le,B.Lr,B.Mc,B.Ld,B.Mb,B.M3,B.Li,B.LR,B.M2,B.Lj,B.Ln,B.LP,B.LQ,B.LX,B.M8,B.LK,B.M6,B.cA,B.Ll,B.LJ,B.Lf,B.Mj,B.Lo,B.M7,B.LE,B.LB,B.hD,B.M5,B.Lm,B.LW,B.Mf,B.LL,B.Lt,B.hy,B.hN,B.Lu,B.LN,B.Lz,B.LA,B.M0,B.Ls,B.Lv,B.M4,B.cz,B.Lw,B.hB,B.Mk,B.LI,B.hJ,B.Mg,B.LF,B.LH,B.hC,B.M_,B.LZ,B.cB],t.m) +B.KV={script:0,form:1,iframe:2,object:3,embed:4,input:5,button:6,link:7,style:8,video:9,audio:10,source:11,track:12,use:13,foreignObject:14,animate:15,animateMotion:16,animateTransform:17,set:18} +B.hO=new A.aX(B.KV,19,t.a) +B.Ml=new A.aS([B.hF],t.m) +B.La={h1:0,h2:1,h3:2,h4:3,h5:4,h6:5,p:6,div:7,li:8,blockquote:9,pre:10,tr:11,figure:12} +B.Mm=new A.aX(B.La,13,t.a) +B.Mn=new A.aS([38,62,34,39,61,60,96,32,10,13,9,12],A.a0("aS")) B.hW=new A.bm(0,"ATTRIBUTE") -B.aB=new A.aP([B.hW],t.fr) +B.aB=new A.aS([B.hW],t.fr) B.bA=new A.bm(1,"CDATA") B.bD=new A.bm(2,"COMMENT") B.cH=new A.bm(3,"DECLARATION") @@ -20406,140 +20557,142 @@ B.cI=new A.bm(4,"DOCUMENT_TYPE") B.aT=new A.bm(7,"ELEMENT") B.bB=new A.bm(10,"PROCESSING") B.bC=new A.bm(11,"TEXT") -B.hO=new A.aP([B.bA,B.bD,B.cH,B.cI,B.aT,B.bB,B.bC],t.fr) -B.L6={ol:0,ul:1,menu:2} -B.Mm=new A.b8(B.L6,3,t.b) +B.hP=new A.aS([B.bA,B.bD,B.cH,B.cI,B.aT,B.bB,B.bC],t.fr) +B.L8={ol:0,ul:1,menu:2} +B.Mo=new A.aX(B.L8,3,t.a) B.hA=new A.l("http://www.w3.org/1998/Math/MathML","mi") B.hH=new A.l("http://www.w3.org/1998/Math/MathML","mo") B.hM=new A.l("http://www.w3.org/1998/Math/MathML","mn") B.hz=new A.l("http://www.w3.org/1998/Math/MathML","ms") B.hL=new A.l("http://www.w3.org/1998/Math/MathML","mtext") -B.hP=new A.aP([B.hA,B.hH,B.hM,B.hz,B.hL],t.m) -B.KV={style:0,script:1,xmp:2,iframe:3,noembed:4,noframes:5,noscript:6} -B.Mn=new A.b8(B.KV,7,t.b) -B.KZ={table:0,tbody:1,tfoot:2,thead:3,tr:4} -B.hQ=new A.b8(B.KZ,5,t.b) -B.La={script:0,form:1,iframe:2,object:3,embed:4,input:5,button:6,link:7,style:8,video:9,audio:10,source:11,track:12,use:13} -B.hR=new A.b8(B.La,14,t.b) -B.cD=new A.b8(B.aS,0,A.a_("b8<+(e,e)>")) -B.Mo=new A.aP([B.hN,B.hC],t.m) -B.bz=new A.aP([B.bA,B.bD,B.aT,B.bB,B.bC],t.fr) -B.L5={em:0,i:1} -B.Mp=new A.b8(B.L5,2,t.b) -B.M_=new A.l("http://www.w3.org/1999/xhtml","optgroup") -B.Mb=new A.l("http://www.w3.org/1999/xhtml","option") -B.Mq=new A.aP([B.M_,B.Mb],t.m) -B.L2={strong:0,b:1,th:2} -B.Mr=new A.b8(B.L2,3,t.b) -B.Ms=new A.aP([B.cA,B.cz],t.m) -B.LE=new A.l("http://www.w3.org/1998/Math/MathML","annotation-xml") +B.hQ=new A.aS([B.hA,B.hH,B.hM,B.hz,B.hL],t.m) +B.L9={href:0,"xlink:href":1} +B.Mp=new A.aX(B.L9,2,t.a) +B.KW={style:0,script:1,xmp:2,iframe:3,noembed:4,noframes:5,noscript:6} +B.Mq=new A.aX(B.KW,7,t.a) +B.L_={table:0,tbody:1,tfoot:2,thead:3,tr:4} +B.hR=new A.aX(B.L_,5,t.a) +B.cD=new A.aX(B.aS,0,A.a0("aX<+(e,e)>")) +B.Mr=new A.aS([B.hN,B.hC],t.m) +B.bz=new A.aS([B.bA,B.bD,B.aT,B.bB,B.bC],t.fr) +B.L7={em:0,i:1} +B.Ms=new A.aX(B.L7,2,t.a) +B.M1=new A.l("http://www.w3.org/1999/xhtml","optgroup") +B.Md=new A.l("http://www.w3.org/1999/xhtml","option") +B.Mt=new A.aS([B.M1,B.Md],t.m) +B.L5={image:0,title:1,desc:2} +B.Mu=new A.aX(B.L5,3,t.a) +B.L3={strong:0,b:1,th:2} +B.Mv=new A.aX(B.L3,3,t.a) +B.Mw=new A.aS([B.cA,B.cz],t.m) +B.LG=new A.l("http://www.w3.org/1998/Math/MathML","annotation-xml") B.hK=new A.l("http://www.w3.org/2000/svg","desc") B.hG=new A.l("http://www.w3.org/2000/svg","title") -B.cE=new A.aP([B.hI,B.hE,B.cA,B.hD,B.hy,B.cz,B.hB,B.hJ,B.hA,B.hH,B.hM,B.hz,B.hL,B.LE,B.cB,B.hK,B.hG],t.m) -B.L4={after:0,before:1,"first-letter":2,"first-line":3} -B.Mt=new A.b8(B.L4,4,t.b) -B.Lw=new A.l("http://www.w3.org/1998/Math/MathML","annotaion-xml") -B.Mu=new A.aP([B.Lw,B.cB,B.hK,B.hG],t.m) -B.KX={h1:0,h2:1,h3:2,h4:3,h5:4,h6:5} -B.hS=new A.b8(B.KX,6,t.b) -B.hT=new A.d3("") -B.hU=new A.cf("_throwNoParent") -B.Mv=new A.cf("call") -B.Mw=A.c7("zJ") -B.Mx=A.c7("zK") -B.My=A.c7("vM") -B.Mz=A.c7("vN") -B.MA=A.c7("vT") -B.MB=A.c7("iQ") -B.MC=A.c7("vU") -B.MD=A.c7("p") -B.ME=A.c7("qn") -B.MF=A.c7("qo") -B.MG=A.c7("wT") -B.MH=A.c7("jZ") +B.cE=new A.aS([B.hI,B.hE,B.cA,B.hD,B.hy,B.cz,B.hB,B.hJ,B.hA,B.hH,B.hM,B.hz,B.hL,B.LG,B.cB,B.hK,B.hG],t.m) +B.L6={after:0,before:1,"first-letter":2,"first-line":3} +B.Mx=new A.aX(B.L6,4,t.a) +B.Ly=new A.l("http://www.w3.org/1998/Math/MathML","annotaion-xml") +B.My=new A.aS([B.Ly,B.cB,B.hK,B.hG],t.m) +B.KY={h1:0,h2:1,h3:2,h4:3,h5:4,h6:5} +B.hS=new A.aX(B.KY,6,t.a) +B.hT=new A.d4("") +B.hU=new A.ci("_throwNoParent") +B.Mz=new A.ci("call") +B.MA=A.ca("zQ") +B.MB=A.ca("zR") +B.MC=A.ca("vX") +B.MD=A.ca("vY") +B.ME=A.ca("w3") +B.MF=A.ca("iQ") +B.MG=A.ca("w4") +B.MH=A.ca("p") +B.MI=A.ca("qy") +B.MJ=A.ca("qz") +B.MK=A.ca("x2") +B.ML=A.ca("jZ") B.hV=new A.k5(!1) -B.MI=new A.ag("'",0,"SINGLE_QUOTE") -B.MJ=new A.bm(5,"DOCUMENT") +B.MM=new A.ag("'",0,"SINGLE_QUOTE") +B.MN=new A.bm(5,"DOCUMENT") B.hX=new A.bm(6,"DOCUMENT_FRAGMENT") -B.aC=new A.h7(0,"none") -B.hY=new A.h7(1,"zipCrypto") -B.hZ=new A.h7(2,"aes")})();(function staticFields(){$.oQ=null -$.bF=A.i([],A.a_("y

")) -$.rO=null -$.rh=null -$.rg=null -$.uv=null -$.ug=null -$.uH=null -$.py=null -$.pI=null -$.qV=null -$.oV=A.i([],A.a_("y?>")) +B.aC=new A.h9(0,"none") +B.hY=new A.h9(1,"zipCrypto") +B.hZ=new A.h9(2,"aes")})();(function staticFields(){$.oY=null +$.bG=A.i([],A.a0("y

")) +$.rY=null +$.rs=null +$.rr=null +$.uG=null +$.uq=null +$.uS=null +$.pG=null +$.pQ=null +$.r5=null +$.p2=A.i([],A.a0("y?>")) $.eF=null -$.hD=null -$.hE=null -$.qM=!1 +$.hF=null +$.hG=null +$.qX=!1 $.an=B.a3 -$.tl=null -$.tm=null -$.tn=null -$.to=null -$.qs=A.oC("_lastQuoRemDigits") -$.qt=A.oC("_lastQuoRemUsed") -$.h9=A.oC("_lastRemUsed") -$.qu=A.oC("_lastRem_nsh") -$.t6="" -$.t7=null -$.aM=A.i([4294967295,2147483647,1073741823,536870911,268435455,134217727,67108863,33554431,16777215,8388607,4194303,2097151,1048575,524287,262143,131071,65535,32767,16383,8191,4095,2047,1023,511,255,127,63,31,15,7,3,1,0],t.Z) -$.eE=A.tr() -$.cY=null -$.u_=null -$.pe=null})();(function lazyInitializers(){var s=hunkHelpers.lazyFinal -s($,"zL","r3",()=>A.z7("_$dart_dartClosure")) -s($,"Ak","vd",()=>A.i([new J.iU()],A.a_("y"))) -s($,"zW","uU",()=>A.cD(A.nR({ +$.tv=null +$.tw=null +$.tx=null +$.ty=null +$.qD=A.oJ("_lastQuoRemDigits") +$.qE=A.oJ("_lastQuoRemUsed") +$.hb=A.oJ("_lastRemUsed") +$.qF=A.oJ("_lastRem_nsh") +$.tg="" +$.th=null +$.aP=A.i([4294967295,2147483647,1073741823,536870911,268435455,134217727,67108863,33554431,16777215,8388607,4194303,2097151,1048575,524287,262143,131071,65535,32767,16383,8191,4095,2047,1023,511,255,127,63,31,15,7,3,1,0],t.Z) +$.eE=A.tB() +$.d_=null +$.u9=null +$.pm=null})();(function lazyInitializers(){var s=hunkHelpers.lazyFinal +s($,"zS","re",()=>A.zg("_$dart_dartClosure")) +s($,"As","vp",()=>A.i([new J.iU()],A.a0("y"))) +s($,"A3","v5",()=>A.cF(A.nY({ toString:function(){return"$receiver$"}}))) -s($,"zX","uV",()=>A.cD(A.nR({$method$:null, +s($,"A4","v6",()=>A.cF(A.nY({$method$:null, toString:function(){return"$receiver$"}}))) -s($,"zY","uW",()=>A.cD(A.nR(null))) -s($,"zZ","uX",()=>A.cD(function(){var $argumentsExpr$="$arguments$" +s($,"A5","v7",()=>A.cF(A.nY(null))) +s($,"A6","v8",()=>A.cF(function(){var $argumentsExpr$="$arguments$" try{null.$method$($argumentsExpr$)}catch(r){return r.message}}())) -s($,"A1","v_",()=>A.cD(A.nR(void 0))) -s($,"A2","v0",()=>A.cD(function(){var $argumentsExpr$="$arguments$" +s($,"A9","vb",()=>A.cF(A.nY(void 0))) +s($,"Aa","vc",()=>A.cF(function(){var $argumentsExpr$="$arguments$" try{(void 0).$method$($argumentsExpr$)}catch(r){return r.message}}())) -s($,"A0","uZ",()=>A.cD(A.t3(null))) -s($,"A_","uY",()=>A.cD(function(){try{null.$method$}catch(r){return r.message}}())) -s($,"A4","v2",()=>A.cD(A.t3(void 0))) -s($,"A3","v1",()=>A.cD(function(){try{(void 0).$method$}catch(r){return r.message}}())) -s($,"A5","r5",()=>A.x3()) -s($,"Af","v9",()=>A.mP(4096)) -s($,"Ad","v7",()=>new A.p3().$0()) -s($,"Ae","v8",()=>new A.p2().$0()) -s($,"A6","v3",()=>A.w8(A.hC(A.i([-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-2,-2,-2,-2,-2,62,-2,62,-2,63,52,53,54,55,56,57,58,59,60,61,-2,-2,-2,-1,-2,-2,-2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-2,-2,-2,-2,63,-2,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-2,-2,-2,-2,-2],t.Z)))) -s($,"Ac","c8",()=>A.kz(0)) -s($,"Aa","dR",()=>A.kz(1)) -s($,"Ab","v6",()=>A.kz(2)) -s($,"A9","r6",()=>$.dR().bT(0)) -s($,"A7","v4",()=>A.kz(1e4)) -s($,"A8","v5",()=>A.mP(8)) -s($,"Ah","lD",()=>A.lB(B.MD)) -s($,"zG","dd",()=>A.mP(0)) -s($,"zI","uP",()=>A.mP(0)) -s($,"zH","uO",()=>A.w7(0)) -s($,"zN","uR",()=>A.ix(B.jm)) -s($,"zM","uQ",()=>A.ix(B.iV)) -s($,"An","pZ",()=>new A.lO($.r4())) -s($,"zS","uS",()=>new A.jB(A.a5("/",!0),A.a5("[^/]$",!0),A.a5("^/",!0))) -s($,"zU","lC",()=>new A.k9(A.a5("[/\\\\]",!0),A.a5("[^/\\\\]$",!0),A.a5("^(\\\\\\\\[^\\\\]+\\\\[^\\\\/]+|[a-zA-Z]:[/\\\\])",!0),A.a5("^[/\\\\](?![/\\\\])",!0))) -s($,"zT","hF",()=>new A.k3(A.a5("/",!0),A.a5("(^[a-zA-Z][-+.a-zA-Z\\d]*://|[^/])$",!0),A.a5("[a-zA-Z][-+.a-zA-Z\\d]*://[^/]*",!0),A.a5("^/",!0))) -s($,"zR","r4",()=>A.wR()) -s($,"zV","uT",()=>new A.jg("newline expected")) -s($,"Ai","vb",()=>A.tZ(!1)) -s($,"Aj","vc",()=>A.tZ(!0)) -s($,"Am","r7",()=>A.a5("[&<\\u0001-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f-\\u0084\\u0086-\\u009f]|]]>",!0)) -s($,"Al","ve",()=>A.a5("['&<\\n\\r\\t\\u0001-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f-\\u0084\\u0086-\\u009f]",!0)) -s($,"Ag","va",()=>A.a5('["&<\\n\\r\\t\\u0001-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f-\\u0084\\u0086-\\u009f]',!0)) -s($,"Ap","vf",()=>new A.ka(new A.pz(),5,A.az(t.j7,A.a_("n")),A.a_("ka>")))})();(function nativeSupport(){!function(){var s=function(a){var m={} +s($,"A8","va",()=>A.cF(A.td(null))) +s($,"A7","v9",()=>A.cF(function(){try{null.$method$}catch(r){return r.message}}())) +s($,"Ac","ve",()=>A.cF(A.td(void 0))) +s($,"Ab","vd",()=>A.cF(function(){try{(void 0).$method$}catch(r){return r.message}}())) +s($,"Ad","rg",()=>A.xd()) +s($,"An","vl",()=>A.mV(4096)) +s($,"Al","vj",()=>new A.pb().$0()) +s($,"Am","vk",()=>new A.pa().$0()) +s($,"Ae","vf",()=>A.wi(A.hE(A.i([-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-2,-2,-2,-2,-2,62,-2,62,-2,63,52,53,54,55,56,57,58,59,60,61,-2,-2,-2,-1,-2,-2,-2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-2,-2,-2,-2,63,-2,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-2,-2,-2,-2,-2],t.Z)))) +s($,"Ak","cb",()=>A.kz(0)) +s($,"Ai","dR",()=>A.kz(1)) +s($,"Aj","vi",()=>A.kz(2)) +s($,"Ah","rh",()=>$.dR().bV(0)) +s($,"Af","vg",()=>A.kz(1e4)) +s($,"Ag","vh",()=>A.mV(8)) +s($,"Ap","lD",()=>A.lB(B.MH)) +s($,"zN","de",()=>A.mV(0)) +s($,"zP","v0",()=>A.mV(0)) +s($,"zO","v_",()=>A.wh(0)) +s($,"zV","v2",()=>A.ix(B.jm)) +s($,"zU","v1",()=>A.ix(B.iV)) +s($,"Av","q7",()=>new A.lO($.rf())) +s($,"A_","v3",()=>new A.jB(A.a3("/",!0),A.a3("[^/]$",!0),A.a3("^/",!0))) +s($,"A1","lC",()=>new A.k9(A.a3("[/\\\\]",!0),A.a3("[^/\\\\]$",!0),A.a3("^(\\\\\\\\[^\\\\]+\\\\[^\\\\/]+|[a-zA-Z]:[/\\\\])",!0),A.a3("^[/\\\\](?![/\\\\])",!0))) +s($,"A0","hH",()=>new A.k3(A.a3("/",!0),A.a3("(^[a-zA-Z][-+.a-zA-Z\\d]*://|[^/])$",!0),A.a3("[a-zA-Z][-+.a-zA-Z\\d]*://[^/]*",!0),A.a3("^/",!0))) +s($,"zZ","rf",()=>A.x0()) +s($,"A2","v4",()=>new A.jg("newline expected")) +s($,"Aq","vn",()=>A.u8(!1)) +s($,"Ar","vo",()=>A.u8(!0)) +s($,"Au","ri",()=>A.a3("[&<\\u0001-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f-\\u0084\\u0086-\\u009f]|]]>",!0)) +s($,"At","vq",()=>A.a3("['&<\\n\\r\\t\\u0001-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f-\\u0084\\u0086-\\u009f]",!0)) +s($,"Ao","vm",()=>A.a3('["&<\\n\\r\\t\\u0001-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f-\\u0084\\u0086-\\u009f]',!0)) +s($,"Ax","vr",()=>new A.ka(new A.pH(),5,A.aA(t.j7,A.a0("n")),A.a0("ka>")))})();(function nativeSupport(){!function(){var s=function(a){var m={} m[a]=1 return Object.keys(hunkHelpers.convertToFastObject(m))[0]} v.getIsolateTag=function(a){return s("___dart_"+a+v.isolateTag)} @@ -20550,14 +20703,14 @@ for(var o=0;;o++){var n=s(p+"_"+o+"_") if(!(n in q)){q[n]=1 v.isolateTag=n break}}v.dispatchPropertyName=v.getIsolateTag("dispatch_record")}() -hunkHelpers.setOrUpdateInterceptorsByTag({ArrayBuffer:A.dv,SharedArrayBuffer:A.dv,ArrayBufferView:A.fu,DataView:A.j7,Float32Array:A.j8,Float64Array:A.j9,Int16Array:A.ja,Int32Array:A.jb,Int8Array:A.jc,Uint16Array:A.jd,Uint32Array:A.fv,Uint8ClampedArray:A.fw,CanvasPixelArray:A.fw,Uint8Array:A.dw}) +hunkHelpers.setOrUpdateInterceptorsByTag({ArrayBuffer:A.dv,SharedArrayBuffer:A.dv,ArrayBufferView:A.fw,DataView:A.j7,Float32Array:A.j8,Float64Array:A.j9,Int16Array:A.ja,Int32Array:A.jb,Int8Array:A.jc,Uint16Array:A.jd,Uint32Array:A.fx,Uint8ClampedArray:A.fy,CanvasPixelArray:A.fy,Uint8Array:A.dw}) hunkHelpers.setOrUpdateLeafTags({ArrayBuffer:true,SharedArrayBuffer:true,ArrayBufferView:false,DataView:true,Float32Array:true,Float64Array:true,Int16Array:true,Int32Array:true,Int8Array:true,Uint16Array:true,Uint32Array:true,Uint8ClampedArray:true,CanvasPixelArray:true,Uint8Array:false}) -A.aW.$nativeSuperclassTag="ArrayBufferView" -A.hh.$nativeSuperclassTag="ArrayBufferView" -A.hi.$nativeSuperclassTag="ArrayBufferView" -A.ft.$nativeSuperclassTag="ArrayBufferView" +A.b0.$nativeSuperclassTag="ArrayBufferView" A.hj.$nativeSuperclassTag="ArrayBufferView" A.hk.$nativeSuperclassTag="ArrayBufferView" +A.fv.$nativeSuperclassTag="ArrayBufferView" +A.hl.$nativeSuperclassTag="ArrayBufferView" +A.hm.$nativeSuperclassTag="ArrayBufferView" A.by.$nativeSuperclassTag="ArrayBufferView"})() Function.prototype.$1=function(a){return this(a)} Function.prototype.$2=function(a,b){return this(a,b)} @@ -20574,5 +20727,5 @@ convertToFastObject($);(function(a){if(typeof document==="undefined"){a(null) return}if(typeof document.currentScript!="undefined"){a(document.currentScript) return}var s=document.scripts function onLoad(b){for(var q=0;q`; the reader pushes +and tracks it, pauses reading activity, and removes that specific route when the +document/controller changes or the reader is disposed. `ReaderPanelRouteContext` +provides the panel kind, title, and `buildContent(context, scrollController)`. +Default content is reactive, headerless, shrink-wrapped, and uses the host theme. +The supplied controller connects it to the host's draggable sheet. Settings and +TOC navigation still use the reader command queue. Existing custom panel builders +continue to replace content and are responsible for any headers they include. +Omitting the route factory retains the standalone sheet and its live reader +appearance. Wide docked panels continue to use the reader shell. + +Papyrus client supplies this route with its shared `AppBottomSheet` and +`ExpandableBottomSheet`; header, handle, safe areas, sizing, dismissal, app theme, +and e-ink motion policy are therefore maintained in the client. Reading appearance +changes affect the book while the host sheet keeps the app's theme. + ## Library decisions @@ -105,8 +195,7 @@ and appearance panels, and a progress scrubber. Typography and navigation must behave the same on phone and desktop. Respect reduced motion and e-ink hosts. Capability flags expose only controls implemented by the active engine. -Existing `ReaderDocument`, controller ownership and observer callbacks remain -compatible. EPUB locators gain optional content offsets; legacy CFI strings are -compatibility data, not a claim of full EPUB CFI conformance. The Papyrus adapter -already stores complete locator JSON, so optional locator fields need no database -schema migration. Host preference and progress writes remain host-owned. +`ReaderDocument`, controller ownership and observer callbacks form the host API. +EPUB locators contain a spine index, content offset or anchor, and progression; +they do not contain synthetic CFI strings. The Papyrus adapter stores complete +locator JSON. Host preference and progress writes remain host-owned. diff --git a/docs/integration.md b/docs/integration.md index a38a80b..3e68e64 100644 --- a/docs/integration.md +++ b/docs/integration.md @@ -10,11 +10,10 @@ host-owned and must be disposed by the host. Engine factories must return fresh instances. Observers should enqueue durable host writes, with a flush on close, background and profile changes. The package never writes account-scoped data. -Serialize `ReaderLocator.toJson()` in full. Existing version-1 EPUB and PDF -locators remain readable. New EPUB positions may include `textOffset` and `anchor`; -these fields improve reflow and TOC restoration without a database migration. -Do not interpret legacy EPUB CFI strings as standardized CFI positions. A custom -HTML scrolling renderer continues to use approximate progression restoration. +Serialize `ReaderLocator.toJson()` in full. EPUB positions use `spineIndex`, +`textOffset`, and an optional `anchor`. Custom HTML scrolling renderers use +approximate progression restoration. EPUB locators do not contain CFI strings; +standardized EPUB CFI interoperability is not implemented. PDF stores `pageIndex`, `pageOffset` and `totalProgression`. A custom facade can report intra-page offsets through `PdfViewportConfiguration.onPositionChanged`. @@ -45,3 +44,18 @@ loads the worker through `rootBundle` and creates a local Blob URL. A restrictiv Content Security Policy must allow `worker-src blob:`; do not fall back silently to main-thread parsing if worker initialization fails. Offline deployment must cache the packaged worker alongside other Flutter assets. + +## Optional activity observations + +`PapyrusReader(onActivity: ...)` reports `ReaderActivityEvent` readiness, visibility, +locator, navigation cause, exposed stable coverage, and end-of-document state. +The callback is optional and independent of Goals. Hosts own clocks, foreground lifecycle, +completion confirmation, persistence, and aggregation. + +Settings and contents panels mark content obscured. EPUB coverage uses normalized +chapter UTF-16 content extents, with spine count for host calibration; PDF coverage +lists actually exposed page indices, including spreads. Jumps never expose skipped +pages. Engines without page metrics retain time tracking through ready snapshots. +Parsing remains in the existing worker/isolate transports; activity reporting does +not require whole-book layout. Reflow reports coverage without changing the +restored locator's precise content offset. diff --git a/docs/reader-navigation-validation.md b/docs/reader-navigation-validation.md new file mode 100644 index 0000000..2fcb2c2 --- /dev/null +++ b/docs/reader-navigation-validation.md @@ -0,0 +1,146 @@ +# Reader navigation validation — 2026-10-10 + +## Overlay-controls follow-up + +The subsequent controls revision replaces reserved toolbar/footer space with overlays +on desktop and mobile. The final visual refinement docks the bars and desktop +side panels flush to the screen edges, removes the book title, and uses the standard +56-pixel app bar and platform back button to match book details. Chapter/page +information sits above the slider, 11 pixels from the track center, with four +pixels of top padding and full-height +touch targets retained. There is no persistent show/hide button. +An ordinary page tap toggles the controls; Escape and accessible surface actions +provide alternatives. The full reading viewport and pagination remain unchanged +when the overlays appear or disappear, and safe areas use the page background. + +Two gesture bugs were corrected: empty selection notifications cancelled ordinary +text taps, and paragraphs containing links suppressed taps even on ordinary words. +Link exclusion now tests the actual linked glyph bounds. A selectable mixed-text +regression checks ordinary words before and after a link, the link itself, and empty +selection notifications. Existing long-press, drag, multi-touch and selection +exclusions remain covered. + +The actual client on the iOS simulator passed text-tap hide/show sessions with Alice, +Pride and the local SQL book. Desktop Chrome confirmed that clicking text removes +both overlays completely, with no remaining bars or toggle, and Escape restores +them. Screenshots are in ignored `build/overlay-validation/` (desktop controls shown +and hidden; native book pages shown and hidden). All 167 reader tests, 27 focused +client tests and two example tests pass, as do analysis, client checks, both web +builds and the browser smoke covering PDF controls, paging and scrolling. The entries +below record the original navigation validation before this visual follow-up. + +The flush-bar refinement passes all 168 reader tests (including a comparison of +reader and standard app-bar/back-icon bounds), two example tests, reader analysis, +client checks and the client production web build. The actual iOS client again +passes Alice, Pride and local SQL navigation, tap hide/show, persistence and PDF +controls. Desktop Chrome confirms the titleless bars and docked settings panel. +Current screenshots and logs are in ignored `build/flush-controls-validation/`. +The subsequent footer-spacing correction restores the label above the track and +halves the label-to-track-center gap from 24 to 12 pixels. All 42 focused shell +and real-book tests pass, including explicit spacing and width checks at phone +and desktop sizes. Alice/Pride and PDF client checks pass on the iOS simulator; +updated screenshots are in `build/footer-spacing-validation/`. +Native turn plus observation times were 863 ms, 793 ms and 1856 ms respectively; +as above these include deliberate frame observation and debug/test overhead. + +The fixes were validated with the workspace-pinned Flutter 3.41.2 SDK and an +ignored client `pubspec_overrides.yaml` pointing `papyrus_reader` to `../../reader`. +These navigation checks used locator version 1. Subsequent pre-release contract +cleanup removed synthetic CFI strings; positions use spine indices and content +offsets. Package versions are unchanged; the coordinating client PR pins the +committed reader revision. + +## Opening-screen follow-up + +Initial opening now shows only a centered, accessible loader without a back arrow +or book title. The client uses its motion-aware loader for both media fetching and +engine preparation, keeping identical safe-area bounds and background color. +Tests explicitly hold loading open and compare spinner positions across stages. +All 34 shell tests, two client page tests and two example tests pass, along with +reader/client analysis, client checks and a production web build. Actual iOS +Alice/Pride opening captures and subsequent EPUB/PDF interactions pass; screenshots +and logs are in ignored `build/opening-validation/`. + +## Panel-contrast follow-up + +TOC/settings panels now use the theme's higher-contrast container surface. Wide +panels have a one-pixel leading/top border; mobile sheets have a matching outline. +Borders do not change reader geometry or add floating margins/shadows. All 168 +reader tests, two example tests, reader analysis and the client web build pass. +Actual client Chrome screenshots in dark and light appearances are retained in +ignored `build/panel-contrast-validation/`. + +## Reproducible inputs + +The offline [Gutenberg fixtures](../test/fixtures/gutenberg/README.md) record exact +source URLs and SHA-256 checksums for Alice and Pride and Prejudice. SQL Performance +Explained was tested using the user's existing local file and is not distributed. + +## Checks and observations + +| Target | Result | +| --- | --- | +| Reader | 166 tests passed; analysis and formatting clean | +| Reader example | 2 tests passed; analysis and production web build passed | +| Packaged worker | Regeneration check and real browser transport smoke passed | +| Client | 51 reader, activity, persistence, mapper and page integration tests passed; client checks and production web build passed | +| Actual client, desktop Chrome | Alice cover, forward/backward chapters, TOC and settings overlays, scrolling and paginated spreads; SQL cover/main-content/cover round trip stays at 0% instead of 50% | +| Actual client, 390 × 844 Chrome | Pride cover/main-content/cover returns to 0%; show/hide toggle bounds identical: x334, y4, 48 × 48 CSS pixels | +| Actual client ReaderPage, iOS 27 iPhone 18 Pro simulator | Alice, Pride and local SQL passed cover/next/previous, intermediate-frame checks, panels, stable toggle coordinates, persisted locator and visible position after reopening; PDF opens and retains its settings controls | +| Browser example smoke | Keyboard focus across chapters, hidden controls, mobile sheets, landscape, PDF page turns, wheel scrolling, spreads, appearance changes, local file opening and worker cleanup passed | + +Real-book widget tests exercise both 390 × 844 and 1280 × 850 viewports, slider +endpoints, rapid queued turns, rotation, typography, appearance without controller +replacement, native worker restart and content-offset locators. A gated worker verifies +that slow and failed chapter preparation retains the committed page and progress, +then succeeds on retry. Gesture regressions exclude dragging, long presses, double +taps, multi-touch, selection and link interactions from the center-tap toggle. + +Native frame observation checks every sampled frame for retained PageView content +and absence of the full-page preparation message. The measured next-turn plus +20-frame observation and settling times were Alice 841 ms, Pride 793 ms and SQL +2041 ms in a debug simulator build. These include test overhead and intentional +observation time; they are not production frame-latency benchmarks. The large SQL +body is a single spine item, making it a useful slow-layout case. + +Local evidence is retained under ignored `build/reader-validation/`: desktop and +native screenshots, timings and check logs. Phone browser screenshot capture had +a device-scale mismatch in the automation surface; phone geometry was checked +through DOM bounds and widget tests, with native simulator screenshots used for +visual evidence. No physical iOS/Android or e-ink hardware session was run. Existing +reduced-motion and large-text regressions pass; this is not a hardware certification. +Authenticated live synchronization and release deployment were not exercised. + +## Running the device check + +Serve a temporary local directory on port 8755 containing: + +- `reader.epub`: the Alice fixture. +- `pride.epub`: the Pride and Prejudice fixture. +- `reader.pdf`: `example/assets/a_tiny_pdf.pdf`. +- Optionally `sql.epub`: a locally licensed SQL book, outside the repository. + +From `client/app`, with the local reader override installed: + +```sh +../../tools/flutter drive --no-pub -d \ + --driver=test_driver/reading_tracking_driver.dart \ + --target=integration_test/reader_real_books_test.dart \ + --dart-define=RUN_READER_VALIDATION=true \ + --dart-define=TRACKING_FIXTURE_ORIGIN=http://127.0.0.1:8755 +``` + +Add `--dart-define=READER_INCLUDE_SQL=true` only when that local file is available. +The test uses the client's actual ReaderPage, DataStore and isolated guest database. +Its driver writes screenshots and timings to `client/app/build/integration_response_data.json`. + +On this machine Xcode 27 rejected older deployment targets in dependency Pods. +The simulator command used a temporary `XCODE_XCCONFIG_FILE` containing +`IPHONEOS_DEPLOYMENT_TARGET = 15.0`. No deployment target or Pod lockfile change +is included in the fix. + +The native persistence check exposed an additional client bug: activity updates +stored `reader_locator` outside the metadata envelope consumed by the book mapper. +The final implementation writes and reads the current flat `custom_metadata` +contract. Missing locator patches preserve the previous position; legacy envelope +and locator recovery paths were removed as part of the pre-release cleanup. diff --git a/example/test/widget_test.dart b/example/test/widget_test.dart index 289a675..75d06a4 100644 --- a/example/test/widget_test.dart +++ b/example/test/widget_test.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:papyrus_reader/papyrus_reader.dart'; import 'package:papyrus_reader_example/main.dart'; @@ -30,6 +31,9 @@ void main() { await tester.pumpAndSettle(); expect(find.byType(PapyrusReader), findsOneWidget); + expect(find.byType(Slider), findsNothing); + await tester.sendKeyEvent(LogicalKeyboardKey.escape); + await tester.pumpAndSettle(); final progressSlider = tester.widget(find.byType(Slider)); progressSlider.onChangeEnd!(0.65); @@ -47,7 +51,7 @@ void main() { expect( (memory.locatorFor('garden-letter') as EpubReaderLocator) .totalProgression, - 0.65, + 1.0, ); expect(memory.preferencesFor('garden-letter')!.fontSize, 25); @@ -61,7 +65,10 @@ void main() { await tester.tap(readEpub); await tester.pumpAndSettle(); expect(find.byType(PapyrusReader), findsOneWidget); - expect(tester.widget(find.byType(Slider)).value, 0.65); + expect(find.byType(Slider), findsNothing); + await tester.sendKeyEvent(LogicalKeyboardKey.escape); + await tester.pumpAndSettle(); + expect(tester.widget(find.byType(Slider)).value, 1.0); await tester.tap(find.byTooltip('Reading settings')); await tester.pumpAndSettle(); diff --git a/lib/papyrus_reader.dart b/lib/papyrus_reader.dart index b7909d8..1af7141 100644 --- a/lib/papyrus_reader.dart +++ b/lib/papyrus_reader.dart @@ -2,9 +2,11 @@ library; export 'src/controller/reader_controller.dart'; export 'src/domain/reader_capabilities.dart'; +export 'src/domain/reader_activity.dart'; export 'src/domain/reader_document.dart'; export 'src/domain/reader_exception.dart'; export 'src/domain/reader_locator.dart'; +export 'src/domain/reader_selection.dart'; export 'src/domain/reader_preferences.dart'; export 'src/domain/reader_snapshot.dart'; export 'src/domain/reader_toc_entry.dart'; diff --git a/lib/src/controller/reader_controller.dart b/lib/src/controller/reader_controller.dart index 442004b..32bb317 100644 --- a/lib/src/controller/reader_controller.dart +++ b/lib/src/controller/reader_controller.dart @@ -1,6 +1,7 @@ import 'package:flutter/widgets.dart'; import '../domain/reader_document.dart'; +import '../domain/reader_activity.dart'; import '../domain/reader_exception.dart'; import '../domain/reader_locator.dart'; import '../domain/reader_preferences.dart'; @@ -32,6 +33,8 @@ final class ReaderController extends ChangeNotifier { bool _isDisposed = false; ReaderSnapshot get snapshot => _snapshot; + ({Object token, ReaderNavigationCause cause})? _navigationCommand; + ReaderNavigationCause navigationCause = ReaderNavigationCause.restore; ReaderPreferences get preferences => _snapshot.preferences; @@ -57,6 +60,8 @@ final class ReaderController extends ChangeNotifier { candidate.dispose(); } _loadingEngines.clear(); + _navigationCommand = null; + navigationCause = ReaderNavigationCause.restore; final request = _ReaderLoadRequest( id: ++_latestLoadId, document: document, @@ -126,7 +131,10 @@ final class ReaderController extends ChangeNotifier { } Future goTo(ReaderLocator locator) async { - await _requireReadyEngine().goTo(locator); + await _navigate( + ReaderNavigationCause.jump, + (engine) => engine.goTo(locator), + ); } Future goToProgress(double progress) async { @@ -138,15 +146,23 @@ final class ReaderController extends ChangeNotifier { ); } - await _requireReadyEngine().goToProgress(progress); + await _navigate( + ReaderNavigationCause.jump, + (engine) => engine.goToProgress(progress), + ); } + void cancelPendingSeek() => _engine?.cancelPendingSeek(); + Future goNext() async { - await _requireReadyEngine().goNext(); + await _navigate(ReaderNavigationCause.turn, (engine) => engine.goNext()); } Future goPrevious() async { - await _requireReadyEngine().goPrevious(); + await _navigate( + ReaderNavigationCause.turn, + (engine) => engine.goPrevious(), + ); } Future currentLocator() async { @@ -154,8 +170,27 @@ final class ReaderController extends ChangeNotifier { } Future updatePreferences(ReaderPreferences preferences) async { - await _requireReadyEngine().updatePreferences(preferences); - _syncFromEngine(); + await _navigate(ReaderNavigationCause.reflow, (engine) async { + await engine.updatePreferences(preferences); + if (identical(_engine, engine)) _syncFromEngine(); + }); + } + + Future _navigate( + ReaderNavigationCause cause, + Future Function(ReaderEngine) action, + ) async { + final engine = _requireReadyEngine(); + final token = Object(); + _navigationCommand = (token: token, cause: cause); + navigationCause = cause; + try { + await action(engine); + } finally { + if (identical(_navigationCommand?.token, token)) { + _navigationCommand = null; + } + } } void _selectEngine(ReaderEngine engine) { @@ -191,6 +226,10 @@ final class ReaderController extends ChangeNotifier { final engine = _engine; if (engine != null) { + if (engine.snapshot.locator != _snapshot.locator) { + navigationCause = + _navigationCommand?.cause ?? ReaderNavigationCause.viewport; + } _publish(engine.snapshot); } } diff --git a/lib/src/domain/reader_activity.dart b/lib/src/domain/reader_activity.dart new file mode 100644 index 0000000..6302b1c --- /dev/null +++ b/lib/src/domain/reader_activity.dart @@ -0,0 +1,184 @@ +import 'package:flutter/foundation.dart'; + +import 'reader_locator.dart'; + +/// Navigation is descriptive; hosts must not count skipped locator distances. +enum ReaderNavigationCause { restore, turn, jump, reflow, viewport } + +/// Stable visible content. EPUB extents use normalized chapter UTF-16 offsets. +final class ReaderContentCoverage { + const ReaderContentCoverage({ + required this.key, + required this.start, + required this.end, + this.chapterCount, + this.pdfPageIndex, + }); + + static const int currentVersion = 1; + final String key; + final double start; + final double end; + final int? chapterCount; + final int? pdfPageIndex; + + factory ReaderContentCoverage.fromJson(Map json) { + if (json['version'] != currentVersion) { + throw FormatException( + 'Unsupported content coverage version: ${json['version']}.', + ); + } + final key = json['key']; + final start = json['start']; + final end = json['end']; + final chapters = json['chapterCount']; + final page = json['pdfPageIndex']; + if (key is! String || + start is! num || + end is! num || + (chapters != null && chapters is! int) || + (page != null && page is! int)) { + throw const FormatException('Invalid content coverage fields.'); + } + final coverage = ReaderContentCoverage( + key: key, + start: start.toDouble(), + end: end.toDouble(), + chapterCount: chapters as int?, + pdfPageIndex: page as int?, + ); + coverage._validate(); + return coverage; + } + + Map toJson() { + _validate(); + return { + 'version': currentVersion, + 'key': key, + 'start': start, + 'end': end, + if (chapterCount != null) 'chapterCount': chapterCount, + if (pdfPageIndex != null) 'pdfPageIndex': pdfPageIndex, + }; + } + + void _validate() { + if (key.trim().isEmpty || + !start.isFinite || + !end.isFinite || + start < 0 || + end > 1 || + end < start || + (chapterCount != null && chapterCount! <= 0) || + (pdfPageIndex != null && pdfPageIndex! < 0)) { + throw const FormatException( + 'Invalid content coverage range or identity.', + ); + } + } + + @override + bool operator ==(Object other) => + identical(this, other) || + other is ReaderContentCoverage && + key == other.key && + start == other.start && + end == other.end && + chapterCount == other.chapterCount && + pdfPageIndex == other.pdfPageIndex; + + @override + int get hashCode => Object.hash(key, start, end, chapterCount, pdfPageIndex); +} + +/// Generic observation only. The host owns timing, persistence, and goal rules. +final class ReaderActivityEvent { + ReaderActivityEvent({ + required this.ready, + required this.visible, + required this.cause, + this.locator, + List coverage = const [], + this.atEnd = false, + }) : coverage = List.unmodifiable(coverage); + + static const int currentVersion = 1; + final bool ready; + final bool visible; + final ReaderNavigationCause cause; + final ReaderLocator? locator; + final List coverage; + final bool atEnd; + + factory ReaderActivityEvent.fromJson(Map json) { + if (json['version'] != currentVersion) { + throw FormatException( + 'Unsupported reader activity version: ${json['version']}.', + ); + } + final ready = json['ready']; + final visible = json['visible']; + final atEnd = json['atEnd']; + final cause = json['cause']; + final locator = json['locator']; + final coverage = json['coverage']; + if (ready is! bool || + visible is! bool || + atEnd is! bool || + coverage is! List || + (locator != null && locator is! Map) || + !ReaderNavigationCause.values.any((value) => value.name == cause) || + coverage.any((value) => value is! Map)) { + throw const FormatException('Invalid reader activity fields.'); + } + return ReaderActivityEvent( + ready: ready, + visible: visible, + atEnd: atEnd, + cause: ReaderNavigationCause.values.firstWhere( + (value) => value.name == cause, + ), + locator: locator == null + ? null + : ReaderLocator.fromJson(locator as Map), + coverage: coverage + .map( + (value) => + ReaderContentCoverage.fromJson(value as Map), + ) + .toList(), + ); + } + + Map toJson() => { + 'version': currentVersion, + 'ready': ready, + 'visible': visible, + 'atEnd': atEnd, + 'cause': cause.name, + if (locator != null) 'locator': locator!.toJson(), + 'coverage': coverage.map((value) => value.toJson()).toList(), + }; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is ReaderActivityEvent && + ready == other.ready && + visible == other.visible && + cause == other.cause && + locator == other.locator && + atEnd == other.atEnd && + listEquals(coverage, other.coverage); + + @override + int get hashCode => Object.hash( + ready, + visible, + cause, + locator, + atEnd, + Object.hashAll(coverage), + ); +} diff --git a/lib/src/domain/reader_capabilities.dart b/lib/src/domain/reader_capabilities.dart index e47ad83..8a4cba0 100644 --- a/lib/src/domain/reader_capabilities.dart +++ b/lib/src/domain/reader_capabilities.dart @@ -4,12 +4,14 @@ final class ReaderCapabilities { this.supportsScrolling = false, this.supportsTextCustomization = false, this.supportsColumnMode = false, + this.supportsPageTurnAnimation = false, }); final bool supportsPagination; final bool supportsScrolling; final bool supportsTextCustomization; final bool supportsColumnMode; + final bool supportsPageTurnAnimation; @override bool operator ==(Object other) => @@ -18,7 +20,8 @@ final class ReaderCapabilities { supportsPagination == other.supportsPagination && supportsScrolling == other.supportsScrolling && supportsTextCustomization == other.supportsTextCustomization && - supportsColumnMode == other.supportsColumnMode; + supportsColumnMode == other.supportsColumnMode && + supportsPageTurnAnimation == other.supportsPageTurnAnimation; @override int get hashCode => Object.hash( @@ -26,5 +29,6 @@ final class ReaderCapabilities { supportsScrolling, supportsTextCustomization, supportsColumnMode, + supportsPageTurnAnimation, ); } diff --git a/lib/src/domain/reader_locator.dart b/lib/src/domain/reader_locator.dart index 4a632bd..2de2ba7 100644 --- a/lib/src/domain/reader_locator.dart +++ b/lib/src/domain/reader_locator.dart @@ -23,16 +23,12 @@ sealed class ReaderLocator { final class EpubReaderLocator extends ReaderLocator { factory EpubReaderLocator({ - required String cfi, required int spineIndex, required double localProgression, required double totalProgression, int? textOffset, String? anchor, }) { - if (cfi.trim().isEmpty) { - throw ArgumentError.value(cfi, 'cfi', 'must not be empty'); - } if (spineIndex < 0) { throw ArgumentError.value( spineIndex, @@ -51,7 +47,6 @@ final class EpubReaderLocator extends ReaderLocator { } return EpubReaderLocator._( - cfi: cfi, spineIndex: spineIndex, localProgression: localProgression, totalProgression: totalProgression, @@ -61,7 +56,6 @@ final class EpubReaderLocator extends ReaderLocator { } const EpubReaderLocator._({ - required this.cfi, required this.spineIndex, required this.localProgression, required this.totalProgression, @@ -70,12 +64,8 @@ final class EpubReaderLocator extends ReaderLocator { }); factory EpubReaderLocator._fromJson(Map json) { - final cfi = json['cfi']; final spineIndex = json['spineIndex']; - if (cfi is! String || cfi.trim().isEmpty) { - throw const FormatException('EPUB locator CFI must not be empty.'); - } if (spineIndex is! int || spineIndex < 0) { throw const FormatException( 'EPUB locator spineIndex must be a non-negative integer.', @@ -93,7 +83,6 @@ final class EpubReaderLocator extends ReaderLocator { } return EpubReaderLocator._( - cfi: cfi, spineIndex: spineIndex, localProgression: _readProgression(json, 'localProgression'), totalProgression: _readProgression(json, 'totalProgression'), @@ -102,7 +91,6 @@ final class EpubReaderLocator extends ReaderLocator { ); } - final String cfi; final int spineIndex; final double localProgression; final double totalProgression; @@ -111,7 +99,7 @@ final class EpubReaderLocator extends ReaderLocator { @override Map toJson() { - if (cfi.isEmpty || spineIndex < 0) { + if (spineIndex < 0) { throw const FormatException('Cannot serialize an invalid EPUB locator.'); } _validateProgression(localProgression, 'localProgression'); @@ -120,7 +108,6 @@ final class EpubReaderLocator extends ReaderLocator { return { 'version': ReaderLocator.currentVersion, 'type': 'epub', - 'cfi': cfi, 'spineIndex': spineIndex, 'localProgression': localProgression, 'totalProgression': totalProgression, @@ -133,7 +120,6 @@ final class EpubReaderLocator extends ReaderLocator { bool operator ==(Object other) => identical(this, other) || other is EpubReaderLocator && - cfi == other.cfi && spineIndex == other.spineIndex && localProgression == other.localProgression && textOffset == other.textOffset && @@ -142,7 +128,6 @@ final class EpubReaderLocator extends ReaderLocator { @override int get hashCode => Object.hash( - cfi, spineIndex, localProgression, totalProgression, diff --git a/lib/src/domain/reader_preferences.dart b/lib/src/domain/reader_preferences.dart index 77ad58d..b2eb928 100644 --- a/lib/src/domain/reader_preferences.dart +++ b/lib/src/domain/reader_preferences.dart @@ -16,7 +16,8 @@ final class ReaderPreferences { this.foregroundColor = const Color(0xff1b1b1b), this.brightness = Brightness.light, this.layoutMode = ReaderLayoutMode.paginated, - this.columnMode = ReaderColumnMode.automatic, + this.columnMode = ReaderColumnMode.single, + this.pageTurnAnimation = true, }) : assert(fontSize > 0), assert(lineHeight > 0), assert(paragraphSpacing >= 0); @@ -32,6 +33,7 @@ final class ReaderPreferences { final Brightness brightness; final ReaderLayoutMode layoutMode; final ReaderColumnMode columnMode; + final bool pageTurnAnimation; ReaderPreferences copyWith({ Object? fontFamily = _unsetFontFamily, @@ -45,6 +47,7 @@ final class ReaderPreferences { Brightness? brightness, ReaderLayoutMode? layoutMode, ReaderColumnMode? columnMode, + bool? pageTurnAnimation, }) { return ReaderPreferences( fontFamily: identical(fontFamily, _unsetFontFamily) @@ -60,6 +63,7 @@ final class ReaderPreferences { brightness: brightness ?? this.brightness, layoutMode: layoutMode ?? this.layoutMode, columnMode: columnMode ?? this.columnMode, + pageTurnAnimation: pageTurnAnimation ?? this.pageTurnAnimation, ); } @@ -77,7 +81,8 @@ final class ReaderPreferences { foregroundColor == other.foregroundColor && brightness == other.brightness && layoutMode == other.layoutMode && - columnMode == other.columnMode; + columnMode == other.columnMode && + pageTurnAnimation == other.pageTurnAnimation; @override int get hashCode => Object.hash( @@ -92,5 +97,6 @@ final class ReaderPreferences { brightness, layoutMode, columnMode, + pageTurnAnimation, ); } diff --git a/lib/src/domain/reader_selection.dart b/lib/src/domain/reader_selection.dart new file mode 100644 index 0000000..913e0d6 --- /dev/null +++ b/lib/src/domain/reader_selection.dart @@ -0,0 +1,82 @@ +import 'package:flutter/painting.dart'; + +import 'reader_locator.dart'; + +/// Durable text anchors. EPUB uses chapter-local UTF-16 offsets, PDF uses page rectangles. +final class ReaderSelection { + const ReaderSelection({ + required this.text, + required this.start, + required this.end, + this.rectangles = const [], + }); + + final String text; + final ReaderLocator start; + final ReaderLocator end; + final List rectangles; + + Map toJson() => { + 'text': text, + 'start': start.toJson(), + 'end': end.toJson(), + 'rectangles': [for (final rectangle in rectangles) rectangle.toJson()], + }; + + factory ReaderSelection.fromJson(Map json) => + ReaderSelection( + text: json['text'] as String, + start: ReaderLocator.fromJson( + Map.from(json['start'] as Map), + ), + end: ReaderLocator.fromJson( + Map.from(json['end'] as Map), + ), + rectangles: [ + for (final rectangle in json['rectangles'] as List? ?? const []) + ReaderSelectionRect.fromJson( + Map.from(rectangle as Map), + ), + ], + ); +} + +final class ReaderSelectionRect { + const ReaderSelectionRect({required this.pageIndex, required this.rect}); + + final int pageIndex; + + /// Coordinates relative to page width and height, with a top-left origin. + final Rect rect; + + Map toJson() => { + 'pageIndex': pageIndex, + 'left': rect.left, + 'top': rect.top, + 'right': rect.right, + 'bottom': rect.bottom, + }; + + factory ReaderSelectionRect.fromJson(Map json) => + ReaderSelectionRect( + pageIndex: json['pageIndex'] as int, + rect: Rect.fromLTRB( + (json['left'] as num).toDouble(), + (json['top'] as num).toDouble(), + (json['right'] as num).toDouble(), + (json['bottom'] as num).toDouble(), + ), + ); +} + +final class ReaderHighlight { + const ReaderHighlight({ + required this.id, + required this.selection, + required this.color, + }); + + final String id; + final ReaderSelection selection; + final Color color; +} diff --git a/lib/src/domain/reader_snapshot.dart b/lib/src/domain/reader_snapshot.dart index 0c45750..5550450 100644 --- a/lib/src/domain/reader_snapshot.dart +++ b/lib/src/domain/reader_snapshot.dart @@ -1,4 +1,5 @@ import 'reader_capabilities.dart'; +import 'reader_activity.dart'; import 'reader_document.dart'; import 'reader_exception.dart'; import 'reader_locator.dart'; @@ -24,6 +25,9 @@ sealed class ReaderSnapshot { ReaderException? get error; String? get locationLabel => null; + List get coverage => const []; + bool get contentReady => status == ReaderStatus.ready; + bool get atEnd => false; } final class ReaderIdleSnapshot extends ReaderSnapshot { @@ -88,11 +92,21 @@ final class ReaderReadySnapshot extends ReaderSnapshot { this.locator, List toc = const [], this.locationLabel, - }) : toc = List.unmodifiable(toc); + List coverage = const [], + this.contentReady = true, + this.atEnd = false, + }) : toc = List.unmodifiable(toc), + coverage = List.unmodifiable(coverage); @override ReaderStatus get status => ReaderStatus.ready; + @override + final List coverage; + @override + final bool contentReady; + @override + final bool atEnd; @override final String? locationLabel; diff --git a/lib/src/engine/epub/epub_page_layout.dart b/lib/src/engine/epub/epub_page_layout.dart new file mode 100644 index 0000000..44b521a --- /dev/null +++ b/lib/src/engine/epub/epub_page_layout.dart @@ -0,0 +1,132 @@ +import 'dart:async'; +import 'dart:math' as math; + +import 'epub_rich_layout.dart'; + +/// A resumable page cursor. Reading ahead consumes pages, not whole spine items. +/// Requests share the same cursor so foreground navigation reuses prefetch work. +final class EpubPageLayout { + EpubPageLayout( + Stream source, { + Stream Function()? countSource, + }) : _iterator = StreamIterator(source), + _countSource = countSource; + + final StreamIterator _iterator; + final Stream Function()? _countSource; + StreamIterator? _counter; + Future? _countPending; + int _countedPages = 0; + int? _exactCount; + bool _countFailed = false; + final Map> _yieldTimers = {}; + final List pages = []; + bool complete = false; + bool _disposed = false; + Object? _failure; + StackTrace? _failureStack; + + Future yieldWork() { + if (_disposed) return Future.value(); + final ready = Completer(); + late final Timer timer; + timer = Timer(Duration.zero, () { + _yieldTimers.remove(timer); + ready.complete(); + }); + _yieldTimers[timer] = ready; + return ready.future; + } + + int? get pageCount => complete ? pages.length : _exactCount; + + int estimatedPageCount(int contentLength) { + final exact = pageCount; + if (exact != null) return exact; + if (pages.length < 2 || pages.last.offset <= 0) { + return math.max(1, pages.length); + } + + final estimate = (contentLength * (pages.length - 1) / pages.last.offset) + .ceil(); + return math.max(pages.length, estimate); + } + + /// Counts without retaining the remaining pages or advancing the reading cursor. + /// A cancelled background request can resume from the same counting cursor. + Future countPages({bool Function()? cancelled}) async { + if (_countSource == null || _countFailed) return; + + while (!_disposed && pageCount == null && !(cancelled?.call() ?? false)) { + await (_countPending ??= _countNext().whenComplete( + () => _countPending = null, + )); + } + } + + Future _countNext() async { + final counter = _counter ??= StreamIterator(_countSource!()); + try { + if (await counter.moveNext()) { + _countedPages++; + } else if (!_disposed) { + _exactCount = _countedPages; + _counter = null; + } + } catch (_) { + _countFailed = true; + rethrow; + } + } + + Future ensure({ + int count = 1, + int? offset, + bool toEnd = false, + bool Function()? cancelled, + }) async { + while (!_disposed && !complete && !(cancelled?.call() ?? false)) { + if (_failure case final failure?) { + Error.throwWithStackTrace(failure, _failureStack!); + } + + final hasOffset = + offset == null || (pages.isNotEmpty && pages.last.offset > offset); + + if (!toEnd && pages.length >= count && hasOffset) return; + await _advance(); + } + } + + Future? _pending; + + Future _advance() { + return _pending ??= _readNext().whenComplete(() => _pending = null); + } + + Future _readNext() async { + try { + if (await _iterator.moveNext()) { + if (!_disposed) pages.add(_iterator.current); + } else { + complete = true; + } + } catch (error, stack) { + _failure = error; + _failureStack = stack; + rethrow; + } + } + + void dispose() { + if (_disposed) return; + _disposed = true; + for (final entry in _yieldTimers.entries) { + entry.key.cancel(); + entry.value.complete(); + } + _yieldTimers.clear(); + unawaited(_iterator.cancel()); + unawaited(_counter?.cancel()); + } +} diff --git a/lib/src/engine/epub/epub_progress_index.dart b/lib/src/engine/epub/epub_progress_index.dart new file mode 100644 index 0000000..938ccdb --- /dev/null +++ b/lib/src/engine/epub/epub_progress_index.dart @@ -0,0 +1,38 @@ +import 'dart:math' as math; + +/// Stable content coordinates independent of pagination and chapter count. +final class EpubProgressIndex { + EpubProgressIndex(List lengths) + : lengths = List.unmodifiable(lengths), + starts = [0] { + for (final length in lengths) { + starts.add(starts.last + math.max(1, length)); + } + } + + final List lengths; + final List starts; + + double progress(int chapter, {int? offset, double local = 0}) { + final weight = starts[chapter + 1] - starts[chapter]; + final within = offset == null ? local * weight : offset.clamp(0, weight); + return ((starts[chapter] + within) / starts.last).clamp(0, 1); + } + + ({int chapter, int offset}) position(double progress) { + final target = progress * starts.last; + var chapter = lengths.length - 1; + + for (var index = 0; index < lengths.length; index++) { + if (target < starts[index + 1]) { + chapter = index; + break; + } + } + + return ( + chapter: chapter, + offset: (target - starts[chapter]).round().clamp(0, lengths[chapter]), + ); + } +} diff --git a/lib/src/engine/epub/epub_reader_engine.dart b/lib/src/engine/epub/epub_reader_engine.dart index c5c9d5e..341c281 100644 --- a/lib/src/engine/epub/epub_reader_engine.dart +++ b/lib/src/engine/epub/epub_reader_engine.dart @@ -1,6 +1,10 @@ +import 'dart:async'; +import 'dart:math' as math; + import 'package:flutter/widgets.dart'; import '../../domain/reader_capabilities.dart'; +import '../../domain/reader_activity.dart'; import '../../domain/reader_document.dart'; import '../../domain/reader_exception.dart'; import '../../domain/reader_locator.dart'; @@ -11,6 +15,7 @@ import '../../domain/reader_types.dart'; import '../reader_engine.dart'; import 'epub_content_renderer.dart'; import 'epub_paginator.dart'; +import 'epub_progress_index.dart'; import 'epub_rich_layout.dart'; import 'epub_viewport.dart'; import 'worker/epub_worker.dart'; @@ -38,23 +43,43 @@ final class EpubReaderEngine extends ReaderEngine { List _blocks = const []; Map _anchors = const {}; int _chapterCount = 0; + int _documentRevision = 0; + EpubProgressIndex? _progressIndex; + final Map> _chapterCache = {}; + final Map>> _chapterRequests = {}; + ReaderReadySnapshot? _displayed; + Future Function( + EpubReaderLocator target, + List blocks, + bool Function() cancelled, + )? + prepareLocation; + Future _turnQueue = Future.value(); int _contentLength = 0; int _restorationRevision = 0; int _contentRevision = 0; int _navigationGeneration = 0; + _EpubSeek? _activeSeek; bool _disposed = false; int _visiblePage = 1; int _pageCount = 0; + bool _pageCountEstimated = false; + List _coverage = const []; + bool _viewportReady = false; + bool _atEnd = false; + bool _batchingViewport = false; - /// The mounted viewport handles local page/scroll turns. The engine crosses - /// the spine only when that viewport reports a boundary. - Future Function(int direction)? moveWithinChapter; + /// The viewport owns page turns, including transitions across spine items. + /// The engine handles boundaries when no paginated viewport is mounted. + Future Function(int direction)? moveViewport; String get currentChapterHtml => _currentChapterHtml; List get blocks => _blocks; int get restorationRevision => _restorationRevision; int get contentRevision => _contentRevision; int get contentLength => _contentLength; + int get chapterCount => _chapterCount; + int get documentRevision => _documentRevision; EpubReaderLocator get locator => _locator!; ReaderPreferences get preferences => _preferences; @@ -66,6 +91,7 @@ final class EpubReaderEngine extends ReaderEngine { supportsScrolling: true, supportsTextCustomization: true, supportsColumnMode: true, + supportsPageTurnAnimation: true, ); @override ReaderSnapshot snapshot = const ReaderIdleSnapshot(); @@ -83,6 +109,7 @@ final class EpubReaderEngine extends ReaderEngine { 'The EPUB document or initial locator has the wrong format.', ); } + cancelPendingSeek(); final generation = ++_navigationGeneration; EpubWorker? candidate; try { @@ -111,6 +138,16 @@ final class EpubReaderEngine extends ReaderEngine { _document = document; _preferences = preferences; _chapterCount = count; + _documentRevision++; + _progressIndex = EpubProgressIndex( + (metadata['lengths'] as List?)?.cast() ?? List.filled(count, 1), + ); + _chapterCache.clear(); + _chapterRequests.clear(); + if ((chapter['html'] as String).length <= 4 * 1024 * 1024) { + _chapterCache[target.spineIndex] = chapter; + } + _displayed = null; _toc = [ for (final entry in metadata['toc'] as List) _tocEntry(Map.from(entry as Map), count), @@ -156,42 +193,63 @@ final class EpubReaderEngine extends ReaderEngine { String? anchor, }) { return EpubReaderLocator( - cfi: 'epubcfi(/6/${(index + 1) * 2}!/4/1:${textOffset ?? 0})', spineIndex: index, localProgression: local, - totalProgression: ((index + local) / (count ?? _chapterCount)).clamp( - 0, - 1, - ), + totalProgression: + _progressIndex?.progress(index, offset: textOffset, local: local) ?? + ((index + local) / (count ?? _chapterCount)).clamp(0, 1), textOffset: textOffset, anchor: anchor, ); } void _setChapter(Map chapter, EpubReaderLocator target) { + _coverage = const []; + _viewportReady = false; + _atEnd = false; _currentChapterHtml = chapter['html'] as String; - _blocks = [ - for (final block in chapter['blocks'] as List) - EpubContentBlock(Map.from(block as Map)), - ]; + _blocks = EpubContentBlocks(chapter['blocks'] as List); _anchors = (chapter['anchors'] as Map).cast(); _contentLength = chapter['length'] as int; + _toc = [ + for (final entry in _toc) _resolveTocEntry(entry, target.spineIndex), + ]; final offset = target.anchor == null ? target.textOffset : _anchors[target.anchor] ?? target.textOffset; - _locator = offset == null - ? target - : _locatorFor( - target.spineIndex, - local: target.localProgression, - textOffset: offset.clamp(0, _contentLength), - ); + _locator = _locatorFor( + target.spineIndex, + local: target.localProgression, + textOffset: offset?.clamp(0, _contentLength), + ); _paginator.clear(); _contentRevision++; _pageCount = 0; _restorationRevision++; } + ReaderTocEntry _resolveTocEntry(ReaderTocEntry entry, int spineIndex) { + final locator = entry.locator as EpubReaderLocator; + int? offset; + if (locator.spineIndex == spineIndex) { + offset = locator.anchor == null ? 0 : _anchors[locator.anchor]; + } + return ReaderTocEntry( + title: entry.title, + locator: offset == null + ? locator + : _locatorFor( + spineIndex, + textOffset: offset, + local: _contentLength == 0 ? 0 : offset / _contentLength, + anchor: locator.anchor, + ), + children: [ + for (final child in entry.children) _resolveTocEntry(child, spineIndex), + ], + ); + } + void _requireCurrent(int generation) { if (_disposed || generation != _navigationGeneration) { throw const ReaderException( @@ -202,7 +260,12 @@ final class EpubReaderEngine extends ReaderEngine { } @override - Future goTo(ReaderLocator locator) async { + Future goTo(ReaderLocator locator) { + cancelPendingSeek(); + return _goTo(locator); + } + + Future _goTo(ReaderLocator locator, {_EpubSeek? seek}) async { if (locator is! EpubReaderLocator || locator.spineIndex >= _chapterCount || _worker == null) { @@ -216,22 +279,61 @@ final class EpubReaderEngine extends ReaderEngine { final offset = locator.anchor == null ? locator.textOffset : _anchors[locator.anchor] ?? locator.textOffset; - _locator = offset == null - ? locator - : _locatorFor( - locator.spineIndex, - local: locator.localProgression, - textOffset: offset.clamp(0, _contentLength), - ); + final target = _locatorFor( + locator.spineIndex, + local: locator.localProgression, + textOffset: offset?.clamp(0, _contentLength), + ); + await _prepare(target, _blocks, seek); + _requireCurrent(generation); + _locator = target; + _coverage = const []; + _viewportReady = false; + _atEnd = false; _restorationRevision++; } else { - final chapter = await _worker!.chapter(locator.spineIndex); + final request = chapterContent(locator.spineIndex); + final chapter = await (seek?.wait(request) ?? request); + _requireCurrent(generation); + await _prepare( + _locatorFor( + locator.spineIndex, + local: locator.localProgression, + textOffset: locator.anchor == null + ? locator.textOffset + : (chapter['anchors'] as Map)[locator.anchor] as int? ?? + locator.textOffset, + ), + EpubContentBlocks(chapter['blocks'] as List), + seek, + ); _requireCurrent(generation); _setChapter(chapter, locator); } _publish(); } + Future _prepare( + EpubReaderLocator target, + List blocks, + _EpubSeek? seek, + ) async { + final preparation = prepareLocation?.call( + target, + blocks, + () => seek?.cancelled ?? false, + ); + if (preparation != null) await (seek?.wait(preparation) ?? preparation); + } + + @override + void cancelPendingSeek() { + final seek = _activeSeek; + if (seek == null || seek.cancelled) return; + _navigationGeneration++; + seek.cancel(); + } + @override Future goToProgress(double progress) async { if (!progress.isFinite || progress < 0 || progress > 1) { @@ -247,15 +349,92 @@ final class EpubReaderEngine extends ReaderEngine { 'No EPUB document is loaded.', ); } - final scaled = progress * _chapterCount; - final index = progress == 1 ? _chapterCount - 1 : scaled.floor(); - await goTo(_locatorFor(index, local: progress == 1 ? 1 : scaled - index)); + cancelPendingSeek(); + final seek = _EpubSeek(); + _activeSeek = seek; + final position = _progressIndex!.position(progress); + try { + await _goTo( + _locatorFor( + position.chapter, + local: progress == 1 + ? 1 + : position.offset / + math.max(1, _progressIndex!.lengths[position.chapter]), + textOffset: position.offset, + ), + seek: seek, + ); + } catch (_) { + // A cancelled request must not report a late preparation failure. + if (!seek.cancelled) rethrow; + } finally { + if (identical(_activeSeek, seek)) _activeSeek = null; + } } @override - Future goNext() => _move(1); + Future goNext() => _queueTurn(1); @override - Future goPrevious() => _move(-1); + Future goPrevious() => _queueTurn(-1); + + Future _queueTurn(int direction) { + final turn = _turnQueue.then((_) => _move(direction)); + _turnQueue = turn.catchError((Object _) {}); + return turn; + } + + Future> chapterContent(int index) async { + final cached = _chapterCache.remove(index); + + if (cached != null) { + _chapterCache[index] = cached; + return cached; + } + + final pending = _chapterRequests[index]; + + if (pending != null) { + return pending; + } + + final request = _readChapter(index); + _chapterRequests[index] = request; + + try { + return await request; + } finally { + if (identical(_chapterRequests[index], request)) { + _chapterRequests.remove(index); + } + } + } + + Future> _readChapter(int index) async { + final worker = _worker!; + final chapter = await worker.chapter(index); + + if (_disposed || !identical(worker, _worker)) { + throw const ReaderException( + ReaderErrorCode.engineUnavailable, + 'The document was closed.', + ); + } + + _chapterCache[index] = chapter; + var size = _chapterCache.values.fold( + 0, + (sum, chapter) => sum + (chapter['html'] as String).length, + ); + + while (_chapterCache.length > 3 || size > 4 * 1024 * 1024) { + final removed = _chapterCache.remove(_chapterCache.keys.first)!; + size -= (removed['html'] as String).length; + } + + return chapter; + } + Future _move(int direction) async { if (_locator == null) { throw const ReaderException( @@ -263,7 +442,7 @@ final class EpubReaderEngine extends ReaderEngine { 'No EPUB document is loaded.', ); } - if (await moveWithinChapter?.call(direction) ?? false) return; + if (await moveViewport?.call(direction) ?? false) return; final index = _locator!.spineIndex + direction; if (index < 0 || index >= _chapterCount) { throw const ReaderException( @@ -274,6 +453,29 @@ final class EpubReaderEngine extends ReaderEngine { await goTo(_locatorFor(index, local: direction < 0 ? 1 : 0)); } + void viewportChanged( + double local, { + required int textOffset, + required int pageNumber, + required int pageCount, + bool pageCountEstimated = false, + required int coverageStart, + required int coverageEnd, + required bool atEnd, + }) { + _batchingViewport = true; + _pageCount = pageCount; + _pageCountEstimated = pageCountEstimated; + viewportPositionChanged( + local, + textOffset: textOffset, + pageNumber: pageNumber, + ); + viewportCoverageChanged(coverageStart, coverageEnd, atEnd: atEnd); + _batchingViewport = false; + _publish(); + } + void viewportPositionChanged( double local, { int? textOffset, @@ -291,11 +493,65 @@ final class EpubReaderEngine extends ReaderEngine { _publish(); } - void viewportPaginationChanged(int count, int visiblePage) { - if (_disposed || (_pageCount == count && _visiblePage == visiblePage)) { + void viewportCoverageChanged(int start, int end, {bool atEnd = false}) { + if (_disposed || _locator == null) return; + final coverage = _contentLength > 0 && end > start + ? ReaderContentCoverage( + key: 'epub:${_locator!.spineIndex}:$_contentLength', + start: start / _contentLength, + end: (end / _contentLength).clamp(0, 1), + chapterCount: _chapterCount, + ) + : null; + final nextEnd = atEnd && _locator!.spineIndex == _chapterCount - 1; + if (_viewportReady && + (!nextEnd || _locator!.totalProgression == 1) && + _atEnd == nextEnd && + (coverage == null + ? _coverage.isEmpty + : _coverage.length == 1 && + _coverage.first.key == coverage.key && + _coverage.first.start == coverage.start && + _coverage.first.end == coverage.end)) { + return; + } + _viewportReady = true; + _coverage = coverage == null ? const [] : [coverage]; + _atEnd = nextEnd; + + if (nextEnd) { + final position = _locator!; + _locator = EpubReaderLocator( + spineIndex: position.spineIndex, + localProgression: position.localProgression, + totalProgression: 1, + textOffset: position.textOffset, + ); + } + + _publish(); + } + + void viewportPreparing() { + if (_disposed || !_viewportReady) return; + _viewportReady = false; + _coverage = const []; + _publish(); + } + + void viewportPaginationChanged( + int count, + int visiblePage, { + bool estimated = false, + }) { + if (_disposed || + (_pageCount == count && + _visiblePage == visiblePage && + _pageCountEstimated == estimated)) { return; } _pageCount = count; + _pageCountEstimated = estimated; _visiblePage = visiblePage; _publish(); } @@ -311,23 +567,46 @@ final class EpubReaderEngine extends ReaderEngine { ); } if (_preferences == preferences) return; + final geometryChanged = + preferences.copyWith( + backgroundColor: _preferences.backgroundColor, + foregroundColor: _preferences.foregroundColor, + brightness: _preferences.brightness, + pageTurnAnimation: _preferences.pageTurnAnimation, + ) != + _preferences; _preferences = preferences; - _restorationRevision++; + if (geometryChanged) { + _coverage = const []; + _viewportReady = false; + _atEnd = false; + _restorationRevision++; + } _publish(); } void _publish() { - if (_disposed) return; + if (_disposed || _batchingViewport) return; snapshot = ReaderReadySnapshot( document: _document!, + coverage: _coverage, + contentReady: _viewportReady, + atEnd: _atEnd, preferences: _preferences, capabilities: capabilities, - locator: _locator, + locator: !_viewportReady && _displayed != null + ? _displayed!.locator + : _locator, toc: _toc, - locationLabel: - 'Chapter ${_locator!.spineIndex + 1} of $_chapterCount' - '${_pageCount > 0 ? ' · Page $_visiblePage of $_pageCount' : ''}', + locationLabel: !_viewportReady && _displayed != null + ? _displayed!.locationLabel + : 'Chapter ${_locator!.spineIndex + 1} of $_chapterCount' + '${_pageCount > 0 ? ' · Page $_visiblePage of ${_pageCountEstimated ? '≈' : ''}$_pageCount' : ''}', ); + if (_viewportReady) { + _displayed = snapshot as ReaderReadySnapshot; + } + notifyListeners(); } @@ -345,13 +624,32 @@ final class EpubReaderEngine extends ReaderEngine { @override void dispose() { if (_disposed) return; + cancelPendingSeek(); _disposed = true; _navigationGeneration++; _openingWorker?.dispose(); _worker?.dispose(); _worker = null; _openingWorker = null; - moveWithinChapter = null; + moveViewport = null; + prepareLocation = null; + _chapterCache.clear(); + _chapterRequests.clear(); super.dispose(); } } + +final class _EpubSeek { + final _cancellation = Completer(); + bool get cancelled => _cancellation.isCompleted; + void cancel() => _cancellation.complete(); + + Future wait(Future operation) => Future.any([ + operation, + _cancellation.future.then((_) => throw const _CancelledSeek()), + ]); +} + +final class _CancelledSeek implements Exception { + const _CancelledSeek(); +} diff --git a/lib/src/engine/epub/epub_rich_layout.dart b/lib/src/engine/epub/epub_rich_layout.dart index 46a2232..b7387e5 100644 --- a/lib/src/engine/epub/epub_rich_layout.dart +++ b/lib/src/engine/epub/epub_rich_layout.dart @@ -1,9 +1,35 @@ +import 'dart:collection'; import 'dart:math' as math; import 'dart:typed_data'; import 'package:flutter/widgets.dart'; +import 'package:flutter/rendering.dart'; import '../../domain/reader_preferences.dart'; +import '../../domain/reader_selection.dart'; +import '../../domain/reader_locator.dart'; +import '../../presentation/reader_interaction_scope.dart'; + +/// Converts worker blocks only when the page cursor reaches them. In particular, +/// a large spine item must not decode all of its illustrations on the UI thread. +final class EpubContentBlocks extends ListBase { + EpubContentBlocks(this._blocks); + final List _blocks; + + @override + int get length => _blocks.length; + + @override + EpubContentBlock operator [](int index) => + EpubContentBlock(Map.from(_blocks[index] as Map)); + + @override + set length(int value) => throw UnsupportedError('Read-only content'); + + @override + void operator []=(int index, EpubContentBlock value) => + throw UnsupportedError('Read-only content'); +} final class EpubContentBlock { EpubContentBlock(Map json) @@ -48,7 +74,12 @@ final class EpubContentBlock { ); } - TextSpan span(ReaderPreferences preferences, {int start = 0, int? end}) { + TextSpan span( + ReaderPreferences preferences, { + int start = 0, + int? end, + List highlights = const [], + }) { final children = []; var position = 0; for (final run in runs) { @@ -56,20 +87,58 @@ final class EpubContentBlock { final from = math.max(0, start - position); final to = math.min(text.length, (end ?? length) - position); if (to > from) { - children.add( - TextSpan( - text: text.substring(from, to), - style: TextStyle( - fontWeight: run['bold'] == true ? FontWeight.bold : null, - fontStyle: run['italic'] == true ? FontStyle.italic : null, - fontFamily: run['code'] == true ? 'monospace' : null, - decoration: TextDecoration.combine([ - if (run['underline'] == true) TextDecoration.underline, - if (run['strike'] == true) TextDecoration.lineThrough, - ]), + final cuts = {from, to}; + + for (final highlight in highlights) { + final first = highlight.selection.start; + final last = highlight.selection.end; + + if (first is EpubReaderLocator && + last is EpubReaderLocator && + first.textOffset != null && + last.textOffset != null) { + cuts.add((first.textOffset! - offset - position).clamp(from, to)); + cuts.add((last.textOffset! - offset - position).clamp(from, to)); + } + } + + final boundaries = cuts.toList()..sort(); + + for (var index = 0; index < boundaries.length - 1; index++) { + final segmentStart = boundaries[index]; + Color? background; + + for (final highlight in highlights) { + final first = highlight.selection.start; + final last = highlight.selection.end; + final absolute = offset + position + segmentStart; + + if (first is EpubReaderLocator && + last is EpubReaderLocator && + first.textOffset != null && + last.textOffset != null && + absolute >= first.textOffset! && + absolute < last.textOffset!) { + background = highlight.color.withValues(alpha: .4); + } + } + + children.add( + TextSpan( + text: text.substring(segmentStart, boundaries[index + 1]), + style: TextStyle( + backgroundColor: background, + fontWeight: run['bold'] == true ? FontWeight.bold : null, + fontStyle: run['italic'] == true ? FontStyle.italic : null, + fontFamily: run['code'] == true ? 'monospace' : null, + decoration: TextDecoration.combine([ + if (run['underline'] == true) TextDecoration.underline, + if (run['strike'] == true) TextDecoration.lineThrough, + ]), + ), ), - ), - ); + ); + } } position += text.length; } @@ -96,35 +165,56 @@ final class EpubRichPage { int get offset => fragments.isEmpty ? 0 : fragments.first.offset; } +/// Collects a complete layout for export and layout verification. +Future> layoutEpubChapter( + List blocks, { + required Size contentSize, + required ReaderPreferences preferences, + required TextScaler textScaler, + required TextDirection direction, + required bool Function() cancelled, +}) => paginateEpub( + blocks, + contentSize: contentSize, + preferences: preferences, + textScaler: textScaler, + direction: direction, + cancelled: cancelled, +).toList(); + /// Measures each paragraph once and cuts at actual line boundaries. Long /// paragraphs never trigger repeated binary-search layouts or surrogate splits. -Future> layoutEpubChapter( +Stream paginateEpub( List blocks, { required Size contentSize, required ReaderPreferences preferences, required TextScaler textScaler, required TextDirection direction, required bool Function() cancelled, -}) async { + Future Function()? yieldWork, +}) async* { final width = math.max(1.0, contentSize.width); final height = math.max(1.0, contentSize.height); - final pages = []; + var emitted = false; var fragments = []; var used = 0.0; final stopwatch = Stopwatch()..start(); - void finish() { - if (fragments.isEmpty) return; - pages.add(EpubRichPage(List.unmodifiable(fragments))); + EpubRichPage finish() { + emitted = true; + final page = EpubRichPage(List.unmodifiable(fragments)); fragments = []; used = 0; + return page; } for (final block in blocks) { - if (cancelled()) return const []; + if (cancelled()) return; final spacing = block.paragraphEnd ? preferences.paragraphSpacing : 0.0; if (block.image != null) { final imageHeight = math.min(width / block.aspect, height * .65); - if (used + imageHeight + spacing > height) finish(); + if (used + imageHeight + spacing > height && fragments.isNotEmpty) { + yield finish(); + } fragments.add(EpubPageFragment(block, 0, 1, imageHeight)); used += imageHeight + spacing; } else { @@ -134,66 +224,79 @@ Future> layoutEpubChapter( textDirection: direction, textScaler: textScaler, )..layout(maxWidth: width); - final lines = painter.computeLineMetrics(); - final text = span.toPlainText(); - var start = 0; - var segmentHeight = 0.0; - for (var lineIndex = 0; lineIndex < lines.length; lineIndex++) { - final line = lines[lineIndex]; - final top = line.baseline - line.ascent; - final bottom = line.baseline + line.descent; - // Ascent/descent exclude part of the line-height leading on Skia fonts. - // Count the complete line box so several paragraphs cannot overfill a - // page even when the glyph bounds are shorter than their line boxes. - final lineHeight = line.height; - if (used + segmentHeight + lineHeight + spacing > height && - (used > 0 || segmentHeight > 0)) { - final position = painter.getPositionForOffset( - Offset(line.left + line.width / 2, (top + bottom) / 2), - ); - // Query inside the line: x=0 can resolve to the previous line's end - // on Skia, even when the y coordinate belongs to the following line. - final boundary = painter - .getLineBoundary( - TextPosition( - offset: position.offset, - affinity: TextAffinity.downstream, - ), - ) - .start; - if (boundary > start) { - fragments.add( - EpubPageFragment(block, start, boundary, segmentHeight), + try { + final lines = painter.computeLineMetrics(); + final text = span.toPlainText(); + var start = 0; + var segmentHeight = 0.0; + for (var lineIndex = 0; lineIndex < lines.length; lineIndex++) { + final line = lines[lineIndex]; + final top = line.baseline - line.ascent; + final bottom = line.baseline + line.descent; + // Ascent/descent exclude part of the line-height leading on Skia fonts. + // Count the complete line box so several paragraphs cannot overfill a + // page even when the glyph bounds are shorter than their line boxes. + final lineHeight = line.height; + if (used + segmentHeight + lineHeight + spacing > height && + (used > 0 || segmentHeight > 0)) { + final position = painter.getPositionForOffset( + Offset(line.left + line.width / 2, (top + bottom) / 2), ); - start = boundary; + // Query inside the line: x=0 can resolve to the previous line's end + // on Skia, even when the y coordinate belongs to the following line. + final boundary = painter + .getLineBoundary( + TextPosition( + offset: position.offset, + affinity: TextAffinity.downstream, + ), + ) + .start; + if (boundary > start) { + fragments.add( + EpubPageFragment(block, start, boundary, segmentHeight), + ); + start = boundary; + } + if (fragments.isNotEmpty) { + yield finish(); + if (cancelled()) return; + } + segmentHeight = 0; } - finish(); - segmentHeight = 0; + segmentHeight += lineHeight; } - segmentHeight += lineHeight; - } - if (start < text.length) { - fragments.add( - EpubPageFragment(block, start, text.length, segmentHeight), - ); - used += segmentHeight + spacing; + if (start < text.length) { + fragments.add( + EpubPageFragment(block, start, text.length, segmentHeight), + ); + used += segmentHeight + spacing; + } + } finally { + painter.dispose(); } - painter.dispose(); } if (stopwatch.elapsedMilliseconds >= 4) { - await Future.delayed(Duration.zero); + if (yieldWork == null) { + await Future.delayed(Duration.zero); + } else { + await yieldWork(); + } stopwatch.reset(); } } - finish(); - if (pages.isEmpty) pages.add(const EpubRichPage([])); - return List.unmodifiable(pages); + if (fragments.isNotEmpty) { + yield finish(); + } else if (!emitted) { + yield const EpubRichPage([]); + } } Widget buildEpubFragment( EpubPageFragment fragment, - ReaderPreferences preferences, -) { + ReaderPreferences preferences, { + List highlights = const [], +}) { final block = fragment.block; if (block.image != null) { return SizedBox( @@ -211,7 +314,137 @@ Widget buildEpubFragment( ), ); } - return Text.rich( - block.span(preferences, start: fragment.start, end: fragment.end), + final text = EpubSelectionFragment( + key: ValueKey(fragment.offset), + fragment: fragment, + child: Text.rich( + block.span( + preferences, + start: fragment.start, + end: fragment.end, + highlights: highlights, + ), + ), + ); + if (!block.runs.any((run) => run['link'] == true)) { + return text; + } + return LayoutBuilder( + builder: (context, constraints) => Listener( + onPointerDown: (event) { + final painter = TextPainter( + text: block.span( + preferences, + start: fragment.start, + end: fragment.end, + ), + textDirection: Directionality.of(context), + textScaler: MediaQuery.textScalerOf(context), + )..layout(maxWidth: constraints.maxWidth); + var position = 0; + for (final run in block.runs) { + final end = position + (run['text'] as String).length; + final start = math.max(position, fragment.start) - fragment.start; + final stop = math.min(end, fragment.end) - fragment.start; + if (run['link'] == true && stop > start) { + final boxes = painter.getBoxesForSelection( + TextSelection(baseOffset: start, extentOffset: stop), + ); + if (boxes.any( + (box) => box.toRect().contains(event.localPosition), + )) { + ReaderInteractionScope.maybeOf(context)?.suppressTap(); + break; + } + } + position = end; + } + painter.dispose(); + }, + child: text, + ), ); } + +final class EpubSelectionFragment extends StatefulWidget { + const EpubSelectionFragment({ + required this.fragment, + required this.child, + super.key, + }); + final EpubPageFragment fragment; + final Widget child; + + @override + State createState() => EpubSelectionFragmentState(); +} + +final class EpubSelectionFragmentState extends State + implements SelectionRegistrar { + final _selectables = {}; + SelectionRegistrar? _parent; + + SelectedContentRange? get range { + for (final selectable in _selectables) { + final selection = selectable.getSelection(); + if (selection != null) return selection; + } + return null; + } + + List rectangles(int start, int end) { + RenderParagraph? paragraph; + void visit(RenderObject object) { + if (object is RenderParagraph) { + paragraph = object; + } else { + object.visitChildren(visit); + } + } + + final object = context.findRenderObject(); + if (object != null) visit(object); + final text = paragraph; + if (text == null || !text.attached) return const []; + final length = widget.fragment.end - widget.fragment.start; + final selection = TextSelection( + baseOffset: start.clamp(0, length), + extentOffset: end.clamp(0, length), + ); + return [ + for (final box in text.getBoxesForSelection(selection)) + Rect.fromPoints( + text.localToGlobal(box.toRect().topLeft), + text.localToGlobal(box.toRect().bottomRight), + ), + ]; + } + + @override + void add(Selectable selectable) { + _selectables.add(selectable); + _parent?.add(selectable); + } + + @override + void remove(Selectable selectable) { + _selectables.remove(selectable); + _parent?.remove(selectable); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + final parent = SelectionContainer.maybeOf(context); + if (identical(parent, _parent)) return; + for (final selectable in _selectables) { + _parent?.remove(selectable); + parent?.add(selectable); + } + _parent = parent; + } + + @override + Widget build(BuildContext context) => + SelectionRegistrarScope(registrar: this, child: widget.child); +} diff --git a/lib/src/engine/epub/epub_viewport.dart b/lib/src/engine/epub/epub_viewport.dart index c6a2c5c..b09bfd6 100644 --- a/lib/src/engine/epub/epub_viewport.dart +++ b/lib/src/engine/epub/epub_viewport.dart @@ -2,10 +2,20 @@ import 'dart:async'; import 'dart:math' as math; import 'package:flutter/material.dart'; +import 'package:flutter/foundation.dart'; +import '../../domain/reader_selection.dart'; +import '../../domain/reader_locator.dart'; import '../../domain/reader_types.dart'; +import '../../domain/reader_preferences.dart'; +import '../../presentation/reader_interaction_scope.dart'; +import '../../presentation/reader_loading.dart'; +import '../../presentation/reader_swipe_tracker.dart'; +import '../../presentation/reader_highlight_interaction.dart'; +import '../../presentation/reader_text_toolbar.dart'; import 'epub_reader_engine.dart'; import 'epub_rich_layout.dart'; +import 'epub_page_layout.dart'; import 'epub_content_renderer.dart'; final class EpubViewport extends StatefulWidget { @@ -16,35 +26,243 @@ final class EpubViewport extends StatefulWidget { } final class _EpubViewportState extends State { - final PageController _pagesController = PageController(); - final ScrollController _scrollController = ScrollController(); + PageController _pagesController = PageController(); + ScrollController _scrollController = ScrollController(); Future>? _layout; List _pages = const []; Object? _layoutKey; - int _layoutGeneration = 0; + Object? _geometryKey; + Size _contentSize = Size.zero; + TextScaler _scaler = TextScaler.noScaling; + TextDirection _direction = TextDirection.ltr; + int _fontRevision = 0; + final Map _layoutCache = {}; + List? _turnPages; + int _turnDirection = 0; + int? _turnSpine; + static const _spreadsAhead = 5; + static const _spreadsBehind = 3; + final Set _warmingImages = {}; + static const _turnDuration = Duration(milliseconds: 220); + Timer? _prefetchTimer; + int _prefetchGeneration = 0; + ReaderPreferences? _displayPreferences; + int _displayColumns = 1; + Timer? _loadingTimer; + bool _showLoading = false; int _restoration = -1; int _pageIndex = 0; + int _pageViewCount = 0; int _columns = 1; - double _drag = 0; + final _swipe = ReaderSwipeTracker(); + bool get _animateTurns => + widget.engine.preferences.pageTurnAnimation && + !(MediaQuery.maybeOf(context)?.disableAnimations ?? false); + int _startPage = 0; double _startScroll = 0; bool _restoring = false; bool _busy = false; Completer? _layoutReady; List _scrollOffsets = const []; + final _selectionKey = GlobalKey(); + final _selectionMenuController = ContextMenuController(); + int _menuRevision = 0; + String _selectedText = ''; + Rect? _menuBounds; + + Iterable get _fragments { + final fragments = []; + void visit(Element element) { + if (element is StatefulElement && + element.state is EpubSelectionFragmentState) { + fragments.add(element.state as EpubSelectionFragmentState); + } + element.visitChildElements(visit); + } + + _selectionKey.currentContext?.visitChildElements(visit); + return fragments; + } + + Rect? _visibleBounds(Iterable rectangles) { + final box = context.findRenderObject() as RenderBox; + final viewport = box.localToGlobal(Offset.zero) & box.size; + Rect? bounds; + for (final rectangle in rectangles) { + final visible = rectangle.intersect(viewport); + if (!visible.isEmpty) { + bounds = bounds?.expandToInclude(visible) ?? visible; + } + } + return bounds; + } + + Rect? get _selectionBounds => _visibleBounds([ + for (final fragment in _fragments) + if (fragment.range case final range?) + ...fragment.rectangles(range.startOffset, range.endOffset), + ]); + + ReaderHighlightTarget? _highlightAt(Offset position) { + final highlights = + ReaderInteractionScope.maybeOf(context)?.highlights ?? + const []; + for (final highlight in highlights.reversed) { + final start = highlight.selection.start; + final end = highlight.selection.end; + if (start is! EpubReaderLocator || + end is! EpubReaderLocator || + start.spineIndex != widget.engine.locator.spineIndex || + start.textOffset == null || + end.textOffset == null) { + continue; + } + final rectangles = [ + for (final fragment in _fragments) + ...fragment.rectangles( + start.textOffset! - fragment.widget.fragment.offset, + end.textOffset! - fragment.widget.fragment.offset, + ), + ]; + if (rectangles.any((rectangle) => rectangle.contains(position))) { + final bounds = _visibleBounds(rectangles); + if (bounds != null) return (highlight: highlight, bounds: bounds); + } + } + return null; + } + + ReaderSelection? _selectedPassage() { + int? first; + int? last; + + void visit(Element element) { + if (element is StatefulElement && + element.state is EpubSelectionFragmentState) { + final state = element.state as EpubSelectionFragmentState; + final selection = state.range; + + if (selection != null && selection.startOffset != selection.endOffset) { + final start = + state.widget.fragment.offset + + math.min(selection.startOffset, selection.endOffset); + final end = + state.widget.fragment.offset + + math.max(selection.startOffset, selection.endOffset); + first = first == null + ? start.toInt() + : math.min(first!, start).toInt(); + last = last == null ? end.toInt() : math.max(last!, end).toInt(); + } + } + + element.visitChildElements(visit); + } + + _selectionKey.currentContext?.visitChildElements(visit); + + if (first == null || last == null || _selectedText.isEmpty) { + return null; + } + + final locator = widget.engine.locator; + EpubReaderLocator at(int offset) => EpubReaderLocator( + spineIndex: locator.spineIndex, + textOffset: offset, + localProgression: (offset / math.max(1, widget.engine.contentLength)) + .clamp(0, 1), + totalProgression: locator.totalProgression, + ); + + return ReaderSelection( + text: _selectedText, + start: at(first!), + end: at(last!), + ); + } + + Widget _selectionMenu(BuildContext context, SelectableRegionState state) { + final interactions = ReaderInteractionScope.maybeOf(this.context); + final items = []; + + void add(String label, ValueChanged? action) { + if (_selectedText.isEmpty || action == null) { + return; + } + + items.add( + ContextMenuButtonItem( + label: label, + onPressed: () { + final selection = _selectedPassage(); + _selectionMenuController.remove(); + state.hideToolbar(); + state.clearSelection(); + if (selection != null) action(selection); + }, + ), + ); + } + + add('Annotate', interactions?.onAnnotate); + add('Add note', interactions?.onNote); + items.addAll( + state.contextMenuButtonItems.map( + (item) => ContextMenuButtonItem( + type: item.type, + label: item.label, + onPressed: () { + _selectionMenuController.remove(); + item.onPressed?.call(); + }, + ), + ), + ); + final bounds = _menuBounds; + if (bounds == null || items.isEmpty) return const SizedBox.shrink(); + return ReaderTextToolbar(bounds: bounds, items: items); + } + + void _selectionStatusChanged(SelectableRegionSelectionStatus status) { + final revision = ++_menuRevision; + WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted || revision != _menuRevision) return; + _selectionMenuController.remove(); + final state = _selectionKey.currentState?.selectableRegion; + if (status != SelectableRegionSelectionStatus.finalized || + _selectedText.isEmpty || + state == null) { + return; + } + _menuBounds = _selectionBounds; + _selectionMenuController.show( + context: context, + contextMenuBuilder: (context) => TapRegion( + groupId: SelectableRegion, + child: _selectionMenu(context, state), + ), + ); + }); + WidgetsBinding.instance.ensureVisualUpdate(); + } @override void initState() { super.initState(); widget.engine.addListener(_changed); - widget.engine.moveWithinChapter = _move; + widget.engine.moveViewport = _move; + widget.engine.prepareLocation = _prepareLocation; _scrollController.addListener(_scrollChanged); PaintingBinding.instance.systemFonts.addListener(_fontsChanged); } void _fontsChanged() { if (!mounted) return; - setState(() => _layoutKey = null); + setState(() { + _fontRevision++; + _layoutKey = null; + }); } @override @@ -52,15 +270,19 @@ final class _EpubViewportState extends State { super.didUpdateWidget(oldWidget); if (oldWidget.engine != widget.engine) { oldWidget.engine.removeListener(_changed); - oldWidget.engine.moveWithinChapter = null; + oldWidget.engine.moveViewport = null; + oldWidget.engine.prepareLocation = null; + _clearLayouts(); + _pages = const []; widget.engine.addListener(_changed); - widget.engine.moveWithinChapter = _move; + widget.engine.moveViewport = _move; + widget.engine.prepareLocation = _prepareLocation; _layoutKey = null; } } void _changed() { - if (mounted && _restoration != widget.engine.restorationRevision) { + if (mounted) { setState(() {}); } } @@ -85,13 +307,81 @@ final class _EpubViewportState extends State { if (_restoration == widget.engine.restorationRevision) return; _restoration = widget.engine.restorationRevision; final target = _target(pages); + _restoring = true; _pageIndex = target ~/ _columns; - WidgetsBinding.instance.addPostFrameCallback((_) { + if (widget.engine.preferences.layoutMode == ReaderLayoutMode.paginated) { + final previous = _pagesController; + _pagesController = PageController( + initialPage: _turnPages == null + ? _pageIndex + : (_turnDirection > 0 ? 0 : 1), + keepPage: false, + ); + WidgetsBinding.instance.addPostFrameCallback((_) => previous.dispose()); + } else { + final preferences = widget.engine.preferences; + final heights = [ + for (final page in pages) _pageHeight(page, preferences), + ]; + final extent = math.max( + 0.0, + heights.fold(0, (total, height) => total + height) - + _contentSize.height - + preferences.pageMargins.vertical, + ); + final offset = widget.engine.locator.textOffset; + var pixels = extent * widget.engine.locator.localProgression; + if (offset != null) { + pixels = heights + .take(target) + .fold(0, (total, height) => total + height); + pixels += preferences.pageMargins.top; + for (final fragment in pages[target].fragments) { + if (fragment.offset >= offset || + fragment.block.offset + fragment.end > offset) { + break; + } + pixels += fragment.height + fragment.spacing(preferences); + } + } + final previous = _scrollController; + previous.removeListener(_scrollChanged); + _scrollController = ScrollController( + initialScrollOffset: pixels.clamp(0, extent), + keepScrollOffset: false, + )..addListener(_scrollChanged); + WidgetsBinding.instance.addPostFrameCallback((_) => previous.dispose()); + } + WidgetsBinding.instance.addPostFrameCallback((_) async { if (!mounted || !identical(_pages, pages)) return; _restoring = true; if (widget.engine.preferences.layoutMode == ReaderLayoutMode.paginated) { if (_pagesController.hasClients) { - _pagesController.jumpToPage(_pageIndex); + if (_turnPages != null) { + final controller = _pagesController; + await controller.animateToPage( + _turnDirection > 0 ? 1 : 0, + duration: _turnDuration, + curve: Curves.easeOutCubic, + ); + + if (!mounted || !identical(_pagesController, controller)) return; + final replacement = PageController( + initialPage: _pageIndex, + keepPage: false, + ); + setState(() { + _turnPages = null; + _pagesController = replacement; + }); + WidgetsBinding.instance.addPostFrameCallback( + (_) => controller.dispose(), + ); + await WidgetsBinding.instance.endOfFrame; + if (!mounted || !identical(_pagesController, replacement)) return; + } else { + _pagesController.jumpToPage(_pageIndex); + } } } else if (_scrollController.hasClients && _scrollOffsets.isNotEmpty) { var pixels = _scrollOffsets[target]; @@ -117,8 +407,18 @@ final class _EpubViewportState extends State { } _restoring = false; _busy = false; + _loadingTimer?.cancel(); + _showLoading = false; if (_layoutReady?.isCompleted == false) _layoutReady!.complete(); - widget.engine.viewportPaginationChanged(pages.length, target + 1); + if (widget.engine.preferences.layoutMode == ReaderLayoutMode.paginated) { + _publishPage( + _pageIndex, + restoredOffset: widget.engine.locator.textOffset, + ); + } else { + _scrollChanged(); + } + _schedulePrefetch(); }); } @@ -141,28 +441,139 @@ final class _EpubViewportState extends State { _scrollController.jumpTo(next); return true; } - final count = (_pages.length / _columns).ceil(); final next = _pageIndex + direction; - if (next < 0 || next >= count) return false; - _pageIndex = next; - if (_pagesController.hasClients) _pagesController.jumpToPage(next); - _publishPage(next); + final layout = _layoutCache[_layoutKey]; + + final requiredPages = (next + 1) * _columns; + if (next >= 0 && + layout != null && + !layout.complete && + layout.pages.length < requiredPages) { + await layout.ensure(count: requiredPages); + if (!mounted || !identical(layout, _layoutCache[_layoutKey])) return true; + setState(() {}); + } + + final count = (_pages.length / _columns).ceil(); + + if (next < 0 || next >= count) { + final index = widget.engine.locator.spineIndex + direction; + if (index < 0 || index >= widget.engine.chapterCount) return false; + final animate = _animateTurns; + final from = _pageIndex * _columns; + final outgoing = _pages.sublist( + from, + math.min(from + _columns, _pages.length), + ); + final spine = widget.engine.locator.spineIndex; + + // Prepare first, keeping the committed page interactive while work yields. + await widget.engine.goTo( + EpubReaderLocator( + spineIndex: index, + localProgression: direction < 0 ? 1 : 0, + totalProgression: widget.engine.locator.totalProgression, + ), + ); + if (!mounted) return true; + _turnPages = animate ? outgoing : null; + _turnDirection = direction; + _turnSpine = spine; + await WidgetsBinding.instance.endOfFrame; + await _layoutReady?.future; + return true; + } + + if (next >= _pageViewCount) { + // A prepared page may not yet be included in the PageView's scroll extent. + setState(() {}); + await WidgetsBinding.instance.endOfFrame; + if (!mounted || !identical(layout, _layoutCache[_layoutKey])) return true; + } + + final controller = _pagesController; + + if (!controller.hasClients) { + return true; + } + + if (!_animateTurns) { + controller.jumpToPage(next); + } else { + await controller.animateToPage( + next, + duration: _turnDuration, + curve: Curves.easeOutCubic, + ); + } + + // Touch input can complete the animation future before its target is reached. + // Subsequent drag/settling updates continue through onPageChanged. + if (mounted && + identical(controller, _pagesController) && + controller.hasClients) { + final page = controller.page; + + if (page != null) { + _publishPage(page.round()); + } + } + return true; } - void _publishPage(int index) { - if (_restoring || _pages.isEmpty) return; + void _publishPage( + int index, { + int? restoredOffset, + bool schedulePrefetch = true, + }) { + if (_restoring || _busy || _pages.isEmpty) { + return; + } + _pageIndex = index; final page = (index * _columns).clamp(0, _pages.length - 1); - widget.engine.viewportPositionChanged( - _pages.length <= _columns ? 0 : page / (_pages.length - _columns), - textOffset: _pages[page].offset, + final after = math.min(page + _columns, _pages.length); + final spreads = (_pages.length / _columns).ceil(); + final layout = _layoutCache[_layoutKey]; + final complete = layout?.complete ?? true; + final local = complete + ? (spreads <= 1 ? 0.0 : index / (spreads - 1)) + : _pages[page].offset / math.max(1, widget.engine.contentLength); + final int coverageEnd; + if (after < _pages.length) { + coverageEnd = _pages[after].offset; + } else if (complete) { + coverageEnd = widget.engine.contentLength; + } else { + final fragment = _pages.last.fragments.last; + coverageEnd = fragment.block.offset + fragment.end; + } + + widget.engine.viewportChanged( + local, + textOffset: restoredOffset ?? _pages[page].offset, pageNumber: page + 1, + pageCount: + layout?.estimatedPageCount(widget.engine.contentLength) ?? + _pages.length, + pageCountEstimated: layout != null && layout.pageCount == null, + coverageStart: _pages[page].offset, + coverageEnd: coverageEnd, + atEnd: complete && after == _pages.length, ); + if (schedulePrefetch) { + _schedulePrefetch(); + } } void _scrollChanged() { - if (_restoring || !_scrollController.hasClients || _pages.isEmpty) return; + if (_restoring || + _busy || + !_scrollController.hasClients || + _pages.isEmpty) { + return; + } final pixels = _scrollController.position.pixels; var index = 0; for (var i = 1; i < _scrollOffsets.length; i++) { @@ -180,14 +591,35 @@ final class _EpubViewportState extends State { within -= fragment.height + fragment.spacing(widget.engine.preferences); } final max = _scrollController.position.maxScrollExtent; - widget.engine.viewportPositionChanged( + final bottom = pixels + _scrollController.position.viewportDimension; + var lastOffset = offset; + for (var i = index; i < _pages.length && _scrollOffsets[i] < bottom; i++) { + var top = _scrollOffsets[i] + widget.engine.preferences.pageMargins.top; + for (final fragment in _pages[i].fragments) { + if (top >= bottom) break; + lastOffset = fragment.block.offset + fragment.end; + top += fragment.height + fragment.spacing(widget.engine.preferences); + } + } + widget.engine.viewportChanged( max <= 0 ? 0 : (pixels / max).clamp(0, 1), textOffset: offset, pageNumber: index + 1, + pageCount: _pages.length, + coverageStart: offset, + coverageEnd: lastOffset.clamp(0, widget.engine.contentLength), + atEnd: pixels >= max - 1, ); } - void _beyondChapter(int direction) { + void _requestTurn(int direction) { + final request = ReaderInteractionScope.maybeOf(context)?.onTurn; + + if (request != null) { + request(direction); + return; + } + unawaited( (direction > 0 ? widget.engine.goNext() : widget.engine.goPrevious()) .catchError((Object error, StackTrace stack) { @@ -202,13 +634,256 @@ final class _EpubViewportState extends State { ); } + void _clearLayouts() { + for (final layout in _layoutCache.values) { + layout.dispose(); + } + _layoutCache.clear(); + _turnPages = null; + } + + Future> _measure( + int index, + List blocks, { + EpubReaderLocator? target, + bool toEnd = false, + int? prefetch, + bool Function()? cancelled, + }) async { + final geometry = _geometryKey; + final key = (index, geometry); + bool obsolete() => + !mounted || + geometry != _geometryKey || + (cancelled?.call() ?? false) || + (prefetch != null && prefetch != _prefetchGeneration); + final layout = _layoutCache.putIfAbsent(key, () { + final contentSize = _contentSize; + final preferences = widget.engine.preferences; + final scaler = _scaler; + final direction = _direction; + late final EpubPageLayout cursor; + Stream paginate() => paginateEpub( + blocks, + contentSize: contentSize, + preferences: preferences, + textScaler: scaler, + direction: direction, + cancelled: () => !mounted || geometry != _geometryKey, + yieldWork: () => cursor.yieldWork(), + ); + cursor = EpubPageLayout(paginate(), countSource: paginate); + return cursor; + }); + + while (_layoutCache.length > 3) { + final oldest = _layoutCache.keys.firstWhere( + (candidate) => candidate != _layoutKey && candidate != key, + ); + _layoutCache.remove(oldest)!.dispose(); + } + + try { + await layout.ensure( + count: prefetch == null ? _columns : (_spreadsAhead + 1) * _columns + 1, + offset: target?.textOffset, + toEnd: + toEnd || + widget.engine.preferences.layoutMode == ReaderLayoutMode.scroll || + (target != null && + target.textOffset == null && + target.localProgression > 0), + cancelled: obsolete, + ); + final offset = target?.textOffset; + if (offset != null && !layout.complete) { + final targetPage = layout.pages.lastIndexWhere( + (page) => page.offset <= offset, + ); + await layout.ensure( + count: ((targetPage ~/ _columns) + 1) * _columns, + cancelled: obsolete, + ); + } + } catch (_) { + if (identical(_layoutCache[key], layout)) _layoutCache.remove(key); + layout.dispose(); + rethrow; + } + + return layout.pages; + } + + Future _prepareLocation( + EpubReaderLocator target, + List blocks, + bool Function() cancelled, + ) async { + if (widget.engine.renderer != null && + widget.engine.preferences.layoutMode == ReaderLayoutMode.scroll) { + return; + } + + _prefetchGeneration++; + _prefetchTimer?.cancel(); + // A resize can supersede measurement while navigation is waiting. + Object? geometry; + do { + geometry = _geometryKey; + await _measure( + target.spineIndex, + blocks, + target: target, + cancelled: cancelled, + ); + } while (mounted && !cancelled() && geometry != _geometryKey); + } + + void _publishPageCount(EpubPageLayout layout) { + if (_busy || + _restoring || + widget.engine.preferences.layoutMode != ReaderLayoutMode.paginated || + !identical(layout, _layoutCache[_layoutKey])) { + return; + } + + widget.engine.viewportPaginationChanged( + layout.estimatedPageCount(widget.engine.contentLength), + _pageIndex * _columns + 1, + estimated: layout.pageCount == null, + ); + } + + bool _prefetchCancelled(int generation) => + !mounted || generation != _prefetchGeneration; + + void _warmImages(List pages, int first, int end) { + final limit = math.min(end, pages.length); + for (var index = math.max(0, first); index < limit; index++) { + for (final fragment in pages[index].fragments) { + final bytes = fragment.block.image; + if (bytes == null) continue; + final image = MemoryImage(bytes); + if (PaintingBinding.instance.imageCache.containsKey(image) || + !_warmingImages.add(image)) { + continue; + } + unawaited( + precacheImage( + image, + context, + onError: (_, _) {}, + ).whenComplete(() => _warmingImages.remove(image)), + ); + } + } + } + + Future _countInBackground(EpubPageLayout layout, int generation) async { + try { + // Let nearby-page preparation start before spending time on exact totals. + await layout.yieldWork(); + if (_prefetchCancelled(generation)) return; + await layout.countPages(cancelled: () => _prefetchCancelled(generation)); + if (!_prefetchCancelled(generation)) _publishPageCount(layout); + } catch (_) { + // Keep the estimated total when speculative counting fails. + } + } + + Future _prefetchNeighbor( + int index, + int direction, + int generation, + ) async { + final neighbor = index + direction; + if (neighbor < 0 || neighbor >= widget.engine.chapterCount) return; + try { + final chapter = await widget.engine.chapterContent(neighbor); + if (_prefetchCancelled(generation)) return; + final pages = await _measure( + neighbor, + EpubContentBlocks(chapter['blocks'] as List), + toEnd: direction < 0, + prefetch: generation, + ); + if (_prefetchCancelled(generation)) return; + _warmImages( + pages, + direction < 0 ? pages.length - _spreadsBehind * _columns : 0, + direction < 0 ? pages.length : _spreadsAhead * _columns, + ); + final layout = _layoutCache[(neighbor, _geometryKey)]; + if (direction > 0 && layout != null) { + await _countInBackground(layout, generation); + } + } catch (_) { + // One unreadable or slow neighbor must not block the other direction. + } + } + + void _schedulePrefetch() { + _prefetchTimer?.cancel(); + final generation = ++_prefetchGeneration; + final index = widget.engine.locator.spineIndex; + _prefetchTimer = Timer(Duration.zero, () async { + try { + final current = _layoutCache[_layoutKey]; + if (current == null) return; + final previousCount = current.pages.length; + final wasComplete = current.complete; + await current.ensure( + count: (_pageIndex + _spreadsAhead + 1) * _columns + 1, + cancelled: () => _prefetchCancelled(generation), + ); + if (_prefetchCancelled(generation)) return; + if (previousCount != current.pages.length || + wasComplete != current.complete) { + setState(() {}); + } + if (!wasComplete && + current.complete && + widget.engine.preferences.layoutMode == + ReaderLayoutMode.paginated) { + _publishPage( + _pageIndex, + restoredOffset: widget.engine.locator.textOffset, + schedulePrefetch: false, + ); + } else { + _publishPageCount(current); + } + + _warmImages( + current.pages, + (_pageIndex - _spreadsBehind) * _columns, + (_pageIndex + _spreadsAhead + 1) * _columns, + ); + + await Future.wait([ + _prefetchNeighbor(index, 1, generation), + if (_pageIndex < _spreadsBehind) + _prefetchNeighbor(index, -1, generation), + _countInBackground(current, generation), + ]); + } catch (_) { + // Foreground navigation surfaces errors. Speculation preserves the page. + } + }); + } + @override void dispose() { - _layoutGeneration++; + _prefetchGeneration++; + _prefetchTimer?.cancel(); + _clearLayouts(); + _loadingTimer?.cancel(); if (_layoutReady?.isCompleted == false) _layoutReady!.complete(); widget.engine.removeListener(_changed); PaintingBinding.instance.systemFonts.removeListener(_fontsChanged); - widget.engine.moveWithinChapter = null; + widget.engine.moveViewport = null; + widget.engine.prepareLocation = null; + _selectionMenuController.remove(); _pagesController.dispose(); _scrollController.dispose(); super.dispose(); @@ -219,6 +894,9 @@ final class _EpubViewportState extends State { final preferences = widget.engine.preferences; if (preferences.layoutMode == ReaderLayoutMode.scroll && widget.engine.renderer != null) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) widget.engine.viewportCoverageChanged(0, 0); + }); return EpubScrollViewport( xhtml: widget.engine.currentChapterHtml, preferences: preferences, @@ -231,7 +909,10 @@ final class _EpubViewportState extends State { ); } return ColoredBox( - color: preferences.backgroundColor, + color: _pages.isEmpty + ? ReaderLoadingScope.maybeOf(context)?.backgroundColor ?? + preferences.backgroundColor + : preferences.backgroundColor, child: LayoutBuilder( builder: (context, constraints) { final size = Size( @@ -255,32 +936,64 @@ final class _EpubViewportState extends State { math.max(1, columnWidth - preferences.pageMargins.horizontal), math.max(1, size.height - preferences.pageMargins.vertical), ); - final key = ( - widget.engine.contentRevision, + final geometry = ( + widget.engine.documentRevision, contentSize, - preferences, + preferences.fontFamily, + preferences.fontSize, + preferences.lineHeight, + preferences.letterSpacing, + preferences.paragraphSpacing, + preferences.pageMargins, + preferences.layoutMode, scaler, direction, _columns, + _fontRevision, ); + + if (_geometryKey != geometry) { + _geometryKey = geometry; + _contentSize = contentSize; + _scaler = scaler; + _direction = direction; + _clearLayouts(); + _prefetchGeneration++; + } + + final key = (widget.engine.locator.spineIndex, geometry); + if (_layoutKey != key) { _layoutKey = key; + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted && _layoutKey == key && _busy) { + widget.engine.viewportPreparing(); + } + }); _restoration = -1; _restoring = true; - final generation = ++_layoutGeneration; _busy = true; - if (_layoutReady?.isCompleted == false) _layoutReady!.complete(); + + if (_layoutReady?.isCompleted == false) { + _layoutReady!.complete(); + } + _layoutReady = Completer(); - _layout = Future.delayed(Duration.zero).then( - (_) => layoutEpubChapter( - widget.engine.blocks, - contentSize: contentSize, - preferences: preferences, - textScaler: scaler, - direction: direction, - cancelled: () => !mounted || generation != _layoutGeneration, - ), - ); + _loadingTimer?.cancel(); + _showLoading = false; + _loadingTimer = Timer(const Duration(milliseconds: 300), () { + if (mounted && _busy) { + setState(() => _showLoading = true); + } + }); + final cached = _layoutCache[key]; + _layout = cached == null + ? _measure( + widget.engine.locator.spineIndex, + widget.engine.blocks, + target: widget.engine.locator, + ) + : SynchronousFuture(cached.pages); } return Center( child: SizedBox( @@ -288,57 +1001,65 @@ final class _EpubViewportState extends State { child: FutureBuilder>( future: _layout, builder: (context, snapshot) { - if (snapshot.hasError) { + if (snapshot.hasError && _pages.isEmpty) { if (_layoutReady?.isCompleted == false) { _layoutReady!.complete(); } _busy = false; - return Center( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'Could not lay out this chapter.', - style: TextStyle( - color: preferences.foregroundColor, + return ColoredBox( + color: preferences.backgroundColor, + child: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'Could not prepare these pages.', + style: TextStyle( + color: preferences.foregroundColor, + ), ), - ), - const SizedBox(height: 12), - FilledButton( - onPressed: () => setState(() => _layoutKey = null), - child: const Text('Try again'), - ), - ], - ), - ); - } - if (snapshot.connectionState != ConnectionState.done || - !snapshot.hasData || - snapshot.data!.isEmpty) { - return Center( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - CircularProgressIndicator( - color: preferences.foregroundColor, - ), - const SizedBox(height: 12), - Text( - 'Preparing pages…', - style: TextStyle( - color: preferences.foregroundColor, + const SizedBox(height: 12), + FilledButton( + onPressed: () => + setState(() => _layoutKey = null), + child: const Text('Try again'), ), - ), - ], + ], + ), ), ); } - final pages = snapshot.data!; - _restore(pages, width); + final ready = + snapshot.connectionState == ConnectionState.done && + snapshot.hasData && + snapshot.data!.isNotEmpty; + + if (!ready && _pages.isEmpty) { + return const ReaderLoading(); + } + if (ready) { + _displayPreferences = preferences; + _displayColumns = _columns; + _restore(snapshot.data!, width); + } else if (snapshot.hasError) { + _busy = false; + _loadingTimer?.cancel(); + if (_layoutReady?.isCompleted == false) { + _layoutReady!.complete(); + } + } + + final pages = ready ? snapshot.data! : _pages; + final displayPreferences = ready + ? preferences + : _displayPreferences!; + final columns = ready ? _columns : _displayColumns; Widget content; - if (preferences.layoutMode == ReaderLayoutMode.scroll) { + if (displayPreferences.layoutMode == + ReaderLayoutMode.scroll) { final heights = [ - for (final page in pages) _pageHeight(page), + for (final page in pages) + _pageHeight(page, displayPreferences), ]; var cumulative = 0.0; _scrollOffsets = [ @@ -350,73 +1071,165 @@ final class _EpubViewportState extends State { })(), ]; content = ListView.custom( + key: ValueKey(_scrollController), controller: _scrollController, itemExtentBuilder: (index, _) => heights[index], childrenDelegate: _EpubScrollDelegate( - (context, index) => _page(pages[index], scroll: true), + (context, index) => _page( + pages[index], + displayPreferences, + scroll: true, + ), childCount: pages.length, extent: cumulative, ), ); } else { + final outgoing = _turnPages; + _pageViewCount = outgoing == null + ? (pages.length / columns).ceil() + : 2; content = PageView.builder( + key: ValueKey(_pagesController), controller: _pagesController, + physics: _animateTurns + ? null + : const NeverScrollableScrollPhysics(), onPageChanged: _publishPage, - itemCount: (pages.length / _columns).ceil(), - itemBuilder: (context, index) => Row( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - for (var column = 0; column < _columns; column++) - Expanded( - child: index * _columns + column < pages.length - ? _page(pages[index * _columns + column]) - : const SizedBox.shrink(), - ), - ], - ), + itemCount: _pageViewCount, + itemBuilder: (context, index) { + if (outgoing != null) { + final oldPage = index == (_turnDirection > 0 ? 0 : 1); + return _spread( + oldPage ? outgoing : pages, + oldPage ? 0 : _pageIndex, + columns, + displayPreferences, + spine: oldPage ? _turnSpine : null, + ); + } + return _spread( + pages, + index, + columns, + displayPreferences, + ); + }, ); } - // Pointer tracking does not claim the gesture arena from text - // selection, links or scrolling. Only a drag past a boundary turns. - return Listener( - onPointerDown: (_) { - _drag = 0; - _startPage = _pageIndex; - _startScroll = _scrollController.hasClients - ? _scrollController.offset - : 0; - }, - onPointerMove: (event) => _drag += - preferences.layoutMode == ReaderLayoutMode.scroll - ? event.delta.dy - : event.delta.dx, - onPointerUp: (_) { - if (_drag.abs() < 70) return; - if (preferences.layoutMode == ReaderLayoutMode.scroll && - _scrollController.hasClients) { - final p = _scrollController.position; - if (_drag < 0 && - _startScroll >= p.maxScrollExtent - 1) { - _beyondChapter(1); + final surface = ReaderHighlightInteraction( + hitTest: _highlightAt, + isSelecting: () => _selectedText.isNotEmpty, + child: Listener( + onPointerDown: (event) { + _swipe.start(event); + _startPage = _pageIndex; + _startScroll = _scrollController.hasClients + ? _scrollController.offset + : 0; + }, + onPointerMove: _swipe.update, + onPointerCancel: _swipe.cancel, + onPointerUp: (event) { + final offset = _swipe.end(event); + + if (offset == null) { + return; + } + + final scrolling = + displayPreferences.layoutMode == + ReaderLayoutMode.scroll; + final drag = scrolling ? offset.dy : offset.dx; + final crossAxis = scrolling ? offset.dx : offset.dy; + + if (drag.abs() < 70 || drag.abs() <= crossAxis.abs()) { + return; } - if (_drag > 0 && _startScroll <= 1) _beyondChapter(-1); - } else { - if (_drag < 0 && - _startPage == - (pages.length / _columns).ceil() - 1) { - _beyondChapter(1); + + if (scrolling && _scrollController.hasClients) { + final position = _scrollController.position; + + if (drag < 0 && + _startScroll >= position.maxScrollExtent - 1) { + _requestTurn(1); + } + + if (drag > 0 && _startScroll <= 1) { + _requestTurn(-1); + } + } else { + if (drag < 0 && + (!_animateTurns || + _startPage == + (pages.length / columns).ceil() - 1)) { + _requestTurn(1); + } + + if (drag > 0 && (!_animateTurns || _startPage == 0)) { + _requestTurn(-1); + } } - if (_drag > 0 && _startPage == 0) _beyondChapter(-1); - } - }, - child: - Localizations.of( - context, - MaterialLocalizations, - ) == - null - ? content - : SelectionArea(child: content), + }, + child: + Localizations.of( + context, + MaterialLocalizations, + ) == + null + ? content + : SelectionArea( + key: _selectionKey, + contextMenuBuilder: _selectionMenu, + onSelectionChanged: (selection) { + final selected = + selection?.plainText.isNotEmpty ?? false; + _selectedText = selection?.plainText ?? ''; + if (!selected) { + _menuRevision++; + _menuBounds = null; + _selectionMenuController.remove(); + } + _swipe.selectionChanged(selected); + ReaderInteractionScope.maybeOf( + context, + )?.onSelectionChanged(selected); + }, + child: _SelectionStatusObserver( + onChanged: _selectionStatusChanged, + child: content, + ), + ), + ), + ); + return Stack( + fit: StackFit.expand, + children: [ + IgnorePointer( + ignoring: !ready || _turnPages != null, + child: surface, + ), + if (!ready && _showLoading && !snapshot.hasError) + const PositionedDirectional( + top: 8, + end: 8, + child: SizedBox( + width: 16, + height: 16, + child: CircularProgressIndicator(strokeWidth: 2), + ), + ), + if (snapshot.hasError) + Align( + alignment: Alignment.bottomCenter, + child: FilledButton( + onPressed: () => setState(() => _layoutKey = null), + child: const Text( + 'Could not prepare pages. Try again', + ), + ), + ), + ], ); }, ), @@ -427,21 +1240,59 @@ final class _EpubViewportState extends State { ); } - double _pageHeight(EpubRichPage page) => - widget.engine.preferences.pageMargins.vertical + + Widget _spread( + List pages, + int index, + int columns, + ReaderPreferences preferences, { + int? spine, + }) => Row( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + for (var column = 0; column < columns; column++) + Expanded( + child: index * columns + column < pages.length + ? _page( + pages[index * columns + column], + preferences, + spine: spine, + ) + : const SizedBox.shrink(), + ), + ], + ); + + double _pageHeight(EpubRichPage page, ReaderPreferences preferences) => + preferences.pageMargins.vertical + page.fragments.fold( 0, (sum, fragment) => - sum + fragment.height + fragment.spacing(widget.engine.preferences), + sum + fragment.height + fragment.spacing(preferences), ); - Widget _page(EpubRichPage page, {bool scroll = false}) { - final preferences = widget.engine.preferences; + Widget _page( + EpubRichPage page, + ReaderPreferences preferences, { + bool scroll = false, + int? spine, + }) { + final highlights = + ReaderInteractionScope.maybeOf(context)?.highlights.where((highlight) { + final start = highlight.selection.start; + return start is EpubReaderLocator && + start.spineIndex == (spine ?? widget.engine.locator.spineIndex); + }).toList() ?? + const []; + final children = [ for (final fragment in page.fragments) Padding( padding: EdgeInsets.only(bottom: fragment.spacing(preferences)), - child: buildEpubFragment(fragment, preferences), + child: buildEpubFragment( + fragment, + preferences, + highlights: highlights, + ), ), ]; return Padding( @@ -475,3 +1326,43 @@ final class _EpubScrollDelegate extends SliverChildBuilderDelegate { double trailingScrollOffset, ) => extent; } + +/// Observes selection completion without inserting a nested selection container. +final class _SelectionStatusObserver extends StatefulWidget { + const _SelectionStatusObserver({ + required this.onChanged, + required this.child, + }); + final ValueChanged onChanged; + final Widget child; + + @override + State<_SelectionStatusObserver> createState() => + _SelectionStatusObserverState(); +} + +final class _SelectionStatusObserverState + extends State<_SelectionStatusObserver> { + ValueListenable? _status; + + void _changed() => widget.onChanged(_status!.value); + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + final status = SelectableRegionSelectionStatusScope.maybeOf(context); + if (identical(status, _status)) return; + _status?.removeListener(_changed); + _status = status; + _status?.addListener(_changed); + } + + @override + void dispose() { + _status?.removeListener(_changed); + super.dispose(); + } + + @override + Widget build(BuildContext context) => widget.child; +} diff --git a/lib/src/engine/epub/worker/epub_content.dart b/lib/src/engine/epub/worker/epub_content.dart index 59ce516..a129ea3 100644 --- a/lib/src/engine/epub/worker/epub_content.dart +++ b/lib/src/engine/epub/worker/epub_content.dart @@ -131,7 +131,10 @@ Map collectEpubContent(String html) { final style = {...inherited}; if (const {'strong', 'b', 'th'}.contains(tag)) style['bold'] = true; if (const {'em', 'i'}.contains(tag)) style['italic'] = true; - if (tag == 'u' || tag == 'a') style['underline'] = true; + if (tag == 'u' || (tag == 'a' && node.attributes['href'] != null)) { + style['underline'] = true; + } + if (tag == 'a' && node.attributes['href'] != null) style['link'] = true; if (tag == 's' || tag == 'del') style['strike'] = true; if (tag == 'code' || tag == 'pre') style['code'] = true; if (tag == 'br') runs.add({'text': '\n', ...style}); diff --git a/lib/src/engine/epub/worker/epub_processor.dart b/lib/src/engine/epub/worker/epub_processor.dart index f74dce7..a4a1c55 100644 --- a/lib/src/engine/epub/worker/epub_processor.dart +++ b/lib/src/engine/epub/worker/epub_processor.dart @@ -121,7 +121,26 @@ final class EpubProcessor { _book = book; _spine = spine; _chapters.clear(); - return {'count': spine.length, 'toc': tableOfContents}; + final lengths = []; + + for (final chapter in spine) { + try { + final raw = await chapter.readHtmlContent(); + final sanitized = await _sanitize( + raw, + chapter, + book, + embedImages: false, + ); + lengths.add(collectEpubContent(sanitized)['length'] as int); + } catch (_) { + // Keep broken resources in the spine; visiting them still reports the + // original chapter error instead of shifting durable locator indices. + lengths.add(0); + } + } + + return {'count': spine.length, 'toc': tableOfContents, 'lengths': lengths}; } Future> _chapter(int index) async { @@ -155,9 +174,55 @@ final class EpubProcessor { Future _sanitize( String raw, EpubChapterRef chapter, - EpubBookRef book, - ) async { + EpubBookRef book, { + bool embedImages = true, + }) async { final document = html_parser.parse(raw); + // Gutenberg and Calibre commonly wrap a raster cover in an SVG image. + // Normalize that wrapper before applying the regular image sanitizer. + for (final svg in document.querySelectorAll('svg').toList()) { + final images = svg.querySelectorAll('image'); + + if (images.length != 1 || + svg + .querySelectorAll('*') + .any( + (element) => !const { + 'image', + 'title', + 'desc', + }.contains(element.localName), + )) { + continue; + } + + final image = images.single; + final source = + image.attributes['href'] ?? + image.attributes.entries + .where( + (entry) => + entry.key.toString() == 'xlink:href' || + entry.key.toString() == 'href', + ) + .map((entry) => entry.value) + .firstOrNull; + final replacement = html_dom.Element.tag('img'); + replacement.attributes['src'] = source ?? ''; + replacement.attributes['alt'] = + svg.querySelector('title')?.text ?? 'Cover'; + + for (final dimension in ['width', 'height']) { + final value = image.attributes[dimension]; + + if (value != null) { + replacement.attributes[dimension] = value; + } + } + + svg.replaceWith(replacement); + } + const blockedTags = { 'script', 'form', @@ -173,6 +238,11 @@ final class EpubProcessor { 'source', 'track', 'use', + 'foreignObject', + 'animate', + 'animateMotion', + 'animateTransform', + 'set', }; for (final tag in blockedTags) { for (final element in document.querySelectorAll(tag).toList()) { @@ -181,12 +251,24 @@ final class EpubProcessor { } for (final element in document.querySelectorAll('*').toList()) { + final isSvgImage = element.localName == 'image'; + final imageSource = isSvgImage + ? element.attributes.entries + .where( + (entry) => const { + 'href', + 'xlink:href', + }.contains(entry.key.toString()), + ) + .map((entry) => entry.value) + .firstOrNull + : element.attributes['src']; _sanitizeAttributes(element); - if (element.localName != 'img') { + if (element.localName != 'img' && !isSvgImage) { continue; } - final source = element.attributes['src']?.trim(); + final source = imageSource?.trim(); final uri = source == null ? null : Uri.tryParse(source); if (source == null || source.isEmpty || @@ -210,13 +292,16 @@ final class EpubProcessor { continue; } - final bytes = await image.readContent(); final mime = image.contentMimeType ?? 'application/octet-stream'; if (!mime.toLowerCase().startsWith('image/')) { element.remove(); continue; } - element.attributes['src'] = 'data:$mime;base64,${base64Encode(bytes)}'; + if (embedImages) { + final bytes = await image.readContent(); + element.attributes[isSvgImage ? 'href' : 'src'] = + 'data:$mime;base64,${base64Encode(bytes)}'; + } } return document.outerHtml; } @@ -224,7 +309,17 @@ final class EpubProcessor { void _sanitizeAttributes(html_dom.Element element) { for (final name in element.attributes.keys.toList()) { final normalizedName = name.toString().toLowerCase(); - if (normalizedName.startsWith('on') || normalizedName == 'srcset') { + if (normalizedName.startsWith('on') || + normalizedName == 'srcset' || + normalizedName == 'xlink:href' || + (normalizedName != 'style' && + RegExp( + r'url\s*\(', + caseSensitive: false, + ).hasMatch(element.attributes[name]!) && + !RegExp( + r'''^url\(\s*(['"]?)#[\w:.-]+\1\s*\)$''', + ).hasMatch(element.attributes[name]!))) { element.attributes.remove(name); } } diff --git a/lib/src/engine/pdf/pdf_facade.dart b/lib/src/engine/pdf/pdf_facade.dart index 609b766..443b4ef 100644 --- a/lib/src/engine/pdf/pdf_facade.dart +++ b/lib/src/engine/pdf/pdf_facade.dart @@ -3,10 +3,16 @@ import 'dart:math'; import 'package:flutter/gestures.dart'; import 'package:flutter/services.dart'; -import 'package:flutter/widgets.dart'; +import 'package:flutter/material.dart'; import 'package:pdfrx/pdfrx.dart'; import '../../domain/reader_types.dart'; +import '../../domain/reader_selection.dart'; +import '../../domain/reader_locator.dart'; +import '../../presentation/reader_interaction_scope.dart'; +import '../../presentation/reader_swipe_tracker.dart'; +import '../../presentation/reader_highlight_interaction.dart'; +import 'pdf_selection_toolbar.dart'; enum PdfFacadeError { invalid, encrypted } @@ -38,6 +44,8 @@ final class PdfViewportConfiguration { required this.layoutMode, required this.onPageChanged, this.onPositionChanged, + this.onVisiblePagesChanged, + this.onContentReadyChanged, }); final int pageIndex; @@ -47,6 +55,8 @@ final class PdfViewportConfiguration { final ReaderLayoutMode layoutMode; final ValueChanged onPageChanged; final void Function(int pageIndex, double pageOffset)? onPositionChanged; + final ValueChanged>? onVisiblePagesChanged; + final ValueChanged? onContentReadyChanged; } abstract interface class PdfFacade { @@ -177,8 +187,8 @@ final class _PdfrxFacade implements PdfFacade, DisposablePdfFacade { Object? _viewKey; int _viewerRevision = 0; DateTime? _lastWheelTurn; - Offset? _touchStart; - int _touchPointers = 0; + final _swipe = ReaderSwipeTracker(); + bool _textSelected = false; @override final int pageCount; @@ -261,6 +271,58 @@ final class _PdfrxFacade implements PdfFacade, DisposablePdfFacade { ); } + Future _saveSelection( + PdfTextSelectionDelegate delegate, + ValueChanged action, + ) async { + final ranges = await delegate.getSelectedTextRanges(); + + if (_disposed || ranges.isEmpty) { + return; + } + + final rectangles = []; + + for (final range in ranges) { + final page = _controller.document.pages[range.pageNumber - 1]; + + for (final fragment in range.enumerateFragmentBoundingRects()) { + final bounds = fragment.bounds.toRect(page: page); + final rect = Rect.fromLTRB( + (bounds.left / page.width).clamp(0, 1), + (bounds.top / page.height).clamp(0, 1), + (bounds.right / page.width).clamp(0, 1), + (bounds.bottom / page.height).clamp(0, 1), + ); + if (rect.isEmpty) continue; + rectangles.add( + ReaderSelectionRect(pageIndex: range.pageNumber - 1, rect: rect), + ); + } + } + + if (rectangles.isEmpty) return; + + PdfReaderLocator at(int page, double offset) => PdfReaderLocator( + pageIndex: page, + pageOffset: offset, + totalProgression: pageCount <= 1 ? 0 : page / (pageCount - 1), + ); + + final selection = ReaderSelection( + text: ranges.map((range) => range.text).join('\n'), + start: at(ranges.first.pageNumber - 1, rectangles.first.rect.top), + end: at(ranges.last.pageNumber - 1, rectangles.last.rect.bottom), + rectangles: rectangles, + ); + + await delegate.clearTextSelection(); + + if (_disposed) return; + + action(selection); + } + @override Widget buildViewport(PdfViewportConfiguration configuration) { _configuration = configuration; @@ -272,6 +334,12 @@ final class _PdfrxFacade implements PdfFacade, DisposablePdfFacade { _viewKey = key; _viewerRevision++; _restoring = true; + final revision = _viewerRevision; + WidgetsBinding.instance.addPostFrameCallback((_) { + if (!_disposed && _restoring && revision == _viewerRevision) { + _configuration?.onContentReadyChanged?.call(false); + } + }); } final revision = _viewerRevision; return applyPdfBrightness( @@ -300,54 +368,134 @@ final class _PdfrxFacade implements PdfFacade, DisposablePdfFacade { // Let pdfrx finish handling the wheel before snapping to the next row. WidgetsBinding.instance.addPostFrameCallback((_) { if (!_disposed && revision == _viewerRevision) { - _turnSpread(delta > 0 ? 1 : -1); + final turn = ReaderInteractionScope.maybeOf(context)?.onTurn; + if (turn != null) { + turn(delta > 0 ? 1 : -1); + } else { + _turnSpread(delta > 0 ? 1 : -1); + } } }); WidgetsBinding.instance.scheduleFrame(); }, - onPointerDown: (event) { - if (event.kind != PointerDeviceKind.touch) return; - _touchPointers++; - _touchStart = _touchPointers == 1 ? event.position : null; - }, + onPointerDown: _swipe.start, + onPointerMove: _swipe.update, + onPointerCancel: _swipe.cancel, onPointerUp: (event) { - if (event.kind != PointerDeviceKind.touch) return; - final start = _touchStart; - _touchPointers = max(0, _touchPointers - 1); - _touchStart = null; + final offset = _swipe.end(event); + if (configuration.layoutMode == ReaderLayoutMode.paginated && - start != null && + offset != null && !_restoring && _atFit && - (event.position.dx - start.dx).abs() > 70) { - _turnSpread(event.position.dx < start.dx ? 1 : -1); + offset.dx.abs() > 70 && + offset.dx.abs() > offset.dy.abs()) { + final direction = offset.dx < 0 ? 1 : -1; + final turn = ReaderInteractionScope.maybeOf(context)?.onTurn; + + if (turn != null) { + turn(direction); + } else { + _turnSpread(direction); + } } }, - onPointerCancel: (_) { - _touchPointers = 0; - _touchStart = null; - }, - child: PdfViewer( - _documentRef, - key: ValueKey(key), - controller: _controller, - initialPageNumber: _pageIndex + 1, - params: buildPdfViewerParams( - configuration, - viewportSize: size, - currentPageIndex: () => _pageIndex, - onViewerReady: (_, _) async { - if (_disposed || revision != _viewerRevision) return; - try { - await _restorePage(); - } finally { - if (!_disposed && revision == _viewerRevision) { - _restoring = false; - _positionChanged(); - } - } - }, - onPageChanged: (_) => _positionChanged(), + child: ReaderHighlightInteraction( + isSelecting: () => _textSelected, + hitTest: (position) { + if (!_controller.isReady) return null; + final documentPosition = _controller.globalToDocument(position); + if (documentPosition == null) return null; + final target = pdfHighlightAt( + documentPosition, + _controller.layout.pageLayouts, + ReaderInteractionScope.maybeOf(context)?.highlights ?? + const [], + ); + if (target == null) return null; + final visible = target.bounds.intersect( + _controller.visibleRect, + ); + final topLeft = _controller.documentToGlobal(visible.topLeft); + final bottomRight = _controller.documentToGlobal( + visible.bottomRight, + ); + if (visible.isEmpty || topLeft == null || bottomRight == null) { + return null; + } + return ( + highlight: target.highlight, + bounds: Rect.fromPoints(topLeft, bottomRight), + ); + }, + child: PdfSelectionToolbar( + controller: _controller, + saveSelection: _saveSelection, + child: PdfViewer( + _documentRef, + key: ValueKey(key), + controller: _controller, + initialPageNumber: _pageIndex + 1, + params: buildPdfViewerParams( + configuration, + viewportSize: size, + customizeContextMenuItems: (params, items) { + if (!params.textSelectionDelegate.hasSelectedText || + !params.textSelectionDelegate.isCopyAllowed) { + return; + } + + final interactions = ReaderInteractionScope.maybeOf( + context, + ); + + for (final entry in [ + ('Annotate', interactions?.onAnnotate), + ('Add note', interactions?.onNote), + ]) { + final action = entry.$2; + + if (action != null) { + items.add( + ContextMenuButtonItem( + label: entry.$1, + onPressed: () { + params.dismissContextMenu(); + _saveSelection( + params.textSelectionDelegate, + action, + ); + }, + ), + ); + } + } + }, + highlights: + ReaderInteractionScope.maybeOf(context)?.highlights ?? + const [], + onTextSelectionChange: (selection) { + _textSelected = selection.hasSelectedText; + _swipe.selectionChanged(selection.hasSelectedText); + ReaderInteractionScope.maybeOf( + context, + )?.onSelectionChanged(selection.hasSelectedText); + }, + currentPageIndex: () => _pageIndex, + onViewerReady: (_, _) async { + if (_disposed || revision != _viewerRevision) return; + try { + await _restorePage(); + } finally { + if (!_disposed && revision == _viewerRevision) { + _restoring = false; + _positionChanged(); + } + } + }, + onPageChanged: (_) => _positionChanged(), + ), + ), ), ), ), @@ -373,6 +521,13 @@ final class _PdfrxFacade implements PdfFacade, DisposablePdfFacade { 0.0, 1.0, ); + final visible = _controller.visibleRect; + final exposure = pdfViewportExposure( + _controller.layout.pageLayouts, + visible, + ); + config?.onVisiblePagesChanged?.call(exposure.pages); + config?.onContentReadyChanged?.call(exposure.contentVisible); _pageIndex = index; _pageOffset = offset; if (config?.onPositionChanged != null) { @@ -394,15 +549,88 @@ final class _PdfrxFacade implements PdfFacade, DisposablePdfFacade { } } +/// Visible content permits time tracking even when zoom prevents page qualification. +({bool contentVisible, List pages}) pdfViewportExposure( + List pages, + Rect viewport, +) { + var contentVisible = false; + final qualified = []; + for (var i = 0; i < pages.length; i++) { + final rect = pages[i]; + if (!rect.overlaps(viewport)) continue; + final intersection = rect.intersect(viewport); + final area = intersection.width * intersection.height; + if (area <= 0) continue; + contentVisible = true; + if (area >= rect.width * rect.height * .25) qualified.add(i); + } + return (contentVisible: contentVisible, pages: qualified); +} + +ReaderHighlightTarget? pdfHighlightAt( + Offset position, + List pages, + List highlights, +) { + for (final highlight in highlights.reversed) { + for (final rectangle in highlight.selection.rectangles) { + final pageIndex = rectangle.pageIndex; + if (pageIndex < 0 || pageIndex >= pages.length) continue; + final page = pages[pageIndex]; + final rect = rectangle.rect; + final bounds = Rect.fromLTRB( + page.left + rect.left * page.width, + page.top + rect.top * page.height, + page.left + rect.right * page.width, + page.top + rect.bottom * page.height, + ); + if (bounds.contains(position)) { + return (highlight: highlight, bounds: bounds); + } + } + } + return null; +} + PdfViewerParams buildPdfViewerParams( PdfViewportConfiguration configuration, { PdfViewerReadyCallback? onViewerReady, + PdfViewerTextSelectionChangeCallback? onTextSelectionChange, ValueChanged? onPageChanged, Size viewportSize = const Size(800, 600), int Function()? currentPageIndex, + PdfViewerContextMenuUpdateMenuItemsFunction? customizeContextMenuItems, + List highlights = const [], }) { final paginated = configuration.layoutMode == ReaderLayoutMode.paginated; return PdfViewerParams( + customizeContextMenuItems: customizeContextMenuItems, + pagePaintCallbacks: [ + (canvas, pageRect, page) { + for (final highlight in highlights) { + for (final rectangle in highlight.selection.rectangles) { + if (rectangle.pageIndex != page.pageNumber - 1) { + continue; + } + + final rect = rectangle.rect; + canvas.drawRect( + Rect.fromLTRB( + pageRect.left + rect.left * pageRect.width, + pageRect.top + rect.top * pageRect.height, + pageRect.left + rect.right * pageRect.width, + pageRect.top + rect.bottom * pageRect.height, + ), + Paint()..color = highlight.color.withValues(alpha: .35), + ); + } + } + }, + ], + textSelectionParams: PdfTextSelectionParams( + onTextSelectionChange: onTextSelectionChange, + ), backgroundColor: configuration.brightness == Brightness.dark ? Color.fromARGB( (configuration.backgroundColor.a * 255).round(), diff --git a/lib/src/engine/pdf/pdf_reader_engine.dart b/lib/src/engine/pdf/pdf_reader_engine.dart index 8667dd4..77eacfe 100644 --- a/lib/src/engine/pdf/pdf_reader_engine.dart +++ b/lib/src/engine/pdf/pdf_reader_engine.dart @@ -1,6 +1,7 @@ import 'package:flutter/widgets.dart'; import '../../domain/reader_capabilities.dart'; +import '../../domain/reader_activity.dart'; import '../../domain/reader_document.dart'; import '../../domain/reader_exception.dart'; import '../../domain/reader_locator.dart'; @@ -58,6 +59,8 @@ final class PdfReaderEngine extends ReaderEngine { ); } + _exposedPages = const []; + _viewportReady = null; PdfFacade? candidate; try { final bytes = await document.loadBytes(); @@ -176,6 +179,9 @@ final class PdfReaderEngine extends ReaderEngine { 'The locator is not valid for the current PDF.', ); } + _exposedPages = const []; + _viewportReady = null; + _publish(); await facade.showPage(locator.pageIndex, locator.pageOffset); _locator = locator; _publish(); @@ -280,10 +286,42 @@ final class PdfReaderEngine extends ReaderEngine { _publish(); } + List _exposedPages = const []; + bool? _viewportReady; + void _contentReadyChanged(bool ready) { + if (_disposed || _viewportReady == ready) return; + _viewportReady = ready; + _publish(); + } + + void _visiblePagesChanged(List pages) { + if (_disposed) return; + if (pages.length == _exposedPages.length && + List.generate( + pages.length, + (i) => pages[i] == _exposedPages[i], + ).every((same) => same)) { + return; + } + _exposedPages = List.unmodifiable(pages); + _publish(); + } + void _publish() { if (_disposed) return; snapshot = ReaderReadySnapshot( document: _document!, + contentReady: _viewportReady ?? _exposedPages.isNotEmpty, + coverage: [ + for (final page in _exposedPages) + ReaderContentCoverage( + key: 'pdf:$page', + start: 0, + end: 1, + pdfPageIndex: page, + ), + ], + atEnd: _exposedPages.contains(_facade!.pageCount - 1), preferences: _preferences, capabilities: capabilities, locator: _locator, @@ -311,6 +349,17 @@ final class PdfReaderEngine extends ReaderEngine { ReaderColumnMode.automatic => constraints.maxWidth >= 1000, }; _facingPages = facingPages; + if (_facadeFactory != null && _viewportReady == null) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (_disposed || + !identical(_facade, facade) || + _viewportReady != null) { + return; + } + _viewportReady = true; + _publish(); + }); + } return facade.buildViewport( PdfViewportConfiguration( pageIndex: locator.pageIndex, @@ -320,6 +369,8 @@ final class PdfReaderEngine extends ReaderEngine { layoutMode: _preferences.layoutMode, onPageChanged: _visiblePageChanged, onPositionChanged: _visiblePositionChanged, + onVisiblePagesChanged: _visiblePagesChanged, + onContentReadyChanged: _contentReadyChanged, ), ); }, diff --git a/lib/src/engine/pdf/pdf_selection_toolbar.dart b/lib/src/engine/pdf/pdf_selection_toolbar.dart new file mode 100644 index 0000000..3d626c3 --- /dev/null +++ b/lib/src/engine/pdf/pdf_selection_toolbar.dart @@ -0,0 +1,190 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:pdfrx/pdfrx.dart'; + +import '../../domain/reader_selection.dart'; +import '../../presentation/reader_interaction_scope.dart'; +import '../../presentation/reader_text_toolbar.dart'; + +/// pdfrx only finalizes its automatic menu for selection handles, not mouse drags. +final class PdfSelectionToolbar extends StatefulWidget { + const PdfSelectionToolbar({ + required this.controller, + required this.saveSelection, + required this.child, + super.key, + }); + + final PdfViewerController controller; + final Future Function( + PdfTextSelectionDelegate selection, + ValueChanged action, + ) + saveSelection; + final Widget child; + + @override + State createState() => _PdfSelectionToolbarState(); +} + +final class _PdfSelectionToolbarState extends State { + final _menu = ContextMenuController(); + int _revision = 0; + int? _pointer; + + @override + void initState() { + super.initState(); + widget.controller.addListener(_dismiss); + } + + @override + void didUpdateWidget(PdfSelectionToolbar oldWidget) { + super.didUpdateWidget(oldWidget); + + if (oldWidget.controller != widget.controller) { + oldWidget.controller.removeListener(_dismiss); + widget.controller.addListener(_dismiss); + _dismiss(); + } + } + + void _dismiss() { + _revision++; + _menu.remove(); + } + + KeyEventResult _onKeyEvent(FocusNode node, KeyEvent event) { + if (_menu.isShown && event.logicalKey == LogicalKeyboardKey.escape) { + _dismiss(); + return KeyEventResult.handled; + } + return KeyEventResult.ignored; + } + + void _scheduleMenu() { + final revision = ++_revision; + WidgetsBinding.instance.addPostFrameCallback((_) => _show(revision)); + WidgetsBinding.instance.ensureVisualUpdate(); + } + + Future _show(int revision) async { + final controller = widget.controller; + + if (!mounted || revision != _revision || !controller.isReady) return; + + final selection = controller.textSelectionDelegate; + + if (!selection.hasSelectedText || !selection.isCopyAllowed) return; + + final ranges = await selection.getSelectedTextRanges(); + + if (!mounted || revision != _revision || !controller.isReady) return; + + final viewport = context.findRenderObject() as RenderBox?; + + if (viewport == null || !viewport.hasSize) return; + + final viewportBounds = viewport.localToGlobal(Offset.zero) & viewport.size; + Rect? bounds; + + for (final range in ranges) { + final page = controller.document.pages[range.pageNumber - 1]; + final pageRect = controller.layout.pageLayouts[range.pageNumber - 1]; + + for (final fragment in range.enumerateFragmentBoundingRects()) { + final rect = fragment.bounds.toRectInDocument( + page: page, + pageRect: pageRect, + ); + final start = controller.documentToGlobal(rect.topLeft); + final end = controller.documentToGlobal(rect.bottomRight); + + if (start == null || end == null) continue; + + final visible = Rect.fromPoints(start, end).intersect(viewportBounds); + + if (!visible.isEmpty) { + bounds = bounds?.expandToInclude(visible) ?? visible; + } + } + } + + if (bounds == null) return; + + final interactions = ReaderInteractionScope.maybeOf(context); + final items = []; + + for (final (label, action) in [ + ('Annotate', interactions?.onAnnotate), + ('Add note', interactions?.onNote), + ]) { + if (action != null) { + items.add( + ContextMenuButtonItem( + label: label, + onPressed: () { + _dismiss(); + widget.saveSelection(selection, action); + }, + ), + ); + } + } + + items.add( + ContextMenuButtonItem( + type: ContextMenuButtonType.copy, + onPressed: () async { + _dismiss(); + await selection.copyTextSelection(); + await selection.clearTextSelection(); + }, + ), + ); + + final menuBounds = bounds; + _menu.show( + context: context, + contextMenuBuilder: (_) => TapRegion( + onTapOutside: (_) => _dismiss(), + child: Focus( + onKeyEvent: _onKeyEvent, + child: ReaderTextToolbar(bounds: menuBounds, items: items), + ), + ), + ); + } + + @override + void dispose() { + widget.controller.removeListener(_dismiss); + _dismiss(); + super.dispose(); + } + + @override + Widget build(BuildContext context) => Listener( + onPointerDown: (event) { + _dismiss(); + _pointer = + event.kind == PointerDeviceKind.mouse && + event.buttons == kPrimaryButton + ? event.pointer + : null; + }, + onPointerUp: (event) { + if (event.pointer == _pointer) { + _pointer = null; + _scheduleMenu(); + } + }, + onPointerCancel: (_) { + _pointer = null; + _dismiss(); + }, + onPointerSignal: (_) => _dismiss(), + child: Focus(onKeyEvent: _onKeyEvent, child: widget.child), + ); +} diff --git a/lib/src/engine/reader_engine.dart b/lib/src/engine/reader_engine.dart index 9a9df80..b98bf38 100644 --- a/lib/src/engine/reader_engine.dart +++ b/lib/src/engine/reader_engine.dart @@ -26,6 +26,10 @@ abstract class ReaderEngine extends ChangeNotifier { Future goToProgress(double progress); + /// Stop a pending progress seek when supported. Engines that cannot cancel + /// finish the active operation before the shell runs the latest queued seek. + void cancelPendingSeek() {} + Future goNext(); Future goPrevious(); diff --git a/lib/src/presentation/papyrus_reader.dart b/lib/src/presentation/papyrus_reader.dart index fadf87e..d9e149b 100644 --- a/lib/src/presentation/papyrus_reader.dart +++ b/lib/src/presentation/papyrus_reader.dart @@ -3,10 +3,13 @@ import 'dart:math' as math; import 'dart:ui' as ui; import 'package:flutter/material.dart'; +import 'package:flutter/semantics.dart'; +import 'package:flutter/scheduler.dart'; import 'package:flutter/services.dart'; import '../controller/reader_controller.dart'; import '../domain/reader_document.dart'; +import '../domain/reader_activity.dart'; import '../domain/reader_exception.dart'; import '../domain/reader_locator.dart'; import '../domain/reader_preferences.dart'; @@ -15,10 +18,14 @@ import '../domain/reader_types.dart'; import '../engine/reader_engine_registry.dart'; import 'reader_material_theme.dart'; import 'reader_controls.dart'; +import 'reader_surface.dart'; import 'reader_contents_panel.dart'; import 'reader_settings_panel.dart'; +import 'reader_panel_header.dart'; +import 'reader_loading.dart'; import 'reader_theme_data.dart'; import 'reader_ui_builders.dart'; +import '../domain/reader_selection.dart'; enum _ReaderPanel { none, tableOfContents, settings } @@ -30,9 +37,15 @@ final class PapyrusReader extends StatefulWidget { this.theme, this.controller, this.registry, + this.onActivity, this.onLocatorChanged, this.onPreferencesChanged, this.onBack, + this.onAnnotate, + this.onNote, + this.onEditHighlight, + this.onRemoveHighlight, + this.highlights = const [], this.builders = const ReaderUiBuilders(), super.key, }) : assert( @@ -46,9 +59,15 @@ final class PapyrusReader extends StatefulWidget { final ReaderThemeData? theme; final ReaderController? controller; final ReaderEngineRegistry? registry; + final ValueChanged? onActivity; final ReaderLocatorChanged? onLocatorChanged; final ReaderPreferencesChanged? onPreferencesChanged; final VoidCallback? onBack; + final ValueChanged? onAnnotate; + final ValueChanged? onNote; + final ValueChanged? onEditHighlight; + final ValueChanged? onRemoveHighlight; + final List highlights; final ReaderUiBuilders builders; @override @@ -59,15 +78,21 @@ final class _PapyrusReaderState extends State { late ReaderController _controller; late bool _ownsController; ReaderSnapshot? _observedSnapshot; + bool _hasReadableContent = false; _ReaderPanel _panel = _ReaderPanel.none; - bool _controlsVisible = true; + bool _controlsVisible = false; double? _dragProgress; + bool _draggingProgress = false; + int _seekRevision = 0; + int? _pendingSeekRevision; + int? _activeSeekRevision; int _loadGeneration = 0; bool _loadedDependencies = false; Future _commandQueue = Future.value(); int _commandGeneration = 0; int _pendingCommands = 0; String? _commandError; + VoidCallback? _retryCommand; final ValueNotifier _commandRevision = ValueNotifier(0); Route? _compactPanelRoute; NavigatorState? _compactPanelNavigator; @@ -82,11 +107,13 @@ final class _PapyrusReaderState extends State { ); FocusNode? _widePanelOpener; final FocusNode _readerFocusNode = FocusNode(debugLabel: 'reader navigation'); - final FocusNode _controlsToggleFocusNode = FocusNode( - debugLabel: 'reader controls toggle', - ); + + ReaderActivityEvent? _lastActivity; + bool _activityReportScheduled = false; bool get _isCommandBusy => _pendingCommands > 0; + Timer? _busyTimer; + bool _showBusy = false; @override void initState() { @@ -123,15 +150,14 @@ final class _PapyrusReaderState extends State { if (controllerChanged || documentChanged) { _panel = _ReaderPanel.none; - _controlsVisible = true; + _controlsVisible = false; _dragProgress = null; _loadDocument(); } } Map get _keyBindings => { - if (!_controlsVisible) - const SingleActivator(LogicalKeyboardKey.escape): _toggleControls, + const SingleActivator(LogicalKeyboardKey.escape): _toggleControls, const SingleActivator(LogicalKeyboardKey.arrowLeft): _goPrevious, const SingleActivator(LogicalKeyboardKey.pageUp): _goPrevious, const SingleActivator(LogicalKeyboardKey.arrowRight): _goNext, @@ -176,6 +202,7 @@ final class _PapyrusReaderState extends State { widget.initialPreferences ?? const ReaderPreferences(), ); _observedSnapshot = _controller.snapshot; + _hasReadableContent = _controller.snapshot.contentReady; _controller.addListener(_controllerChanged); } @@ -199,9 +226,16 @@ final class _PapyrusReaderState extends State { } void _invalidateCommands({bool notify = true}) { + _controller.cancelPendingSeek(); + _seekRevision++; + _pendingSeekRevision = null; + _activeSeekRevision = null; + _draggingProgress = false; _commandGeneration++; _commandQueue = Future.value(); _pendingCommands = 0; + _busyTimer?.cancel(); + _showBusy = false; _commandError = null; if (notify && mounted) { @@ -252,7 +286,15 @@ final class _PapyrusReaderState extends State { final previous = _observedSnapshot; final next = _controller.snapshot; _observedSnapshot = next; - _dragProgress = null; + _hasReadableContent = + next.status == ReaderStatus.ready && + (_hasReadableContent || next.contentReady); + + if (next.contentReady && + !_draggingProgress && + _pendingSeekRevision == null) { + _dragProgress = null; + } if (next.locator != null && next.locator != previous?.locator) { _invokeHostCallback( @@ -268,6 +310,41 @@ final class _PapyrusReaderState extends State { } setState(() {}); + _reportActivity(); + } + + void _scheduleActivityReport() { + if (_activityReportScheduled) return; + _activityReportScheduled = true; + WidgetsBinding.instance.addPostFrameCallback((_) { + _activityReportScheduled = false; + _reportActivity(); + }); + } + + void _reportActivity() { + if (!mounted) return; + if (WidgetsBinding.instance.schedulerPhase == + SchedulerPhase.persistentCallbacks) { + _scheduleActivityReport(); + return; + } + final snapshot = _controller.snapshot; + final event = ReaderActivityEvent( + ready: snapshot.contentReady, + visible: + snapshot.contentReady && + _panel == _ReaderPanel.none && + _compactPanelRoute == null && + (ModalRoute.of(context)?.isCurrent ?? true), + cause: _controller.navigationCause, + locator: snapshot.locator, + coverage: snapshot.coverage, + atEnd: snapshot.atEnd, + ); + if (event == _lastActivity || widget.onActivity == null) return; + _lastActivity = event; + _invokeHostCallback(() => widget.onActivity!(event), 'onActivity'); } void _invokeHostCallback(VoidCallback callback, String name) { @@ -287,6 +364,7 @@ final class _PapyrusReaderState extends State { @override void dispose() { + _busyTimer?.cancel(); _dismissCompactPanel(); _invalidateCommands(notify: false); _detachController(); @@ -295,36 +373,44 @@ final class _PapyrusReaderState extends State { _widePanelFocusNode.dispose(); HardwareKeyboard.instance.removeHandler(_handleUnfocusedReadingKey); _readerFocusNode.dispose(); - _controlsToggleFocusNode.dispose(); _commandRevision.dispose(); super.dispose(); } @override Widget build(BuildContext context) { + _scheduleActivityReport(); final snapshot = _controller.snapshot; - final ambient = Theme.of(context); - final readerTheme = snapshot.status == ReaderStatus.ready - ? buildReaderMaterialTheme(ambient, snapshot.preferences.brightness) - : ambient; + final readerTheme = Theme.of(context); final theme = widget.theme ?? ReaderThemeData.fromTheme(readerTheme); return Theme( data: readerTheme, child: Builder( builder: (context) => Material( - color: theme.surfaceColor, + color: _hasReadableContent + ? snapshot.preferences.backgroundColor + : theme.surfaceColor, child: SafeArea( child: switch (snapshot.status) { ReaderStatus.idle => _buildEmpty(context, snapshot, theme), - ReaderStatus.loading => _stateChrome( - _buildLoading(context, snapshot, theme), - theme, - ), + ReaderStatus.loading => _buildLoading(context, snapshot, theme), ReaderStatus.error => _stateChrome( _buildError(context, snapshot, theme), theme, ), - ReaderStatus.ready => _buildReady(context, snapshot, theme), + ReaderStatus.ready => ReaderLoadingScope( + backgroundColor: theme.surfaceColor, + builder: (context) => Theme( + data: readerTheme, + child: Builder( + builder: (context) => ColoredBox( + color: theme.surfaceColor, + child: _buildLoading(context, snapshot, theme), + ), + ), + ), + child: _buildReady(context, snapshot, theme), + ), }, ), ), @@ -387,27 +473,10 @@ final class _PapyrusReaderState extends State { return builder(context, _stateContext(snapshot)); } - final title = widget.document.title?.trim(); return Center( - child: Padding( - padding: EdgeInsets.all(theme.panelPadding * 2), - child: Semantics( - liveRegion: true, - label: 'Opening document', - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - CircularProgressIndicator(color: theme.accentColor), - const SizedBox(height: 20), - Text( - title == null || title.isEmpty - ? 'Opening document…' - : 'Opening $title…', - textAlign: TextAlign.center, - ), - ], - ), - ), + child: CircularProgressIndicator( + color: theme.accentColor, + semanticsLabel: 'Opening document', ), ); } @@ -481,10 +550,7 @@ final class _PapyrusReaderState extends State { state: ui.ViewFocusState.focused, direction: ui.ViewFocusDirection.undefined, ); - final focus = _controlsVisible && widget.builders.toolbar == null - ? _controlsToggleFocusNode - : _readerFocusNode; - focus.requestFocus(); + _readerFocusNode.requestFocus(); } Widget _buildReady( @@ -495,25 +561,22 @@ final class _PapyrusReaderState extends State { return LayoutBuilder( builder: (context, constraints) { final isWide = constraints.maxWidth >= theme.compactBreakpoint; - final toolbar = widget.builders.toolbar?.call( - context, - ReaderToolbarContext( - document: widget.document, - snapshot: snapshot, - onBack: widget.onBack, - isBusy: _isCommandBusy, - toggleControls: _toggleControls, - controlsVisible: _controlsVisible, - openTableOfContents: () => _openPanel( - context, - _ReaderPanel.tableOfContents, - isWide, - theme, - ), - openSettings: () => - _openPanel(context, _ReaderPanel.settings, isWide, theme), - ), + final toolbarContext = ReaderToolbarContext( + document: widget.document, + snapshot: snapshot, + onBack: widget.onBack, + isBusy: _isCommandBusy, + toggleControls: _toggleControls, + controlsVisible: _controlsVisible, + openTableOfContents: () => + _openPanel(context, _ReaderPanel.tableOfContents, isWide, theme), + openSettings: () => + _openPanel(context, _ReaderPanel.settings, isWide, theme), ); + final toolbar = widget.builders.toolbar?.call(context, toolbarContext); + final actions = + widget.builders.toolbarActions?.call(context, toolbarContext) ?? + const []; return CallbackShortcuts( bindings: _keyBindings, @@ -526,157 +589,163 @@ final class _PapyrusReaderState extends State { autofocus: true, child: Stack( children: [ - Column( - children: [ - if (_controlsVisible) - FocusTraversalOrder( - key: const ValueKey('reader-toolbar'), - order: const NumericFocusOrder(1), - child: - toolbar ?? - ReaderToolbar( - document: widget.document, - onBack: widget.onBack, - onTableOfContents: () => _openPanel( - context, - _ReaderPanel.tableOfContents, - isWide, - theme, - ), - onSettings: () => _openPanel( - context, - _ReaderPanel.settings, - isWide, - theme, - ), - tocFocusNode: _tocButtonFocusNode, - settingsFocusNode: _settingsButtonFocusNode, + Positioned.fill( + key: const ValueKey('reader-content'), + child: FocusTraversalOrder( + order: const NumericFocusOrder(3), + child: _readingSurface(context, snapshot, isWide), + ), + ), + PositionedDirectional( + bottom: 0, + start: 0, + end: 0, + child: _chromeVisibility( + child: _overlayBar( + theme, + Center( + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 1000), + child: FocusTraversalOrder( + key: const ValueKey('reader-progress-controls'), + order: const NumericFocusOrder(4), + child: ReaderProgressControls( + progress: + _dragProgress ?? + _progressOf(snapshot.locator), + locationLabel: snapshot.locationLabel, + onProgressChangeStart: _startProgressDrag, + onProgressChanged: (value) => setState(() { + _draggingProgress = true; + _dragProgress = value; + }), + onProgressChangeEnd: _goToProgress, + onPrevious: _goPrevious, + onNext: _goNext, + enabled: true, theme: theme, - isWide: isWide, ), + ), + ), ), - if (_controlsVisible) - SizedBox( - key: const ValueKey('reader-toolbar-border'), - height: 1, - child: _isCommandBusy - ? const LinearProgressIndicator( - key: ValueKey('reader-command-progress'), - minHeight: 1, - ) - : ColoredBox(color: theme.dividerColor), - ), - if (_commandError case final error?) - ReaderCommandError( - message: error, - theme: theme, - onDismiss: () => setState(() => _commandError = null), + border: Border( + top: BorderSide(color: theme.dividerColor), ), - Expanded( - key: const ValueKey('reader-content'), - child: Row( - children: [ - Expanded( - child: FocusTraversalOrder( - order: const NumericFocusOrder(3), - child: _buildViewport(context, snapshot), + ), + ), + ), + Positioned.fill( + child: Column( + children: [ + _chromeVisibility( + child: FocusTraversalOrder( + key: const ValueKey('reader-toolbar'), + order: const NumericFocusOrder(1), + child: _overlayBar( + theme, + Column( + mainAxisSize: MainAxisSize.min, + children: [ + toolbar ?? + ReaderToolbar( + document: widget.document, + actions: actions, + onBack: widget.onBack, + onTableOfContents: () => _openPanel( + context, + _ReaderPanel.tableOfContents, + isWide, + theme, + ), + onSettings: () => _openPanel( + context, + _ReaderPanel.settings, + isWide, + theme, + ), + tocFocusNode: _tocButtonFocusNode, + settingsFocusNode: + _settingsButtonFocusNode, + theme: theme, + isWide: isWide, + ), + if (_showBusy) + const LinearProgressIndicator( + key: ValueKey('reader-command-progress'), + minHeight: 2, + ), + ], ), - ), - if (isWide && _panel != _ReaderPanel.none) ...[ - VerticalDivider( - width: 1, - color: theme.dividerColor, + border: Border( + bottom: BorderSide(color: theme.dividerColor), ), - FocusTraversalOrder( - order: const NumericFocusOrder(2), - child: SizedBox( - key: const ValueKey('reader-side-panel'), + ), + ), + ), + if (isWide && _panel != _ReaderPanel.none) + Expanded( + child: Stack( + children: [ + Positioned.fill( + top: 0, + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: _closeWidePanel, + child: const ColoredBox( + color: Colors.transparent, + ), + ), + ), + PositionedDirectional( + top: 0, + bottom: 0, + end: 0, width: theme.sidePanelWidth, - child: ColoredBox( - color: theme.panelColor, - child: _buildWidePanel( - context, - snapshot, + child: FocusTraversalOrder( + order: const NumericFocusOrder(2), + child: _overlayBar( theme, + ColoredBox( + key: const ValueKey( + 'reader-side-panel', + ), + color: theme.panelColor, + child: DecoratedBox( + position: + DecorationPosition.foreground, + decoration: BoxDecoration( + border: BorderDirectional( + start: BorderSide( + color: theme.dividerColor, + ), + ), + ), + child: _buildWidePanel( + context, + snapshot, + theme, + ), + ), + ), ), ), ), - ), - ], - ], - ), - ), - if (_controlsVisible) - FocusTraversalOrder( - key: const ValueKey('reader-progress-controls'), - order: const NumericFocusOrder(4), - child: ReaderProgressControls( - progress: - _dragProgress ?? _progressOf(snapshot.locator), - locationLabel: snapshot.locationLabel, - onProgressChanged: (value) { - setState(() => _dragProgress = value); - }, - onProgressChangeEnd: _goToProgress, - onPrevious: _goPrevious, - onNext: _goNext, - enabled: !_isCommandBusy, - theme: theme, + ], + ), ), - ), - ], + ], + ), ), - if (toolbar == null || !_controlsVisible) + if (_commandError case final error?) PositionedDirectional( - key: const ValueKey('reader-controls-toggle'), - top: _controlsVisible - ? (readerToolbarHeight(context, theme, isWide) - - theme.minimumTargetSize) / - 2 - : 8, + bottom: 80, + start: 8, end: 8, - child: ListenableBuilder( - listenable: _controlsToggleFocusNode, - builder: (context, _) { - final label = _controlsVisible - ? 'Hide controls' - : 'Show controls'; - return Semantics( - container: true, - button: true, - label: label, - focusable: true, - focused: _controlsToggleFocusNode.hasFocus, - onTap: _toggleControls, - onDidGainAccessibilityFocus: - _controlsToggleFocusNode.requestFocus, - excludeSemantics: true, - child: Tooltip( - message: label, - excludeFromSemantics: true, - child: Material( - color: _controlsVisible - ? Colors.transparent - : theme.chromeColor, - shape: const CircleBorder(), - child: IconTheme( - data: IconThemeData( - color: theme.onChromeColor, - ), - child: ReaderIconButton( - icon: _controlsVisible - ? Icons.fullscreen_rounded - : Icons.fullscreen_exit_rounded, - tooltip: null, - focusNode: _controlsToggleFocusNode, - onPressed: _toggleControls, - theme: theme, - ), - ), - ), - ), - ); - }, + child: ReaderCommandError( + message: error, + theme: theme, + onRetry: _retryCommand, + onDismiss: () => setState(() => _commandError = null), ), ), ], @@ -688,6 +757,61 @@ final class _PapyrusReaderState extends State { ); } + Widget _chromeVisibility({required Widget child}) => Visibility( + visible: _controlsVisible, + maintainState: true, + maintainAnimation: true, + child: child, + ); + + Widget _overlayBar(ReaderThemeData theme, Widget child, {Border? border}) => + Material( + color: theme.chromeColor, + elevation: 0, + child: DecoratedBox( + position: DecorationPosition.foreground, + decoration: BoxDecoration(border: border), + child: child, + ), + ); + + Widget _readingSurface( + BuildContext context, + ReaderSnapshot snapshot, + bool isWide, + ) { + return Semantics( + key: const ValueKey('reader-surface-actions'), + container: true, + customSemanticsActions: { + CustomSemanticsAction( + label: _controlsVisible + ? 'Hide reading controls' + : 'Show reading controls', + ): _toggleControls, + }, + child: ReaderSurface( + enabled: _panel == _ReaderPanel.none && _compactPanelRoute == null, + onAnnotate: widget.onAnnotate, + onNote: widget.onNote, + onEditHighlight: widget.onEditHighlight, + onRemoveHighlight: widget.onRemoveHighlight, + highlights: widget.highlights, + onToggle: _toggleControls, + onTurn: (direction) => direction > 0 ? _goNext() : _goPrevious(), + child: Theme( + data: buildReaderMaterialTheme( + Theme.of(context), + snapshot.preferences.brightness, + ), + child: Builder( + builder: (context) => _buildViewport(context, snapshot), + ), + ), + ), + ); + } + Widget _buildViewport(BuildContext context, ReaderSnapshot snapshot) { final viewport = _controller.buildViewport(context); final builder = widget.builders.viewport; @@ -754,11 +878,11 @@ final class _PapyrusReaderState extends State { return; } - _widePanelOpener = - FocusManager.instance.primaryFocus ?? - (panel == _ReaderPanel.tableOfContents - ? _tocButtonFocusNode - : _settingsButtonFocusNode); + _widePanelOpener = widget.builders.toolbar != null + ? FocusManager.instance.primaryFocus + : (panel == _ReaderPanel.tableOfContents + ? _tocButtonFocusNode + : _settingsButtonFocusNode); setState(() => _panel = panel); WidgetsBinding.instance.addPostFrameCallback((_) { if (mounted && _panel == panel) { @@ -770,91 +894,117 @@ final class _PapyrusReaderState extends State { final navigator = Navigator.of(context); final localizations = MaterialLocalizations.of(context); - late final ModalBottomSheetRoute route; - route = ModalBottomSheetRoute( - capturedThemes: InheritedTheme.capture( - from: context, - to: navigator.context, - ), - barrierLabel: localizations.scrimLabel, - barrierOnTapHint: localizations.scrimOnTapHint( - localizations.bottomSheetLabel, - ), - modalBarrierColor: Theme.of(context).bottomSheetTheme.modalBarrierColor, - useSafeArea: true, - isScrollControlled: true, - backgroundColor: Colors.transparent, - showDragHandle: false, - constraints: BoxConstraints( - maxWidth: theme.compactBreakpoint, - maxHeight: math.max( - 160, - (MediaQuery.sizeOf(context).height - - MediaQuery.viewInsetsOf(context).bottom) * - 0.88, - ), - ), - builder: (sheetContext) { - Widget buildPanel() { - // Captured route themes are a snapshot. Appearance can change while - // this sheet is open, so use the current reader theme on every update. - final preferences = _controller.preferences; - final currentTheme = buildReaderMaterialTheme( - Theme.of(this.context), - preferences.brightness, - ); - final colors = currentTheme.colorScheme; - final panelTheme = - widget.theme ?? ReaderThemeData.fromTheme(currentTheme); - return Theme( - data: currentTheme, - child: Builder( - builder: (context) => ClipRRect( - borderRadius: const BorderRadius.vertical( - top: Radius.circular(28), + final customRoute = widget.builders.compactPanelRoute; + late final Route route; + route = customRoute != null + ? customRoute( + context, + ReaderPanelRouteContext( + kind: panel == _ReaderPanel.settings + ? ReaderPanelKind.settings + : ReaderPanelKind.tableOfContents, + title: panel == _ReaderPanel.settings + ? 'Reading settings' + : 'Contents', + buildContent: (context, scrollController) => ListenableBuilder( + listenable: Listenable.merge([_controller, _commandRevision]), + builder: (context, child) => _panelWidget( + context, + _controller.snapshot, + panel, + ReaderThemeData.fromTheme(Theme.of(context)), + () { + if (route.isCurrent) navigator.pop(); + }, + showHeader: false, + scrollController: scrollController, ), - child: ColoredBox( - color: panelTheme.panelColor, - child: Column( - children: [ - SizedBox( - height: 32, - child: Center( - child: Container( - width: 32, - height: 4, - decoration: BoxDecoration( - color: colors.onSurfaceVariant, - borderRadius: BorderRadius.circular(2), - ), - ), + ), + ), + ) + : ModalBottomSheetRoute( + capturedThemes: InheritedTheme.capture( + from: context, + to: navigator.context, + ), + barrierLabel: localizations.scrimLabel, + barrierOnTapHint: localizations.scrimOnTapHint( + localizations.bottomSheetLabel, + ), + modalBarrierColor: Theme.of( + context, + ).bottomSheetTheme.modalBarrierColor, + useSafeArea: true, + isScrollControlled: true, + backgroundColor: Colors.transparent, + showDragHandle: false, + constraints: BoxConstraints( + maxWidth: theme.compactBreakpoint, + maxHeight: math.max( + 160, + (MediaQuery.sizeOf(context).height - + MediaQuery.viewInsetsOf(context).bottom) * + 0.88, + ), + ), + builder: (sheetContext) { + Widget buildPanel() { + final currentTheme = Theme.of(this.context); + final colors = currentTheme.colorScheme; + final panelTheme = + widget.theme ?? ReaderThemeData.fromTheme(currentTheme); + return Theme( + data: currentTheme, + child: Builder( + builder: (context) => Material( + color: panelTheme.panelColor, + clipBehavior: Clip.antiAlias, + shape: RoundedRectangleBorder( + borderRadius: const BorderRadius.vertical( + top: Radius.circular(28), ), + side: BorderSide(color: panelTheme.dividerColor), ), - Expanded( - child: _panelWidget( - context, - _controller.snapshot, - panel, - panelTheme, - () => Navigator.of(sheetContext).pop(), - ), + child: Column( + children: [ + SizedBox( + height: 32, + child: Center( + child: Container( + width: 32, + height: 4, + decoration: BoxDecoration( + color: colors.onSurfaceVariant, + borderRadius: BorderRadius.circular(2), + ), + ), + ), + ), + Expanded( + child: _panelWidget( + context, + _controller.snapshot, + panel, + panelTheme, + () => Navigator.of(sheetContext).pop(), + ), + ), + ], ), - ], + ), ), - ), - ), - ), - ); - } + ); + } - return ListenableBuilder( - listenable: Listenable.merge([_controller, _commandRevision]), - builder: (context, child) => buildPanel(), - ); - }, - ); + return ListenableBuilder( + listenable: Listenable.merge([_controller, _commandRevision]), + builder: (context, child) => buildPanel(), + ); + }, + ); _compactPanelRoute = route; _compactPanelNavigator = navigator; + _reportActivity(); final sheet = navigator.push(route); unawaited( sheet.then( @@ -862,12 +1012,14 @@ final class _PapyrusReaderState extends State { if (identical(_compactPanelRoute, route)) { _compactPanelRoute = null; _compactPanelNavigator = null; + _reportActivity(); } }, onError: (Object error, StackTrace stackTrace) { if (identical(_compactPanelRoute, route)) { _compactPanelRoute = null; _compactPanelNavigator = null; + _reportActivity(); } FlutterError.reportError( FlutterErrorDetails( @@ -887,19 +1039,48 @@ final class _PapyrusReaderState extends State { ReaderSnapshot snapshot, _ReaderPanel panel, ReaderThemeData theme, - VoidCallback close, - ) { + VoidCallback close, { + bool showHeader = true, + ScrollController? scrollController, + }) { final state = ReaderPanelContext( snapshot: snapshot, controller: _controller, close: close, isBusy: _isCommandBusy, + showHeader: showHeader, + buildHeader: (context, title) => + ReaderPanelHeader(title: title, close: close, theme: theme), + navigate: (locator) { + close(); + _enqueueCommand( + (controller) => controller.goTo(locator), + context: 'while navigating to a saved location', + ); + }, + buildContents: (context) => ReaderContentsPanel( + showHeader: false, + scrollController: scrollController, + snapshot: snapshot, + close: close, + theme: theme, + enabled: !_isCommandBusy, + onNavigate: (locator) { + close(); + _enqueueCommand( + (controller) => controller.goTo(locator), + context: 'while navigating from contents', + ); + }, + ), ); return switch (panel) { _ReaderPanel.tableOfContents => widget.builders.tableOfContents?.call(context, state) ?? ReaderContentsPanel( + showHeader: showHeader, + scrollController: scrollController, snapshot: snapshot, close: close, theme: theme, @@ -915,6 +1096,8 @@ final class _PapyrusReaderState extends State { _ReaderPanel.settings => widget.builders.settings?.call(context, state) ?? ReaderSettingsPanel( + showHeader: showHeader, + scrollController: scrollController, snapshot: snapshot, close: close, theme: theme, @@ -930,11 +1113,44 @@ final class _PapyrusReaderState extends State { }; } + void _startProgressDrag(double progress) { + _seekRevision++; + _pendingSeekRevision = null; + if (_activeSeekRevision != null) _controller.cancelPendingSeek(); + setState(() { + _draggingProgress = true; + _dragProgress = progress; + }); + } + void _goToProgress(double progress) { - setState(() => _dragProgress = progress); + final revision = ++_seekRevision; + if (_activeSeekRevision != null) _controller.cancelPendingSeek(); + setState(() { + _draggingProgress = false; + _pendingSeekRevision = revision; + _dragProgress = progress; + }); _enqueueCommand( - (controller) => controller.goToProgress(progress), + (controller) async { + _activeSeekRevision = revision; + _pendingSeekRevision = revision; + try { + await controller.goToProgress(progress); + } finally { + if (_activeSeekRevision == revision) _activeSeekRevision = null; + if (mounted && revision == _seekRevision) { + setState(() { + _pendingSeekRevision = null; + if (!_draggingProgress && controller.snapshot.contentReady) { + _dragProgress = null; + } + }); + } + } + }, context: 'while changing reader progress', + isCurrent: () => revision == _seekRevision, ); } @@ -958,6 +1174,7 @@ final class _PapyrusReaderState extends State { Future Function(ReaderController controller) operation, { required String context, bool expectedBoundary = false, + bool Function()? isCurrent, }) { if (!mounted) { return; @@ -969,20 +1186,32 @@ final class _PapyrusReaderState extends State { _readerFocusNode.hasFocus && _panel == _ReaderPanel.none && _compactPanelRoute == null; + if (_pendingCommands == 0) { + _busyTimer = Timer(const Duration(milliseconds: 300), () { + if (mounted && _isCommandBusy) { + setState(() => _showBusy = true); + } + }); + } + _pendingCommands++; _commandError = null; _commandRevision.value++; setState(() {}); final scheduled = _commandQueue.then((_) async { - if (!mounted || generation != _commandGeneration) { + if (!mounted || + generation != _commandGeneration || + !(isCurrent?.call() ?? true)) { return; } try { await operation(controller); } catch (error, stackTrace) { - if (!mounted || generation != _commandGeneration) { + if (!mounted || + generation != _commandGeneration || + !(isCurrent?.call() ?? true)) { return; } if (expectedBoundary && @@ -991,6 +1220,12 @@ final class _PapyrusReaderState extends State { return; } + _retryCommand = () => _enqueueCommand( + operation, + context: context, + expectedBoundary: expectedBoundary, + isCurrent: isCurrent, + ); _handleCommandError(error, stackTrace, context); } }); @@ -1000,11 +1235,18 @@ final class _PapyrusReaderState extends State { } _pendingCommands = math.max(0, _pendingCommands - 1); + + if (!_isCommandBusy) { + _busyTimer?.cancel(); + _showBusy = false; + } _commandRevision.value++; setState(() {}); - if (restoreReadingFocus) { + if (restoreReadingFocus && (isCurrent?.call() ?? true)) { WidgetsBinding.instance.addPostFrameCallback((_) { if (mounted && + !_draggingProgress && + (isCurrent?.call() ?? true) && generation == _commandGeneration && _panel == _ReaderPanel.none && _compactPanelRoute == null) { diff --git a/lib/src/presentation/reader_contents_panel.dart b/lib/src/presentation/reader_contents_panel.dart index e878e8f..609d763 100644 --- a/lib/src/presentation/reader_contents_panel.dart +++ b/lib/src/presentation/reader_contents_panel.dart @@ -9,6 +9,8 @@ import 'reader_theme_data.dart'; final class ReaderContentsPanel extends StatelessWidget { const ReaderContentsPanel({ super.key, + this.showHeader = true, + this.scrollController, required this.snapshot, required this.close, required this.theme, @@ -16,6 +18,8 @@ final class ReaderContentsPanel extends StatelessWidget { required this.onNavigate, }); + final bool showHeader; + final ScrollController? scrollController; final ReaderSnapshot snapshot; final VoidCallback close; final ReaderThemeData theme; @@ -24,28 +28,24 @@ final class ReaderContentsPanel extends StatelessWidget { @override Widget build(BuildContext context) { + final content = ListView( + controller: scrollController, + shrinkWrap: !showHeader, + children: [ + if (snapshot.toc.isEmpty) + const Padding( + padding: EdgeInsets.all(24), + child: Text('No table of contents is available.'), + ), + for (final entry in snapshot.toc) + _TocEntryTile(entry: entry, enabled: enabled, onNavigate: onNavigate), + ], + ); + if (!showHeader) return content; return Column( children: [ ReaderPanelHeader(title: 'Contents', close: close, theme: theme), - Expanded( - child: snapshot.toc.isEmpty - ? const Center( - child: Padding( - padding: EdgeInsets.all(24), - child: Text('No table of contents is available.'), - ), - ) - : ListView( - children: [ - for (final entry in snapshot.toc) - _TocEntryTile( - entry: entry, - enabled: enabled, - onNavigate: onNavigate, - ), - ], - ), - ), + Expanded(child: content), ], ); } diff --git a/lib/src/presentation/reader_controls.dart b/lib/src/presentation/reader_controls.dart index b3e3135..dc4f3fd 100644 --- a/lib/src/presentation/reader_controls.dart +++ b/lib/src/presentation/reader_controls.dart @@ -11,11 +11,13 @@ final class ReaderCommandError extends StatelessWidget { required this.message, required this.theme, required this.onDismiss, + this.onRetry, }); final String message; final ReaderThemeData theme; final VoidCallback onDismiss; + final VoidCallback? onRetry; @override Widget build(BuildContext context) { @@ -38,6 +40,8 @@ final class ReaderCommandError extends StatelessWidget { ), ), ), + if (onRetry != null) + TextButton(onPressed: onRetry, child: const Text('Try again')), IconButton( tooltip: 'Dismiss reader error', onPressed: onDismiss, @@ -73,6 +77,7 @@ final class ReaderToolbar extends StatelessWidget { required this.settingsFocusNode, required this.theme, required this.isWide, + this.actions = const [], }); final ReaderDocument document; @@ -83,64 +88,42 @@ final class ReaderToolbar extends StatelessWidget { final FocusNode settingsFocusNode; final ReaderThemeData theme; final bool isWide; + final List actions; @override Widget build(BuildContext context) { final height = readerToolbarHeight(context, theme, isWide); - return Container( + return SizedBox( height: height, - padding: const EdgeInsets.symmetric(horizontal: 8), - color: theme.chromeColor, - child: IconTheme( - data: IconThemeData(color: theme.onChromeColor), - child: DefaultTextStyle.merge( - style: TextStyle(color: theme.onChromeColor), - child: Row( - children: [ - if (onBack != null) - ReaderIconButton( - icon: Icons.arrow_back_rounded, - tooltip: 'Back', - onPressed: onBack!, - theme: theme, - ), - const SizedBox(width: 4), - Expanded( - child: Text( - document.title?.trim().isNotEmpty == true - ? document.title!.trim() - : 'Reader', - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: Theme.of(context).textTheme.titleLarge?.copyWith( - color: theme.onChromeColor, - fontWeight: FontWeight.w600, - ), - ), - ), - ReaderIconButton( - key: const ValueKey('reader-toc-button'), - focusNode: tocFocusNode, - icon: Icons.format_list_bulleted_rounded, - tooltip: 'Table of contents', - onPressed: onTableOfContents, - theme: theme, - ), - ReaderIconButton( - key: const ValueKey('reader-settings-button'), - focusNode: settingsFocusNode, - icon: Icons.text_fields_rounded, - tooltip: 'Reading settings', - onPressed: onSettings, - theme: theme, - ), - // The controls toggle stays mounted in the shell overlay during - // reflow, preserving browser accessibility and keyboard focus. - SizedBox(width: theme.minimumTargetSize), - ], + child: AppBar( + primary: false, + automaticallyImplyLeading: false, + toolbarHeight: height, + backgroundColor: theme.chromeColor, + foregroundColor: theme.onChromeColor, + elevation: 0, + scrolledUnderElevation: 0, + leading: onBack == null ? null : BackButton(onPressed: onBack), + actions: [ + ...actions, + ReaderIconButton( + key: const ValueKey('reader-toc-button'), + focusNode: tocFocusNode, + icon: Icons.format_list_bulleted_rounded, + tooltip: 'Table of contents', + onPressed: onTableOfContents, + theme: theme, ), - ), + ReaderIconButton( + key: const ValueKey('reader-settings-button'), + focusNode: settingsFocusNode, + icon: Icons.text_fields_rounded, + tooltip: 'Reading settings', + onPressed: onSettings, + theme: theme, + ), + ], ), ); } @@ -181,6 +164,7 @@ final class ReaderProgressControls extends StatelessWidget { const ReaderProgressControls({ super.key, required this.progress, + required this.onProgressChangeStart, required this.onProgressChanged, required this.onProgressChangeEnd, required this.onPrevious, @@ -191,6 +175,7 @@ final class ReaderProgressControls extends StatelessWidget { }); final double progress; + final ValueChanged onProgressChangeStart; final ValueChanged onProgressChanged; final ValueChanged onProgressChangeEnd; final VoidCallback onPrevious; @@ -204,6 +189,52 @@ final class ReaderProgressControls extends StatelessWidget { final normalized = progress.clamp(0.0, 1.0); final percent = (normalized * 100).round(); + final controls = Row( + children: [ + ReaderIconButton( + icon: Icons.chevron_left_rounded, + tooltip: 'Previous', + onPressed: enabled ? onPrevious : null, + theme: theme, + ), + Expanded( + child: Semantics( + label: 'Reading progress', + value: '$percent percent', + slider: true, + child: SliderTheme( + data: SliderTheme.of(context).copyWith( + activeTrackColor: theme.progressColor, + thumbColor: theme.handleColor, + ), + child: Slider( + value: normalized, + onChangeStart: enabled ? onProgressChangeStart : null, + onChanged: enabled ? onProgressChanged : null, + onChangeEnd: enabled ? onProgressChangeEnd : null, + ), + ), + ), + ), + SizedBox( + width: 64, + child: Text( + '$percent%', + key: const ValueKey('reader-progress-label'), + textAlign: TextAlign.center, + maxLines: 1, + semanticsLabel: '$percent percent read', + ), + ), + ReaderIconButton( + icon: Icons.chevron_right_rounded, + tooltip: 'Next', + onPressed: enabled ? onNext : null, + theme: theme, + ), + ], + ); + return ColoredBox( color: theme.chromeColor, child: IconTheme( @@ -212,64 +243,35 @@ final class ReaderProgressControls extends StatelessWidget { style: TextStyle(color: theme.onChromeColor), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - if (locationLabel != null) - Text( - locationLabel!, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: Theme.of(context).textTheme.labelMedium?.copyWith( - color: theme.onChromeColor, - ), - ), - Row( - children: [ - ReaderIconButton( - icon: Icons.chevron_left_rounded, - tooltip: 'Previous', - onPressed: enabled ? onPrevious : null, - theme: theme, - ), - Expanded( - child: Semantics( - label: 'Reading progress', - value: '$percent percent', - slider: true, - child: SliderTheme( - data: SliderTheme.of(context).copyWith( - activeTrackColor: theme.progressColor, - thumbColor: theme.handleColor, - ), - child: Slider( - value: normalized, - onChanged: enabled ? onProgressChanged : null, - onChangeEnd: enabled ? onProgressChangeEnd : null, + child: locationLabel == null + ? controls + : Stack( + children: [ + Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + locationLabel!, + textAlign: TextAlign.center, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: Theme.of(context).textTheme.labelMedium + ?.copyWith(color: theme.onChromeColor), ), - ), + // Keep the label 11 pixels above the track while the + // controls retain their full-height touch targets. + SizedBox(height: theme.minimumTargetSize / 2 + 11), + ], ), - ), - SizedBox( - width: 64, - child: Text( - '$percent%', - key: const ValueKey('reader-progress-label'), - textAlign: TextAlign.center, - maxLines: 1, - semanticsLabel: '$percent percent read', + PositionedDirectional( + start: 0, + end: 0, + bottom: 0, + child: controls, ), - ), - ReaderIconButton( - icon: Icons.chevron_right_rounded, - tooltip: 'Next', - onPressed: enabled ? onNext : null, - theme: theme, - ), - ], - ), - ], - ), + ], + ), ), ), ), diff --git a/lib/src/presentation/reader_highlight_interaction.dart b/lib/src/presentation/reader_highlight_interaction.dart new file mode 100644 index 0000000..6b934d2 --- /dev/null +++ b/lib/src/presentation/reader_highlight_interaction.dart @@ -0,0 +1,143 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import '../domain/reader_selection.dart'; +import 'reader_interaction_scope.dart'; +import 'reader_text_toolbar.dart'; + +typedef ReaderHighlightTarget = ({ReaderHighlight highlight, Rect bounds}); + +/// Observes short taps without taking drags or long presses away from selection. +final class ReaderHighlightInteraction extends StatefulWidget { + const ReaderHighlightInteraction({ + required this.hitTest, + required this.isSelecting, + required this.child, + super.key, + }); + + final ReaderHighlightTarget? Function(Offset position) hitTest; + final bool Function() isSelecting; + final Widget child; + + @override + State createState() => + _ReaderHighlightInteractionState(); +} + +final class _ReaderHighlightInteractionState + extends State { + final _menu = ContextMenuController(); + final _pointers = {}; + PointerDownEvent? _start; + ReaderHighlightTarget? _target; + + void _show(ReaderHighlightTarget target) { + final interactions = ReaderInteractionScope.maybeOf(context); + final items = []; + + for (final (label, action) in [ + ('Edit', interactions?.onEditHighlight), + ('Remove', interactions?.onRemoveHighlight), + ]) { + if (action != null) { + items.add( + ContextMenuButtonItem( + label: label, + onPressed: () { + _menu.remove(); + action(target.highlight); + }, + ), + ); + } + } + + items.add( + ContextMenuButtonItem( + type: ContextMenuButtonType.copy, + onPressed: () { + _menu.remove(); + Clipboard.setData( + ClipboardData(text: target.highlight.selection.text), + ); + }, + ), + ); + + _menu.show( + context: context, + contextMenuBuilder: (context) => TapRegion( + groupId: SelectableRegion, + onTapOutside: (_) => _menu.remove(), + child: Focus( + autofocus: true, + onKeyEvent: (_, event) { + if (event.logicalKey == LogicalKeyboardKey.escape) { + _menu.remove(); + return KeyEventResult.handled; + } + return KeyEventResult.ignored; + }, + child: ReaderTextToolbar(bounds: target.bounds, items: items), + ), + ), + ); + } + + @override + void dispose() { + _menu.remove(); + super.dispose(); + } + + @override + Widget build(BuildContext context) => Listener( + onPointerSignal: (_) => _menu.remove(), + onPointerDown: (event) { + _menu.remove(); + _pointers.add(event.pointer); + _target = null; + _start = event; + + if (_pointers.length != 1 || + event.buttons != kPrimaryButton || + widget.isSelecting()) { + return; + } + + _target = widget.hitTest(event.position); + + if (_target != null) { + ReaderInteractionScope.maybeOf(context)?.suppressTap(); + } + }, + onPointerMove: (event) { + if (_start != null && + (event.position - _start!.position).distance > kTouchSlop) { + _target = null; + } + }, + onPointerCancel: (event) { + _pointers.remove(event.pointer); + _target = null; + }, + onPointerUp: (event) { + _pointers.remove(event.pointer); + final target = _target; + final start = _start; + _target = null; + + if (target != null && + start != null && + event.pointer == start.pointer && + _pointers.isEmpty && + !widget.isSelecting() && + event.timeStamp - start.timeStamp < kLongPressTimeout) { + _show(target); + } + }, + child: widget.child, + ); +} diff --git a/lib/src/presentation/reader_interaction_scope.dart b/lib/src/presentation/reader_interaction_scope.dart new file mode 100644 index 0000000..512f147 --- /dev/null +++ b/lib/src/presentation/reader_interaction_scope.dart @@ -0,0 +1,39 @@ +import 'package:flutter/widgets.dart'; +import '../domain/reader_selection.dart'; + +/// Routes viewport boundary gestures through the shell's command queue. +final class ReaderInteractionScope extends InheritedWidget { + const ReaderInteractionScope({ + required this.onTurn, + required this.onSelectionChanged, + required this.suppressTap, + this.onAnnotate, + this.onNote, + this.onEditHighlight, + this.onRemoveHighlight, + this.highlights = const [], + required super.child, + super.key, + }); + + final ValueChanged onTurn; + final ValueChanged onSelectionChanged; + final VoidCallback suppressTap; + final ValueChanged? onAnnotate; + final ValueChanged? onNote; + final ValueChanged? onEditHighlight; + final ValueChanged? onRemoveHighlight; + final List highlights; + + static ReaderInteractionScope? maybeOf(BuildContext context) => + context.dependOnInheritedWidgetOfExactType(); + + @override + bool updateShouldNotify(ReaderInteractionScope oldWidget) => + onTurn != oldWidget.onTurn || + highlights != oldWidget.highlights || + onAnnotate != oldWidget.onAnnotate || + onNote != oldWidget.onNote || + onEditHighlight != oldWidget.onEditHighlight || + onRemoveHighlight != oldWidget.onRemoveHighlight; +} diff --git a/lib/src/presentation/reader_loading.dart b/lib/src/presentation/reader_loading.dart new file mode 100644 index 0000000..8407e08 --- /dev/null +++ b/lib/src/presentation/reader_loading.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; + +/// Keeps engine preparation visually consistent with the host's opening state. +final class ReaderLoadingScope extends InheritedWidget { + const ReaderLoadingScope({ + required this.builder, + required this.backgroundColor, + required super.child, + super.key, + }); + + final WidgetBuilder builder; + final Color backgroundColor; + + static ReaderLoadingScope? maybeOf(BuildContext context) => + context.dependOnInheritedWidgetOfExactType(); + + @override + bool updateShouldNotify(ReaderLoadingScope oldWidget) => + builder != oldWidget.builder || + backgroundColor != oldWidget.backgroundColor; +} + +final class ReaderLoading extends StatelessWidget { + const ReaderLoading({super.key}); + + @override + Widget build(BuildContext context) { + final scope = context + .dependOnInheritedWidgetOfExactType(); + return scope?.builder(context) ?? + const Center( + child: CircularProgressIndicator(semanticsLabel: 'Opening document'), + ); + } +} diff --git a/lib/src/presentation/reader_settings_panel.dart b/lib/src/presentation/reader_settings_panel.dart index e8531d6..63916e4 100644 --- a/lib/src/presentation/reader_settings_panel.dart +++ b/lib/src/presentation/reader_settings_panel.dart @@ -10,6 +10,8 @@ import 'reader_theme_data.dart'; final class ReaderSettingsPanel extends StatelessWidget { const ReaderSettingsPanel({ super.key, + this.showHeader = true, + this.scrollController, required this.snapshot, required this.close, required this.theme, @@ -19,6 +21,8 @@ final class ReaderSettingsPanel extends StatelessWidget { required this.onUpdatePreferences, }); + final bool showHeader; + final ScrollController? scrollController; final ReaderSnapshot snapshot; final VoidCallback close; final ReaderThemeData theme; @@ -32,206 +36,222 @@ final class ReaderSettingsPanel extends StatelessWidget { final capabilities = snapshot.capabilities ?? const ReaderCapabilities(); final preferences = snapshot.preferences; - return Column( + final content = ListView( + controller: scrollController, + shrinkWrap: !showHeader, + padding: EdgeInsets.all(theme.panelPadding), children: [ - ReaderPanelHeader( - title: 'Reading settings', - close: close, - theme: theme, - ), - Expanded( - child: ListView( - padding: EdgeInsets.all(theme.panelPadding), - children: [ - if (capabilities.supportsTextCustomization) ...[ - DropdownButtonFormField( - key: ValueKey(('reader-font', preferences.fontFamily)), - initialValue: - const [ - null, - 'serif', - 'sans-serif', - 'monospace', - ].contains(preferences.fontFamily) - ? preferences.fontFamily ?? 'system' - : 'system', - isExpanded: true, - decoration: const InputDecoration( - labelText: 'Typeface', - border: OutlineInputBorder(), - ), - items: const [ - DropdownMenuItem(value: 'system', child: Text('System')), - DropdownMenuItem(value: 'serif', child: Text('Serif')), - DropdownMenuItem( - value: 'sans-serif', - child: Text('Sans serif'), - ), - DropdownMenuItem( - value: 'monospace', - child: Text('Monospace'), + if (capabilities.supportsTextCustomization) ...[ + DropdownButtonFormField( + key: ValueKey(('reader-font', preferences.fontFamily)), + initialValue: + const [ + null, + 'serif', + 'sans-serif', + 'monospace', + ].contains(preferences.fontFamily) + ? preferences.fontFamily ?? 'system' + : 'system', + isExpanded: true, + decoration: const InputDecoration( + labelText: 'Typeface', + border: OutlineInputBorder(), + ), + items: const [ + DropdownMenuItem(value: 'system', child: Text('System')), + DropdownMenuItem(value: 'serif', child: Text('Serif')), + DropdownMenuItem(value: 'sans-serif', child: Text('Sans serif')), + DropdownMenuItem(value: 'monospace', child: Text('Monospace')), + ], + onChanged: enabled + ? (value) => _update( + preferences.copyWith( + fontFamily: value == 'system' ? null : value, ), - ], - onChanged: enabled - ? (value) => _update( - preferences.copyWith( - fontFamily: value == 'system' ? null : value, - ), - ) - : null, - ), - const SizedBox(height: 20), - _SettingSlider( - title: 'Font size', - value: preferences.fontSize.clamp(8, 72), - min: 8, - max: 72, - divisions: 64, - valueLabel: preferences.fontSize.round().toString(), - enabled: enabled, - isBusy: isBusy, - commandRevision: commandRevision, - onChangeEnd: (value) => - _update(preferences.copyWith(fontSize: value)), - ), - _SettingSlider( - title: 'Line height', - value: preferences.lineHeight.clamp(1, 2.5), - min: 1, - max: 2.5, - divisions: 15, - valueLabel: preferences.lineHeight.toStringAsFixed(1), - enabled: enabled, - isBusy: isBusy, - commandRevision: commandRevision, - onChangeEnd: (value) => - _update(preferences.copyWith(lineHeight: value)), - ), - _SettingSlider( - title: 'Margins', - value: preferences.pageMargins.left.clamp(0, 64), - min: 0, - max: 64, - divisions: 16, - valueLabel: preferences.pageMargins.left.round().toString(), - enabled: enabled, - isBusy: isBusy, - commandRevision: commandRevision, - onChangeEnd: (value) => _update( - preferences.copyWith(pageMargins: EdgeInsets.all(value)), - ), + ) + : null, + ), + const SizedBox(height: 20), + _SettingSlider( + title: 'Font size', + value: preferences.fontSize.clamp(8, 72), + min: 8, + max: 72, + divisions: 64, + valueLabel: preferences.fontSize.round().toString(), + enabled: enabled, + isBusy: isBusy, + commandRevision: commandRevision, + onChangeEnd: (value) => + _update(preferences.copyWith(fontSize: value)), + ), + _SettingSlider( + title: 'Line height', + value: preferences.lineHeight.clamp(1, 2.5), + min: 1, + max: 2.5, + divisions: 15, + valueLabel: preferences.lineHeight.toStringAsFixed(1), + enabled: enabled, + isBusy: isBusy, + commandRevision: commandRevision, + onChangeEnd: (value) => + _update(preferences.copyWith(lineHeight: value)), + ), + _SettingSlider( + title: 'Margins', + value: preferences.pageMargins.left.clamp(0, 64), + min: 0, + max: 64, + divisions: 16, + valueLabel: preferences.pageMargins.left.round().toString(), + enabled: enabled, + isBusy: isBusy, + commandRevision: commandRevision, + onChangeEnd: (value) => _update( + preferences.copyWith(pageMargins: EdgeInsets.all(value)), + ), + ), + const SizedBox(height: 12), + ], + if (capabilities.supportsPagination || + capabilities.supportsScrolling) ...[ + DropdownButtonFormField( + key: ValueKey(('reader-mode', preferences.layoutMode)), + initialValue: preferences.layoutMode, + isExpanded: true, + decoration: const InputDecoration( + labelText: 'Reading mode', + border: OutlineInputBorder(), + ), + items: [ + if (capabilities.supportsPagination) + const DropdownMenuItem( + value: ReaderLayoutMode.paginated, + child: Text('Paginated'), ), - const SizedBox(height: 12), - ], - if (capabilities.supportsPagination || - capabilities.supportsScrolling) ...[ - DropdownButtonFormField( - key: ValueKey(('reader-mode', preferences.layoutMode)), - initialValue: preferences.layoutMode, - isExpanded: true, - decoration: const InputDecoration( - labelText: 'Reading mode', - border: OutlineInputBorder(), - ), - items: [ - if (capabilities.supportsPagination) - const DropdownMenuItem( - value: ReaderLayoutMode.paginated, - child: Text('Paginated'), - ), - if (capabilities.supportsScrolling) - const DropdownMenuItem( - value: ReaderLayoutMode.scroll, - child: Text('Continuous scroll'), - ), - ], - onChanged: enabled - ? (value) { - if (value != null) { - _update(preferences.copyWith(layoutMode: value)); - } - } - : null, + if (capabilities.supportsScrolling) + const DropdownMenuItem( + value: ReaderLayoutMode.scroll, + child: Text('Continuous scroll'), ), - ], - if (capabilities.supportsColumnMode) ...[ - const SizedBox(height: 12), - DropdownButtonFormField( - key: ValueKey(('reader-columns', preferences.columnMode)), - initialValue: preferences.columnMode, - isExpanded: true, - decoration: const InputDecoration( - labelText: 'Columns', - border: OutlineInputBorder(), - ), - items: const [ - DropdownMenuItem( - value: ReaderColumnMode.automatic, - child: Text('Automatic'), - ), - DropdownMenuItem( - value: ReaderColumnMode.single, - child: Text('Single'), - ), - DropdownMenuItem( - value: ReaderColumnMode.double, - child: Text('Double'), - ), - ], - onChanged: enabled - ? (value) { - if (value != null) { - _update(preferences.copyWith(columnMode: value)); - } - } - : null, - ), - ], - const SizedBox(height: 20), - Text( - 'Page appearance', - style: Theme.of(context).textTheme.titleMedium, + ], + onChanged: enabled + ? (value) { + if (value != null) { + _update(preferences.copyWith(layoutMode: value)); + } + } + : null, + ), + ], + if (capabilities.supportsPageTurnAnimation && + preferences.layoutMode == ReaderLayoutMode.paginated) ...[ + const SizedBox(height: 12), + DropdownButtonFormField( + key: ValueKey(('reader-animation', preferences.pageTurnAnimation)), + initialValue: preferences.pageTurnAnimation, + isExpanded: true, + decoration: const InputDecoration( + labelText: 'Page turn animation', + border: OutlineInputBorder(), + ), + items: const [ + DropdownMenuItem(value: true, child: Text('Slide')), + DropdownMenuItem(value: false, child: Text('None')), + ], + onChanged: enabled + ? (value) { + if (value != null) { + _update(preferences.copyWith(pageTurnAnimation: value)); + } + } + : null, + ), + ], + if (capabilities.supportsColumnMode) ...[ + const SizedBox(height: 12), + DropdownButtonFormField( + key: ValueKey(('reader-columns', preferences.columnMode)), + initialValue: preferences.columnMode, + isExpanded: true, + decoration: const InputDecoration( + labelText: 'Columns', + border: OutlineInputBorder(), + ), + items: const [ + DropdownMenuItem( + value: ReaderColumnMode.automatic, + child: Text('Automatic'), ), - const SizedBox(height: 8), - Wrap( - spacing: 8, - runSpacing: 8, - children: [ - _AppearancePreset( - label: 'Light', - selected: - preferences.brightness == Brightness.light && - preferences.backgroundColor == const Color(0xffffffff), - background: const Color(0xffffffff), - foreground: const Color(0xff1b1b1b), - brightness: Brightness.light, - enabled: enabled, - onSelected: _applyAppearance, - ), - _AppearancePreset( - label: 'Sepia', - selected: - preferences.backgroundColor == const Color(0xfff4ecd8), - background: const Color(0xfff4ecd8), - foreground: const Color(0xff3d3527), - brightness: Brightness.light, - enabled: enabled, - onSelected: _applyAppearance, - ), - _AppearancePreset( - label: 'Night', - selected: preferences.brightness == Brightness.dark, - background: const Color(0xff151719), - foreground: const Color(0xffece7de), - brightness: Brightness.dark, - enabled: enabled, - onSelected: _applyAppearance, - ), - ], + DropdownMenuItem( + value: ReaderColumnMode.single, + child: Text('Single'), + ), + DropdownMenuItem( + value: ReaderColumnMode.double, + child: Text('Double'), ), ], + onChanged: enabled + ? (value) { + if (value != null) { + _update(preferences.copyWith(columnMode: value)); + } + } + : null, ), + ], + const SizedBox(height: 20), + Text('Page appearance', style: Theme.of(context).textTheme.titleMedium), + const SizedBox(height: 8), + Wrap( + spacing: 8, + runSpacing: 8, + children: [ + _AppearancePreset( + label: 'Light', + selected: + preferences.brightness == Brightness.light && + preferences.backgroundColor == const Color(0xffffffff), + background: const Color(0xffffffff), + foreground: const Color(0xff1b1b1b), + brightness: Brightness.light, + enabled: enabled, + onSelected: _applyAppearance, + ), + _AppearancePreset( + label: 'Sepia', + selected: preferences.backgroundColor == const Color(0xfff4ecd8), + background: const Color(0xfff4ecd8), + foreground: const Color(0xff3d3527), + brightness: Brightness.light, + enabled: enabled, + onSelected: _applyAppearance, + ), + _AppearancePreset( + label: 'Night', + selected: preferences.brightness == Brightness.dark, + background: const Color(0xff151719), + foreground: const Color(0xffece7de), + brightness: Brightness.dark, + enabled: enabled, + onSelected: _applyAppearance, + ), + ], + ), + ], + ); + if (!showHeader) return content; + return Column( + children: [ + ReaderPanelHeader( + title: 'Reading settings', + close: close, + theme: theme, ), + Expanded(child: content), ], ); } diff --git a/lib/src/presentation/reader_surface.dart b/lib/src/presentation/reader_surface.dart new file mode 100644 index 0000000..e0da3ff --- /dev/null +++ b/lib/src/presentation/reader_surface.dart @@ -0,0 +1,123 @@ +import 'dart:async'; + +import 'package:flutter/gestures.dart'; +import 'package:flutter/widgets.dart'; + +import 'reader_interaction_scope.dart'; +import '../domain/reader_selection.dart'; + +/// Observe taps without competing with selection or the viewport's drag arena. +final class ReaderSurface extends StatefulWidget { + const ReaderSurface({ + required this.enabled, + required this.onToggle, + required this.onTurn, + required this.child, + this.onAnnotate, + this.onNote, + this.onEditHighlight, + this.onRemoveHighlight, + this.highlights = const [], + super.key, + }); + + final bool enabled; + final VoidCallback onToggle; + final ValueChanged onTurn; + final Widget child; + final ValueChanged? onAnnotate; + final ValueChanged? onNote; + final ValueChanged? onEditHighlight; + final ValueChanged? onRemoveHighlight; + final List highlights; + + @override + State createState() => _ReaderSurfaceState(); +} + +final class _ReaderSurfaceState extends State { + final Set _pointers = {}; + Offset? _start; + Duration _startedAt = Duration.zero; + bool _cancelled = false; + bool _selection = false; + bool _blocked = false; + Timer? _tap; + Timer? _hold; + + @override + void dispose() { + _tap?.cancel(); + _hold?.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) => ReaderInteractionScope( + onTurn: widget.onTurn, + onAnnotate: widget.onAnnotate, + onNote: widget.onNote, + onEditHighlight: widget.onEditHighlight, + onRemoveHighlight: widget.onRemoveHighlight, + highlights: widget.highlights, + onSelectionChanged: (selected) { + if (selected || _selection) { + _cancelled = true; + _tap?.cancel(); + } + _selection = selected; + }, + suppressTap: () { + _blocked = true; + _cancelled = true; + _tap?.cancel(); + }, + child: LayoutBuilder( + builder: (context, constraints) => Listener( + behavior: HitTestBehavior.translucent, + onPointerDown: (event) { + final doubleTap = _tap?.isActive ?? false; + _tap?.cancel(); + _pointers.add(event.pointer); + if (_pointers.length == 1) { + _start = event.localPosition; + _startedAt = event.timeStamp; + _hold?.cancel(); + _hold = Timer(kLongPressTimeout, () => _cancelled = true); + _cancelled = doubleTap || _selection || _blocked; + } else { + _cancelled = true; + } + }, + onPointerMove: (event) { + if (_start != null && + (event.localPosition - _start!).distance > kTouchSlop) { + _cancelled = true; + } + }, + onPointerCancel: (event) { + _hold?.cancel(); + _pointers.remove(event.pointer); + _cancelled = true; + }, + onPointerUp: (event) { + _hold?.cancel(); + _pointers.remove(event.pointer); + _blocked = false; + if (!widget.enabled || + _cancelled || + _pointers.isNotEmpty || + event.timeStamp - _startedAt >= kLongPressTimeout) { + return; + } + _tap = Timer(kDoubleTapTimeout, () { + if (mounted && widget.enabled && !_cancelled && !_selection) { + widget.onToggle(); + } + }); + }, + child: widget.child, + ), + ), + ); +} diff --git a/lib/src/presentation/reader_swipe_tracker.dart b/lib/src/presentation/reader_swipe_tracker.dart new file mode 100644 index 0000000..21b565b --- /dev/null +++ b/lib/src/presentation/reader_swipe_tracker.dart @@ -0,0 +1,71 @@ +import 'package:flutter/gestures.dart'; + +/// Raw boundary gestures must yield to selection, long presses and multi-touch. +final class ReaderSwipeTracker { + final Set _pointers = {}; + PointerDownEvent? _start; + bool _cancelled = false; + bool _dragging = false; + bool _selected = false; + + void selectionChanged(bool selected) { + if (selected || _selected) { + _cancelled = true; + } + + _selected = selected; + } + + void start(PointerDownEvent event) { + _pointers.add(event.pointer); + + if (_pointers.length != 1) { + _cancelled = true; + return; + } + + _start = event; + _dragging = false; + _cancelled = _selected || event.kind != PointerDeviceKind.touch; + } + + void update(PointerMoveEvent event) { + final start = _start; + + if (start == null || _cancelled || event.pointer != start.pointer) { + return; + } + + if (!_dragging && event.timeStamp - start.timeStamp >= kLongPressTimeout) { + _cancelled = true; + return; + } + + if ((event.position - start.position).distance > kTouchSlop) { + _dragging = true; + } + } + + Offset? end(PointerUpEvent event) { + final start = _start; + _pointers.remove(event.pointer); + + if (start == null || event.pointer != start.pointer) { + return null; + } + + _start = null; + + if (_cancelled || _selected || !_dragging || _pointers.isNotEmpty) { + return null; + } + + return event.position - start.position; + } + + void cancel(PointerCancelEvent event) { + _pointers.remove(event.pointer); + _cancelled = true; + _start = null; + } +} diff --git a/lib/src/presentation/reader_text_toolbar.dart b/lib/src/presentation/reader_text_toolbar.dart new file mode 100644 index 0000000..65f09f5 --- /dev/null +++ b/lib/src/presentation/reader_text_toolbar.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; + +/// Positions actions against the actual glyphs rather than a secondary-click anchor. +final class ReaderTextToolbar extends StatelessWidget { + const ReaderTextToolbar({ + required this.bounds, + required this.items, + super.key, + }); + + final Rect bounds; + final List items; + + @override + Widget build(BuildContext context) => TextSelectionToolbar( + anchorAbove: bounds.topCenter, + anchorBelow: bounds.bottomCenter, + children: [ + for (var index = 0; index < items.length; index++) + TextSelectionToolbarTextButton( + padding: TextSelectionToolbarTextButton.getPadding( + index, + items.length, + ), + onPressed: items[index].onPressed, + child: Text( + AdaptiveTextSelectionToolbar.getButtonLabel(context, items[index]), + ), + ), + ], + ); +} diff --git a/lib/src/presentation/reader_theme_data.dart b/lib/src/presentation/reader_theme_data.dart index 7568516..1dea375 100644 --- a/lib/src/presentation/reader_theme_data.dart +++ b/lib/src/presentation/reader_theme_data.dart @@ -14,7 +14,7 @@ final class ReaderThemeData { this.compactBreakpoint = 720, this.sidePanelWidth = 320, this.compactToolbarHeight = 56, - this.wideToolbarHeight = 64, + this.wideToolbarHeight = 56, this.minimumTargetSize = 48, this.panelPadding = 16, }); @@ -23,9 +23,9 @@ final class ReaderThemeData { final colors = theme.colorScheme; return ReaderThemeData( - chromeColor: colors.surfaceContainer, + chromeColor: colors.surface, surfaceColor: colors.surface, - panelColor: colors.surfaceContainerLow, + panelColor: colors.surface, accentColor: colors.primary, progressColor: colors.primary, handleColor: colors.primary, diff --git a/lib/src/presentation/reader_ui_builders.dart b/lib/src/presentation/reader_ui_builders.dart index 0e5667d..39960ea 100644 --- a/lib/src/presentation/reader_ui_builders.dart +++ b/lib/src/presentation/reader_ui_builders.dart @@ -2,17 +2,48 @@ import 'package:flutter/widgets.dart'; import '../controller/reader_controller.dart'; import '../domain/reader_document.dart'; +import '../domain/reader_locator.dart'; import '../domain/reader_snapshot.dart'; typedef ReaderToolbarBuilder = Widget Function(BuildContext context, ReaderToolbarContext state); typedef ReaderPanelBuilder = Widget Function(BuildContext context, ReaderPanelContext state); +typedef ReaderPanelHeaderBuilder = + Widget Function(BuildContext context, String title); typedef ReaderStateBuilder = Widget Function(BuildContext context, ReaderStateContext state); typedef ReaderViewportBuilder = Widget Function(BuildContext context, ReaderViewportContext state); +/// Creates an unpushed compact panel route. The reader pushes and tracks it so +/// document replacement and disposal dismiss only the reader's own panel. +typedef ReaderPanelRouteBuilder = + Route Function(BuildContext context, ReaderPanelRouteContext panel); + +/// Builds live panel content without a header, surface, or drag handle. +/// Attach [scrollController] to the host sheet's coordinated scrolling surface. +typedef ReaderPanelContentBuilder = + Widget Function(BuildContext context, ScrollController? scrollController); + +enum ReaderPanelKind { tableOfContents, settings } + +final class ReaderPanelRouteContext { + const ReaderPanelRouteContext({ + required this.kind, + required this.title, + required this.buildContent, + }); + + final ReaderPanelKind kind; + final String title; + + /// Content subscribes to reader changes and uses the theme at this context. + /// Navigation and settings still run through the reader's command queue. + /// Existing custom panel builders remain responsible for their own content. + final ReaderPanelContentBuilder buildContent; +} + final class ReaderToolbarContext { const ReaderToolbarContext({ required this.document, @@ -22,7 +53,7 @@ final class ReaderToolbarContext { this.onBack, this.isBusy = false, this.toggleControls, - this.controlsVisible = true, + this.controlsVisible = false, }); final ReaderDocument document; @@ -43,8 +74,18 @@ final class ReaderPanelContext { required this.controller, required this.close, this.isBusy = false, + this.showHeader = true, + this.buildContents, + this.buildHeader, + this.navigate, }); + final bool showHeader; + final WidgetBuilder? buildContents; + + /// Builds the standard panel header with the reader's chrome and close action. + final ReaderPanelHeaderBuilder? buildHeader; + final ValueChanged? navigate; final ReaderSnapshot snapshot; final ReaderController controller; final VoidCallback close; @@ -80,6 +121,8 @@ final class ReaderViewportContext { final class ReaderUiBuilders { const ReaderUiBuilders({ this.toolbar, + this.toolbarActions, + this.compactPanelRoute, this.tableOfContents, this.settings, this.loading, @@ -89,8 +132,15 @@ final class ReaderUiBuilders { }); final ReaderToolbarBuilder? toolbar; + final List Function(BuildContext context, ReaderToolbarContext state)? + toolbarActions; + + /// Overrides compact panel presentation; wide side panels are unchanged. + final ReaderPanelRouteBuilder? compactPanelRoute; final ReaderPanelBuilder? tableOfContents; final ReaderPanelBuilder? settings; + + /// Used while opening the document and preparing its first readable pages. final ReaderStateBuilder? loading; final ReaderStateBuilder? error; final ReaderStateBuilder? empty; diff --git a/test/controller/reader_controller_test.dart b/test/controller/reader_controller_test.dart index 4d6f4e3..c85a5c1 100644 --- a/test/controller/reader_controller_test.dart +++ b/test/controller/reader_controller_test.dart @@ -102,7 +102,6 @@ void main() { test('delegates loading to the matching engine', () async { final initialLocator = EpubReaderLocator( - cfi: 'epubcfi(/6/2!/4/1:0)', spineIndex: 0, localProgression: 0, totalProgression: 0, @@ -120,7 +119,6 @@ void main() { test('mirrors engine state and emits locator changes once', () async { await controller.load(document); final locator = EpubReaderLocator( - cfi: 'epubcfi(/6/6!/4/1:4)', spineIndex: 2, localProgression: 0.4, totalProgression: 0.5, @@ -135,10 +133,44 @@ void main() { expect(notifications, 1); }); + test( + 'command causes are scoped and subsequent engine navigation is a viewport change', + () async { + await controller.load(document); + final jump = EpubReaderLocator( + spineIndex: 1, + localProgression: 0, + totalProgression: .2, + ); + final viewport = EpubReaderLocator( + spineIndex: 1, + localProgression: .5, + totalProgression: .3, + ); + final observed = []; + controller.addListener(() => observed.add(controller.navigationCause)); + engine.locatorOnNavigation = jump; + engine.navigationGate = Completer(); + final command = controller.goTo(jump); + expect(observed.last, ReaderNavigationCause.jump); + engine.navigationGate!.complete(); + await command; + engine.emitLocator(viewport); + expect(observed.last, ReaderNavigationCause.viewport); + await controller.goNext(); + engine.emitLocator(jump); + expect(observed.last, ReaderNavigationCause.viewport); + await controller.updatePreferences( + const ReaderPreferences(fontSize: 20), + ); + engine.emitLocator(viewport); + expect(observed.last, ReaderNavigationCause.viewport); + }, + ); + test('delegates navigation and current location', () async { await controller.load(document); final locator = EpubReaderLocator( - cfi: 'epubcfi(/6/4!/4/1:0)', spineIndex: 1, localProgression: 0.1, totalProgression: 0.2, @@ -357,7 +389,6 @@ void main() { final load = controller.load(document); await started.future; final locator = EpubReaderLocator( - cfi: 'epubcfi(/6/2)', spineIndex: 0, localProgression: 0, totalProgression: 0, @@ -390,7 +421,6 @@ void main() { engine.loadFailure = failure; await expectLater(controller.load(document), throwsA(same(failure))); final locator = EpubReaderLocator( - cfi: 'epubcfi(/6/2)', spineIndex: 0, localProgression: 0, totalProgression: 0, @@ -483,7 +513,6 @@ void main() { onLocatorChanged: (_) => throw callbackFailure, ); final locator = EpubReaderLocator( - cfi: 'epubcfi(/6/2)', spineIndex: 0, localProgression: 0, totalProgression: 0, diff --git a/test/domain/reader_activity_test.dart b/test/domain/reader_activity_test.dart new file mode 100644 index 0000000..769fa84 --- /dev/null +++ b/test/domain/reader_activity_test.dart @@ -0,0 +1,110 @@ +import 'dart:convert'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus_reader/papyrus_reader.dart'; + +void main() { + final epub = EpubReaderLocator( + spineIndex: 0, + localProgression: .5, + totalProgression: .25, + textOffset: 50, + ); + final pdf = PdfReaderLocator( + pageIndex: 2, + pageOffset: .1, + totalProgression: .4, + ); + for (final locator in [epub, pdf]) { + test( + 'activity round-trips version 1 ${locator.runtimeType} locators and coverage', + () { + final source = [ + if (locator is EpubReaderLocator) + const ReaderContentCoverage( + key: 'chapter:0', + start: .25, + end: .5, + chapterCount: 2, + ) + else + const ReaderContentCoverage( + key: 'pdf:2', + start: 0, + end: 1, + pdfPageIndex: 2, + ), + ]; + final event = ReaderActivityEvent( + ready: true, + visible: true, + cause: ReaderNavigationCause.viewport, + locator: locator, + coverage: source, + atEnd: true, + ); + source.clear(); + final json = + jsonDecode(jsonEncode(event.toJson())) as Map; + final restored = ReaderActivityEvent.fromJson(json); + expect(restored, event); + expect(restored.hashCode, event.hashCode); + expect(restored.locator, ReaderLocator.fromJson(locator.toJson())); + expect(restored.coverage, hasLength(1)); + expect(() => restored.coverage.clear(), throwsUnsupportedError); + }, + ); + } + test('activity rejects malformed and unsupported representations', () { + final valid = ReaderActivityEvent( + ready: true, + visible: true, + cause: ReaderNavigationCause.restore, + ).toJson(); + for (final patch in >[ + {'version': 2}, + {'ready': 1}, + {'visible': null}, + {'atEnd': 'true'}, + {'cause': 'unknown'}, + {'locator': 7}, + { + 'coverage': [7], + }, + { + 'locator': {...pdf.toJson(), 'version': 2}, + }, + ]) { + expect( + () => ReaderActivityEvent.fromJson({...valid, ...patch}), + throwsFormatException, + ); + } + }); + test( + 'coverage validates versions, normalized extents and calibration identity', + () { + final valid = const ReaderContentCoverage( + key: 'chapter:0', + start: 0, + end: 1, + ).toJson(); + for (final patch in >[ + {'version': 2}, + {'key': ''}, + {'start': -1}, + {'end': 2}, + {'start': .75, 'end': .5}, + {'start': double.nan}, + {'chapterCount': 0}, + {'pdfPageIndex': -1}, + {'chapterCount': 'two'}, + ]) { + expect( + () => ReaderContentCoverage.fromJson({...valid, ...patch}), + throwsFormatException, + ); + } + }, + ); +} diff --git a/test/domain/reader_locator_test.dart b/test/domain/reader_locator_test.dart index b22826b..5f0b7e9 100644 --- a/test/domain/reader_locator_test.dart +++ b/test/domain/reader_locator_test.dart @@ -5,7 +5,6 @@ void main() { group('ReaderLocator', () { test('round trips an EPUB locator through versioned JSON', () { final locator = EpubReaderLocator( - cfi: 'epubcfi(/6/4!/4/2/1:0)', spineIndex: 1, localProgression: 0.25, totalProgression: 0.4, @@ -17,7 +16,6 @@ void main() { expect(decoded.toJson(), { 'version': 1, 'type': 'epub', - 'cfi': 'epubcfi(/6/4!/4/2/1:0)', 'spineIndex': 1, 'localProgression': 0.25, 'totalProgression': 0.4, @@ -65,22 +63,9 @@ void main() { }); group('EpubReaderLocator construction', () { - test('rejects an empty CFI', () { - expect( - () => EpubReaderLocator( - cfi: '', - spineIndex: 0, - localProgression: 0, - totalProgression: 0, - ), - throwsArgumentError, - ); - }); - test('rejects a negative spine index', () { expect( () => EpubReaderLocator( - cfi: 'epubcfi(/6/2)', spineIndex: -1, localProgression: 0, totalProgression: 0, @@ -92,7 +77,6 @@ void main() { test('rejects non-finite local progression', () { expect( () => EpubReaderLocator( - cfi: 'epubcfi(/6/2)', spineIndex: 0, localProgression: double.nan, totalProgression: 0, @@ -104,7 +88,6 @@ void main() { test('rejects local progression outside zero and one', () { expect( () => EpubReaderLocator( - cfi: 'epubcfi(/6/2)', spineIndex: 0, localProgression: -0.01, totalProgression: 0, @@ -113,7 +96,6 @@ void main() { ); expect( () => EpubReaderLocator( - cfi: 'epubcfi(/6/2)', spineIndex: 0, localProgression: 1.01, totalProgression: 0, @@ -125,7 +107,6 @@ void main() { test('rejects non-finite total progression', () { expect( () => EpubReaderLocator( - cfi: 'epubcfi(/6/2)', spineIndex: 0, localProgression: 0, totalProgression: double.infinity, @@ -137,7 +118,6 @@ void main() { test('rejects total progression outside zero and one', () { expect( () => EpubReaderLocator( - cfi: 'epubcfi(/6/2)', spineIndex: 0, localProgression: 0, totalProgression: -0.01, @@ -146,7 +126,6 @@ void main() { ); expect( () => EpubReaderLocator( - cfi: 'epubcfi(/6/2)', spineIndex: 0, localProgression: 0, totalProgression: 1.01, @@ -160,19 +139,11 @@ void main() { Map validJson() => { 'version': 1, 'type': 'epub', - 'cfi': 'epubcfi(/6/2)', 'spineIndex': 0, 'localProgression': 0.25, 'totalProgression': 0.5, }; - test('rejects an empty CFI', () { - expect( - () => ReaderLocator.fromJson(validJson()..['cfi'] = ''), - throwsFormatException, - ); - }); - test('rejects a negative spine index', () { expect( () => ReaderLocator.fromJson(validJson()..['spineIndex'] = -1), diff --git a/test/domain/reader_preferences_test.dart b/test/domain/reader_preferences_test.dart index 49f4828..770d145 100644 --- a/test/domain/reader_preferences_test.dart +++ b/test/domain/reader_preferences_test.dart @@ -12,7 +12,7 @@ void main() { expect(preferences.pageMargins, const EdgeInsets.all(24)); expect(preferences.brightness, Brightness.light); expect(preferences.layoutMode, ReaderLayoutMode.paginated); - expect(preferences.columnMode, ReaderColumnMode.automatic); + expect(preferences.columnMode, ReaderColumnMode.single); }); test('copyWith changes selected values and preserves the rest', () { diff --git a/test/domain/reader_snapshot_test.dart b/test/domain/reader_snapshot_test.dart index a9e0614..b41f0b2 100644 --- a/test/domain/reader_snapshot_test.dart +++ b/test/domain/reader_snapshot_test.dart @@ -5,7 +5,6 @@ import 'package:papyrus_reader/papyrus_reader.dart'; void main() { final locator = EpubReaderLocator( - cfi: 'epubcfi(/6/2)', spineIndex: 0, localProgression: 0, totalProgression: 0, @@ -32,6 +31,25 @@ void main() { expect(() => snapshot.toc.add(entry), throwsUnsupportedError); }); + test('ready snapshots defensively copy content coverage', () { + const coverage = ReaderContentCoverage( + key: 'chapter:0', + start: 0, + end: .5, + chapterCount: 2, + ); + final source = [coverage]; + final snapshot = ReaderReadySnapshot( + document: document, + preferences: const ReaderPreferences(), + capabilities: const ReaderCapabilities(), + coverage: source, + ); + source.clear(); + expect(snapshot.coverage, [coverage]); + expect(() => snapshot.coverage.clear(), throwsUnsupportedError); + }); + test('ReaderTocEntry defensively copies nested child source lists', () { final child = ReaderTocEntry(title: 'Section', locator: locator); final source = [child]; diff --git a/test/engine/epub_content_renderer_test.dart b/test/engine/epub_content_renderer_test.dart index 24ffd99..aea6798 100644 --- a/test/engine/epub_content_renderer_test.dart +++ b/test/engine/epub_content_renderer_test.dart @@ -1,8 +1,52 @@ -import 'package:flutter/widgets.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:papyrus_reader/papyrus_reader.dart'; +import '../support/in_process_epub_worker.dart'; +import '../support/synthetic_epub.dart'; + void main() { + testWidgets('progress seeks restore the custom renderer within a chapter', ( + tester, + ) async { + final renderer = _TrackingRenderer(); + final engine = EpubReaderEngine( + renderer: renderer, + workerFactory: () async => InProcessEpubWorker(), + ); + addTearDown(engine.dispose); + await engine.load( + ReaderDocument( + id: 'custom-scroll', + format: ReaderFormat.epub, + loadBytes: () async => syntheticEpub( + singleSpine: true, + firstChapterBody: + '

${List.filled(200, "Scrollable text").join(" ")}

', + ), + ), + preferences: const ReaderPreferences(layoutMode: ReaderLayoutMode.scroll), + ); + await tester.pumpWidget( + MaterialApp( + home: ListenableBuilder( + listenable: engine, + builder: (context, _) => engine.buildViewport(context), + ), + ), + ); + await tester.pumpAndSettle(); + for (final progress in [.25, .75, 1.0]) { + await pumpReaderCommand(tester, engine.goToProgress(progress)); + expect( + renderer.controller.offset / + renderer.controller.position.maxScrollExtent, + closeTo(progress, .01), + ); + expect(engine.locator.totalProgression, closeTo(progress, .01)); + } + }); + testWidgets('programmatic restoration does not publish progress', ( tester, ) async { diff --git a/test/engine/epub_page_layout_test.dart b/test/engine/epub_page_layout_test.dart new file mode 100644 index 0000000..52e75c3 --- /dev/null +++ b/test/engine/epub_page_layout_test.dart @@ -0,0 +1,155 @@ +import 'dart:collection'; + +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus_reader/papyrus_reader.dart'; +import 'package:papyrus_reader/src/engine/epub/epub_page_layout.dart'; +import 'package:papyrus_reader/src/engine/epub/epub_rich_layout.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + test('a huge unchaptered stream measures only the requested pages', () async { + final source = _CountingBlocks(10000); + final layout = EpubPageLayout( + paginateEpub( + EpubContentBlocks(source), + contentSize: const Size(280, 60), + preferences: const ReaderPreferences(), + textScaler: TextScaler.noScaling, + direction: TextDirection.ltr, + cancelled: () => false, + ), + ); + addTearDown(layout.dispose); + await layout.ensure(count: 4); + expect(layout.pages, hasLength(4)); + expect(layout.complete, isFalse); + expect(source.reads, lessThan(12)); + final first = layout.pages.first; + + await Future.wait([layout.ensure(count: 8), layout.ensure(count: 10)]); + expect(layout.pages, hasLength(10)); + expect(identical(first, layout.pages.first), isTrue); + expect(layout.pages.map((page) => page.offset).toSet(), hasLength(10)); + expect(source.reads, lessThan(30)); + + await layout.ensure(offset: 4000); + expect(layout.pages.last.offset, greaterThan(4000)); + expect(source.reads, lessThan(100)); + }); + + test( + 'background totals do not expand or consume the reading window', + () async { + Stream source() async* { + for (var index = 0; index < 100; index++) { + final block = EpubContentBlock({ + 'kind': 'p', + 'offset': index * 100, + 'length': 90, + 'runs': [ + {'text': 'A page'}, + ], + }); + yield EpubRichPage([EpubPageFragment(block, 0, 90, 30)]); + } + } + + final layout = EpubPageLayout(source(), countSource: source); + addTearDown(layout.dispose); + await layout.ensure(count: 4); + expect(layout.pageCount, isNull); + expect(layout.estimatedPageCount(10000), 100); + await layout.countPages(); + expect(layout.pageCount, 100); + expect(layout.pages, hasLength(4)); + expect(layout.complete, isFalse); + await layout.ensure(count: 5); + expect(layout.pages.last.offset, 400); + expect(layout.pageCount, 100); + }, + ); + + test('a failed background count cannot publish a truncated total', () async { + Stream source() async* { + yield const EpubRichPage([]); + throw StateError('Unreadable content'); + } + + final layout = EpubPageLayout(source(), countSource: source); + addTearDown(layout.dispose); + await layout.ensure(count: 1); + await expectLater(layout.countPages(), throwsStateError); + await layout.countPages(); + expect(layout.pageCount, isNull); + }); + + testWidgets('disposing a cursor cancels pending background yields', ( + tester, + ) async { + final layout = EpubPageLayout(const Stream.empty()); + final waiting = layout.yieldWork(); + layout.dispose(); + await waiting; + }); + + test('a layout failure must not become a false end of the book', () async { + Stream source() async* { + yield const EpubRichPage([]); + throw StateError('Unreadable content'); + } + + final layout = EpubPageLayout(source()); + addTearDown(layout.dispose); + await layout.ensure(count: 1); + await expectLater(layout.ensure(count: 2), throwsStateError); + await expectLater(layout.ensure(count: 2), throwsStateError); + expect(layout.complete, isFalse); + expect(layout.pages, hasLength(1)); + }); + + test('cancelling speculation does not discard a foreground cursor', () async { + final layout = EpubPageLayout( + Stream.fromIterable([ + for (var i = 0; i < 100; i++) const EpubRichPage([]), + ]), + ); + addTearDown(layout.dispose); + await layout.ensure(count: 3); + await layout.ensure(toEnd: true, cancelled: () => true); + expect(layout.pages, hasLength(3)); + await layout.ensure(count: 5); + expect(layout.pages, hasLength(5)); + layout.dispose(); + await layout.ensure(toEnd: true); + expect(layout.pages, hasLength(5)); + }); +} + +final class _CountingBlocks extends ListBase { + _CountingBlocks(this.length); + @override + final int length; + int reads = 0; + + @override + Object? operator [](int index) { + reads++; + final text = 'Passage $index continues without any chapter break. '; + return { + 'kind': 'p', + 'offset': index * 100, + 'length': text.length, + 'runs': [ + {'text': text}, + ], + }; + } + + @override + set length(int value) => throw UnsupportedError('Read-only'); + @override + void operator []=(int index, Object? value) => + throw UnsupportedError('Read-only'); +} diff --git a/test/engine/epub_page_loading_test.dart b/test/engine/epub_page_loading_test.dart new file mode 100644 index 0000000..b3c37ea --- /dev/null +++ b/test/engine/epub_page_loading_test.dart @@ -0,0 +1,58 @@ +import 'dart:async'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus_reader/papyrus_reader.dart'; +import 'package:papyrus_reader/src/engine/epub/worker/epub_worker.dart'; + +import '../support/in_process_epub_worker.dart'; +import '../support/synthetic_epub.dart'; + +void main() { + test( + 'navigation shares an in-flight prefetch and reuses the initial content', + () async { + final worker = _GatedWorker(); + final engine = EpubReaderEngine(workerFactory: () async => worker); + addTearDown(engine.dispose); + await engine.load( + ReaderDocument( + id: 'shared', + format: ReaderFormat.epub, + loadBytes: () async => syntheticEpub(), + ), + preferences: const ReaderPreferences(), + ); + await engine.chapterContent(0); + expect(worker.reads[0], 1); + + final prefetch = engine.chapterContent(1); + final turn = engine.goNext(); + await Future.delayed(Duration.zero); + expect(worker.reads[1], 1); + expect(engine.locator.spineIndex, 0); + worker.gate.complete(); + await Future.wait([prefetch, turn]); + expect(engine.locator.spineIndex, 1); + expect(worker.reads[1], 1); + }, + ); +} + +final class _GatedWorker implements EpubWorker { + final delegate = InProcessEpubWorker(); + final gate = Completer(); + final reads = {}; + + @override + Future> request(String command, Object? argument) async { + if (command == 'chapter') { + final index = argument as int; + reads.update(index, (count) => count + 1, ifAbsent: () => 1); + if (index == 1) await gate.future; + } + return delegate.request(command, argument); + } + + @override + void dispose() => delegate.dispose(); +} diff --git a/test/engine/epub_progress_index_test.dart b/test/engine/epub_progress_index_test.dart new file mode 100644 index 0000000..eed3c19 --- /dev/null +++ b/test/engine/epub_progress_index_test.dart @@ -0,0 +1,24 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus_reader/src/engine/epub/epub_progress_index.dart'; + +void main() { + test( + 'a cover and a long chapter receive content weights, not equal shares', + () { + final index = EpubProgressIndex([2, 998]); + expect(index.progress(0, offset: 0), 0); + expect(index.progress(1, offset: 0), .002); + expect(index.progress(1, offset: 498), .5); + expect(index.position(.5), (chapter: 1, offset: 498)); + expect(index.position(0), (chapter: 0, offset: 0)); + expect(index.position(1), (chapter: 1, offset: 998)); + }, + ); + + test('empty spine items remain addressable without division by zero', () { + final index = EpubProgressIndex([0, 0]); + expect(index.progress(0), 0); + expect(index.progress(1), .5); + expect(index.position(1), (chapter: 1, offset: 0)); + }); +} diff --git a/test/engine/epub_reader_engine_test.dart b/test/engine/epub_reader_engine_test.dart index d110964..a970042 100644 --- a/test/engine/epub_reader_engine_test.dart +++ b/test/engine/epub_reader_engine_test.dart @@ -50,6 +50,21 @@ void main() { final locator = await engine.currentLocator() as EpubReaderLocator; expect(locator.spineIndex, 1); expect(locator.textOffset, greaterThan(0)); + final section = + engine.snapshot.toc.first.children.single.locator + as EpubReaderLocator; + expect(section.textOffset, locator.textOffset); + expect(section.localProgression, greaterThan(0)); + final chapter = engine.snapshot.toc.first.locator as EpubReaderLocator; + expect(chapter.spineIndex, 0); + expect(chapter.textOffset, 0); + expect(chapter.localProgression, 0); + await engine.goPrevious(); + expect( + (engine.snapshot.toc.first.children.single.locator as EpubReaderLocator) + .textOffset, + section.textOffset, + ); }); test( 'lazily loads a valid EPUB and builds nested table of contents', @@ -83,7 +98,6 @@ void main() { final engine = testEpubEngine(); final book = document(syntheticEpub()); final restored = EpubReaderLocator( - cfi: 'epubcfi(/6/4!/4/1:0)', spineIndex: 1, localProgression: 0.2, totalProgression: 0.6, @@ -94,7 +108,14 @@ void main() { initialLocator: restored, preferences: const ReaderPreferences(), ); - expect(await engine.currentLocator(), restored); + final restoredPosition = + await engine.currentLocator() as EpubReaderLocator; + expect(restoredPosition.spineIndex, restored.spineIndex); + expect(restoredPosition.localProgression, restored.localProgression); + expect( + restoredPosition.totalProgression, + isNot(restored.totalProgression), + ); expect(engine.currentChapterHtml, contains('Chapter Two')); await engine.goPrevious(); @@ -110,7 +131,6 @@ void main() { await engine.goTo( EpubReaderLocator( - cfi: 'epubcfi(/6/6!/4/1:0)', spineIndex: 2, localProgression: 0, totalProgression: 1, @@ -151,8 +171,8 @@ void main() { final middle = await engine.currentLocator() as EpubReaderLocator; expect(middle.spineIndex, 1); - expect(middle.localProgression, 0.5); - expect(middle.totalProgression, 0.5); + expect(middle.textOffset, greaterThan(0)); + expect(middle.totalProgression, closeTo(0.5, .01)); expect(engine.currentChapterHtml, contains('Chapter Two')); await engine.goToProgress(1); @@ -185,7 +205,6 @@ void main() { engine.load( document(syntheticEpub()), initialLocator: EpubReaderLocator( - cfi: 'epubcfi(/6/18!/4/1:0)', spineIndex: 8, localProgression: 0, totalProgression: 1, @@ -297,7 +316,6 @@ void main() { final paginator = TrackingEpubPaginator(); final engine = testEpubEngine(paginator: paginator); final restored = EpubReaderLocator( - cfi: 'epubcfi(/6/4!/4/1:0)', spineIndex: 1, localProgression: 0, totalProgression: 1 / 3, @@ -336,7 +354,6 @@ void main() { final previousHtml = engine.currentChapterHtml; final previousClearCount = paginator.clearCount; final restored = EpubReaderLocator( - cfi: 'epubcfi(/6/4!/4/1:0)', spineIndex: 1, localProgression: 0, totalProgression: 1 / 3, @@ -563,7 +580,6 @@ void main() { await tester.pumpAndSettle(); final locator = await engine.currentLocator() as EpubReaderLocator; - expect(locator.cfi, startsWith('epubcfi(')); expect(locator.localProgression, greaterThan(0)); }); @@ -574,7 +590,6 @@ void main() { await engine.load( document(syntheticEpub(longChapter: true)), initialLocator: EpubReaderLocator( - cfi: 'epubcfi(/6/2!/4/1:0)', spineIndex: 0, localProgression: 0.5, totalProgression: 0.25, @@ -608,7 +623,6 @@ void main() { await engine.goTo( EpubReaderLocator( - cfi: 'epubcfi(/6/2!/4/1:80)', spineIndex: 0, localProgression: 0.8, totalProgression: 0.4, @@ -632,7 +646,6 @@ void main() { await engine.load( document(syntheticEpub(longChapter: true)), initialLocator: EpubReaderLocator( - cfi: 'epubcfi(/6/2!/4/1:0)', spineIndex: 0, localProgression: 0.5, totalProgression: 0.25, @@ -711,7 +724,7 @@ void main() { layoutMode: ReaderLayoutMode.scroll, ), ); - await engine.goNext(); + await pumpReaderCommand(tester, engine.goNext()); Widget viewport() { return Directionality( @@ -732,13 +745,14 @@ void main() { var locator = await engine.currentLocator() as EpubReaderLocator; expect(locator.spineIndex, 1); expect(locator.localProgression, closeTo(1, 0.001)); - expect(locator.totalProgression, closeTo(2 / 3, 0.001)); + final previousProgress = locator.totalProgression; - await engine.goNext(); + await pumpReaderCommand(tester, engine.goNext()); locator = await engine.currentLocator() as EpubReaderLocator; expect(locator.spineIndex, 2); expect(locator.localProgression, 0); - expect(locator.totalProgression, closeTo(2 / 3, 0.001)); + expect(locator.totalProgression, greaterThanOrEqualTo(previousProgress)); + expect(locator.totalProgression - previousProgress, lessThan(.1)); await tester.pumpWidget(viewport()); await tester.pumpAndSettle(); diff --git a/test/engine/epub_rich_layout_test.dart b/test/engine/epub_rich_layout_test.dart index 5db9772..e9b86e3 100644 --- a/test/engine/epub_rich_layout_test.dart +++ b/test/engine/epub_rich_layout_test.dart @@ -5,6 +5,52 @@ import 'package:papyrus_reader/src/engine/epub/epub_rich_layout.dart'; import 'package:papyrus_reader/src/engine/epub/worker/epub_content.dart'; void main() { + test('saved text offsets highlight the same text across page fragments', () { + final block = EpubContentBlock({ + 'kind': 'p', + 'offset': 20, + 'length': 16, + 'runs': [ + {'text': 'Repeated passage'}, + ], + }); + final selection = ReaderSelection( + text: 'passage', + start: EpubReaderLocator( + spineIndex: 0, + textOffset: 29, + localProgression: 0, + totalProgression: 0, + ), + end: EpubReaderLocator( + spineIndex: 0, + textOffset: 36, + localProgression: 1, + totalProgression: 1, + ), + ); + final highlight = ReaderHighlight( + id: 'saved', + selection: ReaderSelection.fromJson(selection.toJson()), + color: const Color(0xffffff00), + ); + final full = block.span(const ReaderPreferences(), highlights: [highlight]); + expect(full.toPlainText(), 'Repeated passage'); + expect((full.children!.last as TextSpan).text, 'passage'); + expect((full.children!.last as TextSpan).style!.backgroundColor, isNotNull); + final fragment = block.span( + const ReaderPreferences(fontSize: 28), + start: 12, + end: 16, + highlights: [highlight], + ); + expect(fragment.toPlainText(), 'sage'); + expect( + (fragment.children!.single as TextSpan).style!.backgroundColor, + isNotNull, + ); + }); + TestWidgetsFlutterBinding.ensureInitialized(); testWidgets('measured fragments match the rendered Material reader text', ( tester, @@ -151,7 +197,6 @@ void main() { isTrue, ); final locator = EpubReaderLocator( - cfi: 'epubcfi(/6/2)', spineIndex: 0, localProgression: .3, totalProgression: .1, diff --git a/test/engine/epub_seek_test.dart b/test/engine/epub_seek_test.dart new file mode 100644 index 0000000..1524d29 --- /dev/null +++ b/test/engine/epub_seek_test.dart @@ -0,0 +1,95 @@ +import 'dart:async'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus_reader/papyrus_reader.dart'; +import 'package:papyrus_reader/src/engine/epub/worker/epub_worker.dart'; + +import '../support/in_process_epub_worker.dart'; +import '../support/synthetic_epub.dart'; + +void main() { + for (final lateError in [false, true]) { + test( + 'latest seek does not wait for an obsolete chapter read, late error $lateError', + () async { + final worker = _SeekWorker(); + final engine = EpubReaderEngine(workerFactory: () async => worker); + addTearDown(engine.dispose); + await engine.load(_document(), preferences: const ReaderPreferences()); + final visited = []; + engine.addListener(() => visited.add(engine.locator.spineIndex)); + final old = engine.goToProgress(.7); + await worker.started.future; + final latest = engine.goToProgress(1); + await Future.wait([old, latest]).timeout(const Duration(seconds: 2)); + expect(engine.locator.spineIndex, 2); + expect(visited, isNot(contains(1))); + if (lateError) { + worker.gate.completeError(StateError('Obsolete chapter read failed')); + } else { + worker.gate.complete(); + } + await Future.delayed(Duration.zero); + expect(engine.locator.spineIndex, 2); + expect(visited, isNot(contains(1))); + }, + ); + } + + test( + 'superseding a seek cancels its layout demand without waiting for it', + () async { + final engine = EpubReaderEngine( + workerFactory: () async => InProcessEpubWorker(), + ); + addTearDown(engine.dispose); + await engine.load(_document(), preferences: const ReaderPreferences()); + final started = Completer(); + final gate = Completer(); + late bool Function() cancelled; + engine.prepareLocation = (target, blocks, isCancelled) async { + if (target.spineIndex == 1) { + cancelled = isCancelled; + started.complete(); + await gate.future; + } + }; + final old = engine.goToProgress(.7); + await started.future; + final latest = engine.goToProgress(1); + await Future.wait([old, latest]).timeout(const Duration(seconds: 2)); + expect(cancelled(), isTrue); + expect(engine.locator.spineIndex, 2); + gate.complete(); + await Future.delayed(Duration.zero); + expect(engine.locator.spineIndex, 2); + }, + ); +} + +ReaderDocument _document() => ReaderDocument( + id: 'seeking', + format: ReaderFormat.epub, + loadBytes: () async => syntheticEpub( + firstChapterBody: '

${List.filled(300, 'First').join(' ')}

', + secondChapterBody: '

${List.filled(300, 'Later').join(' ')}

', + ), +); + +final class _SeekWorker implements EpubWorker { + final delegate = InProcessEpubWorker(); + final started = Completer(); + final gate = Completer(); + + @override + Future> request(String command, Object? argument) async { + if (command == 'chapter' && argument == 1) { + if (!started.isCompleted) started.complete(); + await gate.future; + } + return delegate.request(command, argument); + } + + @override + void dispose() => delegate.dispose(); +} diff --git a/test/engine/epub_worker_test.dart b/test/engine/epub_worker_test.dart index a57b3aa..c7a0ef9 100644 --- a/test/engine/epub_worker_test.dart +++ b/test/engine/epub_worker_test.dart @@ -1,13 +1,26 @@ import 'dart:typed_data'; import 'package:flutter_test/flutter_test.dart'; +import 'package:html/parser.dart' as html_parser; import 'package:papyrus_reader/papyrus_reader.dart'; import 'package:papyrus_reader/src/engine/epub/worker/epub_worker.dart'; +import 'package:papyrus_reader/src/engine/epub/worker/epub_content.dart'; import '../support/synthetic_epub.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); + test('named XHTML anchors do not underline the surrounding book text', () { + final content = collectEpubContent('

Book text

'); + final block = (content['blocks'] as List).single as Map; + expect((block['runs'] as List).single['underline'], isNot(true)); + expect((content['anchors'] as Map)['chapter'], 0); + final link = collectEpubContent('

A link

'); + expect( + ((link['blocks'] as List).single['runs'] as List).single['underline'], + isTrue, + ); + }); Future> listText(String html) async { final worker = await createEpubWorker(); addTearDown(worker.dispose); @@ -22,6 +35,57 @@ void main() { .toList(); } + test( + 'native worker only flattens raster wrappers and preserves SVG artwork', + () async { + final worker = await createEpubWorker(); + addTearDown(worker.dispose); + await worker.open( + syntheticEpub( + firstChapterBody: ''' +Raster cover +Vector label + +Overlay label +

Unsafe embedded HTML

+''', + ), + ); + final chapter = await worker.chapter(0); + final document = html_parser.parse(chapter['html'] as String); + expect(document.querySelector('#cover'), isNull); + final cover = document.querySelector('img')!; + expect(cover.attributes['src'], startsWith('data:image/png;base64,')); + expect(cover.attributes['alt'], 'Raster cover'); + expect(cover.attributes['width'], '100'); + expect(cover.attributes['height'], '200'); + final diagram = document.querySelector('#diagram')!; + expect(diagram.querySelector('path')!.attributes['d'], 'M0 0L100 100'); + expect( + diagram.querySelector('path')!.attributes['fill'], + 'url(#gradient)', + ); + expect(diagram.querySelector('text')!.text, 'Vector label'); + expect(document.querySelectorAll('#collage image'), hasLength(2)); + expect(document.querySelector('#overlay text')!.text, 'Overlay label'); + expect(document.querySelector('#overlay rect'), isNotNull); + for (final image in document.querySelectorAll('image')) { + expect(image.attributes['href'], startsWith('data:image/png;base64,')); + expect( + image.attributes.keys.map((key) => key.toString()), + isNot(contains('xlink:href')), + ); + } + expect(document.querySelectorAll('#hostile image'), isEmpty); + expect( + document.querySelector('#hostile path')!.attributes['fill'], + isNull, + ); + expect(document.outerHtml, isNot(contains('evil'))); + expect(document.querySelectorAll('script, foreignObject, set'), isEmpty); + }, + ); + test('native worker preserves ordered list start and item values', () async { expect( await listText(''' diff --git a/test/engine/pdf_highlight_test.dart b/test/engine/pdf_highlight_test.dart new file mode 100644 index 0000000..c760b21 --- /dev/null +++ b/test/engine/pdf_highlight_test.dart @@ -0,0 +1,124 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus_reader/papyrus_reader.dart'; +import 'package:papyrus_reader/src/engine/pdf/pdf_facade.dart'; +import 'package:pdfrx/pdfrx.dart'; + +class _Page extends Fake implements PdfPage { + _Page(this.pageNumber); + @override + final int pageNumber; +} + +class _Canvas extends Fake implements Canvas { + final rectangles = []; + @override + void drawRect(Rect rect, Paint paint) => rectangles.add(rect); +} + +void main() { + test( + 'PDF highlight hits follow page position and choose the topmost overlapping highlight', + () { + final locator = PdfReaderLocator( + pageIndex: 1, + pageOffset: .2, + totalProgression: .5, + ); + final highlight = ReaderHighlight( + id: 'saved', + color: const Color(0xffffff00), + selection: ReaderSelection( + text: 'Saved passage', + start: locator, + end: locator, + rectangles: const [ + ReaderSelectionRect( + pageIndex: 1, + rect: Rect.fromLTRB(.1, .2, .8, .3), + ), + ], + ), + ); + final pages = [ + const Rect.fromLTWH(0, 0, 200, 400), + const Rect.fromLTWH(220, 0, 200, 400), + ]; + expect( + pdfHighlightAt(const Offset(250, 100), pages, [ + highlight, + ])?.highlight.id, + 'saved', + ); + expect( + pdfHighlightAt(const Offset(250, 100), pages, [highlight])?.bounds, + const Rect.fromLTRB(240, 80, 380, 120), + ); + expect(pdfHighlightAt(const Offset(30, 100), pages, [highlight]), isNull); + expect( + pdfHighlightAt(const Offset(250, 200), pages, [highlight]), + isNull, + ); + final overlap = ReaderHighlight( + id: 'newer', + color: const Color(0xff00ff00), + selection: highlight.selection, + ); + expect( + pdfHighlightAt(const Offset(250, 100), pages, [ + highlight, + overlap, + ])?.highlight.id, + 'newer', + ); + }, + ); + + test( + 'PDF highlights scale with the page and never bleed into other pages', + () { + final locator = PdfReaderLocator( + pageIndex: 2, + pageOffset: .2, + totalProgression: .4, + ); + final selection = ReaderSelection( + text: 'Selected PDF text', + start: locator, + end: locator, + rectangles: const [ + ReaderSelectionRect( + pageIndex: 2, + rect: Rect.fromLTRB(.1, .2, .8, .3), + ), + ], + ); + final restored = ReaderSelection.fromJson(selection.toJson()); + final params = buildPdfViewerParams( + PdfViewportConfiguration( + pageIndex: 2, + facingPages: false, + backgroundColor: const Color(0xffffffff), + brightness: Brightness.light, + layoutMode: ReaderLayoutMode.scroll, + onPageChanged: (_) {}, + ), + highlights: [ + ReaderHighlight( + id: 'saved', + selection: restored, + color: const Color(0xffffff00), + ), + ], + ); + final canvas = _Canvas(); + final paint = params.pagePaintCallbacks!.single; + paint(canvas, const Rect.fromLTWH(10, 20, 200, 400), _Page(3)); + expect(canvas.rectangles.single, const Rect.fromLTRB(30, 100, 170, 140)); + paint(canvas, const Rect.fromLTWH(10, 20, 400, 800), _Page(3)); + expect(canvas.rectangles.last, const Rect.fromLTRB(50, 180, 330, 260)); + paint(canvas, const Rect.fromLTWH(10, 20, 400, 800), _Page(4)); + expect(canvas.rectangles, hasLength(2)); + }, + ); +} diff --git a/test/engine/pdf_reader_engine_test.dart b/test/engine/pdf_reader_engine_test.dart index 774a27f..22fc858 100644 --- a/test/engine/pdf_reader_engine_test.dart +++ b/test/engine/pdf_reader_engine_test.dart @@ -16,6 +16,55 @@ void main() { } group('PdfReaderEngine', () { + test('zoomed content is ready without qualifying a full page', () { + final exposure = pdfViewportExposure([ + const Rect.fromLTWH(0, 0, 1000, 1000), + ], const Rect.fromLTWH(100, 100, 200, 200)); + expect(exposure.contentVisible, isTrue); + expect(exposure.pages, isEmpty); + final spread = pdfViewportExposure([ + const Rect.fromLTWH(0, 0, 500, 800), + const Rect.fromLTWH(510, 0, 500, 800), + ], const Rect.fromLTWH(0, 0, 1010, 800)); + expect(spread.pages, [0, 1]); + expect( + pdfViewportExposure([ + const Rect.fromLTWH(0, 0, 100, 100), + ], const Rect.fromLTWH(200, 200, 100, 100)).contentVisible, + isFalse, + ); + }); + + testWidgets( + 'viewport readiness is independent of qualified page coverage', + (tester) async { + final facade = FakePdfFacade(pageCount: 3); + final engine = PdfReaderEngine(facadeFactory: (_) async => facade); + addTearDown(engine.dispose); + await engine.load(document(), preferences: const ReaderPreferences()); + expect(engine.snapshot.contentReady, isFalse); + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: Builder(builder: engine.buildViewport), + ), + ); + final config = facade.lastConfiguration!; + config.onContentReadyChanged!(false); + config.onVisiblePagesChanged!([]); + expect(engine.snapshot.contentReady, isFalse); + config.onContentReadyChanged!(true); + expect(engine.snapshot.contentReady, isTrue); + expect(engine.snapshot.coverage, isEmpty); + config.onVisiblePagesChanged!([0, 1]); + expect(engine.snapshot.coverage.map((c) => c.pdfPageIndex), [0, 1]); + config.onVisiblePagesChanged!([]); + expect(engine.snapshot.contentReady, isTrue); + await engine.goNext(); + expect(engine.snapshot.contentReady, isFalse); + }, + ); + testWidgets('turns whole spreads only in paginated mode', (tester) async { tester.view.physicalSize = const Size(1200, 800); tester.view.devicePixelRatio = 1; @@ -24,7 +73,12 @@ void main() { final facade = FakePdfFacade(pageCount: 5); final engine = PdfReaderEngine(facadeFactory: (_) async => facade); addTearDown(engine.dispose); - await engine.load(document(), preferences: const ReaderPreferences()); + await engine.load( + document(), + preferences: const ReaderPreferences( + columnMode: ReaderColumnMode.automatic, + ), + ); await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, @@ -39,7 +93,10 @@ void main() { await engine.goPrevious(); expect((await engine.currentLocator() as PdfReaderLocator).pageIndex, 2); await engine.updatePreferences( - const ReaderPreferences(layoutMode: ReaderLayoutMode.scroll), + const ReaderPreferences( + layoutMode: ReaderLayoutMode.scroll, + columnMode: ReaderColumnMode.automatic, + ), ); await engine.goNext(); expect((await engine.currentLocator() as PdfReaderLocator).pageIndex, 3); @@ -240,7 +297,6 @@ void main() { await expectLater( engine.goTo( EpubReaderLocator( - cfi: 'epubcfi(/6/2)', spineIndex: 0, localProgression: 0, totalProgression: 0, diff --git a/test/fixtures/gutenberg/README.md b/test/fixtures/gutenberg/README.md new file mode 100644 index 0000000..f536c93 --- /dev/null +++ b/test/fixtures/gutenberg/README.md @@ -0,0 +1,18 @@ +# Real-book regression fixtures + +These unmodified Project Gutenberg EPUBs retain the credits and licensing +information embedded by their publisher. Tests run offline against these exact +bytes; do not silently refresh them when Gutenberg republishes an edition. + +| File | Source | SHA-256 | +| --- | --- | --- | +| `alice.epub` | [Alice's Adventures in Wonderland, EPUB3 with images](https://www.gutenberg.org/ebooks/11.epub3.images) | `4f81245d31380ac1d6eafb9a321e3691369bc70985736ae4bccf849a4f784036` | +| `pride-and-prejudice.epub` | [Pride and Prejudice, EPUB without illustrations](https://www.gutenberg.org/ebooks/1342.epub.noimages) | `e59e587472723023b21bf380b8327858e7540b25e57affa3a68935b291e370dc` | + +Alice is the locally downloaded edition used to reproduce the reported blank +SVG-wrapped cover and 7% progress jump. Pride and Prejudice was retrieved on +2026-10-10; its smaller, unillustrated edition supplies a second publisher layout +without adding the 24 MB illustrated edition to the repository. + +The user's SQL Performance Explained EPUB is a local-only validation input and +must not be copied into this fixture directory. diff --git a/test/fixtures/gutenberg/alice.epub b/test/fixtures/gutenberg/alice.epub new file mode 100644 index 0000000..e439d7a Binary files /dev/null and b/test/fixtures/gutenberg/alice.epub differ diff --git a/test/fixtures/gutenberg/pride-and-prejudice.epub b/test/fixtures/gutenberg/pride-and-prejudice.epub new file mode 100644 index 0000000..3be0d41 Binary files /dev/null and b/test/fixtures/gutenberg/pride-and-prejudice.epub differ diff --git a/test/presentation/epub_page_turn_test.dart b/test/presentation/epub_page_turn_test.dart new file mode 100644 index 0000000..5133d35 --- /dev/null +++ b/test/presentation/epub_page_turn_test.dart @@ -0,0 +1,357 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus_reader/papyrus_reader.dart'; + +import '../support/in_process_epub_worker.dart'; +import '../support/synthetic_epub.dart'; + +void main() { + testWidgets('instant turns do not slide on commands or touch drags', ( + tester, + ) async { + final engine = testEpubEngine(); + await engine.load( + ReaderDocument( + id: 'instant', + format: ReaderFormat.epub, + loadBytes: () async => syntheticEpub(longChapter: true), + ), + preferences: const ReaderPreferences(), + ); + await tester.pumpWidget( + MaterialApp(home: Builder(builder: engine.buildViewport)), + ); + await tester.pumpAndSettle(); + await pumpReaderCommand(tester, engine.goNext()); + final controller = tester + .widget(find.byType(PageView)) + .controller!; + final location = engine.locator; + final revision = engine.restorationRevision; + await engine.updatePreferences( + engine.preferences.copyWith(pageTurnAnimation: false), + ); + await tester.pump(); + expect(engine.restorationRevision, revision); + expect(engine.locator, location); + expect( + tester.widget(find.byType(PageView)).controller, + same(controller), + ); + final next = engine.goNext(); + await tester.pump(); + expect(controller.page, 2); + await next; + final gesture = await tester.startGesture( + tester.getCenter(find.byType(PageView)), + ); + await gesture.moveBy(const Offset(-150, 0)); + await tester.pump(const Duration(milliseconds: 16)); + expect(controller.page, 2, reason: 'No sliding while a finger is down'); + await gesture.up(); + await tester.pump(); + expect(controller.page, 3); + await tester.pumpAndSettle(); + await tester.drag(find.byType(PageView), const Offset(150, 0)); + await tester.pump(); + expect(controller.page, 2); + await tester.pumpAndSettle(); + expect(tester.takeException(), isNull); + }); + + for (final (reducedMotion, pageTurnAnimation) in [ + (false, true), + (true, true), + (false, false), + ]) { + testWidgets( + 'boundary turns preserve the committed location until visible, reduced motion $reducedMotion, animation $pageTurnAnimation', + (tester) async { + final engine = testEpubEngine(); + await engine.load( + ReaderDocument( + id: 'boundaries', + format: ReaderFormat.epub, + loadBytes: () async => + syntheticEpub(firstChapterBody: '

First page.

'), + ), + preferences: ReaderPreferences(pageTurnAnimation: pageTurnAnimation), + ); + await tester.pumpWidget( + MaterialApp( + home: MediaQuery( + data: MediaQueryData(disableAnimations: reducedMotion), + child: Builder(builder: engine.buildViewport), + ), + ), + ); + await tester.pumpAndSettle(); + final turn = engine.goNext(); + await tester.pump(); + await tester.pump(); + for (var frame = 0; frame < 6; frame++) { + await tester.pump(const Duration(milliseconds: 16)); + } + + if (!reducedMotion && pageTurnAnimation) { + final controller = tester + .widget(find.byType(PageView)) + .controller!; + expect(controller.page, greaterThan(0)); + expect(controller.page, lessThan(1)); + expect((engine.snapshot.locator as EpubReaderLocator).spineIndex, 0); + } + + await pumpReaderCommand(tester, turn); + expect((engine.snapshot.locator as EpubReaderLocator).spineIndex, 1); + expect(engine.snapshot.contentReady, isTrue); + final previous = engine.goPrevious(); + await tester.pump(); + await tester.pump(); + for (var frame = 0; frame < 6; frame++) { + await tester.pump(const Duration(milliseconds: 16)); + } + + if (!reducedMotion && pageTurnAnimation) { + final controller = tester + .widget(find.byType(PageView)) + .controller!; + expect(controller.page, greaterThan(0)); + expect(controller.page, lessThan(1)); + expect((engine.snapshot.locator as EpubReaderLocator).spineIndex, 1); + } + + await pumpReaderCommand(tester, previous); + expect((engine.snapshot.locator as EpubReaderLocator).spineIndex, 0); + await pumpReaderCommand( + tester, + Future.wait([engine.goNext(), engine.goNext(), engine.goPrevious()]), + ); + expect((engine.snapshot.locator as EpubReaderLocator).spineIndex, 1); + expect(tester.takeException(), isNull); + }, + ); + } + + for (final direction in [-1, 1]) { + testWidgets( + 'interrupted page animation records the visible page (direction $direction)', + (tester) async { + final engine = testEpubEngine(); + await engine.load( + ReaderDocument( + id: 'interrupted-turn', + format: ReaderFormat.epub, + loadBytes: () async => syntheticEpub(longChapter: true), + ), + preferences: const ReaderPreferences(), + ); + await tester.pumpWidget( + MaterialApp(home: Builder(builder: engine.buildViewport)), + ); + await tester.pumpAndSettle(); + await pumpReaderCommand(tester, engine.goNext()); + final controller = tester + .widget(find.byType(PageView)) + .controller!; + expect(controller.page, 1); + final before = engine.snapshot; + final turn = direction > 0 ? engine.goNext() : engine.goPrevious(); + await tester.pump(); + await tester.pump(); + await tester.pump(const Duration(milliseconds: 16)); + expect(controller.page, isNot(1)); + expect((controller.page! - 1).abs(), lessThan(.5)); + final gesture = await tester.startGesture( + tester.getCenter(find.byType(PageView)), + ); + await gesture.moveBy(Offset(40.0 * direction, 0)); + await tester.pump(const Duration(milliseconds: 200)); + await gesture.up(); + await pumpReaderCommand(tester, turn); + expect(controller.page, 1); + expect(engine.snapshot.locator, before.locator); + expect(engine.snapshot.locationLabel, before.locationLabel); + expect( + engine.snapshot.coverage.single.start, + before.coverage.single.start, + ); + expect(engine.snapshot.coverage.single.end, before.coverage.single.end); + await pumpReaderCommand(tester, engine.goNext()); + expect( + controller.page, + 2, + reason: 'The next command must not skip a page', + ); + expect(tester.takeException(), isNull); + }, + ); + } + + testWidgets('queued turns continue visually into a multipage destination', ( + tester, + ) async { + final engine = testEpubEngine(); + await engine.load( + ReaderDocument( + id: 'queued', + format: ReaderFormat.epub, + loadBytes: () async => syntheticEpub( + firstChapterBody: '

Start.

', + secondChapterBody: List.filled( + 100, + '

A longer passage fills the following pages with continuous text.

', + ).join(), + ), + ), + preferences: const ReaderPreferences(), + ); + await tester.pumpWidget( + MaterialApp(home: Builder(builder: engine.buildViewport)), + ); + await tester.pumpAndSettle(); + await pumpReaderCommand( + tester, + Future.wait([engine.goNext(), engine.goNext(), engine.goNext()]), + ); + expect(engine.locator.spineIndex, 1); + expect(engine.locator.textOffset, greaterThan(0)); + expect(tester.widget(find.byType(PageView)).controller!.page, 2); + expect(tester.takeException(), isNull); + }); + + testWidgets('page counts stay present and settle without moving the reader', ( + tester, + ) async { + final engine = testEpubEngine(); + final labels = []; + engine.addListener(() { + if (engine.snapshot.contentReady && + engine.snapshot.locationLabel != null) { + labels.add(engine.snapshot.locationLabel!); + } + }); + await engine.load( + ReaderDocument( + id: 'page-counts', + format: ReaderFormat.epub, + loadBytes: () async => syntheticEpub(longChapter: true), + ), + preferences: const ReaderPreferences(), + ); + await tester.pumpWidget( + MaterialApp(home: Builder(builder: engine.buildViewport)), + ); + await tester.pumpAndSettle(); + final location = engine.locator; + for ( + var frame = 0; + frame < 100 && engine.snapshot.locationLabel!.contains('≈'); + frame++ + ) { + await tester.pump(const Duration(milliseconds: 16)); + } + expect( + engine.snapshot.locationLabel, + matches(r'Chapter 1 of 3 · Page 1 of [0-9]+$'), + ); + expect(engine.locator, location); + expect(labels, isNotEmpty); + expect( + labels.every( + (label) => RegExp(r' · Page [0-9]+ of ≈?[0-9]+$').hasMatch(label), + ), + isTrue, + ); + await pumpReaderCommand( + tester, + engine.goTo( + EpubReaderLocator( + spineIndex: 1, + localProgression: 0, + totalProgression: 0, + ), + ), + ); + expect( + engine.snapshot.locationLabel, + matches(r'Chapter 2 of 3 · Page 1 of ≈?[0-9]+$'), + ); + await engine.updatePreferences(const ReaderPreferences(fontSize: 28)); + await tester.pumpAndSettle(); + expect( + engine.snapshot.locationLabel, + matches(r'Chapter 2 of 3 · Page 1 of ≈?[0-9]+$'), + ); + expect(tester.takeException(), isNull); + }); + + testWidgets( + 'a single long spine item reads ahead by pages and restores distant offsets', + (tester) async { + final engine = testEpubEngine(); + await engine.load( + ReaderDocument( + id: 'unchaptered', + format: ReaderFormat.epub, + loadBytes: () async => syntheticEpub( + singleSpine: true, + firstChapterBody: List.generate( + 2000, + (index) => + '

Passage $index. A continuous book with no chapter divisions keeps turning smoothly.

', + ).join(), + ), + ), + preferences: const ReaderPreferences(), + ); + await tester.pumpWidget( + MaterialApp(home: Builder(builder: engine.buildViewport)), + ); + await tester.pumpAndSettle(); + expect(engine.chapterCount, 1); + expect(engine.snapshot.contentReady, isTrue); + expect(engine.snapshot.atEnd, isFalse); + expect( + tester + .widget(find.byType(PageView)) + .childrenDelegate + .estimatedChildCount, + lessThanOrEqualTo(7), + ); + + for (var i = 0; i < 8; i++) { + await pumpReaderCommand(tester, engine.goNext()); + } + + expect(engine.locator.spineIndex, 0); + expect(engine.locator.textOffset, greaterThan(0)); + expect(engine.snapshot.atEnd, isFalse); + await pumpReaderCommand( + tester, + engine.goTo( + EpubReaderLocator( + spineIndex: 0, + textOffset: 60000, + localProgression: 0, + totalProgression: 0, + ), + ), + ); + expect(engine.locator.textOffset, 60000); + final page = tester + .widget(find.byType(PageView)) + .controller! + .page!; + expect(page, greaterThan(8)); + await engine.updatePreferences(const ReaderPreferences(fontSize: 22)); + await tester.pumpAndSettle(); + expect(engine.locator.textOffset, 60000); + await pumpReaderCommand(tester, engine.goToProgress(1)); + expect(engine.snapshot.atEnd, isTrue); + await pumpReaderCommand(tester, engine.goPrevious()); + expect(engine.snapshot.atEnd, isFalse); + expect(tester.takeException(), isNull); + }, + ); +} diff --git a/test/presentation/epub_prefetch_test.dart b/test/presentation/epub_prefetch_test.dart new file mode 100644 index 0000000..e24ab49 --- /dev/null +++ b/test/presentation/epub_prefetch_test.dart @@ -0,0 +1,188 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus_reader/papyrus_reader.dart'; +import 'package:papyrus_reader/src/engine/epub/worker/epub_worker.dart'; + +import '../support/in_process_epub_worker.dart'; +import '../support/synthetic_epub.dart'; + +void main() { + testWidgets( + 'prefetch reports completion when the entire book fits on one page', + (tester) async { + final engine = testEpubEngine(); + await engine.load( + ReaderDocument( + id: 'one-page', + format: ReaderFormat.epub, + loadBytes: () async => syntheticEpub( + singleSpine: true, + firstChapterBody: '

A complete short book.

', + ), + ), + preferences: const ReaderPreferences(pageTurnAnimation: false), + ); + await tester.pumpWidget( + MaterialApp(home: Builder(builder: engine.buildViewport)), + ); + await tester.pumpAndSettle(); + expect(engine.snapshot.contentReady, isTrue); + expect(engine.snapshot.atEnd, isTrue); + expect(engine.locator.totalProgression, 1); + expect(engine.snapshot.coverage.single.end, 1); + expect(engine.locator.textOffset, 0); + }, + ); + + testWidgets( + 'an immediate turn can use a page prepared before the viewport grows', + (tester) async { + final engine = testEpubEngine(); + await engine.load( + ReaderDocument( + id: 'early-turn', + format: ReaderFormat.epub, + loadBytes: () async => syntheticEpub(longChapter: true), + ), + preferences: const ReaderPreferences(pageTurnAnimation: false), + ); + await tester.pumpWidget( + MaterialApp(home: Builder(builder: engine.buildViewport)), + ); + for ( + var frame = 0; + frame < 100 && !engine.snapshot.contentReady; + frame++ + ) { + await tester.pump(const Duration(milliseconds: 1)); + } + expect(engine.snapshot.contentReady, isTrue); + final before = engine.locator.textOffset!; + await pumpReaderCommand(tester, engine.goNext()); + expect( + tester.widget(find.byType(PageView)).controller!.page, + 1, + ); + expect(engine.locator.textOffset, greaterThan(before)); + }, + ); + + for (final blocked in [0, 2]) { + testWidgets( + 'a slow neighbor $blocked does not block preloading the other direction', + (tester) async { + final worker = _GatedNeighbor(blocked); + final engine = EpubReaderEngine(workerFactory: () async => worker); + addTearDown(engine.dispose); + await engine.load( + ReaderDocument( + id: 'neighbors', + format: ReaderFormat.epub, + loadBytes: () async => syntheticEpub(), + ), + initialLocator: EpubReaderLocator( + spineIndex: 1, + localProgression: 0, + totalProgression: .5, + ), + preferences: const ReaderPreferences(pageTurnAnimation: false), + ); + await tester.pumpWidget( + MaterialApp(home: Builder(builder: engine.buildViewport)), + ); + await tester.pumpAndSettle(); + expect(worker.reads[0], 1); + expect(worker.reads[2], 1); + expect(engine.locator.spineIndex, 1); + final destination = blocked == 0 ? 2 : 0; + await pumpReaderCommand( + tester, + blocked == 0 ? engine.goNext() : engine.goPrevious(), + ); + expect(engine.locator.spineIndex, destination); + expect( + worker.reads[destination], + 1, + reason: 'Use the already prepared neighbor', + ); + worker.gate.complete(); + await tester.pumpAndSettle(); + expect(tester.takeException(), isNull); + }, + ); + } + + testWidgets( + 'keeps five forward turns ready and retains pages for reversing direction', + (tester) async { + final engine = testEpubEngine(); + await engine.load( + ReaderDocument( + id: 'buffered', + format: ReaderFormat.epub, + loadBytes: () async => syntheticEpub( + singleSpine: true, + firstChapterBody: List.filled( + 1000, + '

A long uninterrupted book keeps nearby pages ready.

', + ).join(), + ), + ), + preferences: const ReaderPreferences(pageTurnAnimation: false), + ); + await tester.pumpWidget( + MaterialApp(home: Builder(builder: engine.buildViewport)), + ); + await tester.pumpAndSettle(); + final view = tester.widget(find.byType(PageView)); + expect( + view.childrenDelegate.estimatedChildCount, + greaterThanOrEqualTo(6), + ); + expect( + view.childrenDelegate.estimatedChildCount, + lessThan(12), + reason: 'Do not paginate the whole book to turn', + ); + final start = engine.locator.textOffset; + for (var page = 1; page <= 5; page++) { + final turn = engine.goNext(); + await tester.pump(); + expect(view.controller!.page, page); + await turn; + } + for (var page = 4; page >= 0; page--) { + final turn = engine.goPrevious(); + await tester.pump(); + expect(view.controller!.page, page); + await turn; + } + expect(engine.locator.textOffset, start); + await tester.pumpAndSettle(); + expect(tester.takeException(), isNull); + }, + ); +} + +final class _GatedNeighbor implements EpubWorker { + _GatedNeighbor(this.blocked); + final int blocked; + final delegate = InProcessEpubWorker(); + final gate = Completer(); + final reads = {}; + + @override + Future> request(String command, Object? argument) async { + if (command == 'chapter') { + final index = argument as int; + reads.update(index, (count) => count + 1, ifAbsent: () => 1); + if (index == blocked) await gate.future; + } + return delegate.request(command, argument); + } + + @override + void dispose() => delegate.dispose(); +} diff --git a/test/presentation/epub_reading_flow_test.dart b/test/presentation/epub_reading_flow_test.dart index e17ad7b..e86132f 100644 --- a/test/presentation/epub_reading_flow_test.dart +++ b/test/presentation/epub_reading_flow_test.dart @@ -34,13 +34,18 @@ void main() { ), ); await tester.pumpAndSettle(); - await engine.goNext(); + await tester.sendKeyEvent(LogicalKeyboardKey.escape); + await tester.pumpAndSettle(); + await pumpReaderCommand(tester, engine.goNext()); await tester.pumpAndSettle(); - await engine.goNext(); + await pumpReaderCommand(tester, engine.goNext()); await tester.pumpAndSettle(); final before = await engine.currentLocator() as EpubReaderLocator; expect(before.textOffset, greaterThan(0)); - await tester.tap(find.byTooltip('Hide controls')); + await tester.tapAt( + tester.getRect(find.byKey(const ValueKey('reader-content'))).center, + ); + await tester.pump(const Duration(milliseconds: 350)); await tester.pumpAndSettle(); expect( (await engine.currentLocator() as EpubReaderLocator).textOffset, @@ -52,7 +57,7 @@ void main() { ); await tester.sendKeyEvent(LogicalKeyboardKey.escape); await tester.pumpAndSettle(); - expect(find.byTooltip('Hide controls'), findsOneWidget); + expect(find.byTooltip('Reading settings'), findsOneWidget); expect( (await engine.currentLocator() as EpubReaderLocator).textOffset, before.textOffset, @@ -124,7 +129,7 @@ void main() { ); await tester.pumpAndSettle(); - await engine.goNext(); + await pumpReaderCommand(tester, engine.goNext()); await tester.pumpAndSettle(); final secondPage = await engine.currentLocator() as EpubReaderLocator; expect( @@ -154,15 +159,18 @@ void main() { secondPage.textOffset, reason: 'Late font loading must remeasure without losing position', ); - await engine.goToProgress(1 / 3); + await pumpReaderCommand( + tester, + engine.goTo(engine.snapshot.toc.first.children.first.locator), + ); await tester.pumpAndSettle(); - await engine.goPrevious(); + await pumpReaderCommand(tester, engine.goPrevious()); await tester.pumpAndSettle(); final previousChapterEnd = await engine.currentLocator() as EpubReaderLocator; expect(previousChapterEnd.spineIndex, 0); expect(previousChapterEnd.localProgression, 1); - await engine.goNext(); + await pumpReaderCommand(tester, engine.goNext()); await tester.pumpAndSettle(); expect( (await engine.currentLocator() as EpubReaderLocator).spineIndex, diff --git a/test/presentation/epub_seek_test.dart b/test/presentation/epub_seek_test.dart new file mode 100644 index 0000000..69068cc --- /dev/null +++ b/test/presentation/epub_seek_test.dart @@ -0,0 +1,101 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus_reader/papyrus_reader.dart'; +import 'package:papyrus_reader/src/engine/epub/worker/epub_worker.dart'; + +import '../support/in_process_epub_worker.dart'; +import '../support/synthetic_epub.dart'; + +void main() { + testWidgets( + 'rapid scrubbing displays and persists only the latest prepared destination', + (tester) async { + final worker = _SlowChapterWorker(); + final engine = EpubReaderEngine(workerFactory: () async => worker); + final controller = ReaderController( + registry: ReaderEngineRegistry([ + ReaderEngineRegistration( + formats: const {ReaderFormat.epub}, + factory: () => engine, + ), + ]), + ); + addTearDown(controller.dispose); + final saved = []; + await tester.pumpWidget( + MaterialApp( + home: PapyrusReader( + controller: controller, + document: ReaderDocument( + id: 'scrub', + format: ReaderFormat.epub, + loadBytes: () async => syntheticEpub( + firstChapterBody: + '

${List.filled(300, 'First').join(' ')}

', + secondChapterBody: + '

${List.filled(300, 'Later').join(' ')}

', + ), + ), + initialPreferences: const ReaderPreferences( + pageTurnAnimation: false, + ), + onLocatorChanged: (locator) => + saved.add(locator as EpubReaderLocator), + ), + ), + ); + await tester.pumpAndSettle(); + await tester.sendKeyEvent(LogicalKeyboardKey.escape); + await tester.pumpAndSettle(); + saved.clear(); + Slider slider() => tester.widget(find.byType(Slider).first); + slider().onChangeEnd!(.7); + await tester.pump(); + expect(worker.blocked, isTrue); + + slider().onChangeStart!(.7); + slider().onChanged!(.3); + await tester.pumpAndSettle(); + expect(slider().value, .3); + expect(engine.locator.spineIndex, 0); + expect(saved, isEmpty); + + slider().onChangeEnd!(.3); + slider().onChangeEnd!(1); + await tester.pumpAndSettle(); + expect(worker.gate.isCompleted, isFalse); + expect(controller.snapshot.contentReady, isTrue); + expect(engine.locator.spineIndex, 2); + expect(find.text('Chapter Three'), findsOneWidget); + expect(saved, isNotEmpty); + expect(saved.every((locator) => locator.spineIndex == 2), isTrue); + final position = engine.locator; + worker.gate.complete(); + await tester.pumpAndSettle(); + expect(engine.locator, position); + expect(saved.every((locator) => locator.spineIndex == 2), isTrue); + expect(tester.takeException(), isNull); + }, + ); +} + +final class _SlowChapterWorker implements EpubWorker { + final delegate = InProcessEpubWorker(); + final gate = Completer(); + bool blocked = false; + + @override + Future> request(String command, Object? argument) async { + if (command == 'chapter' && argument == 1) { + blocked = true; + await gate.future; + } + return delegate.request(command, argument); + } + + @override + void dispose() => delegate.dispose(); +} diff --git a/test/presentation/epub_selection_test.dart b/test/presentation/epub_selection_test.dart new file mode 100644 index 0000000..e1615e1 --- /dev/null +++ b/test/presentation/epub_selection_test.dart @@ -0,0 +1,379 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus_reader/papyrus_reader.dart'; +import 'package:papyrus_reader/src/presentation/reader_text_toolbar.dart'; + +import '../support/in_process_epub_worker.dart'; +import '../support/synthetic_epub.dart'; + +void main() { + for (final (kind, animation) in [ + (PointerDeviceKind.mouse, true), + (PointerDeviceKind.touch, true), + (PointerDeviceKind.mouse, false), + (PointerDeviceKind.touch, false), + ]) { + testWidgets( + 'selecting text at a chapter boundary does not turn the page ($kind, animation $animation)', + (tester) async { + tester.view.devicePixelRatio = 1; + tester.view.physicalSize = const Size(390, 844); + addTearDown(tester.view.reset); + final engine = testEpubEngine(); + ReaderSelection? saved; + const words = 'Select these words without leaving this chapter.'; + await tester.pumpWidget( + MaterialApp( + theme: ThemeData( + platform: kind == PointerDeviceKind.touch + ? TargetPlatform.android + : TargetPlatform.linux, + ), + home: PapyrusReader( + initialPreferences: ReaderPreferences( + pageTurnAnimation: animation, + ), + onAnnotate: (selection) => saved = selection, + document: ReaderDocument( + id: 'selection', + format: ReaderFormat.epub, + loadBytes: () async => + syntheticEpub(secondChapterBody: '

$words

'), + ), + registry: ReaderEngineRegistry([ + ReaderEngineRegistration( + formats: const {ReaderFormat.epub}, + factory: () => engine, + ), + ]), + ), + ), + ); + await tester.pumpAndSettle(); + await pumpReaderCommand(tester, engine.goNext()); + final before = engine.locator; + final paragraph = tester.renderObject( + find.byWidgetPredicate( + (widget) => + widget is RichText && widget.text.toPlainText() == words, + ), + ); + final start = paragraph.localToGlobal( + paragraph + .getBoxesForSelection( + const TextSelection(baseOffset: 1, extentOffset: 2), + ) + .first + .toRect() + .center, + ); + final gesture = await tester.startGesture(start, kind: kind); + + if (kind == PointerDeviceKind.touch) { + await tester.pump( + kLongPressTimeout + const Duration(milliseconds: 100), + ); + } + + await gesture.moveTo( + start + const Offset(160, 0), + timeStamp: const Duration(milliseconds: 700), + ); + await tester.pump(); + await gesture.up(timeStamp: const Duration(milliseconds: 750)); + await tester.pumpAndSettle(); + expect( + paragraph.selections.any((selection) => !selection.isCollapsed), + isTrue, + ); + expect(engine.locator, before); + if (find.text('Annotate').evaluate().isEmpty && + find.byType(TextSelectionToolbar).evaluate().isNotEmpty) { + await tester.tap(find.byIcon(Icons.more_vert)); + await tester.pumpAndSettle(); + } + expect(find.text('Annotate'), findsOneWidget); + await tester.tap(find.text('Annotate')); + await tester.pumpAndSettle(); + expect(saved, isNotNull); + final first = saved!.start as EpubReaderLocator; + final last = saved!.end as EpubReaderLocator; + expect(first.spineIndex, before.spineIndex); + expect( + words.substring(first.textOffset!, last.textOffset!), + saved!.text, + ); + expect(ReaderSelection.fromJson(saved!.toJson()).start, saved!.start); + expect(find.byTooltip('Reading settings'), findsNothing); + expect(tester.takeException(), isNull); + await tester.pumpWidget(const SizedBox.shrink()); + }, + ); + } + + for (final (column, longParagraph, backwards) in [ + (0, true, false), + (0, false, false), + (1, true, false), + (1, false, false), + (1, true, true), + (1, false, true), + ]) { + testWidgets( + 'mouse selection opens annotation actions in EPUB column $column, long paragraph $longParagraph, backwards $backwards', + (tester) async { + tester.view.devicePixelRatio = 1; + tester.view.physicalSize = const Size(1200, 800); + addTearDown(tester.view.reset); + final engine = testEpubEngine(); + ReaderSelection? saved; + await tester.pumpWidget( + MaterialApp( + theme: ThemeData(platform: TargetPlatform.linux), + home: PapyrusReader( + initialPreferences: const ReaderPreferences( + columnMode: ReaderColumnMode.double, + ), + onAnnotate: (selection) => saved = selection, + document: ReaderDocument( + id: 'columns', + format: ReaderFormat.epub, + loadBytes: () async => syntheticEpub( + longChapter: !longParagraph, + firstChapterBody: longParagraph + ? '

${List.filled(1000, 'Paragraph words for selection across columns. ').join()}

' + : null, + ), + ), + registry: ReaderEngineRegistry([ + ReaderEngineRegistration( + formats: const {ReaderFormat.epub}, + factory: () => engine, + ), + ]), + ), + ), + ); + await tester.pumpAndSettle(); + final before = engine.locator; + final candidates = find.byWidgetPredicate( + (widget) => + widget is RichText && + widget.text.toPlainText().contains('Paragraph'), + ); + final paragraphs = tester.renderObjectList(candidates); + final visible = paragraphs.where((paragraph) { + final point = paragraph.localToGlobal(Offset.zero); + return point.dx >= column * 600 && + point.dx < (column + 1) * 600 && + point.dy < 600; + }); + final paragraph = visible.first; + Offset at(int offset) => paragraph.localToGlobal( + paragraph + .getBoxesForSelection( + TextSelection(baseOffset: offset, extentOffset: offset + 1), + ) + .first + .toRect() + .center, + ); + Future select() async { + final drag = await tester.startGesture( + at(backwards ? 10 : 1), + kind: PointerDeviceKind.mouse, + ); + await drag.moveTo(at(backwards ? 1 : 10)); + await tester.pump(); + await drag.up(); + await tester.pumpAndSettle(); + } + + await select(); + expect(find.text('Annotate'), findsOneWidget); + final bounds = tester + .widget(find.byType(ReaderTextToolbar)) + .bounds; + expect( + bounds.center.dx, + inInclusiveRange(column * 600.0, (column + 1) * 600.0), + ); + expect( + bounds.top, + closeTo( + at(1).dy - + paragraph + .getBoxesForSelection( + const TextSelection(baseOffset: 1, extentOffset: 2), + ) + .first + .toRect() + .height / + 2, + 1, + ), + ); + await tester.tapAt(const Offset(1190, 790)); + await tester.pumpAndSettle(); + expect(find.text('Annotate'), findsNothing); + await select(); + expect( + paragraph.selections.any((selection) => !selection.isCollapsed), + isTrue, + ); + expect(engine.locator, before); + expect(find.text('Annotate'), findsOneWidget); + await tester.tap(find.text('Annotate')); + await tester.pumpAndSettle(); + expect(find.text('Annotate'), findsNothing); + expect(saved, isNotNull); + expect(saved!.text, isNotEmpty); + expect( + (saved!.start as EpubReaderLocator).textOffset, + greaterThanOrEqualTo(column == 1 ? 100 : 0), + ); + expect(tester.takeException(), isNull); + await tester.pumpWidget(const SizedBox.shrink()); + }, + ); + } + + for (final kind in [PointerDeviceKind.mouse, PointerDeviceKind.touch]) { + testWidgets( + 'saved highlight offers edit and remove without toggling chrome ($kind)', + (tester) async { + final engine = testEpubEngine(); + const words = 'Select these words without leaving this chapter.'; + final start = EpubReaderLocator( + spineIndex: 1, + textOffset: 7, + localProgression: .1, + totalProgression: .5, + ); + final end = EpubReaderLocator( + spineIndex: 1, + textOffset: 18, + localProgression: .3, + totalProgression: .5, + ); + final highlight = ReaderHighlight( + id: 'saved', + selection: ReaderSelection( + text: 'these words', + start: start, + end: end, + ), + color: Colors.green, + ); + ReaderHighlight? edited; + ReaderHighlight? removed; + await tester.pumpWidget( + MaterialApp( + home: PapyrusReader( + document: ReaderDocument( + id: 'highlight', + format: ReaderFormat.epub, + loadBytes: () async => + syntheticEpub(secondChapterBody: '

$words

'), + ), + registry: ReaderEngineRegistry([ + ReaderEngineRegistration( + formats: const {ReaderFormat.epub}, + factory: () => engine, + ), + ]), + highlights: [highlight], + onEditHighlight: (highlight) => edited = highlight, + onRemoveHighlight: (highlight) => removed = highlight, + onAnnotate: (_) {}, + ), + ), + ); + await tester.pumpAndSettle(); + await pumpReaderCommand(tester, engine.goNext()); + final before = engine.locator; + final paragraph = tester.renderObject( + find.byWidgetPredicate( + (widget) => + widget is RichText && widget.text.toPlainText() == words, + ), + ); + final rect = paragraph + .getBoxesForSelection( + const TextSelection(baseOffset: 9, extentOffset: 10), + ) + .first + .toRect() + .shift(paragraph.localToGlobal(Offset.zero)); + await tester.tapAt(rect.center, kind: kind); + await tester.pumpAndSettle(); + expect(find.text('Edit'), findsOneWidget); + expect(find.text('Remove'), findsOneWidget); + expect(find.text('Copy'), findsOneWidget); + expect(find.text('Annotate'), findsNothing); + expect(find.byTooltip('Reading settings'), findsNothing); + expect(engine.locator, before); + final bounds = tester + .widget(find.byType(ReaderTextToolbar)) + .bounds; + expect(bounds.contains(rect.center), isTrue); + await tester.tap(find.text('Edit')); + await tester.pumpAndSettle(); + expect(edited?.id, 'saved'); + expect(find.text('Edit'), findsNothing); + await tester.tapAt(rect.center, kind: kind); + await tester.pumpAndSettle(); + await tester.tap(find.text('Remove')); + await tester.pumpAndSettle(); + expect(removed?.id, 'saved'); + final drag = await tester.startGesture(rect.center, kind: kind); + if (kind == PointerDeviceKind.touch) { + await tester.pump( + kLongPressTimeout + const Duration(milliseconds: 100), + ); + } + await drag.moveBy(const Offset(120, 0)); + await tester.pump(); + await drag.up(); + await tester.pumpAndSettle(); + expect(find.text('Edit'), findsNothing); + expect(find.text('Annotate'), findsOneWidget); + expect(engine.locator, before); + expect(tester.takeException(), isNull); + await tester.pumpWidget(const SizedBox.shrink()); + }, + ); + } + + testWidgets( + 'an ordinary touch swipe still advances beyond the last page of a chapter', + (tester) async { + final engine = testEpubEngine(); + await tester.pumpWidget( + MaterialApp( + home: PapyrusReader( + document: ReaderDocument( + id: 'swipe', + format: ReaderFormat.epub, + loadBytes: () async => + syntheticEpub(firstChapterBody: '

A short chapter.

'), + ), + registry: ReaderEngineRegistry([ + ReaderEngineRegistration( + formats: const {ReaderFormat.epub}, + factory: () => engine, + ), + ]), + ), + ), + ); + await tester.pumpAndSettle(); + await tester.dragFrom(const Offset(500, 400), const Offset(-200, 0)); + await tester.pumpAndSettle(); + expect(engine.locator.spineIndex, 1); + await tester.pumpWidget(const SizedBox.shrink()); + }, + ); +} diff --git a/test/presentation/papyrus_reader_test.dart b/test/presentation/papyrus_reader_test.dart index d727bbd..f722344 100644 --- a/test/presentation/papyrus_reader_test.dart +++ b/test/presentation/papyrus_reader_test.dart @@ -55,9 +55,12 @@ void main() { double textScale = 1, ReaderUiBuilders builders = const ReaderUiBuilders(), ReaderLocatorChanged? onLocatorChanged, + ValueChanged? onActivity, ReaderPreferencesChanged? onPreferencesChanged, ReaderPreferences? initialPreferences, ReaderThemeData? readerTheme, + VoidCallback? onBack, + bool showControls = true, }) async { tester.view.physicalSize = size; tester.view.devicePixelRatio = 1; @@ -92,13 +95,74 @@ void main() { builders: builders, initialPreferences: initialPreferences, theme: readerTheme, + onBack: onBack, onLocatorChanged: onLocatorChanged, + onActivity: onActivity, onPreferencesChanged: onPreferencesChanged, ), ), ); + if (showControls) { + await tester.pump(); + + if (controller.snapshot.status == ReaderStatus.ready) { + await toggleReaderControls(tester); + } + } } + testWidgets( + 'books open with hidden controls and bordered overlays preserve the viewport', + (tester) async { + final controller = controllerFor([_UiReaderEngine()]); + addTearDown(controller.dispose); + await pumpReader( + tester, + document: document('Hidden controls'), + controller: controller, + showControls: false, + ); + await tester.pumpAndSettle(); + final viewport = find.byKey(const ValueKey('reader-viewport')); + final element = tester.element(viewport); + final bounds = tester.getRect(viewport); + final locator = controller.snapshot.locator; + expect(find.byTooltip('Reading settings'), findsNothing); + expect(find.byTooltip('Next'), findsNothing); + await toggleReaderControls(tester); + expect( + find.byTooltip('Reading settings').hitTestable(), + findsOneWidget, + ); + expect(find.byTooltip('Next').hitTestable(), findsOneWidget); + final header = find.descendant( + of: find.byKey(const ValueKey('reader-toolbar')), + matching: find.byType(DecoratedBox), + ); + final headerBorder = + (tester.widget(header.first).decoration + as BoxDecoration) + .border! + as Border; + final footer = find.ancestor( + of: find.byTooltip('Next'), + matching: find.byType(DecoratedBox), + ); + final footerBorder = + (tester.widget(footer.first).decoration + as BoxDecoration) + .border! + as Border; + expect(headerBorder.bottom.style, BorderStyle.solid); + expect(footerBorder.top.style, BorderStyle.solid); + expect(tester.element(viewport), same(element)); + expect(tester.getRect(viewport), bounds); + expect(controller.snapshot.locator, locator); + await toggleReaderControls(tester); + expect(find.byTooltip('Next'), findsNothing); + }, + ); + testWidgets('custom snapshot viewports refresh without losing state', ( tester, ) async { @@ -130,13 +194,116 @@ void main() { expect(find.text('Custom position 80'), findsOneWidget); expect(tester.state(viewport), same(state)); - await tester.tap(find.byTooltip('Hide controls')); + await toggleReaderControls(tester); await tester.pumpAndSettle(); expect(find.text('Custom position 80'), findsOneWidget); expect(tester.state(viewport), same(state)); }); - testWidgets('sidebar meets the toolbar border without an empty gap', ( + testWidgets( + 'a host rebuilding on activity does not create a frame feedback loop', + (tester) async { + final events = []; + final controller = controllerFor([_UiReaderEngine()]); + final book = document('Host rebuild'); + addTearDown(controller.dispose); + await tester.pumpWidget( + MaterialApp( + home: StatefulBuilder( + builder: (context, rebuild) { + return PapyrusReader( + document: book, + controller: controller, + onActivity: (event) { + events.add(event); + rebuild(() {}); + }, + ); + }, + ), + ), + ); + await tester.pumpAndSettle( + const Duration(milliseconds: 50), + EnginePhase.sendSemanticsUpdate, + const Duration(seconds: 5), + ); + final count = events.length; + expect(events.last.ready, isTrue); + expect(count, lessThan(5)); + for (var i = 0; i < 10; i++) { + await tester.pump(const Duration(milliseconds: 50)); + } + expect(events.length, count); + await controller.goToProgress(.5); + await tester.pumpAndSettle(); + expect(events.length, count + 1); + expect(events.last.cause, ReaderNavigationCause.jump); + expect(tester.takeException(), isNull); + }, + ); + + testWidgets( + 'generic activity pauses behind panels and observes jumps without page metrics', + (tester) async { + final events = []; + final controller = controllerFor([_UiReaderEngine()]); + addTearDown(controller.dispose); + await pumpReader( + tester, + document: document('Activity'), + controller: controller, + size: const Size(1100, 800), + onActivity: events.add, + ); + await tester.pumpAndSettle(); + expect(events.last.ready, isTrue); + expect(events.last.visible, isTrue); + expect(events.last.coverage, isEmpty); + await controller.goToProgress(.5); + await tester.pumpAndSettle(); + expect(events.last.cause, ReaderNavigationCause.jump); + await tester.tap(find.byTooltip('Reading settings')); + await tester.pumpAndSettle(); + expect(events.last.visible, isFalse); + await tester.tap(find.byTooltip('Close panel')); + await tester.pumpAndSettle(); + expect(events.last.visible, isTrue); + expect(tester.takeException(), isNull); + }, + ); + + testWidgets('reader header matches the standard book-details app bar', ( + tester, + ) async { + tester.view.physicalSize = const Size(390, 844); + tester.view.devicePixelRatio = 1; + await tester.pumpWidget( + MaterialApp( + theme: ThemeData(useMaterial3: false), + home: Scaffold( + appBar: AppBar(leading: BackButton(onPressed: () {})), + ), + ), + ); + final appBar = tester.getRect(find.byType(AppBar)); + final backIcon = tester.getRect(find.byType(BackButtonIcon)); + final controller = controllerFor([_UiReaderEngine()]); + addTearDown(controller.dispose); + await pumpReader( + tester, + document: document('Header'), + controller: controller, + size: const Size(390, 844), + onBack: () {}, + ); + await tester.pumpAndSettle(); + expect(tester.getRect(find.byType(AppBar)), appBar); + expect(tester.getRect(find.byType(BackButtonIcon)), backIcon); + expect(find.text('The Header Reader'), findsNothing); + }); + + testWidgets('sidebar is flush with the toolbar and screen edges', ( tester, ) async { final controller = controllerFor([_UiReaderEngine()]); @@ -153,15 +320,13 @@ void main() { final toolbar = tester.getRect( find.byKey(const ValueKey('reader-toolbar')), ); - final border = tester.getRect( - find.byKey(const ValueKey('reader-toolbar-border')), - ); final panel = tester.getRect( find.byKey(const ValueKey('reader-side-panel')), ); - expect(border.top, toolbar.bottom); - expect(border.height, 1); - expect(panel.top, border.bottom); + expect(panel.top, toolbar.bottom); + expect(panel.right, 1200); + expect(panel.bottom, 1000); + expect(toolbar, const Rect.fromLTWH(0, 0, 1200, 56)); // The panel header keeps its border; text settings have no separator. expect( find.descendant( @@ -189,21 +354,26 @@ void main() { final viewport = find.byKey(const ValueKey('reader-viewport')); final element = tester.element(viewport); final height = tester.getSize(viewport).height; + expect(height, 844); + expect(tester.getTopLeft(viewport), Offset.zero); + expect(find.byTooltip('Hide controls'), findsNothing); if (width > 720) { await tester.tap(find.byTooltip('Reading settings')); await tester.pumpAndSettle(); + await tester.tap(find.byTooltip('Close panel')); + await tester.pumpAndSettle(); } - await tester.tap(find.byTooltip('Hide controls')); + await toggleReaderControls(tester); await tester.pumpAndSettle(); - expect(find.byKey(const ValueKey('reader-toolbar')), findsNothing); expect( - find.byKey(const ValueKey('reader-progress-controls')), + find.byTooltip('Reading settings').hitTestable(), findsNothing, ); + expect(find.byTooltip('Next').hitTestable(), findsNothing); expect(find.byKey(const ValueKey('reader-side-panel')), findsNothing); - expect(find.byTooltip('Show controls'), findsOneWidget); + expect(find.byTooltip('Reading settings'), findsNothing); expect(tester.element(viewport), same(element)); - expect(tester.getSize(viewport), Size(width, 844)); + expect(tester.getSize(viewport), Size(width, height)); await tester.sendKeyEvent(LogicalKeyboardKey.arrowRight); await tester.pumpAndSettle(); await tester.sendKeyEvent(LogicalKeyboardKey.arrowLeft); @@ -211,28 +381,29 @@ void main() { expect(engine.goNextCallCount, 1); expect(engine.goPreviousCallCount, 1); final locator = controller.snapshot.locator; - await tester.tap(find.byTooltip('Show controls')); + await toggleReaderControls(tester); await tester.pumpAndSettle(); expect(tester.element(viewport), same(element)); expect(tester.getSize(viewport).height, height); expect(controller.snapshot.locator, locator); - await tester.tap(find.byTooltip('Hide controls')); + await toggleReaderControls(tester); await tester.pumpAndSettle(); await tester.sendKeyEvent(LogicalKeyboardKey.escape); await tester.pumpAndSettle(); expect(find.byTooltip('Reading settings'), findsOneWidget); expect(find.byTooltip('Next'), findsOneWidget); - // Opening a different book must restore its exit/navigation controls. - await tester.tap(find.byTooltip('Hide controls')); + // Opening a different book starts with controls hidden. + await toggleReaderControls(tester); await tester.pumpAndSettle(); await pumpReader( tester, document: document('Replacement'), + showControls: false, controller: controllerFor([_UiReaderEngine()]), size: Size(width, 844), ); await tester.pumpAndSettle(); - expect(find.byTooltip('Hide controls'), findsOneWidget); + expect(find.byTooltip('Reading settings'), findsNothing); final replacement = tester .widget(find.byType(PapyrusReader)) .controller!; @@ -255,7 +426,7 @@ void main() { controller: controller, ); await tester.pumpAndSettle(); - await tester.tap(find.byTooltip('Hide controls')); + await toggleReaderControls(tester); await tester.pumpAndSettle(); FocusManager.instance.rootScope.requestFocus(); await tester.pump(); @@ -266,7 +437,7 @@ void main() { await tester.pump(); await tester.sendKeyEvent(LogicalKeyboardKey.escape); await tester.pumpAndSettle(); - expect(find.byTooltip('Hide controls'), findsOneWidget); + expect(find.byTooltip('Reading settings'), findsOneWidget); }, ); @@ -282,7 +453,7 @@ void main() { controller: controller, ); await tester.pumpAndSettle(); - await tester.tap(find.byTooltip('Hide controls')); + await toggleReaderControls(tester); await tester.pumpAndSettle(); final context = tester.element(find.byType(PapyrusReader)); final dialog = showDialog( @@ -301,39 +472,42 @@ void main() { Navigator.of(context).pop(); await tester.pumpAndSettle(); await dialog; - expect(find.byTooltip('Show controls'), findsOneWidget); + expect(find.byTooltip('Reading settings'), findsNothing); }); - testWidgets( - 'the controls toggle retains one accessible button through reflow', - (tester) async { - final semantics = tester.ensureSemantics(); - final controller = controllerFor([_UiReaderEngine()]); - addTearDown(controller.dispose); - await pumpReader( - tester, - document: document('Accessible focus'), - controller: controller, - ); - await tester.pumpAndSettle(); - final before = tester - .getSemantics(find.bySemanticsLabel('Hide controls')) - .id; - await tester.tap(find.byTooltip('Hide controls')); - await tester.pumpAndSettle(); - expect( - tester.getSemantics(find.bySemanticsLabel('Show controls')).id, - before, - ); - await tester.sendKeyEvent(LogicalKeyboardKey.escape); - await tester.pumpAndSettle(); - expect( - tester.getSemantics(find.bySemanticsLabel('Hide controls')).id, - before, - ); - semantics.dispose(); - }, - ); + testWidgets('reading surface exposes accessible controls actions', ( + tester, + ) async { + final semantics = tester.ensureSemantics(); + final controller = controllerFor([_UiReaderEngine()]); + addTearDown(controller.dispose); + await pumpReader( + tester, + document: document('Accessible focus'), + controller: controller, + ); + await tester.pumpAndSettle(); + final surface = find.byKey(const ValueKey('reader-surface-actions')); + final actions = tester + .widget(surface) + .properties + .customSemanticsActions!; + expect(actions.keys.single.label, 'Hide reading controls'); + actions.values.single(); + await tester.pumpAndSettle(); + expect(find.byTooltip('Reading settings'), findsNothing); + final hiddenActions = tester + .widget(surface) + .properties + .customSemanticsActions!; + expect(hiddenActions.keys.single.label, 'Show reading controls'); + hiddenActions.values.single(); + await tester.pumpAndSettle(); + expect(find.byTooltip('Reading settings'), findsOneWidget); + expect(find.byTooltip('Show controls'), findsNothing); + expect(find.byTooltip('Hide controls'), findsNothing); + semantics.dispose(); + }); testWidgets( 'custom toolbars can enter focus mode and restore with Escape', @@ -355,14 +529,14 @@ void main() { await tester.tap(find.text('Focus')); await tester.pumpAndSettle(); expect(find.text('Focus'), findsNothing); - expect(find.byTooltip('Show controls'), findsOneWidget); + expect(find.byTooltip('Reading settings'), findsNothing); await tester.sendKeyEvent(LogicalKeyboardKey.escape); await tester.pumpAndSettle(); expect(find.text('Focus'), findsOneWidget); }, ); - testWidgets('all settings dropdown routes follow the reading appearance', ( + testWidgets('all settings dropdown routes follow the app theme', ( tester, ) async { for (final brightness in [Brightness.light, Brightness.dark]) { @@ -384,15 +558,23 @@ void main() { for (final pair in [ ('System', 'Monospace'), ('Paginated', 'Continuous scroll'), - ('Automatic', 'Double'), + ('Single', 'Double'), ]) { await tester.ensureVisible(find.text(pair.$1).first); await tester.tap(find.text(pair.$1).first); await tester.pumpAndSettle(); final option = find.text(pair.$2).last; final menuTheme = Theme.of(tester.element(option)); - expect(menuTheme.brightness, brightness); - expect(menuTheme.canvasColor, menuTheme.colorScheme.surface); + expect( + menuTheme.brightness, + brightness == Brightness.light + ? Brightness.dark + : Brightness.light, + ); + expect( + menuTheme.canvasColor, + Theme.of(tester.element(find.byType(PapyrusReader))).canvasColor, + ); final text = tester.widget( find .descendant(of: option, matching: find.byType(RichText)) @@ -415,7 +597,7 @@ void main() { }); testWidgets( - 'settings text follows reader appearance in opposite app themes', + 'settings text follows the app theme with opposite reading appearances', (tester) async { for (final brightness in [Brightness.dark, Brightness.light]) { final engine = _UiReaderEngine(); @@ -436,18 +618,24 @@ void main() { await tester.pumpAndSettle(); final label = find.text('Page appearance'); final theme = Theme.of(tester.element(label)); - expect(theme.brightness, brightness); + expect( + theme.brightness, + brightness == Brightness.light ? Brightness.dark : Brightness.light, + ); final rich = tester.widget( find.descendant(of: label, matching: find.byType(RichText)), ); - expect(rich.text.style!.color, theme.colorScheme.onSurface); + expect(rich.text.style!.color, theme.textTheme.titleMedium!.color); final dropdown = find.text('Paginated'); final dropdownText = tester.widget( find .descendant(of: dropdown, matching: find.byType(RichText)) .first, ); - expect(dropdownText.text.style!.color, theme.colorScheme.onSurface); + expect( + dropdownText.text.style!.color, + theme.textTheme.titleMedium!.color, + ); for (final chip in tester.widgetList( find.byType(ChoiceChip), )) { @@ -475,7 +663,7 @@ void main() { ); testWidgets( - 'an open mobile panel updates its theme when Night is selected', + 'an open mobile panel retains the app theme when Night is selected', (tester) async { final engine = _UiReaderEngine(); final controller = controllerFor([engine]); @@ -494,11 +682,12 @@ void main() { await tester.pumpAndSettle(); final label = find.text('Page appearance'); final theme = Theme.of(tester.element(label)); - expect(theme.brightness, Brightness.dark); + expect(theme.brightness, Brightness.light); + expect(controller.preferences.brightness, Brightness.dark); final rich = tester.widget( find.descendant(of: label, matching: find.byType(RichText)), ); - expect(rich.text.style!.color, theme.colorScheme.onSurface); + expect(rich.text.style!.color, theme.textTheme.titleMedium!.color); expect(tester.takeException(), isNull); }, ); @@ -515,86 +704,124 @@ void main() { tester, document: document('Loading'), controller: controller, + onBack: () {}, ); expect(find.byType(CircularProgressIndicator), findsOneWidget); - expect(find.text('Opening The Loading Reader…'), findsOneWidget); + expect(find.byTooltip('Back'), findsNothing); + expect(find.text('Opening The Loading Reader…'), findsNothing); + expect( + tester.getCenter(find.byType(CircularProgressIndicator)), + const Offset(300, 400), + ); gate.complete(); await tester.pumpAndSettle(); expect(find.byKey(const ValueKey('reader-viewport')), findsOneWidget); - expect(find.text('The Loading Reader'), findsOneWidget); - expect(find.byTooltip('Table of contents'), findsOneWidget); + expect(find.text('The Loading Reader'), findsNothing); + expect(find.byTooltip('Reading settings'), findsNothing); + expect(find.byTooltip('Table of contents'), findsNothing); + await toggleReaderControls(tester); expect(find.byTooltip('Reading settings'), findsOneWidget); }); - testWidgets('compact chrome opens TOC and settings as bottom sheets', ( - tester, - ) async { - final engine = _UiReaderEngine(); - final controller = controllerFor([engine]); - addTearDown(controller.dispose); - await pumpReader( - tester, - document: document('Compact'), - controller: controller, + Route hostPanelRoute( + BuildContext context, + ReaderPanelRouteContext panel, + ) { + return ModalBottomSheetRoute( + isScrollControlled: true, + builder: (context) => SizedBox( + height: 700, + child: Column( + children: [ + Text(panel.title), + Expanded(child: panel.buildContent(context, null)), + ], + ), + ), ); - await tester.pumpAndSettle(); + } - await tester.tap(find.byTooltip('Table of contents')); - await tester.pumpAndSettle(); + for (final host in [false, true]) { + testWidgets( + 'compact chrome opens TOC and settings as bottom sheets (host: $host)', + (tester) async { + final engine = _UiReaderEngine(); + final controller = controllerFor([engine]); + addTearDown(controller.dispose); + await pumpReader( + tester, + document: document('Compact'), + controller: controller, + builders: ReaderUiBuilders( + compactPanelRoute: host ? hostPanelRoute : null, + ), + ); + await tester.pumpAndSettle(); - expect(find.byType(BottomSheet), findsOneWidget); - expect(find.text('Chapter one'), findsOneWidget); + await tester.tap(find.byTooltip('Table of contents')); + await tester.pumpAndSettle(); - Navigator.of(tester.element(find.byType(BottomSheet))).pop(); - await tester.pumpAndSettle(); - await tester.tap(find.byTooltip('Reading settings')); - await tester.pumpAndSettle(); + expect(find.byType(BottomSheet), findsOneWidget); + expect(find.text('Chapter one'), findsOneWidget); - expect(find.byType(BottomSheet), findsOneWidget); - expect(find.text('Reading mode'), findsOneWidget); - }); + Navigator.of(tester.element(find.byType(BottomSheet))).pop(); + await tester.pumpAndSettle(); + await tester.tap(find.byTooltip('Reading settings')); + await tester.pumpAndSettle(); - testWidgets('compact settings rebuild and preserve sequential edits', ( - tester, - ) async { - final engine = _UiReaderEngine(); - final controller = controllerFor([engine]); - addTearDown(controller.dispose); - await pumpReader( - tester, - document: document('Reactive settings'), - controller: controller, + expect(find.byType(BottomSheet), findsOneWidget); + expect(find.text('Reading mode'), findsOneWidget); + }, ); - await tester.pumpAndSettle(); + } - await tester.tap(find.byTooltip('Reading settings')); - await tester.pumpAndSettle(); + for (final host in [false, true]) { + testWidgets( + 'compact settings rebuild and preserve sequential edits (host: $host)', + (tester) async { + final engine = _UiReaderEngine(); + final controller = controllerFor([engine]); + addTearDown(controller.dispose); + await pumpReader( + tester, + document: document('Reactive settings'), + controller: controller, + builders: ReaderUiBuilders( + compactPanelRoute: host ? hostPanelRoute : null, + ), + ); + await tester.pumpAndSettle(); - Slider fontSlider() => tester - .widgetList(find.byType(Slider)) - .singleWhere((slider) => slider.max == 72); - Slider lineHeightSlider() => tester - .widgetList(find.byType(Slider)) - .singleWhere((slider) => slider.max == 2.5); + await tester.tap(find.byTooltip('Reading settings')); + await tester.pumpAndSettle(); - fontSlider().onChanged!(26); - fontSlider().onChangeEnd!(26); - await tester.pump(); + Slider fontSlider() => tester + .widgetList(find.byType(Slider)) + .singleWhere((slider) => slider.max == 72); + Slider lineHeightSlider() => tester + .widgetList(find.byType(Slider)) + .singleWhere((slider) => slider.max == 2.5); - expect(fontSlider().value, 26); - expect(controller.snapshot.preferences.fontSize, 26); + fontSlider().onChanged!(26); + fontSlider().onChangeEnd!(26); + await tester.pump(); - lineHeightSlider().onChanged!(2); - lineHeightSlider().onChangeEnd!(2); - await tester.pump(); + expect(fontSlider().value, 26); + expect(controller.snapshot.preferences.fontSize, 26); - expect(lineHeightSlider().value, 2); - expect(controller.snapshot.preferences.fontSize, 26); - expect(controller.snapshot.preferences.lineHeight, 2); - }); + lineHeightSlider().onChanged!(2); + lineHeightSlider().onChangeEnd!(2); + await tester.pump(); + + expect(lineHeightSlider().value, 2); + expect(controller.snapshot.preferences.fontSize, 26); + expect(controller.snapshot.preferences.lineHeight, 2); + }, + ); + } testWidgets( 'settings sliders preview locally and commit once on change end', @@ -669,82 +896,102 @@ void main() { }, ); - testWidgets('compact sheet closes before controller and document swap', ( - tester, - ) async { - tester.view.physicalSize = const Size(600, 800); - tester.view.devicePixelRatio = 1; - addTearDown(tester.view.resetPhysicalSize); - addTearDown(tester.view.resetDevicePixelRatio); - final firstEngine = _UiReaderEngine(); - final secondEngine = _UiReaderEngine(); - final firstController = controllerFor([firstEngine]); - final secondController = controllerFor([secondEngine]); - addTearDown(firstController.dispose); - addTearDown(secondController.dispose); - - Widget app(ReaderDocument selected, ReaderController controller) { - return MaterialApp( - home: PapyrusReader(document: selected, controller: controller), - ); - } - - await tester.pumpWidget(app(document('First sheet'), firstController)); - await tester.pumpAndSettle(); - await tester.tap(find.byTooltip('Reading settings')); - await tester.pumpAndSettle(); - expect(find.byType(BottomSheet), findsOneWidget); + for (final host in [false, true]) { + testWidgets( + 'compact sheet closes before controller and document swap (host: $host)', + (tester) async { + tester.view.physicalSize = const Size(600, 800); + tester.view.devicePixelRatio = 1; + addTearDown(tester.view.resetPhysicalSize); + addTearDown(tester.view.resetDevicePixelRatio); + final firstEngine = _UiReaderEngine(); + final secondEngine = _UiReaderEngine(); + final firstController = controllerFor([firstEngine]); + final secondController = controllerFor([secondEngine]); + addTearDown(firstController.dispose); + addTearDown(secondController.dispose); + + Widget app(ReaderDocument selected, ReaderController controller) { + return MaterialApp( + home: PapyrusReader( + document: selected, + controller: controller, + builders: ReaderUiBuilders( + compactPanelRoute: host ? hostPanelRoute : null, + ), + ), + ); + } - await tester.pumpWidget(app(document('Second sheet'), secondController)); - await tester.pumpAndSettle(); + await tester.pumpWidget( + app(document('First sheet'), firstController), + ); + await tester.pumpAndSettle(); + await toggleReaderControls(tester); + await tester.tap(find.byTooltip('Reading settings')); + await tester.pumpAndSettle(); + expect(find.byType(BottomSheet), findsOneWidget); - expect(find.byType(BottomSheet), findsNothing); - expect(find.text('The Second sheet Reader'), findsOneWidget); - expect(secondController.snapshot.status, ReaderStatus.ready); - expect(firstEngine.isDisposed, isFalse); - }); + await tester.pumpWidget( + app(document('Second sheet'), secondController), + ); + await tester.pumpAndSettle(); - testWidgets('pending compact sheets are removed on immediate unmount', ( - tester, - ) async { - tester.view.physicalSize = const Size(600, 800); - tester.view.devicePixelRatio = 1; - addTearDown(tester.view.resetPhysicalSize); - addTearDown(tester.view.resetDevicePixelRatio); - final engine = _UiReaderEngine(); - final controller = controllerFor([engine]); - late StateSetter updateHost; - var showReader = true; - addTearDown(controller.dispose); - await tester.pumpWidget( - MaterialApp( - home: StatefulBuilder( - builder: (context, setState) { - updateHost = setState; - return showReader - ? PapyrusReader( - document: document('Pending sheet'), - controller: controller, - ) - : const SizedBox(key: ValueKey('reader-removed')); - }, - ), - ), + expect(find.byType(BottomSheet), findsNothing); + expect(find.text('The Second sheet Reader'), findsNothing); + expect(find.byTooltip('Reading settings'), findsNothing); + expect(secondController.snapshot.status, ReaderStatus.ready); + expect(firstEngine.isDisposed, isFalse); + }, ); - await tester.pumpAndSettle(); + } - await tester.tap(find.byTooltip('Reading settings')); - updateHost(() => showReader = false); - await tester.pumpAndSettle(); + for (final host in [false, true]) { + testWidgets( + 'pending compact sheets are removed on immediate unmount (host: $host)', + (tester) async { + tester.view.physicalSize = const Size(600, 800); + tester.view.devicePixelRatio = 1; + addTearDown(tester.view.resetPhysicalSize); + addTearDown(tester.view.resetDevicePixelRatio); + final engine = _UiReaderEngine(); + final controller = controllerFor([engine]); + late StateSetter updateHost; + var showReader = true; + addTearDown(controller.dispose); + await tester.pumpWidget( + MaterialApp( + home: StatefulBuilder( + builder: (context, setState) { + updateHost = setState; + return showReader + ? PapyrusReader( + document: document('Pending sheet'), + controller: controller, + builders: ReaderUiBuilders( + compactPanelRoute: host ? hostPanelRoute : null, + ), + ) + : const SizedBox(key: ValueKey('reader-removed')); + }, + ), + ), + ); + await tester.pumpAndSettle(); - expect(find.byKey(const ValueKey('reader-removed')), findsOneWidget); - expect(find.byType(BottomSheet), findsNothing); - expect(tester.takeException(), isNull); - }); + await toggleReaderControls(tester); + await tester.tap(find.byTooltip('Reading settings')); + updateHost(() => showReader = false); + await tester.pumpAndSettle(); - testWidgets('wide chrome uses the full viewport until a panel is opened', ( - tester, - ) async { + expect(find.byKey(const ValueKey('reader-removed')), findsOneWidget); + expect(find.byType(BottomSheet), findsNothing); + expect(tester.takeException(), isNull); + }, + ); + } + + testWidgets('wide panels overlay the unchanged viewport', (tester) async { final engine = _UiReaderEngine(); final controller = controllerFor([engine]); addTearDown(controller.dispose); @@ -769,7 +1016,7 @@ void main() { expect(find.byType(BottomSheet), findsNothing); expect(find.byKey(const ValueKey('reader-side-panel')), findsOneWidget); expect(find.text('Chapter one'), findsOneWidget); - expect(viewportAfter.width, lessThan(viewportBefore.width)); + expect(viewportAfter.width, viewportBefore.width); expect(viewportAfter.height, viewportBefore.height); await tester.tap(find.byTooltip('Reading settings')); @@ -823,6 +1070,106 @@ void main() { expect(find.text('Reading mode'), findsOneWidget); }); + testWidgets( + 'slider releases coalesce and keep the latest preview while waiting', + (tester) async { + final gate = Completer(); + final engine = _UiReaderEngine(progressGates: [gate]); + final controller = controllerFor([engine]); + addTearDown(controller.dispose); + await pumpReader( + tester, + document: document('Seek'), + controller: controller, + ); + await tester.pumpAndSettle(); + Slider slider() => tester.widget(find.byType(Slider).first); + slider().onChangeEnd!(.2); + await tester.pump(); + slider().onChangeEnd!(.4); + slider().onChangeEnd!(.9); + await tester.pump(); + expect(engine.goToProgressCalls, [.2]); + engine._publishLocator( + EpubReaderLocator( + spineIndex: 0, + localProgression: 0, + totalProgression: 0, + ), + ); + await tester.pump(); + expect(slider().value, .9); + gate.complete(); + await tester.pumpAndSettle(); + expect(engine.goToProgressCalls, [.2, .9]); + expect(slider().value, .9); + expect(tester.takeException(), isNull); + }, + ); + + testWidgets('background updates do not move the thumb during a drag', ( + tester, + ) async { + final engine = _UiReaderEngine(); + final controller = controllerFor([engine]); + addTearDown(controller.dispose); + await pumpReader( + tester, + document: document('Drag'), + controller: controller, + ); + await tester.pumpAndSettle(); + Slider slider() => tester.widget(find.byType(Slider).first); + slider().onChangeStart!(0); + slider().onChanged!(.8); + engine._publishLocator( + EpubReaderLocator( + spineIndex: 0, + localProgression: 0, + totalProgression: 0, + ), + ); + await tester.pump(); + expect(slider().value, .8); + expect(engine.goToProgressCalls, isEmpty); + slider().onChangeEnd!(.8); + await tester.pumpAndSettle(); + expect(engine.goToProgressCalls, [.8]); + }); + + testWidgets('obsolete seek errors do not replace the latest result', ( + tester, + ) async { + final gate = Completer(); + final engine = _UiReaderEngine( + progressGates: [gate], + progressFailures: [ + const ReaderException( + ReaderErrorCode.invalidDocument, + 'Obsolete seek failure', + ), + ], + ); + final controller = controllerFor([engine]); + addTearDown(controller.dispose); + await pumpReader( + tester, + document: document('Failure'), + controller: controller, + ); + await tester.pumpAndSettle(); + final slider = tester.widget(find.byType(Slider).first); + slider.onChangeEnd!(.2); + await tester.pump(); + slider.onChangeEnd!(.9); + gate.complete(); + await tester.pumpAndSettle(); + expect(engine.goToProgressCalls, [.2, .9]); + expect(find.text('Obsolete seek failure'), findsNothing); + expect(tester.widget(find.byType(Slider).first).value, .9); + expect(tester.takeException(), isNull); + }); + testWidgets('slider, buttons, and keyboard delegate navigation', ( tester, ) async { @@ -859,7 +1206,7 @@ void main() { }); testWidgets( - 'navigation commands serialize and expose disabled busy controls', + 'navigation commands serialize without flashing or disabling controls', (tester) async { final firstGate = Completer(); final secondGate = Completer(); @@ -879,6 +1226,11 @@ void main() { expect(engine.maxActiveNavigationCount, 1); expect(engine.navigationEvents, ['next-start-0']); + expect( + find.byKey(const ValueKey('reader-command-progress')), + findsNothing, + ); + await tester.pump(const Duration(milliseconds: 300)); expect( find.byKey(const ValueKey('reader-command-progress')), findsOneWidget, @@ -889,7 +1241,7 @@ void main() { matching: find.byType(IconButton), ), ); - expect(nextButton.onPressed, isNull); + expect(nextButton.onPressed, isNotNull); firstGate.complete(); await tester.pump(); @@ -1023,6 +1375,70 @@ void main() { }, ); + testWidgets( + 'wide panels follow the actual changing custom toolbar height', + (tester) async { + final engine = _UiReaderEngine(); + final controller = controllerFor([engine]); + final height = ValueNotifier(96); + addTearDown(controller.dispose); + addTearDown(height.dispose); + await pumpReader( + tester, + document: document('Tall custom toolbar'), + controller: controller, + size: const Size(1100, 800), + builders: ReaderUiBuilders( + toolbar: (context, state) => ValueListenableBuilder( + valueListenable: height, + builder: (context, value, child) => SizedBox( + height: value, + child: Align( + alignment: Alignment.bottomRight, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + TextButton( + onPressed: state.openSettings, + child: const Text('Host settings'), + ), + TextButton( + onPressed: state.openTableOfContents, + child: const Text('Host contents'), + ), + ], + ), + ), + ), + ), + ), + ); + await tester.pumpAndSettle(); + final viewport = find.byKey(const ValueKey('reader-viewport')); + final viewportBounds = tester.getRect(viewport); + final panel = find.byKey(const ValueKey('reader-side-panel')); + await tester.tap(find.text('Host settings')); + await tester.pump(); + expect(tester.getRect(panel).top, 96); + expect(tester.getRect(viewport), viewportBounds); + await tester.tap(find.text('Host contents')); + await tester.pump(); + expect(find.text('Chapter one'), findsOneWidget); + height.value = 128; + await tester.pump(); + expect(tester.getRect(panel).top, 128); + expect(tester.getRect(viewport), viewportBounds); + await tester.tap(find.text('Host settings')); + await tester.pump(); + expect(find.text('Reading mode'), findsOneWidget); + await tester.sendKeyEvent(LogicalKeyboardKey.escape); + await tester.pump(); + expect(panel, findsNothing); + expect(tester.getRect(viewport), viewportBounds); + expect(tester.takeException(), isNull); + }, + ); + testWidgets('wide panels restore a custom toolbar opener', (tester) async { final engine = _UiReaderEngine(); final controller = controllerFor([engine]); @@ -1100,6 +1516,7 @@ void main() { await pumpReader( tester, document: document('Retry'), + showControls: false, controller: controller, builders: ReaderUiBuilders( loading: (context, state) => const Text('Custom loading'), @@ -1237,7 +1654,8 @@ void main() { await tester.pumpAndSettle(); expect(controller.snapshot.document!.id, 'Second'); - expect(find.text('The Second Reader'), findsOneWidget); + expect(find.text('The Second Reader'), findsNothing); + expect(find.byTooltip('Reading settings'), findsNothing); expect(firstEngine.isDisposed, isTrue); }, ); @@ -1268,7 +1686,7 @@ void main() { ) .first, ); - expect(material.color, isNot(Colors.white)); + expect(material.color, controller.snapshot.preferences.backgroundColor); expect(exception, isNull); expect( find.byWidgetPredicate( @@ -1289,6 +1707,8 @@ final class _UiReaderEngine extends ReaderEngine { this.loadGate, this.loadFailure, this.nextGates = const [], + this.progressGates = const [], + this.progressFailures = const [], this.nextFailure, this.previousFailure, this.preferenceFailure, @@ -1304,6 +1724,8 @@ final class _UiReaderEngine extends ReaderEngine { final Widget Function(BuildContext, ReaderSnapshot)? viewportBuilder; final ReaderException? loadFailure; final List> nextGates; + final List> progressGates; + final List progressFailures; final ReaderException? nextFailure; final ReaderException? previousFailure; final ReaderException? preferenceFailure; @@ -1324,7 +1746,6 @@ final class _UiReaderEngine extends ReaderEngine { ReaderTocEntry( title: 'Chapter one', locator: EpubReaderLocator( - cfi: 'epubcfi(/6/2!/4/1:0)', spineIndex: 0, localProgression: 0, totalProgression: 0, @@ -1333,7 +1754,6 @@ final class _UiReaderEngine extends ReaderEngine { ReaderTocEntry( title: 'A nested section', locator: EpubReaderLocator( - cfi: 'epubcfi(/6/2!/4/2:0)', spineIndex: 0, localProgression: 0.2, totalProgression: 0.1, @@ -1384,7 +1804,6 @@ final class _UiReaderEngine extends ReaderEngine { locator: initialLocator ?? EpubReaderLocator( - cfi: 'epubcfi(/6/2!/4/1:0)', spineIndex: 0, localProgression: 0, totalProgression: 0, @@ -1402,10 +1821,14 @@ final class _UiReaderEngine extends ReaderEngine { @override Future goToProgress(double progress) async { + final call = goToProgressCalls.length; goToProgressCalls.add(progress); + if (call < progressGates.length) await progressGates[call].future; + if (call < progressFailures.length && progressFailures[call] != null) { + throw progressFailures[call]!; + } _publishLocator( EpubReaderLocator( - cfi: 'epubcfi(/6/2!/4/1:${(progress * 100).round()})', spineIndex: 0, localProgression: progress, totalProgression: progress, @@ -1500,3 +1923,10 @@ final class _SnapshotViewportState extends State<_SnapshotViewport> { Widget build(BuildContext context) => Text('Custom position ${(widget.progression * 100).toStringAsFixed(0)}'); } + +Future toggleReaderControls(WidgetTester tester) async { + await tester.tapAt( + tester.getRect(find.byKey(const ValueKey('reader-content'))).center, + ); + await tester.pump(const Duration(milliseconds: 350)); +} diff --git a/test/presentation/pdf_selection_test.dart b/test/presentation/pdf_selection_test.dart new file mode 100644 index 0000000..414957b --- /dev/null +++ b/test/presentation/pdf_selection_test.dart @@ -0,0 +1,213 @@ +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus_reader/papyrus_reader.dart'; +import 'package:papyrus_reader/src/engine/pdf/pdf_facade.dart'; +import 'package:papyrus_reader/src/presentation/reader_interaction_scope.dart'; +import 'package:pdfrx/pdfrx.dart'; + +import '../support/pdfium_test_setup.dart'; + +void main() { + for (final layout in ReaderLayoutMode.values) { + testWidgets( + 'PDF mouse drag opens annotation toolbar in $layout', + (tester) async { + final facade = await tester.runAsync(() async { + await initializePdfiumForTest(); + return createPdfrxFacade( + _pdfBytes(), + sourceName: 'selection-$layout', + ).timeout(const Duration(seconds: 15)); + }); + addTearDown(() => (facade as DisposablePdfFacade).dispose()); + ReaderSelection? annotated; + var turns = 0; + var keyboardTurns = 0; + final copied = []; + tester.binding.defaultBinaryMessenger.setMockMethodCallHandler( + SystemChannels.platform, + (call) async { + if (call.method == 'Clipboard.setData') { + copied.add((call.arguments as Map)['text'] as String); + } + return null; + }, + ); + addTearDown( + () => tester.binding.defaultBinaryMessenger.setMockMethodCallHandler( + SystemChannels.platform, + null, + ), + ); + final configuration = PdfViewportConfiguration( + pageIndex: 0, + facingPages: false, + backgroundColor: Colors.white, + brightness: Brightness.light, + layoutMode: layout, + onPageChanged: (_) {}, + ); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: ReaderInteractionScope( + onTurn: (_) => turns++, + onSelectionChanged: (_) {}, + suppressTap: () {}, + onAnnotate: (selection) => annotated = selection, + child: CallbackShortcuts( + bindings: { + const SingleActivator(LogicalKeyboardKey.pageDown): () => + keyboardTurns++, + }, + child: Builder( + builder: (context) => facade!.buildViewport(configuration), + ), + ), + ), + ), + ), + ); + final controller = tester + .widget(find.byType(PdfViewer)) + .controller!; + + for (var frame = 0; frame < 40; frame++) { + await tester.pump(const Duration(milliseconds: 50)); + await tester.runAsync( + () => Future.delayed(const Duration(milliseconds: 10)), + ); + } + + expect(controller.isReady, isTrue); + final page = controller.document.pages.first; + final text = (await tester.runAsync( + () => page.loadText().timeout(const Duration(seconds: 15)), + ))!; + final pageRect = controller.layout.pageLayouts.first; + Offset character(int index) => controller.documentToGlobal( + text.charRects[index].center.toOffsetInDocument( + page: page, + pageRect: pageRect, + ), + )!; + final start = character(0); + final end = character(16); + final mouse = await tester.createGesture(kind: PointerDeviceKind.mouse); + await mouse.addPointer(location: start); + await mouse.down(start); + await mouse.moveTo(Offset.lerp(start, end, .5)!); + await tester.pump(const Duration(milliseconds: 50)); + await mouse.moveTo(end); + await tester.pump(const Duration(milliseconds: 50)); + expect(find.text('Annotate'), findsNothing); + final selectionFocus = FocusManager.instance.primaryFocus; + await mouse.up(); + + for ( + var frame = 0; + frame < 10 && find.text('Annotate').evaluate().isEmpty; + frame++ + ) { + await tester.pump(const Duration(milliseconds: 50)); + await tester.runAsync( + () => Future.delayed(const Duration(milliseconds: 10)), + ); + } + + expect(controller.textSelectionDelegate.hasSelectedText, isTrue); + expect(find.text('Annotate'), findsOneWidget); + expect(find.text('Copy'), findsOneWidget); + expect(find.text('Add note'), findsNothing); + final toolbar = tester.getRect(find.text('Annotate')); + expect(toolbar.bottom, lessThan(start.dy)); + expect(turns, 0); + await tester.pump(); + expect(FocusManager.instance.primaryFocus, same(selectionFocus)); + + for (final modifier in [ + LogicalKeyboardKey.controlLeft, + LogicalKeyboardKey.metaLeft, + ]) { + await tester.sendKeyDownEvent(modifier); + await tester.sendKeyEvent(LogicalKeyboardKey.keyC); + await tester.sendKeyUpEvent(modifier); + await tester.runAsync( + () => Future.delayed(const Duration(milliseconds: 20)), + ); + } + + expect(copied, contains(contains('Selection'))); + await tester.sendKeyEvent(LogicalKeyboardKey.pageDown); + expect(keyboardTurns, 1); + await tester.tap(find.text('Annotate')); + await tester.pump(); + await tester.runAsync( + () => Future.delayed(const Duration(milliseconds: 20)), + ); + await tester.pump(); + expect(annotated, isNotNull); + expect(annotated!.text, contains('Selection')); + expect(annotated!.rectangles, isNotEmpty); + expect((annotated!.start as PdfReaderLocator).pageIndex, 0); + expect(controller.textSelectionDelegate.hasSelectedText, isFalse); + expect(find.text('Annotate'), findsNothing); + + await mouse.down(start); + await mouse.moveTo(end); + await tester.pump(const Duration(milliseconds: 50)); + await mouse.up(); + + for (var frame = 0; frame < 10; frame++) { + await tester.pump(const Duration(milliseconds: 50)); + await tester.runAsync( + () => Future.delayed(const Duration(milliseconds: 10)), + ); + } + + expect(find.text('Annotate'), findsOneWidget); + await tester.sendKeyEvent(LogicalKeyboardKey.escape); + await tester.pump(); + expect(find.text('Annotate'), findsNothing); + await mouse.removePointer(); + await tester.pumpWidget(const SizedBox.shrink()); + expect(tester.takeException(), isNull); + }, + skip: kIsWeb, + timeout: const Timeout(Duration(minutes: 1)), + ); // Browser PDFium is checked through the example asset server. + } +} + +Uint8List _pdfBytes() { + const content = + 'BT /F1 20 Tf 50 700 Td (Selection toolbar appears here.) Tj ET'; + final objects = [ + '<< /Type /Catalog /Pages 2 0 R >>', + '<< /Type /Pages /Kids [3 0 R] /Count 1 >>', + '<< /Type /Page /Parent 2 0 R /MediaBox [0 0 600 800] /Resources << /Font << /F1 4 0 R >> >> /Contents 5 0 R >>', + '<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>', + '<< /Length ${content.length} >>\nstream\n$content\nendstream', + ]; + final buffer = StringBuffer('%PDF-1.4\n'); + final offsets = []; + for (var index = 0; index < objects.length; index++) { + offsets.add(buffer.length); + buffer.write('${index + 1} 0 obj\n${objects[index]}\nendobj\n'); + } + final xref = buffer.length; + buffer.write('xref\n0 ${objects.length + 1}\n0000000000 65535 f \n'); + for (final offset in offsets) { + buffer.write('${offset.toString().padLeft(10, '0')} 00000 n \n'); + } + buffer.write( + 'trailer\n<< /Size ${objects.length + 1} /Root 1 0 R >>\nstartxref\n$xref\n%%EOF', + ); + return Uint8List.fromList(ascii.encode(buffer.toString())); +} diff --git a/test/presentation/reader_loading_motion_test.dart b/test/presentation/reader_loading_motion_test.dart new file mode 100644 index 0000000..27ebd2c --- /dev/null +++ b/test/presentation/reader_loading_motion_test.dart @@ -0,0 +1,247 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus_reader/papyrus_reader.dart'; + +import '../support/in_process_epub_worker.dart'; +import '../support/synthetic_epub.dart'; + +void main() { + testWidgets( + 'host loader stays consistent through opening and initial pagination', + (tester) async { + final gate = Completer(); + final engine = testEpubEngine(); + final phases = {}; + const loaderKey = ValueKey('host-loader'); + await tester.pumpWidget( + MaterialApp( + home: PapyrusReader( + registry: ReaderEngineRegistry([ + ReaderEngineRegistration( + formats: const {ReaderFormat.epub}, + factory: () => engine, + ), + ]), + document: ReaderDocument( + id: 'loading', + format: ReaderFormat.epub, + loadBytes: () async { + await gate.future; + return syntheticEpub(longChapter: true); + }, + ), + initialPreferences: const ReaderPreferences( + brightness: Brightness.dark, + backgroundColor: Colors.black, + foregroundColor: Colors.white, + ), + builders: ReaderUiBuilders( + loading: (context, state) { + phases.add(state.snapshot.status); + expect(Theme.of(context).brightness, Brightness.light); + return const Center( + child: CircularProgressIndicator(key: loaderKey), + ); + }, + ), + ), + ), + ); + expect(find.byKey(loaderKey), findsOneWidget); + final center = tester.getCenter(find.byKey(loaderKey)); + gate.complete(); + + for ( + var frame = 0; + frame < 100 && !engine.snapshot.contentReady; + frame++ + ) { + await tester.pump(const Duration(milliseconds: 16)); + expect(find.text('Preparing pages…'), findsNothing); + if (find.byType(CircularProgressIndicator).evaluate().isNotEmpty) { + expect(find.byType(CircularProgressIndicator), findsOneWidget); + expect(find.byKey(loaderKey), findsOneWidget); + expect(tester.getCenter(find.byKey(loaderKey)), center); + } + } + + await tester.pumpAndSettle(); + expect(phases, containsAll([ReaderStatus.loading, ReaderStatus.ready])); + expect(engine.snapshot.contentReady, isTrue); + expect(find.byType(CircularProgressIndicator), findsNothing); + expect(find.byType(PageView), findsOneWidget); + expect(tester.takeException(), isNull); + }, + ); + + testWidgets('safe-area color stays with readable pages until a new load', ( + tester, + ) async { + tester.view.padding = const FakeViewPadding(top: 24, bottom: 20); + addTearDown(tester.view.resetPadding); + final engines = []; + final controller = ReaderController( + initialPreferences: const ReaderPreferences( + brightness: Brightness.dark, + backgroundColor: Colors.black, + foregroundColor: Colors.white, + ), + registry: ReaderEngineRegistry([ + ReaderEngineRegistration( + formats: const {ReaderFormat.epub}, + factory: () { + final engine = testEpubEngine(); + engines.add(engine); + return engine; + }, + ), + ]), + ); + addTearDown(controller.dispose); + await tester.pumpWidget( + MaterialApp( + home: PapyrusReader( + controller: controller, + document: ReaderDocument( + id: 'insets', + format: ReaderFormat.epub, + loadBytes: () async => syntheticEpub(longChapter: true), + ), + ), + ), + ); + + Color? insetColor() => tester + .widget( + find + .descendant( + of: find.byType(PapyrusReader), + matching: find.byType(Material), + ) + .first, + ) + .color; + + final hostColor = Theme.of( + tester.element(find.byType(PapyrusReader)), + ).colorScheme.surface; + expect(insetColor(), hostColor); + await tester.pumpAndSettle(); + final engine = engines.single; + expect(engine.snapshot.contentReady, isTrue); + expect(insetColor(), Colors.black); + + engine.viewportPreparing(); + expect(engine.snapshot.contentReady, isFalse); + await tester.pump(); + expect(insetColor(), Colors.black); + await tester.pumpAndSettle(); + + await controller.updatePreferences( + controller.preferences.copyWith(fontSize: 28), + ); + expect(controller.snapshot.contentReady, isFalse); + await tester.pump(); + expect(insetColor(), Colors.black); + await tester.pumpAndSettle(); + + var finished = false; + final turn = controller + .goTo( + EpubReaderLocator( + spineIndex: 1, + localProgression: 0, + totalProgression: .9, + ), + ) + .whenComplete(() => finished = true); + for (var frame = 0; frame < 100 && !finished; frame++) { + await tester.pump(const Duration(milliseconds: 16)); + expect(insetColor(), Colors.black); + } + expect(finished, isTrue); + await turn; + await tester.pumpAndSettle(); + expect(engine.locator.spineIndex, 1); + + final gate = Completer(); + final load = controller.load( + ReaderDocument( + id: 'replacement', + format: ReaderFormat.epub, + loadBytes: () async { + await gate.future; + return syntheticEpub(longChapter: true); + }, + ), + ); + await tester.pump(); + expect(insetColor(), hostColor); + gate.complete(); + for ( + var frame = 0; + frame < 100 && !controller.snapshot.contentReady; + frame++ + ) { + await tester.pump(const Duration(milliseconds: 16)); + if (!controller.snapshot.contentReady) { + expect(insetColor(), hostColor); + } + } + await load; + await tester.pumpAndSettle(); + expect(controller.snapshot.contentReady, isTrue); + expect(insetColor(), Colors.black); + expect(tester.takeException(), isNull); + }); + + testWidgets('reading settings update animation without moving the page', ( + tester, + ) async { + final engine = testEpubEngine(); + final changes = []; + await tester.pumpWidget( + MaterialApp( + home: PapyrusReader( + registry: ReaderEngineRegistry([ + ReaderEngineRegistration( + formats: const {ReaderFormat.epub}, + factory: () => engine, + ), + ]), + document: ReaderDocument( + id: 'settings', + format: ReaderFormat.epub, + loadBytes: () async => syntheticEpub(longChapter: true), + ), + onPreferencesChanged: changes.add, + ), + ), + ); + await tester.pumpAndSettle(); + await pumpReaderCommand(tester, engine.goNext()); + final location = engine.locator; + await tester.sendKeyEvent(LogicalKeyboardKey.escape); + await tester.pumpAndSettle(); + await tester.tap(find.byTooltip('Reading settings')); + await tester.pumpAndSettle(); + final animation = find.byType(DropdownButtonFormField); + await tester.ensureVisible(animation); + await tester.tap(animation); + await tester.pumpAndSettle(); + await tester.tap(find.text('None').last); + await tester.pumpAndSettle(); + expect(engine.preferences.pageTurnAnimation, isFalse); + expect(changes.last.pageTurnAnimation, isFalse); + expect(engine.locator, location); + await tester.tap(animation); + await tester.pumpAndSettle(); + await tester.tap(find.text('Slide').last); + await tester.pumpAndSettle(); + expect(engine.preferences.pageTurnAnimation, isTrue); + expect(tester.takeException(), isNull); + }); +} diff --git a/test/presentation/reader_surface_test.dart b/test/presentation/reader_surface_test.dart new file mode 100644 index 0000000..6985e52 --- /dev/null +++ b/test/presentation/reader_surface_test.dart @@ -0,0 +1,146 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus_reader/papyrus_reader.dart'; +import 'package:papyrus_reader/src/engine/epub/epub_rich_layout.dart'; +import 'package:papyrus_reader/src/presentation/reader_interaction_scope.dart'; +import 'package:papyrus_reader/src/presentation/reader_surface.dart'; + +void main() { + testWidgets( + 'selectable text toggles while only the actual link excludes taps', + (tester) async { + var toggles = 0; + final block = EpubContentBlock({ + 'kind': 'p', + 'offset': 0, + 'length': 32, + 'runs': [ + {'text': 'Ordinary words '}, + {'text': 'a link', 'link': true, 'underline': true}, + {'text': ' more text.'}, + ], + }); + await tester.pumpWidget( + MaterialApp( + home: ReaderSurface( + enabled: true, + onToggle: () => toggles++, + onTurn: (_) {}, + child: Center( + child: SizedBox( + width: 500, + child: Builder( + builder: (context) => SelectionArea( + onSelectionChanged: (selection) => + ReaderInteractionScope.maybeOf( + context, + )!.onSelectionChanged( + selection?.plainText.isNotEmpty ?? false, + ), + child: buildEpubFragment( + EpubPageFragment(block, 0, 32, 40), + const ReaderPreferences(fontSize: 24), + ), + ), + ), + ), + ), + ), + ), + ); + final paragraph = tester.renderObject( + find.byWidgetPredicate( + (widget) => + widget is RichText && + widget.text.toPlainText() == 'Ordinary words a link more text.', + ), + ); + Offset character(int index) => paragraph.localToGlobal( + paragraph + .getBoxesForSelection( + TextSelection(baseOffset: index, extentOffset: index + 1), + ) + .single + .toRect() + .center, + ); + await tester.tapAt(character(2)); + await tester.pump(const Duration(milliseconds: 350)); + expect(toggles, 1); + await tester.tapAt(character(16)); + await tester.pump(const Duration(milliseconds: 350)); + expect(toggles, 1); + await tester.tapAt(character(25)); + await tester.pump(const Duration(milliseconds: 350)); + expect(toggles, 2); + }, + ); + + testWidgets('plain page taps toggle while gestures and selections do not', ( + tester, + ) async { + var toggles = 0; + late ReaderInteractionScope interactions; + await tester.pumpWidget( + MaterialApp( + home: SizedBox.expand( + child: ReaderSurface( + enabled: true, + onToggle: () => toggles++, + onTurn: (_) {}, + child: Builder( + builder: (context) { + interactions = ReaderInteractionScope.maybeOf(context)!; + return const ColoredBox(color: Colors.white); + }, + ), + ), + ), + ), + ); + const center = Offset(400, 300); + Future settleTap() => tester.pump(const Duration(milliseconds: 350)); + + await tester.tapAt(center); + await settleTap(); + expect(toggles, 1); + await tester.longPressAt(center); + await settleTap(); + await tester.dragFrom(center, const Offset(-120, 0)); + await settleTap(); + expect(toggles, 1); + await tester.tapAt(center); + await tester.pump(const Duration(milliseconds: 60)); + await tester.tapAt(center); + await settleTap(); + expect(toggles, 1); + final first = await tester.startGesture(center, pointer: 1); + final second = await tester.startGesture( + center + const Offset(20, 0), + pointer: 2, + ); + await second.up(); + await first.up(); + await settleTap(); + expect(toggles, 1); + interactions.onSelectionChanged(true); + await tester.tapAt(center); + await settleTap(); + expect(toggles, 1); + interactions.onSelectionChanged(false); + final linkTap = await tester.startGesture(center); + interactions.suppressTap(); + await linkTap.up(); + await settleTap(); + expect(toggles, 1); + await tester.tapAt(center); + await settleTap(); + expect(toggles, 2); + final plainTap = await tester.startGesture(const Offset(50, 300)); + interactions.onSelectionChanged(false); + await plainTap.up(); + await settleTap(); + expect(toggles, 3); + }); +} diff --git a/test/presentation/reader_swipe_tracker_test.dart b/test/presentation/reader_swipe_tracker_test.dart new file mode 100644 index 0000000..b1ad0dd --- /dev/null +++ b/test/presentation/reader_swipe_tracker_test.dart @@ -0,0 +1,124 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus_reader/src/presentation/reader_swipe_tracker.dart'; + +void main() { + test('only a single touch drag can become a boundary swipe', () { + for (final kind in [ + PointerDeviceKind.touch, + PointerDeviceKind.mouse, + PointerDeviceKind.stylus, + ]) { + final tracker = ReaderSwipeTracker(); + tracker.start(PointerDownEvent(pointer: 1, kind: kind)); + tracker.update( + PointerMoveEvent( + pointer: 1, + kind: kind, + position: const Offset(100, 0), + ), + ); + final offset = tracker.end( + PointerUpEvent(pointer: 1, kind: kind, position: const Offset(100, 0)), + ); + expect( + offset, + kind == PointerDeviceKind.touch ? const Offset(100, 0) : isNull, + ); + } + }); + + test('selection stays disqualified after it clears during a drag', () { + final tracker = ReaderSwipeTracker(); + tracker.start(const PointerDownEvent(pointer: 1)); + tracker.update( + const PointerMoveEvent(pointer: 1, position: Offset(100, 0)), + ); + tracker.selectionChanged(true); + tracker.selectionChanged(false); + expect( + tracker.end(const PointerUpEvent(pointer: 1, position: Offset(200, 0))), + isNull, + ); + tracker.start(const PointerDownEvent(pointer: 2)); + tracker.update( + const PointerMoveEvent(pointer: 2, position: Offset(-100, 0)), + ); + expect( + tracker.end(const PointerUpEvent(pointer: 2, position: Offset(-100, 0))), + const Offset(-100, 0), + ); + }); + + test('dragging an existing selection cannot turn a page', () { + final tracker = ReaderSwipeTracker()..selectionChanged(true); + tracker.start(const PointerDownEvent(pointer: 1)); + tracker.update( + const PointerMoveEvent(pointer: 1, position: Offset(100, 0)), + ); + tracker.selectionChanged(false); + expect( + tracker.end(const PointerUpEvent(pointer: 1, position: Offset(100, 0))), + isNull, + ); + }); + + test( + 'holding before dragging cancels a swipe without a selection callback', + () { + final tracker = ReaderSwipeTracker(); + tracker.start(const PointerDownEvent(pointer: 1)); + tracker.update( + PointerMoveEvent( + pointer: 1, + position: const Offset(100, 0), + timeStamp: kLongPressTimeout, + ), + ); + expect( + tracker.end(const PointerUpEvent(pointer: 1, position: Offset(100, 0))), + isNull, + ); + }, + ); + + test('a moving swipe can continue longer than the long-press timeout', () { + final tracker = ReaderSwipeTracker(); + tracker.start(const PointerDownEvent(pointer: 1)); + tracker.update(const PointerMoveEvent(pointer: 1, position: Offset(30, 0))); + tracker.update( + PointerMoveEvent( + pointer: 1, + position: const Offset(100, 0), + timeStamp: kLongPressTimeout, + ), + ); + expect( + tracker.end(const PointerUpEvent(pointer: 1, position: Offset(100, 0))), + const Offset(100, 0), + ); + }); + + test('multi-touch and cancelled gestures cannot turn pages', () { + final tracker = ReaderSwipeTracker(); + tracker.start(const PointerDownEvent(pointer: 1)); + tracker.start(const PointerDownEvent(pointer: 2)); + tracker.end(const PointerUpEvent(pointer: 2)); + tracker.update( + const PointerMoveEvent(pointer: 1, position: Offset(100, 0)), + ); + expect( + tracker.end(const PointerUpEvent(pointer: 1, position: Offset(100, 0))), + isNull, + ); + tracker.start(const PointerDownEvent(pointer: 3)); + tracker.update( + const PointerMoveEvent(pointer: 3, position: Offset(100, 0)), + ); + tracker.cancel(const PointerCancelEvent(pointer: 3)); + expect( + tracker.end(const PointerUpEvent(pointer: 3, position: Offset(100, 0))), + isNull, + ); + }); +} diff --git a/test/presentation/reader_text_toolbar_test.dart b/test/presentation/reader_text_toolbar_test.dart new file mode 100644 index 0000000..d734d2d --- /dev/null +++ b/test/presentation/reader_text_toolbar_test.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus_reader/src/presentation/reader_text_toolbar.dart'; + +void main() { + for (final width in [390.0, 1200.0]) { + for (final atTop in [true, false]) { + testWidgets( + 'toolbar stays near text and inside width $width, top $atTop', + (tester) async { + tester.view.devicePixelRatio = 1; + tester.view.physicalSize = Size(width, 800); + addTearDown(tester.view.reset); + final bounds = Rect.fromLTWH(width - 100, atTop ? 4 : 700, 85, 24); + await tester.pumpWidget( + MaterialApp( + home: Stack( + children: [ + ReaderTextToolbar( + bounds: bounds, + items: [ + ContextMenuButtonItem(label: 'Edit', onPressed: () {}), + ContextMenuButtonItem(label: 'Remove', onPressed: () {}), + ContextMenuButtonItem(label: 'Copy', onPressed: () {}), + ], + ), + ], + ), + ), + ); + await tester.pumpAndSettle(); + final edit = tester.getRect( + find.widgetWithText(TextSelectionToolbarTextButton, 'Edit'), + ); + final copy = tester.getRect( + find.widgetWithText(TextSelectionToolbarTextButton, 'Copy'), + ); + final toolbar = edit.expandToInclude(copy); + expect(toolbar.left, greaterThanOrEqualTo(0)); + expect(toolbar.right, lessThanOrEqualTo(width)); + if (atTop) { + expect(toolbar.top, greaterThan(bounds.bottom)); + expect(toolbar.top - bounds.bottom, lessThan(30)); + } else { + expect(toolbar.bottom, lessThan(bounds.top)); + expect(bounds.top - toolbar.bottom, lessThan(30)); + } + expect(tester.takeException(), isNull); + }, + ); + } + } +} diff --git a/test/presentation/real_book_reading_test.dart b/test/presentation/real_book_reading_test.dart new file mode 100644 index 0000000..a1a8972 --- /dev/null +++ b/test/presentation/real_book_reading_test.dart @@ -0,0 +1,294 @@ +import 'dart:io'; +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:papyrus_reader/papyrus_reader.dart'; +import 'package:papyrus_reader/src/engine/epub/worker/epub_processor.dart'; +import 'package:papyrus_reader/src/engine/epub/worker/epub_worker.dart'; + +import '../support/in_process_epub_worker.dart'; + +void main() { + for (final name in ['alice', 'pride-and-prejudice']) { + test( + '$name indexes the full book and renders its SVG-wrapped cover', + () async { + final processor = EpubProcessor(); + final bytes = File( + 'test/fixtures/gutenberg/$name.epub', + ).readAsBytesSync(); + final metadata = await processor.dispatch('open', bytes); + final lengths = (metadata['lengths'] as List).cast(); + expect(lengths.length, metadata['count']); + expect(lengths.first, greaterThan(0)); + expect(lengths.first / lengths.reduce((a, b) => a + b), lessThan(.01)); + final cover = await processor.dispatch('chapter', 0); + final blocks = cover['blocks'] as List; + expect(blocks.single['kind'], 'image'); + expect(blocks.single['src'], startsWith('data:image/')); + if (name == 'alice') { + expect(blocks.single['aspect'], closeTo(800 / 1104, .001)); + } + expect(cover['length'], lengths.first); + for (final index in [1, lengths.length ~/ 2, lengths.length - 1]) { + final chapter = await processor.dispatch('chapter', index); + expect(chapter['length'], lengths[index]); + } + }, + ); + } + + test('native worker preserves content offsets across restart', () async { + for (final name in ['alice', 'pride-and-prejudice']) { + final bytes = File( + 'test/fixtures/gutenberg/$name.epub', + ).readAsBytesSync(); + final document = ReaderDocument( + id: name, + format: ReaderFormat.epub, + loadBytes: () async => bytes, + ); + final engine = EpubReaderEngine(); + await engine.load(document, preferences: const ReaderPreferences()); + await engine.goToProgress(.55); + final position = engine.locator; + expect(position.totalProgression, closeTo(.55, .0001)); + engine.dispose(); + final reopened = EpubReaderEngine(); + await reopened.load( + document, + initialLocator: position, + preferences: const ReaderPreferences(fontSize: 30), + ); + expect(reopened.locator.textOffset, position.textOffset); + expect(reopened.locator.totalProgression, position.totalProgression); + reopened.dispose(); + } + }); + + testWidgets( + 'slow and failed chapter preparation retain the committed page and progress', + (tester) async { + final worker = _GatedWorker(); + final engine = EpubReaderEngine(workerFactory: () async => worker); + final bytes = File( + 'test/fixtures/gutenberg/alice.epub', + ).readAsBytesSync(); + await tester.pumpWidget( + MaterialApp( + home: PapyrusReader( + document: ReaderDocument( + id: 'slow-alice', + format: ReaderFormat.epub, + loadBytes: () async => bytes, + ), + registry: ReaderEngineRegistry([ + ReaderEngineRegistration( + formats: const {ReaderFormat.epub}, + factory: () => engine, + ), + ]), + ), + ), + ); + await tester.pumpAndSettle(); + final bounds = tester.getRect( + find.byKey(const ValueKey('reader-content')), + ); + final original = engine.snapshot.locator; + await tester.tapAt(bounds.center); + await tester.pump(const Duration(milliseconds: 350)); + await tester.tap(find.byTooltip('Next')); + await tester.pump(const Duration(milliseconds: 350)); + expect(find.text('Preparing pages…'), findsNothing); + expect(find.byType(PageView), findsOneWidget); + expect(engine.snapshot.locator, original); + worker.fail = true; + worker.gate.complete(); + await tester.pumpAndSettle(); + expect(find.text('Try again'), findsOneWidget); + expect(engine.snapshot.locator, original); + expect( + tester.getRect(find.byKey(const ValueKey('reader-content'))), + bounds, + ); + worker.fail = false; + await tester.tap(find.text('Try again')); + await tester.pumpAndSettle(); + expect(engine.locator.spineIndex, 1); + expect(find.text('Try again'), findsNothing); + await tester.pumpWidget(const SizedBox.shrink()); + }, + ); + + for (final name in ['alice', 'pride-and-prejudice']) { + for (final size in [const Size(390, 844), const Size(1280, 850)]) { + testWidgets('$name navigation and chrome remain stable at $size', ( + tester, + ) async { + tester.view.devicePixelRatio = 1; + tester.view.physicalSize = size; + addTearDown(tester.view.resetPhysicalSize); + addTearDown(tester.view.resetDevicePixelRatio); + final engine = testEpubEngine(); + final bytes = File( + Platform.environment['PAPYRUS_SQL_EPUB'] ?? + 'test/fixtures/gutenberg/$name.epub', + ).readAsBytesSync(); + await tester.pumpWidget( + MaterialApp( + home: PapyrusReader( + document: ReaderDocument( + id: 'alice', + format: ReaderFormat.epub, + loadBytes: () async => bytes, + ), + registry: ReaderEngineRegistry([ + ReaderEngineRegistration( + formats: const {ReaderFormat.epub}, + factory: () => engine, + ), + ]), + ), + ), + ); + await tester.pumpAndSettle(); + expect(engine.blocks.single.image, isNotNull); + expect(engine.locator.totalProgression, 0); + final content = find.byKey(const ValueKey('reader-content')); + final bounds = tester.getRect(content); + expect(find.byTooltip('Reading settings'), findsNothing); + await tester.tapAt(bounds.center); + await tester.pump(const Duration(milliseconds: 350)); + final label = tester.getRect(find.text(engine.snapshot.locationLabel!)); + final slider = tester.getRect(find.byType(Slider)); + expect(slider.center.dy - label.bottom, 11); + expect( + tester + .getSize(find.byKey(const ValueKey('reader-progress-controls'))) + .width, + size.width > 1000 ? 1000 : size.width, + ); + await tester.tap(find.byTooltip('Next')); + for (var frame = 0; frame < 10; frame++) { + await tester.pump(const Duration(milliseconds: 16)); + expect(find.text('Preparing pages…'), findsNothing); + expect(find.byType(PageView), findsOneWidget); + } + await tester.pumpAndSettle(); + expect(engine.locator.spineIndex, 1); + expect(engine.locator.totalProgression, lessThan(.01)); + await tester.tap(find.byTooltip('Previous')); + await tester.pumpAndSettle(); + expect(engine.locator.spineIndex, 0); + expect(engine.locator.localProgression, 0); + expect(engine.locator.totalProgression, 0); + expect(find.text('0%'), findsOneWidget); + await tester.tapAt(bounds.center); + await tester.pump(const Duration(milliseconds: 350)); + await tester.pumpAndSettle(); + expect(tester.getRect(content), bounds); + expect(find.byTooltip('Show controls'), findsNothing); + expect(find.byTooltip('Reading settings'), findsNothing); + await tester.tapAt(bounds.center); + await tester.pump(const Duration(milliseconds: 350)); + await tester.pumpAndSettle(); + await tester.tap(find.byTooltip('Table of contents')); + await tester.pumpAndSettle(); + expect(tester.getRect(content), bounds); + expect(find.text('Preparing pages…'), findsNothing); + if (size.width > 900) { + await tester.sendKeyEvent(LogicalKeyboardKey.escape); + } else { + Navigator.of(tester.element(find.byType(BottomSheet))).pop(); + } + await tester.pumpAndSettle(); + expect(engine.locator.totalProgression, 0); + if (size.width < 900) { + await tester.tapAt(bounds.center); + await tester.pump(const Duration(milliseconds: 350)); + await tester.pumpAndSettle(); + expect(find.byTooltip('Reading settings'), findsNothing); + await tester.tapAt(bounds.center); + await tester.pump(const Duration(milliseconds: 350)); + await tester.pumpAndSettle(); + expect(find.byTooltip('Reading settings'), findsOneWidget); + } + await tester.tap(find.byTooltip('Next')); + await tester.tap(find.byTooltip('Next')); + await tester.tap(find.byTooltip('Previous')); + await tester.pumpAndSettle(); + expect(engine.locator.spineIndex, 1); + await pumpReaderCommand(tester, engine.goToProgress(1)); + expect(engine.locator.totalProgression, 1); + await pumpReaderCommand(tester, engine.goToProgress(.55)); + final position = engine.locator; + final controller = tester + .widget(find.byType(PageView)) + .controller; + await engine.updatePreferences( + engine.preferences.copyWith(backgroundColor: Colors.black), + ); + await tester.pumpAndSettle(); + expect( + tester.widget(find.byType(PageView)).controller, + same(controller), + ); + expect(engine.snapshot.contentReady, isTrue); + expect(engine.locator.textOffset, position.textOffset); + await pumpReaderCommand( + tester, + engine.updatePreferences(engine.preferences.copyWith(fontSize: 24)), + ); + expect(engine.locator.textOffset, position.textOffset); + tester.view.physicalSize = Size(size.height, size.width); + await tester.pumpAndSettle(); + expect(engine.locator.textOffset, position.textOffset); + await pumpReaderCommand( + tester, + engine.updatePreferences( + engine.preferences.copyWith(layoutMode: ReaderLayoutMode.scroll), + ), + ); + final scroll = tester + .widget(find.byType(ListView)) + .controller!; + expect(scroll.initialScrollOffset, closeTo(scroll.offset, 1)); + await pumpReaderCommand(tester, engine.goToProgress(.8)); + final sought = tester + .widget(find.byType(ListView)) + .controller!; + expect(sought.initialScrollOffset, closeTo(sought.offset, 1)); + await pumpReaderCommand(tester, engine.goToProgress(0)); + expect(engine.locator.totalProgression, 0); + expect(tester.takeException(), isNull); + await tester.pumpWidget(const SizedBox.shrink()); + }); + } + } +} + +final class _GatedWorker implements EpubWorker { + final delegate = InProcessEpubWorker(); + final gate = Completer(); + bool fail = false; + + @override + Future> request(String command, Object? argument) async { + if (command == 'chapter' && argument == 1) { + await gate.future; + if (fail) { + throw const ReaderException( + ReaderErrorCode.invalidDocument, + 'Chapter unavailable', + ); + } + } + return delegate.request(command, argument); + } + + @override + void dispose() => delegate.dispose(); +} diff --git a/test/support/fake_reader_engine.dart b/test/support/fake_reader_engine.dart index 45e0d74..91f000d 100644 --- a/test/support/fake_reader_engine.dart +++ b/test/support/fake_reader_engine.dart @@ -36,6 +36,8 @@ class FakeReaderEngine extends ReaderEngine { final Map> _loadStartsByDocument = {}; ReaderLocator? currentLocatorResult; final List goToCalls = []; + ReaderLocator? locatorOnNavigation; + Completer? navigationGate; final List goToProgressCalls = []; int goNextCallCount = 0; int goPreviousCallCount = 0; @@ -93,6 +95,9 @@ class FakeReaderEngine extends ReaderEngine { @override Future goTo(ReaderLocator locator) async { goToCalls.add(locator); + final next = locatorOnNavigation; + if (next != null) emitLocator(next); + await navigationGate?.future; } @override diff --git a/test/support/in_process_epub_worker.dart b/test/support/in_process_epub_worker.dart index 314beac..e344ea6 100644 --- a/test/support/in_process_epub_worker.dart +++ b/test/support/in_process_epub_worker.dart @@ -40,3 +40,26 @@ final class InProcessEpubWorker implements EpubWorker { disposed = true; } } + +Future pumpReaderCommand( + WidgetTester tester, + Future command, +) async { + var finished = false; + Object? failure; + command.then( + (_) => finished = true, + onError: (Object error) { + failure = error; + finished = true; + }, + ); + for (var frame = 0; !finished && frame < 1000; frame++) { + await tester.pump(const Duration(milliseconds: 16)); + } + expect(finished, isTrue, reason: 'Reader command did not complete'); + if (failure != null) { + throw failure!; + } + await tester.pumpAndSettle(); +} diff --git a/test/support/pdfium_test_setup.dart b/test/support/pdfium_test_setup.dart new file mode 100644 index 0000000..d06215b --- /dev/null +++ b/test/support/pdfium_test_setup.dart @@ -0,0 +1,2 @@ +export 'pdfium_test_setup_stub.dart' + if (dart.library.io) 'pdfium_test_setup_native.dart'; diff --git a/test/support/pdfium_test_setup_native.dart b/test/support/pdfium_test_setup_native.dart new file mode 100644 index 0000000..4813635 --- /dev/null +++ b/test/support/pdfium_test_setup_native.dart @@ -0,0 +1,29 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:pdfrx/pdfrx.dart'; + +Future initializePdfiumForTest() async { + // Flutter tests emit a host asset manifest here. pdfrx's Dart initializer + // instead looks for .dart_tool/native_assets.yaml, which a clean checkout lacks. + final manifest = File( + 'build/native_assets/${Platform.operatingSystem}/native_assets.json', + ); + final json = jsonDecode(await manifest.readAsString()) as Map; + final targets = json['native-assets'] as Map; + final assets = targets.values.single as Map; + final module = assets['package:pdfium_dart/libpdfium'] as List; + + if (module.first != 'absolute') { + throw StateError('Expected an absolute PDFium path in ${manifest.path}.'); + } + + final modulePath = module.last as String; + if (!File(modulePath).existsSync()) { + throw StateError('PDFium test library is missing: $modulePath'); + } + + Pdfrx.pdfiumModulePath = modulePath; + // The dependency's worker does not forward initialization errors to its caller. + await pdfrxInitialize().timeout(const Duration(seconds: 15)); +} diff --git a/test/support/pdfium_test_setup_stub.dart b/test/support/pdfium_test_setup_stub.dart new file mode 100644 index 0000000..3f97c17 --- /dev/null +++ b/test/support/pdfium_test_setup_stub.dart @@ -0,0 +1,2 @@ +Future initializePdfiumForTest() => + throw UnsupportedError('This PDFium test requires a native test runner.'); diff --git a/test/support/synthetic_epub.dart b/test/support/synthetic_epub.dart index 3adc89b..2517e1d 100644 --- a/test/support/synthetic_epub.dart +++ b/test/support/synthetic_epub.dart @@ -5,6 +5,7 @@ Uint8List syntheticEpub({ bool fixedLayout = false, bool malicious = false, bool longChapter = false, + bool singleSpine = false, String? firstChapterBody, String? secondChapterBody, bool reversedToc = false, @@ -81,8 +82,7 @@ Uint8List syntheticEpub({ - - + ${singleSpine ? '' : ''} '''), 'OEBPS/toc.ncx': utf8.encode(''' @@ -91,6 +91,7 @@ Uint8List syntheticEpub({ Synthetic Book +${singleSpine ? '' : ''' Chapter One @@ -103,6 +104,7 @@ Uint8List syntheticEpub({ Chapter Two +'''} '''), 'OEBPS/text/chapter1.xhtml': utf8.encode( diff --git a/tool/browser/smoke.mjs b/tool/browser/smoke.mjs index fb80bdf..a8e8996 100644 --- a/tool/browser/smoke.mjs +++ b/tool/browser/smoke.mjs @@ -27,6 +27,7 @@ const browser = await chromium.launch({ executablePath: process.env.PAPYRUS_CHRO const temp = await mkdtemp(resolve(tmpdir(), 'papyrus-reader-')); try { const page = await browser.newPage({ viewport: { width: 1280, height: 850 } }); + page.setDefaultTimeout(5000); const errors = []; let workersClosed = 0; page.on('pageerror', error => errors.push(error.message)); @@ -70,8 +71,84 @@ try { assert.ok(protocol.blocks > 20); assert.equal(protocol.error, 'invalidDocument'); + const settle = () => page.evaluate(() => new Promise((resolve, reject) => { + const deadline = performance.now() + 5000; + let previous; + let stableFrames = 0; + const tick = () => { + const geometry = [...document.querySelectorAll('flt-semantics')].map(element => { + const rect = element.getBoundingClientRect(); + return [element.textContent, rect.x, rect.y, rect.width, rect.height]; + }); + const current = JSON.stringify(geometry); + stableFrames = current === previous ? stableFrames + 1 : 0; + previous = current; + if (stableFrames >= 3) return resolve(); + if (performance.now() >= deadline) return reject(new Error('Reader semantics did not settle within 5 seconds')); + requestAnimationFrame(tick); + }; + requestAnimationFrame(tick); + })); + const tapPage = async () => { + const { width, height } = page.viewportSize(); + await page.mouse.click(width / 2, height / 2); + await settle(); + }; + const assertControlsHidden = async () => { + for (const name of ['Back', 'Reading settings', 'Table of contents', 'Next', 'Previous']) { + await page.getByRole('button', { name, exact: true }).waitFor({state: 'hidden', timeout: 5000}); + assert.equal(await page.getByRole('button', { name, exact: true }).count(), 0, + `${name} must be hidden in focus mode`); + } + assert.equal(await page.getByRole('button', { name: 'Show controls', exact: true }).count(), 0); + }; + const hideControls = async () => { + await tapPage(); + await assertControlsHidden(); + }; + const showInitialControls = async ready => { + await ready.waitFor(); + await settle(); + await assertControlsHidden(); + await tapPage(); + await page.getByRole('button', { name: 'Next', exact: true }).waitFor(); + }; + + const openSettings = async () => { + await page.getByRole('button', { name: 'Reading settings', exact: true }).click(); + await page.getByRole('button', { name: 'Close panel', exact: true }).waitFor(); + await settle(); + }; + const closeSettings = async () => { + const close = page.getByRole('button', { name: 'Close panel', exact: true }); + await close.click(); + await close.waitFor({ state: 'hidden' }); + await settle(); + }; + const backToLibrary = async () => { + await page.getByRole('button', { name: 'Back', exact: true }).click(); + await page.getByRole('button', { name: 'Open a book', exact: true }).waitFor(); + await settle(); + }; + const appearance = async name => { + const chip = page.getByLabel(name, { exact: true }); + await chip.click(); + await chip.waitForFunction(element => ['aria-checked', 'aria-pressed', 'aria-selected'] + .some(attribute => element.getAttribute(attribute) === 'true')); + await settle(); + }; + const select = async (current, target) => { + await page.getByRole('button', { name: new RegExp(current) }).click(); + const option = page.getByRole('menuitem', { name: target, exact: true }); + await option.waitFor(); + await option.click(); + await option.waitFor({ state: 'hidden' }); + await page.getByRole('button', { name: new RegExp(target) }).waitFor(); + await settle(); + }; + await page.getByRole('button', { name: 'Explore layouts', exact: true }).click(); - await page.getByRole('button', { name: 'Next', exact: true }).waitFor(); + await showInitialControls(page.getByText('At the Gate', { exact: true }).first()); await page.waitForFunction(() => document.body.innerText.includes('Passage 1.')); await page.getByRole('button', { name: 'Next', exact: true }).click(); await page.waitForFunction(() => !document.body.innerText.includes('Passage 1. Reading')); @@ -84,11 +161,6 @@ try { await mkdir(folder, { recursive: true }); await page.screenshot({ path: resolve(folder, `${name}.png`) }); }; - const settle = () => page.evaluate(() => new Promise(resolve => { - let frames = 0; - const tick = () => ++frames >= 60 ? resolve() : requestAnimationFrame(tick); - requestAnimationFrame(tick); - })); await settle(); const passage = /Passage (\d+)\. Reading/.exec(await page.locator('body').innerText()); assert.ok(passage, 'The next spread must contain readable paragraphs'); @@ -102,72 +174,70 @@ try { const afterWheel = await paragraph.boundingBox(); assert.ok(beforeWheel && afterWheel && Math.abs(beforeWheel.y - afterWheel.y) < 1, 'A normal paginated column must fit without hidden vertical overflow'); + await openSettings(); + await select('Slide', 'None'); + await screenshot('desktop-instant-turns'); + await select('None', 'Slide'); + await closeSettings(); await screenshot('desktop'); - const hideControls = async () => { - await page.getByRole('button', { name: 'Hide controls', exact: true }).click(); - await settle(); - for (const name of ['Back', 'Reading settings', 'Table of contents', 'Next', 'Previous']) { - assert.equal(await page.getByRole('button', { name, exact: true }).count(), 0, - `${name} must be hidden in focus mode`); - } - await page.getByRole('button', { name: 'Show controls', exact: true }).waitFor(); - }; await hideControls(); const focusedParagraph = await paragraph.boundingBox(); assert.ok(focusedParagraph && focusedParagraph.y < 850 && focusedParagraph.y + focusedParagraph.height > 0, - 'Expanding the reading area must keep the current EPUB paragraph visible'); + 'Overlay controls must keep the current EPUB paragraph visible'); + assert.ok(Math.abs(focusedParagraph.y - beforeWheel.y) < 1, 'Hiding overlays must not move text'); await screenshot('desktop-focus'); await page.keyboard.press('Escape'); + await page.getByRole('button', { name: 'Reading settings', exact: true }).waitFor(); await settle(); - await page.getByRole('button', { name: 'Hide controls', exact: true }).waitFor(); await page.setViewportSize({ width: 390, height: 844 }); await settle(); - await page.getByRole('button', { name: 'Reading settings', exact: true }).click(); - await page.getByRole('button', { name: 'Close panel', exact: true }).waitFor(); - await settle(); + await openSettings(); await screenshot('mobile-settings'); await page.mouse.move(190, 650); await page.mouse.wheel(0, 600); await settle(); - await page.getByLabel('Night', { exact: true }).click(); - await settle(); - await page.getByRole('button', { name: 'Close panel', exact: true }).click(); - await settle(); + await appearance('Night'); + await closeSettings(); await screenshot('mobile-night'); await hideControls(); await screenshot('mobile-focus'); - await page.getByRole('button', { name: 'Show controls', exact: true }).click(); + await tapPage(); + await page.getByRole('button', { name: 'Back', exact: true }).waitFor(); await settle(); await page.setViewportSize({ width: 700, height: 360 }); await settle(); await screenshot('landscape'); - await page.getByRole('button', { name: 'Back', exact: true }).click(); - await page.getByRole('button', { name: 'Open a book', exact: true }).waitFor(); - await settle(); + await backToLibrary(); // File-picker integration lets the example review real documents, including // malformed files. Loading errors must keep Back reachable. const openFile = async path => { const chooser = page.waitForEvent('filechooser'); - // Flutter route transitions do not expose DOM animation state to Playwright. - // Let the entrance transition finish before sending its next pointer event. + await page.getByRole('button', { name: 'Open a book', exact: true }).waitFor(); await settle(); await page.getByRole('button', { name: 'Open a book', exact: true }).click(); - await settle(); await (await chooser).setFiles(path); }; await openFile(resolve(reader, 'example/assets/reading_lab.epub')); - await page.getByRole('button', { name: 'Next', exact: true }).waitFor(); - await page.waitForFunction(() => document.body.innerText.includes('At the Gate')); - await page.getByRole('button', { name: 'Back', exact: true }).click(); - await settle(); + await showInitialControls(page.getByText('At the Gate', { exact: true }).first()); + const progressSlider = page.getByRole('slider').last(); + const progressBounds = await progressSlider.boundingBox(); + assert.ok(progressBounds, 'Reading progress must remain interactive'); + const progressY = progressBounds.y + progressBounds.height / 2; + for (const fraction of [0.8, 0.15, 0.9, 1]) { + await page.mouse.move(progressBounds.x + progressBounds.width / 2, progressY); + await page.mouse.down(); + await page.mouse.move(progressBounds.x + progressBounds.width * fraction, progressY, { steps: 3 }); + await page.mouse.up(); + } + await page.waitForFunction(() => document.querySelector('[aria-label^="Chapter 2 of 2"]')); + await backToLibrary(); const invalid = resolve(temp, 'invalid.epub'); await writeFile(invalid, Buffer.from([1, 2, 3])); await openFile(invalid); await page.getByRole('button', { name: 'Try again', exact: true }).waitFor(); - await page.getByRole('button', { name: 'Back', exact: true }).click(); - await settle(); + await backToLibrary(); assert.ok(workersClosed >= 3, 'Document workers must close with their sessions'); // Crossing chapters must retain keyboard focus in focus mode without pointer refocus. @@ -175,7 +245,7 @@ try { await page.getByRole('button', { name: 'Read EPUB', exact: true }).click(); await page.getByText('At the Gate', { exact: true }).first().waitFor(); await settle(); - await hideControls(); + await assertControlsHidden(); for (let turn = 0; turn < 3; turn++) { await page.keyboard.press('ArrowRight'); await page.getByText('After the Rain', { exact: true }).first().waitFor(); @@ -185,13 +255,13 @@ try { await settle(); } await page.keyboard.press('Escape'); + await page.getByRole('button', { name: 'Back', exact: true }).waitFor(); await settle(); - await page.getByRole('button', { name: 'Back', exact: true }).click(); - await settle(); + await backToLibrary(); await page.setViewportSize({ width: 700, height: 360 }); await page.getByRole('button', { name: 'Read PDF', exact: true }).click(); - await page.getByRole('button', { name: 'Next', exact: true }).waitFor(); + await showInitialControls(page.getByText('Page 1 of 3.', { exact: true })); await settle(); await screenshot('pdf-initial'); await page.getByLabel(/Page 1 of 3/).waitFor(); @@ -209,86 +279,74 @@ try { await page.keyboard.press('ArrowLeft'); await page.getByText('Page 2 of 3.', { exact: true }).waitFor(); await settle(); - await page.getByRole('button', { name: 'Show controls', exact: true }).click(); + await tapPage(); + await page.getByRole('button', { name: 'Back', exact: true }).waitFor(); await settle(); await page.getByLabel(/Page 2 of 3/).waitFor(); - await page.getByRole('button', { name: 'Back', exact: true }).click(); - await settle(); + await backToLibrary(); await page.getByRole('button', { name: 'Read PDF', exact: true }).click(); + await showInitialControls(page.getByText('Page 2 of 3.', { exact: true })); await page.getByLabel(/Page 2 of 3/).waitFor(); await settle(); - await page.getByRole('button', { name: 'Reading settings', exact: true }).click(); - await page.getByRole('button', { name: 'Close panel', exact: true }).waitFor(); - await settle(); + await openSettings(); assert.equal(await page.getByLabel('Typeface', { exact: false }).count(), 0, 'PDF must not advertise reflowable font controls'); - await page.getByRole('button', { name: 'Close panel', exact: true }).click(); - await settle(); + await closeSettings(); await page.setViewportSize({ width: 1280, height: 850 }); await settle(); - await page.getByRole('button', { name: 'Reading settings', exact: true }).click(); - await settle(); - const select = async (current, target) => { - await page.getByRole('button', { name: new RegExp(current) }).click(); - await settle(); - await page.getByRole('menuitem', { name: target, exact: true }).click(); - await settle(); - }; + await openSettings(); await screenshot('pdf-wide-settings'); - await select('Automatic', 'Single'); - await page.getByLabel('Night', { exact: true }).click(); - await settle(); + await page.getByRole('button', { name: /Single/ }).waitFor(); + await appearance('Night'); await screenshot('pdf-night-single'); const pdfPage = () => page.getByRole('group', { name: 'Page 2', exact: true }); const singleBefore = await pdfPage().boundingBox(); - assert.ok(singleBefore && singleBefore.x >= 0 && singleBefore.x + singleBefore.width <= 920, - 'Single PDF page must fit the width left by the settings panel'); + assert.ok(singleBefore && singleBefore.x >= 0 && singleBefore.x + singleBefore.width <= 1280, + 'Single PDF page must fit the full viewport beneath the settings overlay'); await select('Single', 'Double'); await screenshot('pdf-night-double'); await select('Double', 'Single'); const singleAfter = await pdfPage().boundingBox(); assert.ok(singleAfter && Math.abs(singleBefore.width - singleAfter.width) < 1, 'Returning to Single must refit instead of retaining spread zoom'); - await page.getByLabel('Light', { exact: true }).click(); - await settle(); + await appearance('Light'); const lightBounds = await pdfPage().boundingBox(); assert.ok(lightBounds && Math.abs(singleAfter.width - lightBounds.width) < 1, 'Appearance changes must retain the PDF scale'); await screenshot('pdf-light-single'); - await page.getByRole('button', { name: 'Close panel', exact: true }).click(); - await settle(); + await closeSettings(); await page.mouse.move(450, 350); await page.mouse.wheel(0, 180); await page.getByLabel(/Page 3 of 3/).waitFor(); await settle(); + // Discrete PDF wheel turns intentionally debounce input for 250 ms. + await page.waitForTimeout(260); await page.mouse.wheel(0, -180); await page.getByLabel(/Page 2 of 3/).waitFor(); await settle(); - await page.getByRole('button', { name: 'Reading settings', exact: true }).click(); - await settle(); + await openSettings(); await select('Paginated', 'Continuous scroll'); - await page.getByRole('button', { name: 'Close panel', exact: true }).click(); - await settle(); + await closeSettings(); // The page semantics group is clipped to the viewport; measure actual text // inside it to distinguish scrolling from a stationary viewport container. const pdfText = () => page.getByText('Page 2 of 3.', { exact: true }); const continuousBefore = await pdfText().boundingBox(); await page.mouse.move(450, 350); await page.mouse.wheel(0, 100); + await pdfText().waitForFunction((element, previousY) => + element.getBoundingClientRect().y < previousY - 5, continuousBefore.y); await settle(); const continuousAfter = await pdfText().boundingBox(); assert.ok(continuousBefore && continuousAfter && continuousAfter.y < continuousBefore.y - 5, 'Continuous PDF mode must move within the page rather than snapping to the next page'); await page.getByLabel(/Page 2 of 3/).waitFor(); await screenshot('pdf-continuous'); - await page.getByRole('button', { name: 'Reading settings', exact: true }).click(); - await settle(); + await openSettings(); const scrollSingle = await pdfText().boundingBox(); await select('Single', 'Double'); await select('Double', 'Single'); - await page.getByLabel('Night', { exact: true }).click(); - await settle(); + await appearance('Night'); const scrollNight = await pdfText().boundingBox(); assert.ok(scrollSingle && scrollNight && Math.abs(scrollSingle.width - scrollNight.width) < 1, 'Continuous Single must refit after column changes and preserve scale on Night'); @@ -302,43 +360,44 @@ try { // Inspect opened popup routes under the opposite app/reader appearance. // Closed dropdown text alone cannot detect a stale host canvas color. - await page.getByRole('button', { name: 'Close panel', exact: true }).click(); - await settle(); - await page.getByRole('button', { name: 'Back', exact: true }).click(); - await settle(); + await closeSettings(); + await backToLibrary(); await page.getByRole('button', { name: 'Use dark theme', exact: true }).click(); + // Flutter may repeat the accessible name while the hovered tooltip is visible. + await page.getByRole('button', { name: /^Use light theme\b/ }).waitFor(); await settle(); await page.getByRole('button', { name: 'Read EPUB', exact: true }).click(); - await page.getByRole('button', { name: 'Reading settings', exact: true }).waitFor(); - await settle(); - await page.getByRole('button', { name: 'Reading settings', exact: true }).click(); - await settle(); - await page.getByLabel('Light', { exact: true }).click(); + await showInitialControls(page.getByText('At the Gate', { exact: true }).first()); await settle(); + await openSettings(); + await appearance('Light'); await page.getByRole('button', { name: /Reading mode/ }).click(); await page.getByRole('menuitem', { name: 'Continuous scroll', exact: true }).waitFor(); await settle(); await screenshot('dark-app-light-reader-menu'); await page.getByRole('menuitem', { name: 'Continuous scroll', exact: true }).click(); + await page.getByRole('menuitem', { name: 'Continuous scroll', exact: true }).waitFor({ state: 'hidden' }); + await page.getByRole('button', { name: /Continuous scroll/ }).waitFor(); await settle(); await page.getByRole('button', { name: /Typeface/ }).click(); await page.getByRole('menuitem', { name: 'Sans serif', exact: true }).waitFor(); await settle(); await screenshot('dark-app-light-reader-typeface'); await page.getByRole('menuitem', { name: 'Sans serif', exact: true }).click(); + await page.getByRole('menuitem', { name: 'Sans serif', exact: true }).waitFor({ state: 'hidden' }); + await page.getByRole('button', { name: /Sans serif/ }).waitFor(); await settle(); - await page.getByLabel('Night', { exact: true }).click(); - await settle(); + await appearance('Night'); await page.getByRole('button', { name: /Reading mode/ }).click(); await page.getByRole('menuitem', { name: 'Paginated', exact: true }).waitFor(); await settle(); await screenshot('dark-app-night-reader-menu'); await page.getByRole('menuitem', { name: 'Paginated', exact: true }).click(); + await page.getByRole('menuitem', { name: 'Paginated', exact: true }).waitFor({ state: 'hidden' }); + await page.getByRole('button', { name: /Paginated/ }).waitFor(); await settle(); - await page.getByRole('button', { name: 'Close panel', exact: true }).click(); - await settle(); - await page.getByRole('button', { name: 'Back', exact: true }).click(); - await settle(); + await closeSettings(); + await backToLibrary(); await page.getByRole('button', { name: 'Use light theme', exact: true }).waitFor(); assert.deepEqual(errors, []); console.log('Browser checks passed: worker protocol, focus mode and chapter keyboard focus, responsive settings, local files, cleanup, PDF pagination/scroll, column/appearance refitting and opened menus under opposite app themes.');